‘표현력’이라는 용어의 의미가 문맥에 따라 달라짐을 짚으며, Lisp와 Haskell의 매크로와 타입 시스템, 강·약타이핑, 어셈블리와 이식성, J와 Prolog, 고수준·저수준 개념 등을 통해 표현력의 복잡성을 질문한다.
어떤 언어가 더 표현력이 좋을까요, Lisp일까요 Haskell일까요?
나는 여러분이 ‘표현력’이라는 단어를 잊어버리거나, 적어도 언어를 옹호할 때에는 그 단어에 특정한 의미를 부여하려고 노력하길 권하고 싶습니다. 문맥마다 의미가 다르고, 종종 미묘하게 서로 상충하거나 약간은 모순된 뜻을 갖기도 하기 때문입니다.
Lisp가 표현력이 뛰어난 언어로 홍보될 때 보통 의미하는 것은 완전한 매크로 시스템을 갖추고 있으며, 추상적인 코드도, 노골적으로 기계 친화적이고 거의 최적에 가까운 코드도 어렵지 않게 쓸 수 있다는 점입니다. 반면 Haskell이 표현력이 뛰어나다고 할 때는, 매우 추상적인 아이디어까지 표현할 수 있는 강력한 타입 시스템을 갖췄다는 뜻인 경우가 보통입니다. 리습에서 영감을 받은 완전한 매크로 시스템을 갖고 있다는 사실을 아는 사람은 별로 없습니다—이것은 그 ‘표현력’의 근거로 거의 거론되지 않는 듯합니다.
어떤 의미에서는, 모든 강타입 언어는 약타입 언어보다 덜 표현적입니다. 강타입 언어가 막아주는 오류 부류 가운데 상당수는 약타입 언어에서는 허용됩니다. 말 그대로 약타입 언어에는 더 많은 ‘표현들’이 존재합니다. 이런 ‘표현력’의 손실에도 불구하고 Haskell의 옹호자들이 잠을 설치는 일은 별로 없어 보입니다. 비록 어떤 프로그램들은 타입 검사를 통과하지 못하고(혹은 특정한 형식 체계의 틀 안에서는 도저히 통과시킬 수 없지만), 그럼에도 불구하고 올바른 프로그램들이 분명히 존재함에도 말입니다—비록 그럴 법해 보이지 않을지라도요.
내 기계가 실행할 수 있는 어떤 프로그램도 어셈블리어로 쓸 수 있습니다. 그렇다면 어셈블리가 가장 ‘표현력’ 있는 언어일까요? 내가 어떤 말을 했을 때 그것이 다른 기계들에서도 같은 뜻을 갖길 원한다면 어떨까요? 다시 말해 이식성 말입니다. 이식성이 내 선택지를 제약한다면, 그것은 표현력을 줄이는 걸까요, 오히려 높이는 걸까요? 하이쿠와 아무 말이나 마구 늘어놓은 말뭉치 중 어느 쪽이 더 많은 것을 말할 수 있나요?
J 프로그램은 행렬 차원을 공짜로 추상화할 수도 있습니다. 맥락에 따라, 어떤 것은 때로 더 표현력이 있고 다른 때에는 덜할 수 있는 걸까요?
‘고수준’ 대 ‘저수준’은 여기에 어떻게 들어맞을까요? Prolog는 더 ‘고수준’입니다. 단지 함수만이 아니라 실제로 관계를 가지며, 어떻게 할지를 지시하지 않아도 당신이 뜻하는 바를 종종 스스로 알아냅니다. 그런데도, Paul Graham이 한때 지적했듯이, Prolog로 프로그램을 만들려면 실제로 더 많은 코드가 필요한 경우가 많습니다. 그리고 그것이 더 ‘고수준’이라면, 왜 제5세대 프로젝트는 실패했을까요? 또 왜 오늘날에는 흥미로운 수업 과제 정도로 머물며 널리 사용되지는 않을까요?
언제나 그렇듯, 답보다 질문이 더 많습니다.
2015년 11월 12일