스칼라 프로그래밍 언어(The Scala Programing Language)

원문: http://www.scala-lang.org/node/25

Introducing Scala (개요)


Scala언어는 프로그래밍에서 공통적인 패턴들을 직관적이고, 우아하고, 타입세이프하게 표현하기 위한 범용언어이다. 기존의 OOP 언어나 순차언어의 기능을 유연하게 융화하기 때문에 자바 프로그래머들 뿐만 아니라 많은 프로그래머들의 생산성을 향상시키는 것이 가능하다. 자바를 예로 들면 일반적으로 2 ~ 3배정도의 코드량을 줄일 수 있다고 한다.

자바를 사용한 업무 어플리케이션을 개발하고 있는 많은 회사들이 생산성(productivity), 확장성(scalability), 신뢰성(reliability) 향상을 위해서 Scala를 도입하고 있다.

예를 들면, 소셜 네트워크인 Twitter는 메세지 큐의 코어 서비스를 Ruby로 부터 Scala로 이전했다. 빠르게 늘어나는 Tweet율을 안정적으로  확장하기 위해서 결정한 일이었다. 오바마 대통령의 취임식 때에 분당 5000 Tweet을 넘어 섰었다.  Kestel의 리더 개발자인 Robey씨는 Twitter Kestrel project에 대한 뒷예기를 라이브져널을 통해서 밝혔다. 그의 1500라인의 Scala코드는 오픈소스와 되어서 모두에서 공개하고 있다.
수 많은 톱 레벨의 개발자들과 리더들은 이미 Scala에 매료되어 있다. 그들은 다른 이들에게 설명하고, Scala에 대한 책을 저작하고, Scala에 막 입문한 Java프로그래머들에 끊임 없는 서포트를 하고 있다. 그 예로 "전문가들의 도움으로 Java에서 Scala로"를 들 수 있다. Scala 사이트에는 Scala소개에서 부터 상급 연구 과제에 이르기까지의 문서들과 Scala 코드 예제들을 보거나 또는 Scala 설치부터 시작해 볼 수도 있다.

Java와의 결합


기존의 Java코드와 프로그래밍 스킬을 그대로 재사용할 수 있다. Java VM에서 동작하는 Scala 프로그램은, Java의 바이트코드와 호환성을 가지기 때문에 기존의 Java 라이브러리와 어플리케이션 코드를 모두 그대로 사용할 수 있다. 더욱이, Eclipse, NetBeans, Intellij와 같은 친숙한 개발툴들도 그대로 사용할 수 있다. 효율적인 Scala프로그래머가 되는 데는 그리 오랜 시간이 걸리지 않을 것이다. 이미 반은 알고 있지 않은가?

Scala 컴파일러 성능

Scala컴파일러는 상용 환경에서 몇 년간을 사용해 왔기 때문에 안정성은 검증이 되어 있다. 컴파일러의 제작자인 Martin Odersky는 Java reference컴파일러를 작성하기도 했고 generics의 공동 저자이기도 하다. generic은 지금 수맥만의 Java 프로그래머가 사용하고 있다. 그에 의해 만들어 진 Scala 컴파일러로 생성한 바이트 코드는 Java 코드로 생성한 바이트 코드와 비슷한 성능을 내도록 구현되어 있다.

Scala의 발단

EPFL의 교수인 Martin Odersky는 수 십만 줄의 코드를 집적 작성해 보고는 Java 프로그래머들이 자주 불만을 토로하는 것을 알고 있었다. 대학에서의 연구 커뮤니티의 최고의 지식을 Java 프로그래밍을 더 편하게 하고 좀 더 재미있게 하기 위해 적용해 보고 싶다고 생각을 가지게 되었다. Java 커뮤니티에서도 성공이라고 생각한 그의 첫번 째 실용적 성과는 Java Generics이다. 그러나 완전히 확장성(scalable)과 병렬성(concurrent) 프로그래밍을 이루기 위해서는 Java의 기본 문법 자체를 바꿔야 함을 알게 되었다. 아마 여러분들은 이해하기 힘들 것이다. 하지만 이 거짓말 같은 작은 문법의 변화로 Java의 Object-oriented의 측면의 일관성을 높였고, 결과적으로 병렬성에 최대 걸림돌을 해결하는 함수 프로그래밍 개념과 자연스럽게 융화되게 된다. 

Scala 프로그래밍

