AST diff? – 홍민희의 트윗글로부터

홍민희트윗글에서 본 내용인데:

텍스트 파일로 쓰인 소스 코드는 AST의 직렬화일 뿐인데 그걸 왜 사람이 편집하냐, 편집기가 AST 자체를 다루면 되지 않냐는 얘기는 전부터 많았다.

그런데 Rust 쪽의 “언어 생소함 예산” 관점에 따르면 새로운 언어는 혁신하려는 아주 적은 양의 생소함만을 지니고 있지 않으면 진입 장벽 때문에 사람들이 외면해서 망해버린다.
http://words.steveklabnik.com/the-language-strangeness-budget

따라서 AST 수준에서 편집하는 편집기와 언어라는 개념을 실현시키려면, 딱 그 아이디어 말고 다른 부분에서는 혁신을 포기해서 원포인트 혁신을 한 뒤에, 다른 종류의 혁신은 이후의 다른 언어에게 양보해야 한다.

그런데 애초에 그런 아이디어에 매료된 사람들은 야심이 있는 사람들이기 때문에 보통은 이것저것 평소에 프로그래밍 세상에 있던 불만들에 대한 아이디어를 다함께 버무려서 일거에 많은 것을 혁신하고 싶어하기도 한다. 그러면 망하는 지름길…

그런 반면 “코딩 스타일 차이로 인한 어려움”은 혁신의 어려움에 비해서 불편함은 다른 언어적 불편에 비하면 사소한 수준이라 그럭저럭 참고 쓸 수 있고. 그래서 나는 똑똑한 사람들의 “야심의 방향”으로 삼기에 작은 목표라서 혁신이 잘 안된다고 생각.

나는 AST 편집기라는 아이디어보다는 차라리 AST diff 아이디어가 더 불편한 것을 직접적으로 고치는 방식이고 퍼뜨리기도 비교적 쉽기 때문에 훨씬 먼저 달성되지 않을까 기대한다.

그러고 나면 각자 개발 환경에서 각자 취향대로 소스 코드를 포매팅하고 살아도 서식 문제로 버전 관리 시스템에서 충돌이 나지 않게 되기 때문에 점차 코딩 스타일의 차이 자체가 큰 문제가 되지 않는 방향으로 문화가 흐르지 않을지.

처음엔 격하게 공감했는데, 다시 생각해보니 문제점이 있었다.

텍스트 diff 가 쉬운 원인은 텍스트가 어의(Syntax)상으로는  구조가 있을지 몰라도 형식상으로는 리니얼하기 때문이다(다시말해 직렬화 되어있기 때문이다). AST 로 되어버리면 비교가 어려운 일이 된다.

비교가 됐다고 한들 diff 내용을 보여주기 위해서는 또 직렬화가 필요하다. 물론 직접 벡터 그림으로 보여주는 방법도 있지만, 요즘은 벡터 그림도 다 텍스트로 표현하지 않는가 – SVG, Graphviz, PostScript, Processing, etc. (PDF 는 잘 모름.) 게다가 모든 것을 CLI / TLI 에서 하는 Emacs 파(Linus Torvalds)도 고려되어야 한다. Visual Studio 식의 툴인들, 내부적으로는 텍스트로 표현할게 아닌가(Visual Studio 의 프로젝트 파일이 XML 이듯이). 어쨌거나 이 다시 직렬화 해야 하는 문제는 그냥 하면 된다. 큰 문제가 아니긴 하다.

내가 생각해낸 아이디어

C++ 과 Go 언어 사이에 AST diff 할 니즈는 크지 않다. 버전 컨트롤 시스템은 거의 같은 언어를 두고 diff 체크 한다.

따라서 커밋 / 푸시 할 때 go formatter (“gofmt”, or “go fmt”) 같은 툴들이 컨벤션을 통일시켜준다면, 로컬에서 “나만의” 포매팅을 유지하고 싶으면 go formatter 같은 툴에 역운산 (reverse operation) 기능을 구현하되 그 역운산을 파일로 기록하는 장치만 만들면 될 것이다. 이 역운산 역시 text diff 기능을 통해 구현할 수 있으므로 어렵지 않을 것이다. (Git 의 reverse commit 기능을 생각하라)

C++ 에도 같은 효과를 얻고 싶으면 go formatter 의 C++ 버전을 만들면 된다. 다른 언어도 마찬가지.

이게 여태까지 구현되지 않은 원인은 (있는데 내가 모르는 것인가?) 단지 세가지 원인때문이라고 생각한다.

  1. go formatter 같은 툴들에 대해 사람들이 이미 “짱좋아” 단계에 처해있기에. (“아 결정 안해도 되” 의 결정장애 탈출 효과.) 또는 go formatter 같은게 있는지 몰라서.
  2. 흔히 사용되는 VCS 에 플러그인을 구현해주거나, 또는 ‘표준’ VCS 들을 툴로 래핑해서 사용해야 하는 번거로움?
  3. 그다지 필요하지 않아서?

결론

나도 잘 모르겠음. 많은 피드백을 환영한다.

 

Advertisements

댓글 남기기

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s