메아리 저널

연구실 워크샵 다음에 바로 주말이어서 아무 생각 없이 놀고 있다…라기보다는 그냥 멍하니 있는 것 같다. 어제는 거의 잠만 잔 것 같다. 너무 게을러지면 안 되는데. 게을러지지 말자는 뜻에서 글이나 하나 써 보기로 한다.


프로그래밍 언어를 만든다고 하면 보통 기존에 있는 프로그래밍 언어 중 원하는 기능을 제공하는 게 없거나 있더라도 안 좋아서 새로 만드는 것이 보통이다. 이를테면 C++는 C에서 객체지향 기능을 제공하기 위하여 처음 만들어졌고 자바는 “한 번 짜고 어디서나 돌린다”라는 철학을 실현하기 위하여 설계되었으며 C#은 자바의 대항마로 자바의 실수를 피하는 방향으로 설계되었고 D는 C++의 “C와 호환된다”는 설계 철학이 애당초 말이 안 된다고 생각해서 만들어졌다든지 하는 얘기다. 나도 대부분의 언어들에 대해 그런 아쉬운 점들이 좀 있는데 그 중 하나가 조화이다.

프로그래밍 언어는 그 종류에 따라서 여러 가지로 구분되는데, 이를테면 명령형 대 함수형이라거나 정적 타이핑 대 동적 타이핑이라거나 그런 것들이 있다. 그리고 다들 아는 사실이지만 하나의 분류에만 속하는 언어가 모든 작업에 적절한 언어는 아니다. 예를 들어서 컴파일러를 만든다고 하면 AST를 직접적으로 다루고 자료구조의 선언이 더 쉬운 함수형 언어가 강점이 될 수 있다. 물론 다른 방향으로 생각하면, 컴파일러가 적절한 시간 안에 적절한 최적화를 뽑아 내는 게 목표라면 그 수행 속도를 예측하기 힘든 함수형 언어가 오히려 짐이 될 수도 있다. 그렇다고 두 개의 서로 다른 패러다임을 가진 언어를 갖다 붙인다? 물론 이것도 가능한 시나리오지만 사람들을 귀찮게 하는 데는 이만한 전략도 없는 듯 하다. (파이썬처럼 이 쪽에 좀 더 신경을 써서 접합하기 쉽게 하는 언어들[glue language]도 있긴 한데… 그래도 귀찮다.) 종종 귀찮게 하는 수준이 아니라 사람을 잡는 경우 — SQL을 예로 들면 임피던스 불일치(impedance mismatch)라고 하는 것들 — 도 있다.

그래서 내가 정한 새로운 프로그래밍 언어의 목표는 서로 다른 패러다임을 하나로 조화시켜 하나의 언어로 만들어 내는 것이다. 이런 시도가 물론 적지는 않다. 이를테면 함수형 언어들이 모나드니 unique type이니 하는 것을 넣는 이유는 순전히 함수형 프로그래밍이라는 패러다임 아래에서 명령형 프로그래밍이 어쨌든 필요하니까 그걸 함수형 패러다임 상에서 지원하기 위한 고민의 결과물일 것이다. 사실 함수형 언어와 명령형 언어들 사이의 접합은 역방향으로도 많이 시도되어서 내가 고민할 이유는 이제 크지 않은 것 같다. (C++에 익명 함수 문법이 들어 가는 시대인데 뭘 고민하랴!) 대신 내가 주목했던 것은 명령형 패러다임을 가정하고, 정적 언어와 동적 언어를 합쳐 보는 것이었다. “정적·동적 타이핑”이라고 안 썼는데, 왜냐하면 이 문제는 단순히 타입 추론(type inference)만 된다고 해결되는 것이 아니기 때문이다 — 동적 언어는 실행 시간에 할 수 있는 것이 정적 언어에 비해서 많고, 따라서 빠른 개발에 알맞지만 정적 언어가 제공하는 컴파일 시간에 가능한 여러 분석들, 대표적으로 컴파일 시간 타입 체크를 일정 부분 포기하는 것이다. 정적인 언어에 동적인 기능을 넣는 시도는 여럿 있었지만 (이를테면 자바에서 클래스 파일 검증하고 이런 것들) 보통 언어 외적인 부분들을 많이 건들기 때문에 자연스럽다고 생각하진 않는다. 그래서 두 종류의 언어의 장점을 제대로 살릴 수 있는 언어가 필요하다고 느끼게 된 것이다. 뭐 생각해 보면 내가 자주 쓰는 언어가 파이썬 아니면 C/C++인데 이 결론이 안 나오는 게 이상한 건가 (…)

뭐… 그렇게 해서 초창기에는 “그냥 내 언어를 만들어 보자”라는 목표를 가지고 있던 나루 프로그래밍 언어의 목표가 후에 좀 수정이 된 것이다. 이 접근의 장점은 내가 무슨 목표를 가지고 있는지 분명해져서 어느 쪽을 들여다 봐야 하는지 확실해졌다는 것이고, 단점은… 목표가 너무 분명해져서 가능한한 신중을 기하다 보니 개발이 더디다. 세상 일 다 이런 거지 뭐.


노트들

  1. arachneng posted this
텀블러를 씁니다.