어떤 Java 프로그래머들은 처음 Scala를 접하면서 위화감을 느끼기도 하지만 곧 익숙해시고 그들의 생각을 직관적으로 프로그램으로 표현하는 것을 즐기기 시작한다. 키보드 타이핑이 줄고, Type 추측, 모든 것은 객체, 함수 전달등 Scala의 특색들이 불필요한 문법표현의 오버해드를 해소해 준다. 경험이 늘면서 Scala는 안전하고 일반화된 라이브러리를 생성하도록 추상화를 제공하고 있다는 점을 깨닳는다. 어떤 이들은 그들만의 Domain Specific Language(DSL)을 만들기도 한다. Scala는 프로그래머와 함께 확장되고 있다. 더 많은 프로그래머들이 Scala에 대해 더 깊이 알게 되고 훨씬 복잡한 타스크도 더 쉽게 된다. 대부분의 프로그래머들은 어느세 기본 컨셉들이 자연스럽게 합쳐져 있는 Scala의 다특성을 깨닳는 순간이나 믿을 수 없을 만큼 문제해결 능력에  "아! 이해됐다!"라고 예기한다.
몇가지 새로운 문법을 배우는 노력으로 누구라도 Java에서와 같이 쉽게 프로그램을 작성할 수 있으면서 문제 해결 능력을 지속적으로 얻게 된다.
프로그래밍 언어 전문가들에게 Scala 언어는 기술적 요약은 아래와 같다.

Scala는 객체지향이다.

Scala는 순수 객체지향 언어이다. 즉 모든 값은 객체이다. 객체의 type과 동작은 class와 trait으로 기술한다. Class는 subclass로  확장하고 mixin기반 composition 메커니즘으로 다중상속을 한다. 

Scala는 함수적이다. 

모든 함수는 값이기도 하다라는 의미로 보면 Scala는 함수적 언어이기도 하다. Scala의 경량 문법을 사용해서 anonymous함수를 만들 수도 있고 higher-order function을 제공하고 중첩 함수를 허용하며 괄호 문법도 제공한다. Scala의 case class와 그의 built-in의 pattern matching 모델의 대수 type을 제공한다.
또한, Scala의 패턴 매칭 기능은 우측 무시 순차 패턴을 사용해서 XML data처리 기능으로 자연스럽게 확장된다. 이런 면에서 순차 해석은 커리를 조직적으로 하는데 편리하다. 이러한 특징들이 Scala를 웹 서비스와 같은 어플리케이션을 작성하는 데 이상적으로 한다.

Scala 정적 타입 언어이다.

스칼라에는 표현적인 데이터형 시스템을 탑재하고 있어서 강제적으로 추상성을 안전하고 정연한 방식으로 사용되도록 하고 있습니다. 특히 아래와 같은 기능을 제공하고 있습니다.
Generic 클래스
변위 annotation
상위 하위 타입 바인드
오브젝트의 멤버로써의 인너 클래스와 추상타입
합성타입
자신에의 레퍼런스의 명시적 타입지정
다형 메소드
유저가 과다한 타입정보를 일일이 기술하지 않아도 되도록 돕는 로컬 타입 추론 메커니즘을 도입하고 있습니다. 이러한 것들은 프로그래밍의 추상화를 안전하게 재사용하도록 하거나 타입-세이프한 확장기능을 만들게 하는 매우 파워풀한 방식을 재공하고 있습니다.

Scala는 확장가능합니다.

실전에서 특정 도메인에서의 응용 프로그램의 개발을 할 때 종종 도메인 고유 언어 확장이 필요할 때가 있습니다. 스칼라에서는 새로운 언어 요소를 라이브러리 방식으로 간단히 추가할 수 있도록 하는 스칼라만의 메커니즘을 제공하고 있습니다: 모든 메소드를 중치(infix), 후치(postfix) 연산자로 사용할 수 있으며 필요로 하는 타임에 맞는 데이터형을 만들어 주는 클로져를 자동으로 만들어 줍니다(target typing). 이 두가지 기능의 조합하면 매크로 같은 메타 프로로그래밍을 사용할 필요도 없이, 구문 확장도 없이 새로운 문장을 정의할 수 있게 됩니다.

Scala 자바와 .NET과 연동됩니다.

스칼라는 Java 2 런타임 환경과 연동되도록 설계되었습니다. 특히, OO적인 주류인 Java 프로그래밍 언어와의 연동을 최대한 유연하게 하고 있습니다. 스칼라는 자바와 동일한 컴파일러 모델(분할 컴파일, 동적 로딩)을 지니고 있어서 수천이상의 고품질의 기존 라이브러리를 사용할 수 있습니다. .NET 프래임워크(CLR)도 사용가능합니다. 


(2009/4)
발 번역 한 것이라서 오역이나 잘 못된 내용이 있을 수 있습니다.
문제점이나 문의점은 저(허 련호 airless@funit.net)에게 연락 부탁드립니다.

Comments