오늘은 한빛미디어에서 선물로 보내주신 '폴리글랏 프로그래밍'을 읽은 감상문을 올려드리겠다.
책 이해를 위해 먼저 '폴리글랏'이라는 용어부터 살펴볼 필요가 있다. wiktionary의 설명을 빌어 조금 유식하게 표현하자면 고대 그리스어인 πολύγλωττος (polúglōttos, “many-tongued, polyglot”), from πολύς (polús, “many”) + γλῶττα (glôtta, “tongue, language”)가 기원이라고 하며, 쉽게 말해 '여러 언어'를 의미한다. 사전상 정확한 발음이 [|pɑ:liglɑ:t]이라는 점이 함정이긴 하지만, 국내에서는 poly를 '폴리'라 발음하니 못 알아들을 문제는 없다. 컴퓨터 공학에서는 특정 애플리케이션을 작성할 때 여러 언어를 혼합해 사용하는 방식을 총칭하는데, 솔직히 말해 여러분들도 이미 부지불식간에 잘 활용하고 있다. 자바에서 스프링을 사용해 웹 애플리케이션 프로그램을 만들 경우 HTML, CSS, 자바스크립트, 자바, XML, SQL이라는 여섯 가지 언어를 섞어서 사용하므로 폴리글랏 프로그래밍이 낯설리 없다. 옛날에도 셸 스크립트 언어와 C 프로그래밍 언어를 섞어 애플리케이션을 만들었으니 폴리글랏 프로그래밍의 계보를 따지자면 한참을 거슬러 올라가야 한다.
하지만, 적극적인 의미에서 폴리글랏 프로그램이 가능해진 시점은 JVM이나 .Net CLR이 나오면서부터다. 과거에는 목적 파일 수준에서 링크 과정을 거쳐 서로 다른 정적인 프로그래밍 언어로 만들어진 코드를 혼합해서 사용했지만(따라서 ABI와 같은 규약을 맞추기 위해 다양한 트릭을 사용했다. Win32 프로그래머라면 C와 파스칼 호출 방식의 차이점을 아주 잘 알고 있다!), 요즘에는 부담없이 언어끼리 섞어 사용할 수 있다(C#과 VB .Net, Java와 Scala를 섞어 프로그램하는 상황을 생각해보라!). 또한 폴리글랏 프로그래밍 패러다임을 사용할 경우 동일한 런타임을 공유하는 특정 언어에서 다른 언어로 필요에 따라 속도를 조절해가며 천천히 이주가 가능하다는 장점도 생긴다. 아, 각설이 길었는데, 원래 책 내용을 간단하게 설명해야겠다.
이 책은 자바, C#, 스칼라라는 개발자들 사이에서 많이 사용하고 요즘 뜨는 프로그래밍 언어의 특징(특히 닮은 점과 다른 점)을 설명하는 책이다. 물론 본문에 코볼(!)과 같은 옛날 언어와 루비, 파이썬, 그루비와 같은 동적 (스크립트) 언어도 조연으로 등장하므로 다양한 프로그래밍 언어에 대한 차이점을 느낄 수 있다. 이 책에서 강조하는 지점은 바로 부지불식간에 요즘 거의 모든 프로그래밍 언어에 기본으로 탑재되고 있는 '함수형' 언어의 특징이다. 자바의 익명 메소드, 클로저와 람다, C# 사용자라면 감탄을 금하지 못하는 링큐(LINQ), 스칼라의 트레이드와 같은 고품격 특질이 나오게 된 배경과 의의에 대한 설명이 나온다. 개별 특성을 놓고 사람과 기술이 얽힌 이야기 식으로 내용이 전개되므로 구체적인 프로그래밍 기법을 기대한 독자라면 조금 당황할지도 모르겠다는 생각도 든다.
이 책은 자바 8이 나오기 조금 전에 초판이 출간되었기 때문에 Java 8의 람다 표현식과 메소드 참조 그리고 람다 표현식과 스트림을 활용하는 새롭고 개선된 API와 같은 내용은 자세히 언급하지 않는다. 물론 오라클이 썬을 인수한 다음부터 자바 개발이 보수적으로 움직이고 있기 때문에 함수형 언어 특질에 대한 추가가 너무 늦은데다 Is Java 8 a Functional Programming Language?라는 글에서도 밝히듯이 여전히 본격적인 함수형 언어로 사용하기에는 미묘하게 부족한 점이 많으므로 이 책이 지금 이 무렵에 나왔더라도 자바에 대한 호의적인(응?) 평가를 얻기는 어려웠으리라는 생각을 해본다.
결론: 요즘 돌아가는 프로그래밍 언어 생태계에 관심이 많고 함수형 언어의 철학에 대해 어느 정도 이해하고 있는 프로그래머가 보면 재미를 느낄 것이다. 구조적/객체지향적인 언어 세상에 익숙한 개발자들이라면 저자 서문에 나오는 '가볍고 경쾌한 내용일 거라고 믿는다'라는 표현을 믿다가는 본문 중 전개되는 내용을 읽으며 난감한 느낌(힌트: 자바를 디스한다)이 들지도 모르겠다.
EOB