-
마치며프로그래밍 언어 속 타입 2022. 5. 17. 15:40
이 글은 인사이트 출판사의 제안으로 작성 중인 책 『프로그래밍 언어 속 타입』 원고의 일부입니다.
프로그래밍 언어의 역사를 되돌아보면 정적 타입 언어는 끊임없이 발전해 왔다. 자바가 처음 나오던 1990년대만 해도 매개변수에 의한 다형성은 당연한 기능이 아니었다. 학계에서는 1960년대부터 매개변수에 의한 다형성에 대한 연구가 이루어졌지만, 현실에 적용되는 속도는 훨씬 느렸다. 매개변수에 의한 다형성은 기껏해야 하스켈 같은 일부 함수형 언어에서나 찾아볼 수 있었다. 객체 지향 언어에게는 서브타입에 의한 다형성이면 충분해 보였다. 하지만 만들려는 프로그램이 크고 복잡해질수록 개발자들은 정적 타입 언어에 더 많은 기능을 요구했다. 그 결과 자바에 매개변수에 의한 다형성이 추가되었고, 매개변수에 의한 다형성을 제공하는 언어가 하나둘씩 더 생겨났다. 그러더니 어느새 매개변수에 의한 다형성을 제공하지 않는 정적 타입 언어가 더 드물 지경이 되었다.
정적 타입 언어의 발전은 결코 과거에 국한된 이야기가 아니다. 과거에도 일어났지만 요즘도 일어나는 일이다. 이를 잘 보여 주는 예시가 러스트다. 러스트는 기존 시스템 프로그래밍 분야에서 사용되던 C와 C++의 고질적인 문제들을 해결하기 위해 등장한 언어다. C와 C++가 겪는 많은 문제의 원인은 너무나도 부실한 타입 검사에 있었다. 타입 오류로 취급하는 오류가 적다 보니 프로그램이 타입 검사를 통과해도 실행 중에 일어날 수 있는 오류가 너무 많았던 것이다. 당연히 이런 C와 C++의 한계를 극복하려는 여러 시도가 있었다. 대표적으로는 C의 타입 검사를 개선한 사이클론Cyclone과 시큐어드CCured 같은 언어가 있다. 하지만 모두 개발자의 지지를 얻지 못한 채 역사 속으로 사라졌다. 그러다가 러스트가 등장했다. 러스트는 과거의 그 어떤 시도보다도 훨씬 더 성공적으로 C와 C++를 대체해 나가고 있다. 러스트가 C와 C++를 완전히 몰아낼 것이라 단언하기는 어렵지만, 적어도 C와 C++가 차지하던 역할의 상당 부분을 뺏어올 것이라는 사실은 이미 확실해 보인다.
러스트의 성공에서 흥미로운 점은 러스트가 C와 C++를 조금만 고치려고 하지 않았다는 사실이다. 오히려 근본부터 C와 C++과는 전혀 다른 선택을 했다. 이는 C와 C++를 조금만 고쳐 문제를 해결해 보려던 과거의 시도들과는 확실히 차이 나는 부분이다. 러스트의 근본에는 선형 타입linear type이 있다. 선형 타입은 이 책에서 다루지 않은 주제로, 기존의 타입과 비교했을 때 훨씬 더 강력한 능력을 가지고 있다. 기존의 타입은 각각의 값이 “무엇”을 할 수 있는지만 표현한다. 하지만 프로그램이 다루는 많은 대상은 사용 시점과 횟수에 제한이 있다. 가령 열려 있는 파일을 한번 닫고 나면, 그 파일을 더 읽을 수도, 다시 닫을 수도 없다. 즉, 파일이 읽는 능력과 닫는 능력을 가지고 있다고 표현하는 것만으로는 부족한 것이다. 닫기 전까지만 읽을 수 있고, 오직 한 번만 닫을 수 있다고 표현해야 파일의 능력을 제대로 설명한 게 된다. 이런 성질을 표현할 수 있는 수단이 바로 선형 타입이다. 다시 말해, 선형 타입은 각각의 값이 “무엇”을 할 수 있는지 표현할 뿐 아니라 “언제까지”, “몇 번” 할 수 있는지도 표현한다. 그리고 선형 타입의 이런 강력함은 C와 C++의 타입 검사기가 놓치던 수많은 오류를 러스트의 타입 검사기가 잡아내는 데 핵심적인 역할을 했다.
매개변수에 의한 다형성이 학자들의 관심 대상에서 다수의 개발자들이 사용하는 기능이 될 때까지 긴 시간이 필요했듯, 선형 타입 역시 빛을 볼 때까지 오랜 세월을 기다려야 했다. 선형 타입에 관한 연구가 본격적으로 시작된 것은 최소 1980년대로 거슬러 올라간다. 하지만 선형 타입이 유용하기는 해도 실제로 프로그램을 작성할 때 사용하기에는 어렵고 불편하다는 인식이 더 컸기에 현실의 언어에 적용될 가능성은 별로 없어 보였다. 러스트는 그 편견을 성공적으로 깨 부셨다. 언어를 공들여 설계한다면 선형 타입을 사용하여 C와 C++에서 겪던 문제들을 해결하면서도 충분히 실용적인 언어를 만들 수 있다는 사실을 보여 준 것이다.
지금까지 일어난 일들로 미루어 볼 때, 정적 타입 언어가 앞으로도 계속 발전할 것이라는 사실은 명백해 보인다. 지금 이 순간에도 학계에서는 실용적으로 널리 사용되지 못한 채 남아 있는 여러 개념을 계속해서 연구하고 있다. 그 예로는 의존적 타입dependent type, 정제 타입refinement type, 효과 타입effect type, 점진적 타입 검사gradual typing 등이 있다. 이들 개념을 제대로 설명하려면 책 한 권이 더 필요할 테니 여기서 자세히 설명하지는 않겠다. 선형 타입이 그랬듯, 각각의 개념은 현실에 적용되기 어려운 저마다의 이유를 가지고 있다. 하지만 역시 선형 타입이 그랬듯, 그중 어느 개념이든 누군가의 좋은 아이디어와 결합하여 미래에 우리가 사용하는 언어에 적용될 수 있다. 그리고 그 결과 정적 타입 언어가 또 한 번 발전하여 우리를 버그의 악몽에서 한 걸음 더 멀어지게 해 줄 것이다. 그러니 늘 눈을 부릅뜨고 어디서 진보가 일어나는지 지켜보길 바란다. 남들보다 한 발 빠르게 새로운 기능을 익히고 활용할 수 있다면 즐겁지 않겠는가.
이제 진짜로 끝이다. 타입 세계에서의 긴 여정을 마친 것을 축하한다. 책을 읽기 전 정적 타입 언어에 대한 마음이 어떠했든 간에, 지금은 정적 타입 언어를 즐겁게 사용할 수 있는 사람이 되어 있기를 바란다. 책을 읽느라 고생했으니 일단 가서 푹 쉬어라. 그러고는 늘 그랬듯 다시 프로그램을 작성하자. 이왕이면 정적 타입 언어로 말이다!'프로그래밍 언어 속 타입' 카테고리의 다른 글
5.4 카인드 (0) 2022.05.17 5.3 타입클래스 (0) 2022.05.17 5.2 메서드 오버라이딩 - 메서드 오버라이딩과 결과 타입 (0) 2022.05.17 5.2 메서드 오버라이딩 - 메서드 선택의 한계 (0) 2022.05.17 5.2 메서드 오버라이딩 (0) 2022.05.17