1P by GN⁺ 7시간전 | ★ favorite | 댓글 1개
  • Flowistry는 Rust 언어용 IDE 플러그인으로, 현재 집중하고자 하는 코드에 연관된 부분만 보여주는 기능을 제공함
  • 이 플러그인은 Rust 코드 내 정보 흐름을 분석해, 현재 보고 있는 변수나 표현식과 직접적으로 연결된 코드만을 시각적으로 강조함
  • VSCode 플러그인 형태로 쉽게 설치할 수 있으며, 선택한 변수에 영향을 주거나 영향을 받는 코드만 밝게 표시함
  • "Focus mode" , "mark 설정" 등 다양한 기능을 통해 대규모 함수나 복잡한 코드의 이해도를 높임
  • 내부 변경 가능성 처리 미흡, 분석 범위 제한 등 한계가 있지만 발전 중이며, Rust Analyzer와는 별개의 도구임

Flowistry 개요 및 중요성

Flowistry는 Rust 개발자를 위한 IDE 플러그인으로, 코드 내에서 현재 집중하고자 하는 부분과 관련된 코드만을 부각시켜 보여주는 도구임. 대규모 함수나 복잡한 코드 흐름 속에서 필요한 부분을 빠르고 명확하게 파악할 수 있도록 돕기 때문에, 다른 정적 분석 도구와 차별화된 실용적인 가치를 제공함. 핵심 기술은 정보 흐름 분석이며, 이는 프로그램 내에서 한 코드가 다른 코드에 영향을 미칠 수 있는 경로를 파악하는 데이터 흐름 분석 방식임. Flowistry는 이러한 정보 흐름 분석을 Rust 언어의 특성과 소유권/수명 시스템, Rust MIR(Mid-level Intermediate Representation) 기반으로 제공함.

주요 기능 및 작동 방식

  • Rust 코드 내에서 특정 변수나 표현식을 클릭하면, 해당 부분에 영향을 주거나, 영향을 받지 않는 코드를 흐리게 처리함
  • 직관적으로 관련 코드만을 강조하여, 불필요한 코드 읽기를 줄이고, 빠르게 코드의 핵심 흐름을 파악할 수 있음
  • 대규모 함수나 Rust 컴파일러의 실제 함수와 같은 복잡한 코드 내에서, 특정 인자가 어떠한 역할을 하는지 한눈에 확인 가능함
  • 분석의 기반이 되는 알고리듬은 PLDI 2022에 출판된 'Modular Information Flow through Ownership' 논문에 기반함

설치 및 환경 지원

IDE 플러그인 설치

  • Flowistry는 VSCode 플러그인으로 Visual Studio Marketplace 또는 Open VSX Registry에서 설치 가능
  • Rust 워크스페이스를 연 후 자동으로 설치 및 초기화가 진행됨
  • NixOS는 미지원이며, ARM(M1 Mac 등) 플랫폼에서는 소스에서 직접 빌드해야 함

Rustc 플러그인

  • 정보 흐름 분석 기능 자체를 별도의 crate로 공개 중이며, 자세한 문서 및 API도 직접 제공함

사용 방법 및 기능 상세

초기 실행

  • VSCode에서 플러그인 실행 시, 코드베이스 전체의 타입 검사가 선행됨
  • 이 결과는 target/flowistry 폴더에 캐시됨

Focus Mode 진입

  • 플러그인의 "Toggle focus mode" 명령(Ctrl+R Ctrl+A 등)을 사용해 집중 모드 진입
  • 커서를 함수 내에 두면 해당 함수 내에서 자동으로 정보 흐름 분석이 실행됨
  • 플러그인이 분석을 완료하면, 관련된 코드만이 강조 표시됨(분석에는 최대 15초 정도 소요 가능)

