�빫�� ����� ���

Posts tagged ‘scala’

Scala 세팅하고 맛보기~


JVM 상의 함수형 언어 Scala!에서 소개한 scala를 셋팅하고 실행보았습니다.
먼저 다운로드 받아야겠죠? JDK/JVM은 설치되어있다는 가정하에서 말씀드리겠습니다.

  • Scala run time http://www.scala-lang.org/

이클립스나 넷빈즈를 사용하실 분은 전 포스팅에 있는 링크를 참조하시고, 다운받은 scala-2.7.7.final.zip를 적당히 풀어놓습니다. 전 D:\scala 로 간단히.
환경변수 중 PATH와 SCALA_HOME을 셋팅합니다. PATH는 bin 디렉토리를 포함한 D:\scala\bin 과 같이 될 것이고 SCALA_HOME은 압축을 풀어놓은 곳이지요. 전 D:\scala 이고요.

테스트를 해 볼까요?

커맨드창을 열어서
C:\scala 엔터!
인터프린터 환경입니다. 그리고 컴파일된 클래스의 실행명령이기도 하지요.

HelloWorld를 컴파일 해봐야겠죠?

1
2
3
4
5
object HelloWorld {
	def main(args: Array[String]): Unit = {
		System.out.println("Hello, world!" + args.toList);
	}
}

컴파일은 scalac HelloWorld.scala 로 간단히 컴파일됩니다. 그럼 .class가 나오지요. 실행은 scala HelloWorld 입니다. 뭐.. 대충대충하는군요.
(행여나 컴파일, 실행이 되지 않으시면 PATH와 SCALA_HOME이 살짜쿵 틀린 것입니다. 쉽게 되더라구요. -_-)

이 정도로는 함수형 언어의 다른 점을 잘 모르실 듯 해서.. 다른 코드를 하나 보여드리겠습니다.(developerWorks 에 있던 내용이예요. -_-)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
object Timer
{
	def periodicCall(seconds: Int, callback: () => Unit): Unit =
	{
		while (true)
		{
			callback()
			Thread.sleep(seconds * 1000)
		}
	}
 
	def main(args: Array[String]): Unit =
	{
		periodicCall(1, () => 
			Console.println("Time flies... oh, you get the idea."))
	}
}

간단히 살펴보면 말이죠.. 보통 자바나 C와 같이 main 함수가 어플리케이션에 시작점을 알려줍니다. def periodicCall(seconds: Int, callback: () => Unit)를 보면 callback 이라는 파라미터로 함수를 넘겨받습니다. () => Unit 이건 꼭 람다식이군요. 넘겨받은 함수는 파라미터로 callback() 과 같이 사용(호출)할 수 있게되는 거고요. main 함수에서 periodicCall를 콜 할 때 익명함수를 사용하는 것이 보이지요. periodicCall(1, () => Console.println(“Time flies… oh, you get the idea.”))

멋지지 않습니까? 클로져는 람다식으로 간단히 구현되고, 익명함수도 당연히 되며, Unit이라는 객체로 거의 모든 객체를 표현하는 무한한 자유도! 보통 함수형 언어라면 “그까잇거..”하는 것이지만 이게 JVM에서 돌아간다는게 멋진 것이죠.

아직 Haskell도 잘 모르는 상태에서 Scala까지.. 이거 재미있는 것들이 넘쳐나서 좋군요. 흐흐흐흐

JVM 상의 함수형 언어 Scala!


Ajax의 한계를 넘어서기 위한 Comet을 알아보던 중에 재미있는 놈을 발견하게 되었습니다. developerWorks의 Scala, Lift 및 jQuery를 사용하여 Comet 애플리케이션 빌드하기 문서 인데요, Scala가 뭔가 해서 구글링 하고 보니 developerWorks 바쁜 자바 프로그래머를 위한 스칼라 입문
developerWorks 바쁜 자바 프로그래머를 위한 스칼라 입문 검색 이 문서들이 나오는 군요.
아직 정확하게 파악한 건 아니지만 Scala라는 놈은 JVM상에 동작하는 함수형 언어라는 겁니다. Java API를 사용할 수도 있지요. 전부터 조금씩 Haskell공부를 하고 있는 중인데 JVM에서 동작한다니 한편으로 반갑군요. developerWorks의 문서를 인용하여 Scala의 일면을 엿보면..

