표현력

ko생성일: 2025. 9. 22.갱신일: 2025. 9. 22.

‘표현력’이라는 용어의 의미가 문맥에 따라 달라짐을 짚으며, Lisp와 Haskell의 매크로와 타입 시스템, 강·약타이핑, 어셈블리와 이식성, J와 Prolog, 고수준·저수준 개념 등을 통해 표현력의 복잡성을 질문한다.

어떤 언어가 더 표현력이 좋을까요, Lisp일까요 Haskell일까요?

나는 여러분이 ‘표현력’이라는 단어를 잊어버리거나, 적어도 언어를 옹호할 때에는 그 단어에 특정한 의미를 부여하려고 노력하길 권하고 싶습니다. 문맥마다 의미가 다르고, 종종 미묘하게 서로 상충하거나 약간은 모순된 뜻을 갖기도 하기 때문입니다.

Lisp가 표현력이 뛰어난 언어로 홍보될 때 보통 의미하는 것은 완전한 매크로 시스템을 갖추고 있으며, 추상적인 코드도, 노골적으로 기계 친화적이고 거의 최적에 가까운 코드도 어렵지 않게 쓸 수 있다는 점입니다. 반면 Haskell이 표현력이 뛰어나다고 할 때는, 매우 추상적인 아이디어까지 표현할 수 있는 강력한 타입 시스템을 갖췄다는 뜻인 경우가 보통입니다. 리습에서 영감을 받은 완전한 매크로 시스템을 갖고 있다는 사실을 아는 사람은 별로 없습니다—이것은 그 ‘표현력’의 근거로 거의 거론되지 않는 듯합니다.

어떤 의미에서는, 모든 강타입 언어는 약타입 언어보다 덜 표현적입니다. 강타입 언어가 막아주는 오류 부류 가운데 상당수는 약타입 언어에서는 허용됩니다. 말 그대로 약타입 언어에는 더 많은 ‘표현들’이 존재합니다. 이런 ‘표현력’의 손실에도 불구하고 Haskell의 옹호자들이 잠을 설치는 일은 별로 없어 보입니다. 비록 어떤 프로그램들은 타입 검사를 통과하지 못하고(혹은 특정한 형식 체계의 틀 안에서는 도저히 통과시킬 수 없지만), 그럼에도 불구하고 올바른 프로그램들이 분명히 존재함에도 말입니다—비록 그럴 법해 보이지 않을지라도요.

내 기계가 실행할 수 있는 어떤 프로그램도 어셈블리어로 쓸 수 있습니다. 그렇다면 어셈블리가 가장 ‘표현력’ 있는 언어일까요? 내가 어떤 말을 했을 때 그것이 다른 기계들에서도 같은 뜻을 갖길 원한다면 어떨까요? 다시 말해 이식성 말입니다. 이식성이 내 선택지를 제약한다면, 그것은 표현력을 줄이는 걸까요, 오히려 높이는 걸까요? 하이쿠와 아무 말이나 마구 늘어놓은 말뭉치 중 어느 쪽이 더 많은 것을 말할 수 있나요?

J 프로그램은 행렬 차원을 공짜로 추상화할 수도 있습니다. 맥락에 따라, 어떤 것은 때로 더 표현력이 있고 다른 때에는 덜할 수 있는 걸까요?

‘고수준’ 대 ‘저수준’은 여기에 어떻게 들어맞을까요? Prolog는 더 ‘고수준’입니다. 단지 함수만이 아니라 실제로 관계를 가지며, 어떻게 할지를 지시하지 않아도 당신이 뜻하는 바를 종종 스스로 알아냅니다. 그런데도, Paul Graham이 한때 지적했듯이, Prolog로 프로그램을 만들려면 실제로 많은 코드가 필요한 경우가 많습니다. 그리고 그것이 더 ‘고수준’이라면, 왜 제5세대 프로젝트는 실패했을까요? 또 왜 오늘날에는 흥미로운 수업 과제 정도로 머물며 널리 사용되지는 않을까요?

언제나 그렇듯, 답보다 질문이 더 많습니다.


날짜

2015년 11월 12일