Mark 설정

  • 특정 포커스 영역을 고정하고 다른 코드를 검토할 때, "Mark" 개념을 활용해 현재 영역을 유지할 수 있음
  • "Set mark"(Ctrl+R Ctrl+S), "Unset mark"(Ctrl+R Ctrl+D) 등으로 고정/해제 가능

Focus 영역 선택

  • "Select focused region" 명령을 사용하면, 강조된 코드 블록 전체를 한 번에 선택하여 복사, 주석 처리 등 수정이 가능함

한계점 및 유의사항

  • 내부 변경가능성(Interior Mutability)을 완전하게 지원하지 않음
    • 예: Arc, Mutex 등 구조체의 경우 참조간 lifetime 차이로 인해 완전한 추적 불가
  • 포커스 영역이 때로 예상보다 넓어질 수 있음
    • called function의 내부까지 실제로 분석하지 못하기 때문임
  • 선택 불가능한 코드가 있음
    • MIR 수준에서 Source 코드와의 맵핑 한계 때문에 모든 코드가 선택 불가능함
  • 함수 중첩, 클로저, async 등은 함께 분석하지 못함
    • 항상 현재 커서가 속한 가장 작은 함수 단위로만 분석이 이뤄짐

FAQ 및 기타

  • rustup 설치 실패 시: rustup을 수동으로 명령어로 설치 후 VSCode에서 계속 진행해야 함
  • Rust Analyzer와 통합되지 않은 이유: Rust Analyzer는 MIR 분석 및 borrow checker 미지원으로, 별도의 플러그인 형태임
  • 코드 하이라이트 관련 문제: 한계점 문서 참고, 추가 문의는 Github 이슈, Discord, Twitter로 가능함

라이선스 및 오픈소스 정보

  • MIT 라이선스로 공개
  • 주요 프로그래밍 언어는 Rust, TypeScript, 그 외 Python, HTML, JavaScript 등
  • 현재(2025년 9월 기준) 2.6k stars, 61 forks를 보유하며 활발하게 개발 및 유지 관리 중임

결론

Flowistry는 Rust 개발 환경에서 복잡한 코드의 맥락 파악과 집중력 향상에 실질적으로 큰 장점을 제공하는 오픈소스 도구임. 특히 정보 흐름 분석을 실시간으로 IDE에 통합하여 시각적으로 제공한다는 점에서, 기존의 정적 분석 도구나 Rust Analyzer와 차별화된 경험을 제공함. Rust 언어의 학습, 리팩토링, 코드 리뷰 등 다양한 상황에서 높은 활용도와 효율성을 기대할 수 있음.

