ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Rust] Rust의 매크로 기능을 vscode환경에서 조회하기
    카테고리 없음 2024. 6. 22. 21:48

    러스트의 강력한 기능중 하나인 매크로를 알아보자.. main에서 println()을 호출시키고 
    매크로를 vscode의 터미널에서 조회하는 것이 목적

     

    우선 러스트의 매크로는 어떤 기능일까. 

    프로그래머의 알라딘 요술램프 GitHub Copilot Chat에 다음 질문 쿼리를 던져보았다.

     

    Rust의 매크로 기능에 대해서 상세하게 설명해줘

     

    Rust의 매크로는 코드를 작성하는 함수와 유사한 기능을 합니다. 매크로는 컴파일 시간에 코드를 생성하거나 변형시키는 메타 프로그래밍 기법의 일종입니다. Rust에서 매크로는 코드 중복을 줄이고, 추상화를 통해 더 유연하고 강력한 코드를 작성할 수 있게 도와줍니다.

    매크로의 종류

    Rust에는 주로 두 가지 유형의 매크로가 있습니다:

    1. 선언적 매크로(Declarative Macros): macro_rules!를 사용하여 정의되며, 패턴 매칭을 기반으로 작동합니다. 이 매크로는 주어진 입력에 대해 매칭되는 패턴을 찾고, 해당 패턴에 정의된 대로 코드를 생성합니다.
    2. 절차적 매크로(Procedural Macros): 함수처럼 작동하는 매크로로, 입력된 TokenStream을 받아서 다른 TokenStream을 출력합니다. 이 유형의 매크로는 세 가지 하위 유형으로 나뉩니다:
      • 속성 매크로(Attribute Macros): 특정 항목(함수, 구조체 등)에 대한 속성으로 적용됩니다.
      • 파생 매크로(Derive Macros): derive 속성을 사용하여 특정 트레잇을 구현하는 코드를 생성합니다.
      • 함수형 매크로(Function-like Macros): 함수처럼 보이지만, 컴파일 시간에 평가되어 코드를 생성합니다.

    매크로의 사용

    매크로는 ! 기호를 사용하여 호출됩니다. 예를 들어, Rust의 표준 라이브러리에 포함된 println! 매크로는 문자열을 화면에 출력하는 데 사용됩니다.

    매크로 정의 예시

    선언적 매크로의 간단한 예시입니다:

    이 매크로는 인자를 받지 않고, "Hello, world!"를 출력하는 코드를 생성합니다.

    매크로의 장점

    • 중복 제거: 비슷한 코드를 여러 번 작성하는 대신, 매크로를 사용하여 중복을 줄일 수 있습니다.
    • 추상화: 복잡한 코드를 매크로 뒤에 숨겨 사용자가 간단하게 사용할 수 있게 합니다.
    • 컴파일 시간 최적화: 매크로는 컴파일 시간에 코드를 생성하므로, 런타임 비용 없이 특정 작업을 수행할 수 있습니다.

    주의사항

    매크로는 강력하지만, 남용하면 코드의 가독성과 유지 보수성을 해칠 수 있습니다. 따라서 매크로 사용 시에는 코드의 명확성을 유지하는 것이 중요합니다.

     

     

    아주 완벽한 설명을 내놓는다. 예제도 원래 테스트해보려던 println()을 예제로 보여준다. 아마 이미 작성된 나의 main.rs를 참고한듯.

     

     


     

     

     

    // macro = function that writes code
    
    fn main() {
        println!("Hello, world!");
    }

     


    rust macro를 테스트 하기 위해서는 cargo-expand를 설치해야 한다.

     

    cargo install cargo-expand --locked

     

    그런데.. 여러 모듈을 잘 다운로드 받다가 다음과 같은 에러가 출력되었다.

     

     

    러스트는 위와같이 에러 상황 그리고 원인에 대해 매우 친철하게 알려준다 ( 진짜 구글링을 횟수가 줄어든다 )

    에러메세지는

    Caused by:
      package `clap v4.5.7` cannot be built because it requires rustc 1.74 or newer, while the currently active rustc version is 1.68.2
      Try re-running cargo install with `--locked`

     

    rustc의 버전에 문제가 있었다.

     

    그래서 명렁어 뒤에 --locked 옵션을 추가하여 다시 설치를 시도

     

     

     

    이번에도 모듈들을 잘 내려받다가.. 다시 에러메세지를 출력했다.

     

    요지는 rustc 컴파일러 버전이 현재 낮다는 뜻.. 

     

    cargo-expand의 'home v0.5.9' 패키지는 rustc컴파일러 1.70.0부터 지원된다..!

     

    역시나 너무 친절하다. 

     

    rustc버전을 한번 더 조회해보고 update를 진행하기로 했다.

     

    rustup update

     

    왜 rustc update가 아니냐면, Rust 컴파일러를 업데이트 할때는 Rust 패키지 관리자인 rustup을 사용하는 것이 일반적이기 때문..

     

    rustup에 대한 상세한 내용은 아래 레포지토리를 참고하자

     

    https://github.com/rust-lang/rustup

     

    GitHub - rust-lang/rustup: The Rust toolchain installer

    The Rust toolchain installer. Contribute to rust-lang/rustup development by creating an account on GitHub.

    github.com

     

     

    각설하고, 현재 rustc버전 1.68.2 --> 1.7.90로 업데이트 진행.

     

      stable-aarch64-apple-darwin updated - rustc 1.79.0 (129f3b996 2024-06-10) (from rustc 1.68.2 (9eb3afe9e 2023-03-27))

     

     

    이제 Rust컴파일러를 정상적으로 업데이트 했으니 원래 하려던 작업인 매크로 기능을 다운받자..

     

    다시 터미널에 아래 명령어를 입력.

    cargo install cargo-expand --locked

     

     

    정상적으로 설치되었다면 아래와 같은 화면일 것이다.

     

     

    이제 rust의 macro기능을 사용할 모든 준비가 끝났다...!

     

    cargo expand

     

     

     

     

     

     

    + 추가

    글 작성 이후 좀 더 공부하고 싶어서 아래 블로그를 참고했다. 관련 내용이 잘 정리되어 있다..!

     

    https://velog.io/@peeeeeter_j/Rust-Programming-35

    댓글

Designed by Tistory.