스칼라의 기원: 마틴 오더스키와의 대화, 1부

artima - The Origins of Scala

작성자
jeff
발행일
2009년 05월 04일

핵심 요약

  • 1 스칼라 창시자 마틴 오더스키는 초기 컴파일러 개발 경험과 모듈라-2 컴파일러 구축을 통해 프로그래밍 언어 분야에 깊이 관여했습니다.
  • 2 그는 자바에 제네릭, 고차 함수, 패턴 매칭을 도입한 피자(Pizza) 언어와 자바 5 제네릭의 기반이 된 GJ 개발에 참여하며 자바 개선에 기여했습니다.
  • 3 자바의 제약사항에 대한 좌절감으로 인해, 오더스키는 JVM 기반의 새로운 언어인 스칼라를 설계하여 실용성과 향상된 기능을 동시에 추구했습니다.

도입

이 문서는 스칼라 프로그래밍 언어의 창시자인 마틴 오더스키(Martin Odersky)와의 대화 1부로, 스칼라의 탄생 배경과 그의 프로그래밍 언어 개발 여정을 다룹니다. 자바 가상 머신(JVM)을 위한 범용 객체 지향 및 함수형 언어인 스칼라가 어떻게 구상되었는지, 그리고 그 과정에서 오더스키가 겪었던 학문적, 실용적 고민들을 심층적으로 조명합니다. 그의 초기 컴파일러 개발 경험부터 자바 개선 프로젝트, 그리고 스칼라 설계에 이르기까지의 주요 이정표를 살펴봅니다.

컴파일러에 대한 매료와 초기 개발 경험

  • 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 타입 매개변수를 가진 배열 생성 등 자바에서는 불가능했던 기능을 구현할 수 있었습니다. 이는 자바와의 소스 호환성을 희생하더라도 더 나은 설계 원칙을 따르겠다는 스칼라의 차별점을 보여줍니다.

결론

마틴 오더스키의 스칼라 개발 여정은 컴파일러에 대한 초기 열정에서 시작하여, 자바의 한계를 극복하려는 지속적인 노력으로 이어졌습니다. 피자(Pizza)와 GJ(Generic Java)를 통해 자바에 함수형 요소를 도입하고 제네릭 시스템을 구축하는 데 중요한 역할을 했지만, 자바의 엄격한 하위 호환성 제약은 결국 그를 새로운 언어 설계로 이끌었습니다. 스칼라는 이러한 경험을 바탕으로 JVM 위에서 실용적이면서도 강력한 객체 지향 및 함수형 프로그래밍 패러다임을 통합하는 언어로 탄생했습니다. 특히 자바의 '공변 배열'과 같은 설계적 제약을 과감히 벗어던짐으로써, 스칼라는 더욱 유연하고 타입 안전한 프로그래밍 환경을 제공할 수 있었습니다. 이는 기존 언어의 제약을 넘어서는 혁신적인 언어 설계를 위한 중요한 시사점을 제공합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!