컴파일러에 대한 매료와 초기 개발 경험
-
1980년대 초: 대학생 시절, 마틴 오더스키는 컴파일러의 개념을 접하고 즉시 자신만의 컴파일러를 만들고자 했습니다.
-
오스본-1(Osborne-1): 56KB RAM과 두 개의 플로피 드라이브를 갖춘 이 컴퓨터에서 피터 졸리치(Peter Sollich)와 함께 모듈라-2(Modula-2) 컴파일러 개발을 시작했습니다.
-
부트스트래핑 기법: 마이크로소프트 베이직(Microsoft Basic)의 한계로 인해 Z80 어셈블리어로 파스칼(Pascal)의 작은 하위 집합 컴파일러를 만든 후, 이를 확장하여 모듈라-2 전체를 컴파일할 수 있는 시스템을 구축했습니다.
-
보랜드(Borland)와의 인연: 개발 완료 직전 보랜드의 터보 파스칼(Turbo Pascal)이 출시되었고, 보랜드는 그들의 모듈라-2 컴파일러를 인수하여 ‘터보 모듈라-2(Turbo Modula-2)’로 판매할 계획이었으나, IBM PC 버전 개발 지연으로 인해 큰 성공을 거두지는 못했습니다.
-
학문적 길 선택: 보랜드의 채용 제안에도 불구하고, 오더스키는 대학원 과정을 계속하며 연구에 흥미를 느껴 파스칼과 모듈라-2의 창시자인 니클라우스 비르트(Niklaus Wirth) 밑에서 박사 학위를 취득했습니다.
자바 개선 노력: 피자(Pizza)와 GJ
-
함수형 프로그래밍의 영향: 1980년대 후반부터 함수형 프로그래밍에 깊이 매료된 오더스키는 필 워들러(Phil Wadler)와 함께 자바(Java)에 함수형 프로그래밍 아이디어를 접목하는 작업을 시작했습니다.
-
피자(Pizza) 언어(1996): 자바에 제네릭(generics), 고차 함수(higher-order functions), 패턴 매칭(pattern matching) 기능을 추가한 언어로, JVM 플랫폼에서 함수형 언어 기능 구현 가능성을 입증했습니다.
-
GJ(Generic Java) 개발(1997/98): 썬(Sun)의 핵심 개발팀과 협력하여 자바에 제네릭을 도입하기 위한 GJ를 개발했으며, 이는 6년 후 자바 5(Java 5)의 제네릭 기능으로 채택되었습니다.
-
javac컴파일러 기여: 오더스키가 개발한 GJ 컴파일러는 썬의 기존 자바 컴파일러보다 안정적이고 유지보수성이 뛰어나다는 평가를 받아, 2000년 자바 1.3 릴리스부터 표준javac컴파일러로 사용되었습니다.
스칼라(Scala)의 탄생과 설계 철학
-
자바의 제약에 대한 좌절: 피자 및 GJ 개발 과정에서 자바의 엄격한 하위 호환성 제약으로 인해 원하는 방식으로 언어를 설계할 수 없다는 좌절감을 느꼈습니다.
-
새로운 언어 설계: JVM 인프라(라이브러리, 도구)에 연결되면서도 자바보다 나은 언어를 설계하기로 결심하고, EPFL 교수로 부임하여 독립적인 연구 환경을 마련했습니다.
-
초기 시도: 퍼널(Funnel): 조인 계산법(join calculus)에 기반한 객체 지향 버전인 함수형 넷(Functional Nets)과 퍼널 언어를 개발했으나, 지나치게 순수한 설계로 인해 실용성이 떨어진다는 한계를 발견했습니다.
-
스칼라 개발(2002): 퍼널의 순수함과 GJ의 실용성 사이의 균형점을 찾아, 실용적이면서도 자바보다 발전된 언어를 목표로 스칼라를 개발하기 시작했습니다. 2003년 첫 공개 릴리스 이후 2006년 대규모 재설계를 거쳐 성장하고 안정화되었습니다.
자바 개선의 제약사항: 공변 배열(Covariant Arrays) 문제
-
하위 호환성: 자바 제네릭 설계의 가장 큰 제약은 비제네릭 자바와의 완전한 하위 호환성이었습니다. 이로 인해 ‘원시 타입(raw types)’과 ‘미확인 경고(unchecked warnings)’와 같은 문제점이 발생했습니다.
-
공변 배열의 문제: 자바 초기 설계 시 제네릭이 없었기 때문에
String[]이Object[]의 하위 타입이 되는 ‘공변 배열’을 도입했습니다. 이는ArrayStoreException을 유발하며, 배열에 대한 제대로 된 제네릭 구현을 방해하는 ‘원죄(original sin)’가 되었습니다. -
스칼라의 해결책: 스칼라는 자바의 공변 배열 요구사항을 포기함으로써
T타입 매개변수를 가진 배열 생성 등 자바에서는 불가능했던 기능을 구현할 수 있었습니다. 이는 자바와의 소스 호환성을 희생하더라도 더 나은 설계 원칙을 따르겠다는 스칼라의 차별점을 보여줍니다.