2015.04.14

개발에 새로운 힘을 부여하는 '프로그래밍 언어 분기'

Serdar Yegulalp | InfoWorld

컴퓨터 언어가 일상 언어와 비슷한 점은 끊임없이 진화한다는 것이다. 다만 프로그래밍 언어의 진화에서만 볼 수 있는 요소는 명확한 '분기'다. 즉, 공식적으로 줄기에서 갈라져 나오고 뿌리에서 이탈할 수 있는 부분이다. 일시적으로 분기가 일어났다가 새로운 가지로 재결합되어 역으로 뿌리에 영향을 미치는 경우도 있거나 기존 언어에서 변형이 나와 그대로 유지되는 경우도 있고, 돌연변이가 발생하여 완전히 새로운 언어가 생겨나기도 한다.

혁신에 대한 욕망뿐만 아니라, 모든 개발 언어가 언젠가는 그 한계를 드러낸다는 점 때문에 컴퓨터 언어를 바꾸는 원동력이 되기도 한다. 이러한 필수불가결한 진화의 흐름에 따라 사용자들은 언어를 개선하거나 이를 버리고 아예 다른 길을 선택하고는 한다.

언어가 분기하여 진화하는 경로는 대부분 다음 세 가지 가운데 하나에 해당된다.

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로 하위 이식할 수 있다. 이 방법으로 프로그래머는 브라우저 수준 지원을 계속 구현하거나 개선하면서 지금 바로 미래의 언어 기능을 활용할 수 있다.

이러한 언어의 ‘트랜스파일’ 버전을 사용하는 데 따르는 잠재적인 단점 중 하나는 디버깅 방식이다. 자바스크립트를 보면 대부분의 트랜스파일러는 소스 맵을 생성한다. 소스 맵은 생성된 자바스크립트를 원래의 소스와 짝짓는 데 사용 가능하며 실제로 커피스크립트에서 이것이 가능하다. 다만 이 방법에는 제약이 있다. 예를 들어 디버깅할 때 트랜스파일된 변수 이름은 조회할 수 있지만 원래의 변수 이름을 조회할 방법이 (아직은) 없다.



2015.04.14

개발에 새로운 힘을 부여하는 '프로그래밍 언어 분기'

Serdar Yegulalp | InfoWorld

컴퓨터 언어가 일상 언어와 비슷한 점은 끊임없이 진화한다는 것이다. 다만 프로그래밍 언어의 진화에서만 볼 수 있는 요소는 명확한 '분기'다. 즉, 공식적으로 줄기에서 갈라져 나오고 뿌리에서 이탈할 수 있는 부분이다. 일시적으로 분기가 일어났다가 새로운 가지로 재결합되어 역으로 뿌리에 영향을 미치는 경우도 있거나 기존 언어에서 변형이 나와 그대로 유지되는 경우도 있고, 돌연변이가 발생하여 완전히 새로운 언어가 생겨나기도 한다.

혁신에 대한 욕망뿐만 아니라, 모든 개발 언어가 언젠가는 그 한계를 드러낸다는 점 때문에 컴퓨터 언어를 바꾸는 원동력이 되기도 한다. 이러한 필수불가결한 진화의 흐름에 따라 사용자들은 언어를 개선하거나 이를 버리고 아예 다른 길을 선택하고는 한다.

언어가 분기하여 진화하는 경로는 대부분 다음 세 가지 가운데 하나에 해당된다.

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로 하위 이식할 수 있다. 이 방법으로 프로그래머는 브라우저 수준 지원을 계속 구현하거나 개선하면서 지금 바로 미래의 언어 기능을 활용할 수 있다.

이러한 언어의 ‘트랜스파일’ 버전을 사용하는 데 따르는 잠재적인 단점 중 하나는 디버깅 방식이다. 자바스크립트를 보면 대부분의 트랜스파일러는 소스 맵을 생성한다. 소스 맵은 생성된 자바스크립트를 원래의 소스와 짝짓는 데 사용 가능하며 실제로 커피스크립트에서 이것이 가능하다. 다만 이 방법에는 제약이 있다. 예를 들어 디버깅할 때 트랜스파일된 변수 이름은 조회할 수 있지만 원래의 변수 이름을 조회할 방법이 (아직은) 없다.



X