Hacker News 의견
  • 실제 논문은 여기임, Rust에서 정적으로 체크되는 back-reference에 대해 오랜 시간 동안 고민 중임, C/C++ 사용자들이 Rust에서 불만을 가지는 큰 이유 중 하나가 A가 B를 참조할 때 B에서 A로 다시 포인터를 갖기 어렵다는 점임, 그래서 대부분 위험한 우회법이 쓰이곤 함
    Rust에서 Rc, RefCell, Weak, borrow(), borrow_mut(), upgrade(), downgrade() 등을 쓰면 안전하게 구현 가능하지만, 코드가 장황해지고 런타임 오버헤드가 생기며, 이중 borrow에서 패닉이 발생하는 경우도 있음, 그래도 표현력은 충분함, 현재 진행 중인 작업에 노트를 정리해둠
    정적 체크가 어려운 부분은 차용(borrowed) 범위가 겹치지 않는지를 확인하는 것인데, 라이프타임 스코프가 겹치지 않으면 충돌 없음, 함수 호출이나 제네릭 함수 호출 시 스코프 체크가 더 까다로움, Flowistry의 접근법이 도움이 될 수 있음
    Flowistry가 interior mutability(RefCell 등의 내부 변경)를 완전히 다루지 않는다는 점이 신경 쓰임
    실전에서는 1) sound함, 2) 컴파일 타임에서 비용 적게 체크 가능함, 3) 트리의 부모 노드 참조 등 대부분 사람들이 필요한 back pointer 사용 가능함, 4) 문제 발생 시 유용한 진단 메시지 제공함 같은 조건을 만족하는 제약 조건을 찾는 것이 핵심임

  • 다른 언어에서 함수 본문 내 좀 더 크거나 비공식적인 의존 관계를 체크하는 기능이 있는지 궁금함
    예를 들어 파라미터나 변수 foo를 하이라이트하면 foo 자체 사용뿐 아니라 foo로부터 만들어진 모든 변수의 사용까지 한 번에 볼 수 있는지 알고 싶음
    Rust의 borrow 사용은 이런 종류의 추적을 완벽하게 하지만, 이런 시각화는 다른 언어 코드에도 매우 유용할 듯함
    Flowistry는 servo의 flexbox 레이아웃 코드처럼 유지 보수가 어려운 현대 코드베이스 파일에 매우 필요할 거라 생각함, 참고로 이 함수는 400라인이 넘는 가장 난감한 코드 파일 중 하나임

    • (제가 틀릴 수 있지만) 일반적으로 이런 걸 "flow analysis"라고 부르며, TypeScript는 이걸 백그라운드에서 실행해서 타입을 세분화함
      근데 시각화 기능은 없음

    • 이런 기능은 일반적으로 "program slicing"이라고 부름

  • 인간이 읽기 쉽게 최적화한 스타일로 코딩하지 않을 때, 이를 보완해주는 매우 유용한 도구라 생각함
    베이스 코드가 항상 읽기 좋게 작성된 게 아니기 때문에 이런 툴이 큰 도움이 된다고 느끼는 중임

  • 저자가 Rust East Coast에서 플러그인과 루틴 연구에 대해 깊게 다룬 발표 영상을 선보였음

  • 정말 멋진 기능이라 생각함, Rust가 이런 기능에 적합한 이유가 소유권 시스템 덕분에 부수효과가 제한되어 있음임
    Python 등에 이런 걸 붙여도 런타임에서 언제든 콜스택을 올라가 메모리 조작이 가능하니 100% 신뢰할 수 없음
    그래도 대부분의 경우 올바르니 이런 기능이 추가되는 걸 희망함

    • (작성자임) 그래서 Rust를 선택해 만들었고, 다른 언어에서 이렇게 구현하기 어려운 이유임
  • TypeScript나 JavaScript에서 이와 비슷한 도구가 있는지 궁금함

  • 멋있어 보이지만 굳이 'IDE'라고 하지 말고 그냥 VSCode 플러그인이라 하면 좋았을 것 같음

    • 아마 "Visual Studio Code"가 마이크로소프트 상표이기 때문임, 플러그인은 VSCodium, Cursor 등 오픈소스 기반 IDE 전반에서 동작함

    • 문서에도 IDE 플러그인이라고 명시되어 있음

  • 코드의 중요한 부분으로 초점을 맞추는 아이디어가 정말 좋은 듯함
    JS/TS에도 이와 비슷한게 있는지 궁금함

  • rust-analyzer의 documentHighlight LSP 메서드에 기여하는 방법은 어땠는지 궁금함
    GIF에서 보여주는 기능과 상당히 비슷하게 동작함
    플러그인으로 만들기엔 너무 구체적 기능인 것 같음
    관련 LSP 명세 링크

    • README에서 설명됨, 자세한 내용은 여기서 볼 수 있음

    • MIR(Mid-level Intermediate Representation)이 필요함

  • 항상 이런 기능을 꿈꿨고, 함수 외부(이 함수를 누가 호출하는지)에서 데이터가 흘러오는 경로까지 보여주는 기능이 있었으면 했음
    컴파일러의 데이터를 재사용해서 이런 걸 도울 수 있지 않을까 생각함

    • 관련 발표에서 들은 바로는, 컴파일러 데이터를 이미 사용하고 있는 것 같음