Scala Programming Language

cinsk의 이미지

최근에 새 언어를 배우게 됐습니다. Scala라는 언어인데, 꽤 잘 만든? 언어라는 생각이 들어서 소개합니다. 이미 아시는 분들도 있겠지만...

아직 배우고 있는 중이라서, 잘 알지는 못하지만, 지금까지 알게 된 내용으로 말하자면,

간단히 말해:


  • 느낌상 Scala는 Java에 LISP 또는 ML을 짬뽕한 것 같습니다. Functional programming에 관한 내용이 꽤 많이 들어간 언어입니다.

  • Scala는 interpreter와 compiler를 다 제공하는데, compiler는 JVM에서 돌아가는 byte code를 생성합니다.

  • JVM에서 돌아가기 때문에, 기존 Java의 library를 그대로 가져다 쓸 수 있습니다. 따라서 Java 개발자라면 배우기 편할 것 같네요. 물론 LISP과 같은 언어에 대한 기본 지식이 있다는 가정 아래에서..

  • 대부분 Functional language가 그렇긴 하지만, 배우기 꽤 어렵습니다.

특이할만한 언어 내용으로:


  • Java의 interface와 비슷한 trait가 제공되는데, trait는 implementation을 포함할 수 있습니다.

  • Java의 object system과 달리, int와 같은 기본 데이터 타입도 모두 object로 처리됩니다.

  • functional language이기 때문에 function은 first-class type입니다

  • closure, local function을 지원합니다

  • Partial applied function -- 자신만의 control structure를 만들 수 있습니다

  • type parameterization -- C++의 template을 생각하시면 됩니다. 하지만 covariance/invariance/contravariance를 지정할 수 있기 때문에 훨씬 더 강력합니다. (어렵기도 함)

  • pattern matching -- switch와 비슷한데, pattern matching을 통해서 훨씬 더 강력하고 편한 방식으로 코딩할 수 있습니다.

  • XML 지원 -- 대부분 언어가 library function 또는 class를 통해서 XML을 처리하는 것과 달리, Scala는 XML 자체를 문법으로 인식하고 있습니다. 즉, 코드 상에서 XML을 직접 쓸 수도 있으며, Scala 언어가 자동으로 이를 parsing합니다. 따라서 Web framework에 유리

기타:


  • 고맙게도? Scala 배포판은 Emacs scala-mode package를 포함하고 있습니다. Emacs 사용자라면 더욱 환영할 듯 합니다. 관련 설정은 제 Emacs script를 참고하기 바랍니다.

  • Scala 책은 현재 두 권이 나와 있는데, Programming in ScalaBeginning Scala가 있는데, 가능하면 "Programming in Scala"를 읽기 바랍니다.

  • Scala를 기반으로한 web framework인 Lift가 있습니다. 꽤 강력한 것으로 알려져 있지만, 아직 쓸만한 Tutorial은 보지 못했네요. 주제넘게 말하자면 지금까지 나와 있는 책인 The Definitive Guide to Lift: A Scala-based Web Framework, 문서 등은 Django의 tutorial에 비하면 거의 쓰레기 수준.. -,.-

  • Linux 배포판에 제공된 것보다, 직접 binary package를 Scala site에서 받아서 쓰기를 추천합니다. Scala는 자체 pacakge 관리자인 sbaz를 내장하고 있어서 update가 유리합니다.

  • Gentoo 사용자라면, Java VM으로, icedtea6-bin을 쓰면, JVM loading 속도가 좀 더 빠른 듯? 합니다.

요청:

  • 쓸만한 Lift 책 또는 문서을 아시는 분이 있다면 좀 알려주세요.
  • 제게 Lift를 가르쳐주실 분을 찾습니다. -_-;;
  • 여러 명 대상으로 세미나를 해 주실 분도 찾습니다. 장소 지원 및 강의료 지원 가능

댓글

shint의 이미지

지방에서도 이런게 가능하다면 좋겠네요.
라고는 하지만. 사실 들을 사람도 있을가 말까... ㅠㅠ;;;;

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

widgie의 이미지

http://eventreg.oracle.com/webapps/events/ns/EventsDetail.jsp?p_eventId=125255&src=7009948&src=7009948&Act=144

다음주 금요일 오라클 세미나에서

SCALA 세션이 하나 있네요.

