컴퓨터 언어가 일상 언어와 비슷한 점은 끊임없이 진화한다는 것이다. 다만 프로그래밍 언어의 진화에서만 볼 수 있는 요소는 명확한 '분기'다. 즉, 공식적으로 줄기에서 갈라져 나오고 뿌리에서 이탈할 수 있는 부분이다. 일시적으로 분기가 일어났다가 새로운 가지로 재결합되어 역으로 뿌리에 영향을 미치는 경우도 있거나 기존 언어에서 변형이 나와 그대로 유지되는 경우도 있고, 돌연변이가 발생하여 완전히 새로운 언어가 생겨나기도 한다.
혁신에 대한 욕망뿐만 아니라, 모든 개발 언어가 언젠가는 그 한계를 드러낸다는 점 때문에 컴퓨터 언어를 바꾸는 원동력이 되기도 한다. 이러한 필수불가결한 진화의 흐름에 따라 사용자들은 언어를 개선하거나 이를 버리고 아예 다른 길을 선택하고는 한다.
언어가 분기하여 진화하는 경로는 대부분 다음 세 가지 가운데 하나에 해당된다.
1. 완전한 새로운 분기 언어. 기존 언어와 호환되지 않을 수 있다.
2. 뿌리 언어(기존 언어)로 컴파일되는 새로운 언어
3. 기존 언어에 기능이 추가되거나 제거된 확대집합 또는 하위집합
지금 진화 중인 언어 중에서 각 방식의 구체적인 예를 살펴보도록 하자.
1 - 새로운 언어: PHP와 핵(Hack)
PHP의 인기는 PHP 언어에 있어 양날의 칼과 같다. PHP로 개발된 애플리케이션은 어떤 환경에서든 실행이 보장된다는 장점이 있다. 나쁜 점으로는 PHP에는 이해할 수 없는 몇 가지 특성과 내부적인 비일관성이 있는데, 기존에 개발된 방대한 PHP 코드와의 하위 호환성이 깨질 우려로 인해 수정될 가능성이 별로 없다.
이때 등장한 것이 페이스북의 핵 언어다. 핵은 PHP의 변형으로, 페이스북이 방대한 규모로 이 언어를 사용하면서 부상했다. PHP와 상호작용하도록 설계되었지만, 형식 주석, 자바스크립트와 유사한 람다, 자바/C#과 유사한 제네릭 등 PHP가 제공하지 않는 다양한 기능들로 무장했다.
핵이 PHP에 가한 변화는 언어 분기가 어떤 면에서 좋은지를 잘 보여준다. 즉, 조정 위원회나 관할 기구의 승인을 기다릴 필요 없이 큰 변화를 바로 구현할 수 있다. 최근 PHP에도 형식 힌트에 대한 제안이 통과되었지만, 이 안이 실제 언어에 구현되기까지는 한동안 시간이 걸릴 것이다. 물론 실제 코드에 활용되는 것은 더 나중 일이다. 핵에서는 그 기능을 지금 바로 사용할 수 있다.
분기 언어의 단점은 하위 호환성이 확보되지 못할 가능성이 높다는 점이다. 따라서 뿌리 언어를 사용하는 코드는 작동하지 않을 수도 있다. 핵은 가상 머신인 HHVM에서 실행하는 방법으로 부분적으로나마 이 제약에 대한 해법을 제공한다. HHVM은 PHP를 지원하여 두 언어를 동일한 인터프리터에 나란히 구축할 수 있게 해준다. 이 방법으로 기존 PHP 코드베이스를 새로운 핵 코드베이스와 함께 사용할 수 있다. 새 코드가 많이 사용되면서 기존 코드는 서서히 도태된다.
2 - 뿌리 언어로 컴파일되는 언어: 자바스크립트와 그 변형
언어 자체를 변형하지 않고 언어의 분기를 만드는 방법은? 뿌리 언어로 컴파일되는 새 언어를 만드는 것이다. 프로그래머는 기존 언어의 제약(일반적으로 구문)으로부터 자유롭다.
자바스크립트와 그 파생 언어가 가장 두드러진 예다. 중심에 자바스크립트를 사용하는 새로운 언어는 자바스크립트를 언어에 변경을 가하고 새 인터프리터나 컴파일러를 만드는 것이 아니라, 단순히 자바스크립트로 컴파일되고 기존 엔진 위에서 실행된다. 커피스크립트, 타입스크립트를 비롯해 많은 언어가 여기에 해당된다.
왜 이런 방식을 택하는가? 첫째, 완전히 새롭게 만드는 것보다는 기존 언어의 도구 체인을 활용하는 편이 더 쉽다. 자바스크립트의 경우 기존 컴파일러의 속도가 큰 이점이다. 새 언어의 구조체를 자바스크립트의 구조체로 맵핑하는 오버헤드조차 그다지 부담스럽지 않다.
자바스크립트는 어떤 면에서는 스스로를 분기하는 용도로도 사용된다. 바벨(Babel)과 같은 도구를 사용하면 자바스크립트 6의 기능을 버전 5로 하위 이식할 수 있다. 이 방법으로 프로그래머는 브라우저 수준 지원을 계속 구현하거나 개선하면서 지금 바로 미래의 언어 기능을 활용할 수 있다.
이러한 언어의 ‘트랜스파일’ 버전을 사용하는 데 따르는 잠재적인 단점 중 하나는 디버깅 방식이다. 자바스크립트를 보면 대부분의 트랜스파일러는 소스 맵을 생성한다. 소스 맵은 생성된 자바스크립트를 원래의 소스와 짝짓는 데 사용 가능하며 실제로 커피스크립트에서 이것이 가능하다. 다만 이 방법에는 제약이 있다. 예를 들어 디버깅할 때 트랜스파일된 변수 이름은 조회할 수 있지만 원래의 변수 이름을 조회할 방법이 (아직은) 없다.
3 - 하위집합과 확대집합: 파이썬
세 번째 언어 변형은 성능을 높이거나 특정 문제를 해결하기 위해 탄생하는 언어의 하위집합(언어의 축소 버전)이다. 모질라의 asm.js는 자바스크립트의 하위집합으로, C/C++ 프로그램을 컴파일할 수 있다. 큰 인기를 자랑하는 파이썬에도 많은 하위집합이 있다.
파이썬의 하위집합은 일반적으로 파이썬 성능 문제를 해결하는 것을 목표로 한다. 기능을 줄이는 만큼 최적화하기도 더 쉽기 때문이다. 파이파이(PyPy) 파이썬 구현에 사용되는 언어인 R파이썬은 “정적 분석에 적합한 파이썬의 제한된 하위집합”이며, 특정 시점에 가능한 변수의 형식을 더욱 엄격히 제어할 수 있게 해준다. 결과 코드는 파이썬 자체보다 파이파이 JIT 컴파일러를 통해 훨씬 더 효과적으로 최적화할 수 있다.
하위집합이 있는 반면 확대집합도 있다. 기능을 더 추가해서 수행 가능한 작업의 범위를 확대한 언어다. 파이썬의 변형인 싸이썬(Cython)은 파이썬 코드에서 바로 C 코드를 생성할 수 있다. 따라서 프로그래머는 C를 통해 파이썬 프로그램의 성능을 높일 수 있다.
싸이썬 또는 R파이썬과 같은 언어가 그 본래 언어와 같은 수준의 관심을 얻는 경우는 매우 드물다. 싸이썬의 경우 주로 C와 파이썬을 결합하는 사람들이 사용한다. 거기 해당되지 않는다면 굳이 싸이썬을 사용할 이유가 없다.
가끔은 확대집합과 하위집합의 기능이 주 언어로 전이되는 때도 있다. 그 예가 파이썬의 정적 형식 지정이다. 코드 프로파일링을 더 쉽게 하고 궁극적으로는 전체적인 성능을 높이는 방편으로 파이썬 3에 형식 힌트를 추가하자는 제안이 있다.
향후 분기될 만한 후보 언어들
현재 광범위하게 사용되는 언어 중 가까운 시일 내에 분기될 가능성이 높은 다른 언어는 무엇일까?
구글 고(Go, 고랭(Golang)이라고도 함)가 유력하다. 도커와 같은 유명 프로젝트가 고로 만들어지면서 유명세와 찬사를 받고 있다. 그러나 높은 인기에도 불구하고 고의 몇 가지 기능과 동작에는 제약이 있다. 예를 들어, 고의 오류 처리 메커니즘은 많은 지적을 받는다. 제네릭의 부재도 자주 언급되는 단점 중 하나인데, 고 개발팀은 앞으로도 제네릭은 추가되지 않을 것이라고 밝힌 바 있다. 고 설계자들이 입장을 고수한다면(모든 정황이 이를 가리키고 있다) 불만을 가진 사람에게 남은 유일한 방법은 언어의 분기다.
마이크로소프트의 닷넷 언어(주로 C#) 변형도 후보군이다. 마이크로소프트의 새로운 오픈 소스 컴파일 프레임워크를 통해 가능성이 더욱 높아졌다. C#과 닷넷의 오픈 소스 구현인 모노(Mono)와 같은 프로젝트와는 다른 성격으로, C#과의 호환성을 유지하든 유지하지 않든 새로운 방향으로 전환하게 될 가능성이 높다.
마지막으로 언급할 가능성은 언어보다는 사양의 분기에 가까운 것이지만 바로 HTML의 다음 메이저 버전이다. 어떤 면에서 보면 이미 일어났다고 할 수 있다. WHATWG와 HTML5는 W3C와 그 표준의 분기라고 볼 수 있다. 이러한 분기가 이를 실행할 브라우저와 함께 나온다 해도, 판도를 바꾸리라는 보장은 없다. 그러나 분기에는 숙명적으로 위험(과 보상)이 따를 수밖에 없다. editor@itworld.co.kr