본문 바로가기

보안칼럼정리

왜 프로그래밍 언어를 만드는가

728x90
왜 프로그래밍 언어를 만드는가?
Open Dylan의 A Call For Help를 다른 데서 보고 /r/programming에 없길래 올렸다가 대박을 쳤다. 글도 대강 보고 없어서 올렸는데 반응이 생각 외로 뜨거웠는데, 특히 Dylan이 도대체 무슨 언어길래 upvote는 많은데 댓글이 없느냐는둥, 심지어는 도대체 망한 프로그래밍 언어를 살려 내서 뭘 할 거냐는 내 입장에서는 꽤 짜증나는 댓글까지 있었다. 그래서 여기에 대해서 뻔한 얘기를 다시 함으로써 저널 글 수를 채우도록 하겠다.
왜 프로그래밍 언어를 만드는가? 옛날에 언어 독립적인 라이브러리 설계에 대해서 써 갈겼을 때 어중간하게 언급하고 넘어갔지만, 프로그래밍 언어는 여러 개의 서로 다르고 절대로 무시할 수 없는 네 가지 요소로 이루어져 있다.
문법
뜻(의미론)
라이브러리
커뮤니티
D를 만든 Walter Bright가 최근에 프로그래밍 언어를 만들고 싶은 사람을 위한 글을 썼는데 여기에서도 비슷한 구분선이 그어져 있다. 약간 다른 점이라면 이 사람은 프로토타입 구현체의 중요성을 강조하고(내 분류에서는 1-2-3에 삼등분되어 있다) 그냥 라이브러리 뿐만 아니라 런타임 라이브러리의 중요성을 강조한다는 점 정도. 내 말을 못 믿겠으면 비교적 성공적인 언어를 만들어 낸 Walter Bright의 말을 들으시라. 어차피 다 비슷한 얘기다.
여튼간에 이 네 요소 중 하나라도 마음에 안 들면 프로그래밍 언어를 만들 이유가 생긴다. 물론 새 언어를 만들려면 좀 더 명확한 목표가 필요한게 보통이겠지만. 네 요소 모두 매우 넓은 문제 공간을 가지고 있는데다 서로 다른 조합이 가능하기 때문에 프로그래밍 언어를 만들 이유는 항상 넘쳐 난다.
레딧에서 나는 프로그래밍 언어를 일부러라도 죽이려는 것이 순전히 별로 화자가 없는 자연어를 죽이는 거랑 별반 다를 게 없다는 비유를 했었다. 낚여서 퍼덕인 사람한테는 참 미안한 일이지만(이 사람은 내 답글에 자연어도 그렇게 죽여야 한다고 주장했고 덕분에 바로 플레임이 시작되었다), 이 비유가 사실 좀 문제가 있다는 건 나도 잘 알고 있었다. 그럼 왜 그런 비유를 했는가? 자연어와 프로그래밍 언어는 모두 매우 넓은 설계 공간을 가지고 있고, 설계 공간을 대략적으로라도 다 둘러 보는 것은 매우 중요하기 때문이다. 애당초 우리는 가능한 설계가 뭐가 있는지조차도 다 알지 못 한다.
자연어와 프로그래밍 언어의 결정적인 차이점은, 자연어와는 달리 프로그래밍 언어의 쓸모(utility)는 비교적 정량화가 가능하다는 점이다. 하지만 다르게 말하면, 프로그래밍 언어의 생명력 또한 쓸모에 비례하기 때문에 (그리고 프로그래밍 언어는 자연 발생하지 않기 때문에) 굳이 안 쓰이는 언어를 죽여서 쓸모 있을 수도 있는 언어를 괜히 죽일 이유가 없다. 극단적인 예로, 우리는 위에서 1-2-3번 모두가 꽝이라고 PHP를 미친듯이 욕하지만 사실 PHP는 엄청난 크기의 커뮤니티만으로도 쓸모 있는 언어에 속한다. 우리 맘에 전혀 안 들 뿐. 어떤 언어는 아무도 별로 안 쓰지만 의미론이 특이해서 일종의 틈새시장을 개척하는 경우도 있는데 이 또한 쓸모 있는 언어에 속할 것이다. 실제로 듣도 보도 못한 언어가 전혀 생각지도 못 한 분야에서 여전히 쓰이고 있는 걸 종종 볼 수 있다. MUMPS라거나…
간혹 모든 설계 공간을 다 커버할 수 있는 궁극의 프로그래밍 언어를 만들자는 얘기를 하곤 한다(레딧에서도 나왔다). 이 주장은 두 가지 면에서 설득력이 떨어지는데, 우선 거기에 가까운 언어가 실제로 존재하고, 설령 그런 언어가 존재한다 하더라도 결국 설계 공간의 일부분에 특화된 방언(dialect)이 곧 언어의 역할을 할 것이라는 문제가 있다. 리스프 계열 언어를 잘 모르는 사람들은 왜 리스프 계열 언어들이 순전히 키워드 좀 바꾸고 매크로 좀 바꿔서 새로운 “언어”를 만들었다고 말하는 건지 이해하지 못 하는 경향이 있는데(예를 들어서 Arc 따위), 실은 리스프 계열이 새로운 언어를 만드는데 특화된 언어이기 때문에 그렇다. 이런 상황에서는 궁극의 언어를 만들어도 그 안에서 새로운 언어들이 튀어 나와서 정확히 똑같은 상황이 될 것이다. 이를테면 리스프나 스킴을 쓰는 모든 사람들이 call/cc를 사용하는 건 아니지 않겠는가?
그래서 프로그래밍 언어가 계속 만들어져 왔으며, 앞으로도 계속 만들어져야 할 이유는 자연어와 프로그래밍 언어의 공통점에서 찾을 수 있다. 우리는 이 분야가 얼마나 넓은지 모른다. 자연어를 보존하고(혹은 인공어를 만들어 내고), 프로그래밍 언어를 만드는(그게 설령 난해한 프로그래밍 언어일지라도) 사람들은 모두 그 넓은 분야를 여기 저기 들쑤시면서 뭔가 쓸만한 게 없는지 기웃거리는 탐험가에 가깝다. 그들은 우리가 알고 있는 조그마한 집합(그게 자연어든 프로그래밍 언어든간에)에서 나와서 새로운, 어쩌면 더 나을 수도 있는 선택을 고민할 수 있게 해 주는 고마운 이들이다. 그게 내가 레딧에서 이런 이들을 모독하는 사람들을 참지 못 했던 이유였다.
728x90