지난 5년 간에 자바 언어에 대한 불만이 점차 커지고 있다. 혹자는 루비 온 레일즈(Ruby on Rails)의 성장을 주요 요인으로 지적하기도 하지만 개인적으로는 RoR(루비 전문가 들이 흔히 지칭하는 대로)은 그저 결과일 뿐 원인은 아니라고 생각한다. 또는 더 정확하게 말해 자바 개발자들은 더 깊고 은밀한 이유의 결과가 루비일 거라고 생각한다.
간단히 말해 자바 프로그래밍은 오래된 만큼 한계를 보이고 있다.
혹은 더 정확히 말하면 자바 언어 가 한계를 보이고 있다.
생각해 보자. 처음 자바 프로그래머가 나타났을 때 클린턴(대통령) 재임 중이었고 인터넷을 일상적으로 사용하는 사람은 여전히 진짜 괴짜들뿐이었다. 집에서 인터넷에 접속하는 유일한 방법은 전화로 접속하는 방법뿐이었기 때문이다. 블로그라는 개념도 없었고 모든 사람은 상속이 재사용의 근본적인 방법이라고 믿었다. 우리 또한 객체가 실세계를 모델링하는 가장 좋은 방법이고 무어의 법칙은 기하급수적으로 영원히 유효할 거라고 믿었다.
실제 업계의 많은 사람이 신경 썼던 건 무어의 법칙이다. 하지만 2002/2003년 이후, 마이크로프로세서의 주된 추세는 멀티 코어 CPU가 되었다. 본질적으로는 하나의 칩에 다수의 CPU를 넣은 것이다. 이는 매 18개월마다 CPU 속도가 2배가 될 거라고 예상한 무어의 법칙과 다르다. CPU 하나에서 표준적인 라운드 로빈 주기(round-robin cycle)를 반복하기보다는 2개의 CPU에서 동시에 실행하는 멀티스레드 환경이 됐다는 것은 코드가 제대로 동작하려면 멀티스레드에 완벽하게 안전해야 한다는 걸 뜻한다.
학계에서는 이 문제에 대해 많은 연구가 되어 왔고 그 결과로 많은 언어가 설계되었다. 치명적인 문제는 이런 언어 대부분이 각자 그 언어 전용의 가상 기계(virtual machine)나 해석기(interpreter) 위에서 구현되었기 때문에 적용을 하려면, 루비처럼 새로운 플랫폼으로 옮겨가야 했다는 점이다. 멀티스레드 실행은 중요한 문제이고 새로운 언어 중 일부는 강력한 해법을 제시한다. 하지만 너무나 많은 회사나 기업이 10년 전 C++에서 자바 플랫폼으로 이행했을 때를 기억한다. 새로운 플랫폼으로 옮겨가는 위험 부담은 많은 회사가 이제 진지하게 검토하지 않을 정도로 높다. 사실 많은 회사나 기업이 아직 자바 플랫폼으로 이행할 때 입은 상처를 치료하고 있다.
스칼라로 오십시오.

랍니다.

일단 HelloWorld를 봐야겠죠?

1
2
3
4
5
object HelloWorld {
  def main(args: Array[String]): Unit = {
    System.out.println("Hello, Scala!")
  }
}

class 가 object로 바뀌었고.. 배열도 Array[String]으로 바뀌었군요. 함수형 언어의 장점인 클로져나 익명함수도 물론 지원한답니다.

공식 홈페이지는 http://www.scala-lang.org이고 Eclipse pluginnetbeans plugin도 있네요. 이클립스 플러그인은 아직 좀 부족하다고 평하는군요. 넷빈즈는 모르겠습니다. 지금 다운받고 있는 중이긴한데.. 회사 네트웍이 워낙 느려놔서.. -_-;;

조금 더 알아보고 포스팅하도록 하지요.

P.S 몰랐는데 WP-Syntax가 scala를 지원하네요. ~_~