# 구문을 이해하는 구조적 차이 분석 도구 'Difftastic'

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

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=13933](https://news.hada.io/topic?id=13933)
- GeekNews Markdown: [https://news.hada.io/topic/13933.md](https://news.hada.io/topic/13933.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-03-22T09:56:07+09:00
- Updated: 2024-03-22T09:56:07+09:00
- Original source: [difftastic.wilfred.me.uk](https://difftastic.wilfred.me.uk/)
- Points: 3
- Comments: 1

## Topic Body

### Difftastic 구조적 차이 도구

- **Difftastic**은 구문을 이해하는 CLI 차이 도구로, 파일을 줄 단위가 아닌 구문 기반으로 비교함.
- 사람이 읽기 쉬운 정확한 차이점을 제공함.

### 실제 변경된 내용 이해

- Difftastic은 tree-sitter를 사용하여 코드를 파싱함.
- 줄 기반 텍스트 차이와 달리, 내부 표현이 변경되지 않았음을 이해함.

### 서식 변경 무시

- 코드 포매터가 여러 줄로 나누기로 결정했을 때, 실제로 변경된 내용만을 보여줌.

### 감싸기 변경 시각화

- 래퍼를 추가했을 경우, Difftastic은 정확히 구분자를 일치시킴.
- 내부 내용을 변경하더라도 추가된 래퍼를 보여줄 수 있음.

### 실제 줄 번호

- 파일의 실제 줄 번호를 변경 전후로 모두 보여줌.

### 60초 데모

### 프로그래밍 언어 지원

- C++, C#, Clojure, Dart, Erlang 등 다양한 언어 지원.
- 자세한 지원 언어 목록은 매뉴얼에서 확인 가능.

### 파일 형식 지원

- HCL, HTML, JSON, YAML 등 다양한 파일 형식 지원.
- 자세한 지원 파일 형식 목록은 매뉴얼에서 확인 가능.

### Git과 호환

- Git 설정 지침은 매뉴얼에서 확인 가능.

### 완전 오픈 소스

- Difftastic은 MIT 라이선스를 가짐.
- 다운로드, 수정, 친구들과 공유 가능.

### 제작자

- Wilfred Hughes가 Emacs와 커피를 마시며 만듦.

### GN⁺의 의견

- Difftastic은 코드의 구조적 차이를 파악하여 개발자들이 변경 사항을 더 명확하게 이해할 수 있게 도와줌.
- 기존의 줄 기반 diff 도구들과 비교했을 때, Difftastic은 코드의 구문을 이해하고 서식 변경을 무시하는 등의 기능으로 더 정교한 비교가 가능함.
- 오픈소스 도구로서, 커뮤니티의 기여를 통해 지속적으로 개선될 가능성이 있으며, 사용자가 필요에 따라 자유롭게 수정하고 확장할 수 있는 장점이 있음.
- 비슷한 기능을 제공하는 다른 도구로는 Git의 내장 도구인 `git diff`나 JetBrains의 IntelliJ IDEA와 같은 IDE의 내장 비교 도구가 있지만, Difftastic는 구문 기반 비교라는 독특한 접근 방식을 제공함.
- Difftastic을 도입할 때는 지원하는 프로그래밍 언어와 파일 형식을 확인하고, 팀 내에서의 도구 사용에 대한 합의가 필요할 수 있음. 이 도구를 사용함으로써 코드 리뷰의 효율성을 높이고, 협업 과정에서의 오해를 줄일 수 있는 장점이 있음.

## Comments



### Comment 23921

- Author: neo
- Created: 2024-03-22T09:56:07+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=39778412) 
- Tree-sitter 기반 기술 소개
  - Tree-sitter는 코드를 AST(Abstract Syntax Tree, 추상 구문 트리)로 변환하고 이를 에디터나 diff 도구 같은 클라이언트에 제공하는 표준 인터페이스를 제공함.
  - 이를 통해 도구들은 수십 개의 언어를 직접 지원할 필요 없이 Tree-sitter를 지원함으로써 자동으로 Tree-sitter가 지원하는 모든 언어를 다룰 수 있음.
  - 새로운 언어 개발 시 Tree-sitter 파서를 만들면 Tree-sitter를 지원하는 모든 도구가 해당 언어를 지원하게 됨.
  - 이러한 혁신은 다양한 언어를 지원하는 도구 개발에 있어 중복 작업을 줄이고 향상된 도구 생태계를 만들어내는 중임.

- Rust 프로젝트 및 도구 업데이트 방법
  - Rust 기반의 프로젝트들을 cargo를 통해 설치하고 업데이트하는 방법을 제시함.
  - `mise-en-place`는 `asdf`의 대체제로 빠르고 유연함.
  - `zoxide`는 `cd` 명령어의 대체제로, 사용자가 이동한 디렉토리를 기억하고 부분 일치 검색을 통해 빠르게 이동할 수 있게 함.
  - `dust`는 `du`의 보완 도구로, 가장 많은 디스크 공간을 사용하는 디렉토리를 보여줌.

- Difftastic 사용 경험 및 의견
  - Difftastic를 사용한 경험을 공유하며, 다른 diff 도구를 사용할 때 불편함을 느낀다고 언급함.
  - 구문이 변경되어도 의미는 동일할 때를 비교할 수 있는 'semantic' diff 도구에 대한 가능성을 탐구함.

- Difftastic의 편리성
  - Difftastic가 실제 파일의 줄 번호를 보여주는 기능을 강조하며, git diff와 함께 사용 시 매우 유용함을 언급함.

- 관련 도구: diff2html
  - diff2html은 CLI(Command Line Interface)를 통해 HTML 형식의 diff를 브라우저 탭에서 보여주는 도구임.

- Augeas 라이브러리 사용 경험
  - Augeas 라이브러리를 사용하여 설정 파일의 차이를 감지하고, 사용자가 구문에 민감하지 않은 세밀한 허용 목록을 작성할 수 있게 한 경험을 공유함.

- Semantic Merge와 비교
  - Semantic Merge는 오픈 소스가 아니었지만, Difftastic는 오픈 소스이며 더 나은 diff를 제공함.
  - Difftastic를 merge 기능으로 확장할 계획이 있는지에 대한 궁금증을 표현함.

- icdiff로의 복귀
  - Difftastic를 시도했지만, 변경되지 않은 부분에 대해 이상한 포맷팅을 적용하는 등의 문제로 인해 icdiff로 돌아갔다는 의견을 제시함.

- Difftastic의 시각적 문제
  - 큰 XML 파일을 검사할 때 수정된 라인과 속성을 시각적으로 구분하기 어려움을 지적하며, 스타일 변경 방법에 대한 문서화가 필요함을 언급함.

- Difftastic의 설치 크기
  - Arch Linux 패키지의 크기가 7MB이지만 설치 시 80MB로 증가하며, `difft` 바이너리 자체가 78MB임을 언급함.
  - LZ4 압축을 사용하는 ZFS 데이터셋에서는 17MB로 표시되며, 압축 가능한 내용을 바이너리에 포함시키지 않은 이유에 대한 의문을 제기함.