15:10 - 16:00 Introduction to Scala
Scalable 한 언어로써 최근에 각광을 받고 있는 Scala Language 에 대해서 소개 합니다. 한국오라클 이창재 아키텍트

아 근데 intro 정도니 cinsk님이 더 잘아실거 같기도 하고 -_-;;

kaeri17의 이미지

당연히 functional language니 function이 primitive type이겠지만, 컴파일했을때 byte code에서 어떻게 될지 궁금하네요. 근데 요즘 자바 최신버전에서 closure지원 하나요? 예전에 보았을때는 지원 계획이 있었는데 어떻게 되었나 궁금하네요...

neocoin의 이미지

아직 지원안합니다. 올해 7월에 나올 java 7 에 구현된 모양이더군요.

liame의 이미지

java 7에서도 안들어간다는 글을 어디선가 본 것 같은데, 정확한 출처는 기억이 안나네요.

아마 블로그같은데서 인것 같은데..

Mr. 하늘의 이미지

넵, jdk8에서 지원될 예정입니다.
http://blogs.sun.com/mr/entry/rethinking_jdk7

neocoin의 이미지

그렇군요.

http://openjdk.java.net/projects/jdk7/features/ 예정되었는데, 막상 들어가보면

http://openjdk.java.net/projects/lambda/ 8로 갔네요. 2012년 말에나 정식 버전에 반영된다는 이야기인데 것 참..

mykldp의 이미지

