앞서 프로그래밍 언어의 평가 기준에 대해서 알아보았다. 그렇다면 모든 평가 기준을 만족하는 언어를 만들 수 있을까?
아쉽게도, 언어의 평가 기준을 모두 만족하기는 쉽지 않다. 하나의 기준을 만족하고자 하면 다른 기준에서 어긋나는 부분이 발생한다. 따라서 언어를 설계할 때는 이러한 language design trade-offs 에 대해서 명확히 알아야 한다.
trade-off : 모순된 상반 관계를 말할 때 자주 사용하는 표현이다.
예를 들어 자바는 array에 대한 참조가 정확히 이루어질 수 있도록 컴파일러에서 보장한다. 즉, ArrayIndexOutOfBoundsException 에러가 일어나지 않도록 컴파일러가 확인하는 것이다. 하지만, 이를 구현하기 위해서는 잘못된 주소에 접근하지 않는지 배열을 참조할 때마다 컴파일러가 확인해야 한다는 문제점이 있다. 즉, 언어의 신뢰성은 높지만 실행할 때의 비용이 많이 소모된다는 것이다.
APL 언어는 매우 강력한 연산자와 수많은 기호들을 제공하여 복잡한 계산을 간결하게 작성할 수 있게 하지만, 그 대가로 가독성은 떨어지게 된다. 강력한 연산자가 많아질 수록 작성은 쉽지만 코드를 이해하기 위한 진입장벽은 더 높아지는 것이다.
C 에서는 포인터를 통해 직접 메모리에 접근할 수 있다. 메모리에 직접 접근한다는 것은 매우 강력하면서 유연한 연산이다. 메모리에 직접 접근하게 되면 성능은 더 좋아지고 복잡한 자료 구조에 보다 더 쉽게 접근할 수 있다. 하지만, 메모리에 직접 접근한다는 것은 어쨌거나 프로그램의 신뢰성에서는 그리 좋지 않게 작용할 가능성이 높다. 개발자가 실수하여 잘못된 주소에 접근할 수도 있고, 초기화를 하지 않은 경우에는 garbage 문제가 발생할 수도 있다.
이렇듯 프로그래밍 언어는 모든 기준을 만족할 수 없다. 당장 분야마다 가장 많이 사용되는 언어는 전부 다르다. C, Java, Python, Go 등 모든 언어는 자신만의 장점을 가지고 있고, 반대로 단점도 존재한다.
따라서 언어를 설계할 때는 모든 것을 만족하려 하지 말고, 언어의 개발 목적에 맞게끔 디자인하는 것이 가장 중요하다.