# Rust에서 관련 코드에 집중하도록 도와주는 Flowistry IDE 플러그인

> Clean Markdown view of GeekNews topic #23759. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=23759](https://news.hada.io/topic?id=23759)
- GeekNews Markdown: [https://news.hada.io/topic/23759.md](https://news.hada.io/topic/23759.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-10-20T00:33:16+09:00
- Updated: 2025-10-20T00:33:16+09:00
- Original source: [github.com/willcrichton](https://github.com/willcrichton/flowistry)
- Points: 3
- Comments: 1

## Topic Body

- **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 언어의 학습, 리팩토링, 코드 리뷰 등 다양한 상황에서 높은 활용도와 효율성을 기대할 수 있음.

## Comments



### Comment 45140

- Author: neo
- Created: 2025-10-20T00:33:18+09:00
- Points: 1

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

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

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

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

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

* 저자가 Rust East Coast에서 [플러그인과 루틴 연구에 대해 깊게 다룬 발표 영상](https://youtu.be/aYmuMlzvjvc)을 선보였음

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

  * (작성자임) 그래서 Rust를 선택해 만들었고, 다른 언어에서 이렇게 구현하기 어려운 이유임

* TypeScript나 JavaScript에서 이와 비슷한 도구가 있는지 궁금함

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

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

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

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

* rust-analyzer의 documentHighlight LSP 메서드에 기여하는 방법은 어땠는지 궁금함  
GIF에서 보여주는 기능과 상당히 비슷하게 동작함  
플러그인으로 만들기엔 너무 구체적 기능인 것 같음  
[관련 LSP 명세 링크](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_documentHighlight)

  * README에서 설명됨, 자세한 내용은 [여기](https://github.com/willcrichton/flowistry#why-isnt-flowistry-part-of-rust-analyzer)서 볼 수 있음

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

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

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