clojure 와 함게 jvm 언어 중에서는 요즈음 가장 화제인 언어이지요.
Results from the State of Haskell, 2010 Survey (http://blog.johantibell.com/2010/08/results-from-state-of-haskell-2010.html)
에 보면 내일 haskell 이 없어진다면 어떤 언어를 사용할 것인가? 에 대한 대답에 2위로 올라와 있습니다.
(1위는 ocaml, 3위로 clojure 와 f# 이 동률입니다.)
저도 얼마 전부터 공부를 시작했습니다. 몇 가지 첨언을 해봅니다.

> 느낌상 Scala는 Java에 LISP 또는 ML을 짬뽕한 것 같습니다.

lisp 보다는 ML 계열 또는 haskell 의 영향이 여러모로 더 큽니다. clojure 는 lisp 이지요.

> Functional programming에 관한 내용이 꽤 많이 들어간 언어입니다.

내세우는 비젼은 functional programming 과 OOP 을 잘 섞는 것입니다.
잘 설계된 OOP 언어를 기반으로 functional programming 테크닉을 사용할 수 있도록 하는 방식입니다.
모든 것이 object 입니다. function 도 마찬가지로 object 입니다. 그리고 top-level function 은 없습니다.
repl 에서 사용할 때에는 top-level function 을 정의할 수 있는 것 같은 착각이 들 수도 있지만, 실은 function 은 항상 어떤 object 의 멤버입니다.
repl 에서는 숨어있는 환경 객체가 있는 셈이지요.

> 대부분 Functional language가 그렇긴 하지만, 배우기 꽤 어렵습니다.

java 개발자들 중에서 전향하려던 사람들의 불만이기도 합니다. 근래에 scala 의 복잡성에 대해 여러 말들이 있었습니다.

> Java의 interface와 비슷한 trait가 제공되는데, trait는 implementation을 포함할 수 있습니다.

사실상 다중 상속입니다. 상위 클래스들을 적당한 규칙에 따라 linearize 해서 (즉, 순서를 정해서) member resolution 을 해결합니다.
trait 은 default 생성자 이외의 생성자를 가질 수 없는 등 몇가지 제약이 있지만, 꼭 그래야하는지에 대해서는 ... 잘 모르겠습니다.
그러한 제약을 없애자는 논의도 있습니다.

> Partial applied function-- 자신만의 control structure를 만들 수 있습니다

haskeller 들을 위해 첨언하자면, haskell 처럼 모든 function 이 항상 curried function 인 것은 아닙니다.
partial application 이 가능하도록 하기 위해서는 그렇게 되도록 정의 해야합니다.

> type parameterization -- C++의 template을 생각하시면 됩니다. 하지만 covariance/invariance/contravariance를 지정할 수 있기 때문에 훨씬 더 강력합니다. (어렵기도 함)

자바와 마찬가지로 erasure 기반 generics 입니다. c++ template 과는 많이 다릅니다....
scala 에서는 type parameterization 이외에도 abstract type member 를 비슷한 용도로 (하지만 보다 OOP 스럽게...? ) 사용할 수 있습니다.

> pattern matching

algebraic data type (scala 에서는 case class 를 통해 구현됩니다.) 에 대한 매칭 이외에도 몇 가지 패턴을 제공합니다.

> Scala 책은 현재 두 권이 나와 있는데

더 있습니다. http://www.scala-lang.org/node/959 를 참고하시구요. "Programming in Scala" 가 말하자면 The X programming language (TCPL 같은) 에 해당하는 책입니다.
"Programming Scala" 라는 제목의 O'Reilly 책도 괜찮습니다.

기타 몇 가지를 추가하자면...

scala 의 특징 중 하나로 implicit definition 이 있습니다. haskell type class 와 비교하는 경우가 많습니다.
http://blog.tmorris.net/the-power-of-type-classes-with-scala-implicit-defs/

actor 기반 concurrency 를 표준 라이브러리로 지원합니다. STM 도 곧 추가될 예정입니다.
clojure 에 비해 actor 라이브러리 디자인이 딸린다는 (^^;) "소문" 을 들었습니다.
제가 concurrency 쪽을 잘 몰라서 진위는 모르겠습니다.

버젼 2.8 이 나온지 얼마 안됬는데, 기존 버젼과 호환되지 않는 변화가 있습니다.
사실 2.8 대해 정식 릴리즈 이전부터 수 년간 논의가 있었기 때문에 웹에서 얻을 수 있는 많은 정보가 이미 2.8 기준입니다.
그렇더라도 문서를 보실 때에 참고하시는 것이 좋을 것 같습니다.

그리고 scalaz (http://code.google.com/p/scalaz) 라는 라이브러리가 있습니다.
functional programming 을 잘 지원하기 위한 라이브러리입니다.
haskell 에 익숙한 분들이 좋아하실 겁니다.

ihji의 이미지

저는 최근 일년 반정도 Scala를 이용하여 Java 분석기를 작성하고 있는데 그전 2년동안 OCaml만 써와서 그런지 처음엔 정말 적응이 안되더군요. 한 6개월 정도 지나고 나니 좀 편해졌는데 ML이나 Haskell 처럼 생각하기 보다는 Java 9 쯤이라고 생각하는게 포인트더군요. Scala가 functional language인가 아닌가에 대한 토론도 꾸준히 일어나고 있는 걸 볼때 이런 느낌은 저만의 생각은 아닌듯 합니다. 당장 생각나는 제가 가장 익숙하지 않았던 점을 몇가지 꼽아보자면,

1. type inference가 local 합니다. 따라서 global type inference가 지원되는 언어(ML, Haskell, ...)과 비교하면 생략해도 되는 많은 타입 정보들을 직접 써주어야 합니다. 게다가 앞서 몇분이 지적해주셨듯 inheritance와 covariant, contravariant를 지원하려다보니 type 자체가 상당히 복잡하고 어렵습니다. JVM의 type erasure 도 복잡함에 한몫합니다.

2. function과 method가 다릅니다. class의 멤버로 선언하는 method와 다른 method에 인자로 줄 수 있는 function이 다릅니다. method를 first-class value로 사용하려면 => notation을 이용하여 애초부터 FunctionN 타입의 객체를 만들던가, partial application _ 을 이용하여 사용시에 변환 해주어야 합니다.

3. tuple을 argument로 받아 decomposition 할 수 없습니다. 항상 x._1, x._2 처럼 사용해야 합니다 (아니면 다른 variable에 assign 하던가).

정도가 되겠네요. 1,3번은 그렇다고 쳐도 저는 2번을 도저히 용납 할 수 없었는데, OCaml은 functional + OO 지만 functional이 중심이고 Scala는 functional + OO 지만 OO가 중심이라고 생각을 정리하고 나니 Scala가 제공하는 강력한 OO 지원과 Java와의 seemless한 interoperability 때문에 그냥 참고 쓸만 하더군요.

요즘은 초반에 짰던 코드들을 리팩토링 하고 있습니다. 점점 Scala를 알아가면 알아 갈 수록 OO 스럽지 않은 초기 코드가 마음에 들지 않네요. 불만만 잔뜩 썼지만 결론은 Scala는 추천 할 만한 언어라는 겁니다 :)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.