• 티스토리 홈
  • 프로필사진
    2료일
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
2료일
  • 프로필사진
    2료일
    • 분류 전체보기 (118)
      • SWIFT개발 (29)
      • 알고리즘 (25)
      • Design (6)
      • ARkit (1)
      • 면접준비 (32)
      • UIkit (2)
      • Vapor-Server with swift (3)
      • 디자인패턴 (5)
      • 반응형프로그래밍 (12)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 매크로(Macros)
        2024년 03월 07일
        • 2료일
        • 작성자
        • 2024.03.07.:09

        잉? 나는 따로 구조체에서 Init을 선언해주지 않았는데 뜨네?이게모지? memberwise initialization

        이는 컴파일러가 자동으로 init메서드를 생성해주기 때문이다.

        그렇다면 만약 WhatisMacro에 어떤 프로퍼티도 추가해주고 야 이것도 자동 컴파일러가 하게 해줘!

        🍎음...비효율적인데? 물론 swift compiler는 오픈소스야 잠만. 우리회의해보자...

        🧑🏼‍💻어? 그럼 일일이 너네랑 회의해야해? 확장성 딸리네?

        그래서 나온놈이 매크로다! 🧑🏼‍💻얘가 원하는데로 컴파일러를 수정하지 않고 Swift Package로 배포하는 방법!

        개발자가 원하는 방식으로 코드를 자동 생성할 수 있도록 돕는다. 

        매크로란?

        Swift 매크로는 컴파일러가 소스코드를 자동으로 생성하거나 확장할 수 있도록 도와주는 도구. 

        1. 독립매크로(Freestanding macro)

        : #기호로 시작하며, 자체적으로 사용된다. 선언에 첨부되지 않고, 독립적으로 동작.

        ex) let magic = #fourCode("ABCD")

        2. 첨부매크로(Attached Macros)

        : @기호로 시작하며, 특정 선언에 첨부되어 사용된다. 매크로가 첨부된 선언을 수정하거나 확장.

        어떻게 보면 프로퍼티 래퍼랑 똑같이 생겼다. 하지만 완전히 다르다. 매크로는 컴파일 타임때 코드 생성하고 변홚나다. 즉 런타임 오버헤드가 없다. 우리가 사용했던 @Observable이 매크로였음..

        프로퍼티래퍼: 런타임에 동작하고 프로퍼티의 동작을 관리하고 캡슐화한다. ex) @Published

        @OptionSet
        struct MyOptions {
            // ...
        }

        매크로 어떻게 선언하는데?

        public macro OptionSet<RawType>() =
                #externalMacro(module: "SwiftMacros", type: "OptionSetMacro")

        1. macro keyword 선언, 항상 Public keyword. 매크로를 선언하는 모듈과 사용하는 모듈이 다를수 있으므로.

        2. macro name 여기서는 OptionSet이다.

        3. 인수선언 여기서는 없다

        4. swift 표준 라이브러리 externalMacro를 사용하여 swift에 매크로의 구현위치를 알려준다. 여기서는 SwiftMacros모듈은 @OptionSet매크로를 구현하는 OptionSetMacro를 포함한다.

        그래서 매크로 어떻게 만드는데?

        File>New>Package를 보면 swiftMacro가 있다. AST를 사용하여 Swift code와 상호작용하기위해 SwiftSyntax 모듈을 사용하는데 여렇게 추가해주면 자동으로 SwiftSyntax에 대한 의존성을 추가해준다. 이렇듯 스위프트패키지 매니저를 통해 배포할수있어 버전관리, 팀내 배포가 용이하다.

        자 매크로를 추가하였다. 글면 자동으로 이렇게 생긴얘가 생긴다.뭘까 얘는?

        프로덕츠를 보면 이 두가지가 있는데 이는 외부에서 우리가 이 패키지추가할때 두가지가 뜨게 된다. 

         // Library that exposes a macro as part of its API, which is used in client programs.
                .target(name: "MyMacro", dependencies: ["MyMacroMacros"]),

        이름은: 클라이언트 프로그램에 매크로를 API로 노출하는 라이브러리를 뜻하고, 매크로의 구현부를 포함하는 모듈이 dependencies.

        clientProgram에게 API의 일부로서 매크로를 노출한다.

        MyMacro파일에 가면 이렇게 하나의 매크로가 만들어져 있다. 위에서 본 첨부매크로네? 어? 그리고 externalMacro네. 저기구현이 있구나? 즉 얘이름은 stringify고 genric type 인자 하나 받고 리턴타입으로 그 타입과 스트링타입 튜플형태로 받는구나. 그리고! 구현부는 MyMacroMacros라는 외부 플러그인의 stringifyMacro타입에 정의되어있구나!

        컴파일러가 그러면 이 타입을 보면서 아 구현부구나? 파악하게된다. 그리고 맨 아래보면 외부에 제공할 매크로의 타입을 넣어주면된다.

        소스코드를 컴파일 할때 모든 매크로를 확장한다. 일단 주의해야할것이 매크로는 Add something이라고 생각하면 된다. 즉 매크로에 의해 뭔가가 삭제되거나 수정되지 않는다. 조그만하게 코드로 만들어놓고 그것을 컴파일할때 자동으로 확장한다? 이렇게 이해하면 된다!

         

        1. 컴파일러는 코드를 읽고 구문의 메모리 표현(AST추상구문트리)을 생성한다
        2. 컴파일러는 매크로 호출위치를 식별하고 해당 매크로의 AST를 구현부에 전달한다.
        3. 매크로 구현부는 전달받은 AST를 기반으로 새로운 코드 생성.
        4. 생성된 코드는 원래 매크로 호출 위치에 삽입.
        5. 최종적으로 컴파일러는 확장된 소스코드를 기반으로 컴파일을 완료한다.

         

        let magicNumber = #fourCharacterCode("ABCD")

        이전의 LLVM 정리해놓은것을 보신분들은 아시겠지만 파싱의 단계에서 토큰단위로 분석을 하고 AST(추상구문트리)를 만든다. 해당 구조와 상호작용하는 코드를 더 쉽게 작성하기위해 코드의 구조를 만드는 것인데 위와 같이 magicNumber라는 매크로를 확장하는단계이다.
        매크로 부르는쪽에서 매크로의 이름과 해당하는 인수 정보가 들어있다.그리고 나서 string literal이 제대로 들어왔는지 Semantic analysis를 진행한다.!!( 와 아는거 다나와서 신남). 여기서 타입체크 실패하면 에러뜨겟지 

        컴파일러는 매크로를 호출하는 위치를 코드에서 찾고, 해당 매크로를 구현한 외부바이너리를 로드한다 AST부분을 매크로의 구현부분에 전달한다. 

        즉! #fourCharacterCode 구현은 확장할때 입력으로 이부분의 AST를 읽는다

         

        매크로는 이게 끝이아니다 진짜 무궁무진하다.. 아니 너무길다..사실 이거를 완벽이해하진 못했다.하지만 저보다 더 탐구하고 싶은 사람들을 위해 좋은 자료남길께요

        https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwiJtqycieGEAxXlj68BHajhBwgQFnoECBIQAQ&url=https%3A%2F%2Fsujinnaljin.medium.com%2Fswift-%25EB%25A7%25A4%25ED%2581%25AC%25EB%25A1%259C-5e232b78dc5b&usg=AOvVaw1f4opf6_hrnM7vdUd3f5me&opi=89978449

         

        https://www.google.com/url?cd=&esrc=s&opi=89978449&q=&rct=j&sa=t&source=web&url=https%3A%2F%2Fsujinnaljin.medium.com%2Fswift-%25EB%25A7%25A4%25ED%2581%25AC%25EB%25A1%259C-5e232b78dc5b&usg=AOvVaw1f4opf6_hrnM7vdUd3f5me&ved=2ahUKEwiJtqycieGEAxXlj68BHajhBwgQFnoECBIQAQ

         

        www.google.com

         

         

         

        이분 자료 진짜좋습니다

         

        '면접준비' 카테고리의 다른 글

        힙메모리 분석 - WWDC24  (1) 2024.06.15
        Uniform type Identifiers  (1) 2024.04.18
        초기화(initialization.. 편의? 지정?)  (0) 2024.03.05
        Function(1급시민 , inout & 클로저✨)  (2) 2024.03.04
        Assertions && Preconditions  (1) 2024.03.02
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바