読者です 読者をやめる 読者になる 読者になる

( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

Scalaのtrunkをビルドする

「あばばばばばばばば」

この記事は、Scala Advent Calendar jp 2010 : ATNDの17日目です。


今日は、Scalaそれ自身をソースからコンパイルする方法を紹介します。やりかたは簡単で、Scalaソースコードを持ってきて、antコマンドでビルドするだけです。


Scalaソースコードsvnでホストされてますが、githubにもmirrorがあります。こちらから落とすのがよいでしょう。svnが許されるのはゼロ年代までだよねーキャハハ!!


scala/scala · GitHub


じゃあ、git cloneでソースコードを取得して……antでビルドです。簡単っしょ?sbtも使えます。ただし、コンパイルにはメモリを1.5Gほど消費します。core i5/8G/SSDのMBPでビルドに10分かかりました。

$ git clone https://github.com/scala/scala.git
$ cd scala
$ ant


f:id:yuroyoro:20101223150649p:image


で、このbuild.xmlはSABBUSと呼ばれていて、コンパイラSDKをそれぞれにコンパイルでき、自前でビルドしたコンパイラを次のコンパイル時に利用できる用になってます。詳しくはREADME嫁。


せっかく自前でビルドするので、ちょっと文法を変えてみました。try-catch-finalyの代わりにRuby風のbegin-ensureに変更します。こんなパッチを当ててコンパイル。

diff --git a/src/compiler/scala/tools/nsc/symtab/StdNames.scala b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
index 22be96b..6c7147e 100644
--- a/src/compiler/scala/tools/nsc/symtab/StdNames.scala
+++ b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
@@ -90,7 +90,7 @@ trait StdNames extends reflect.generic.StdNames with NameManglers {
     final val EXTENDSkw: NameType   = "extends"
     final val FALSEkw: NameType     = "false"
     final val FINALkw: NameType     = "final"
-    final val FINALLYkw: NameType   = "finally"
+    final val FINALLYkw: NameType   = "ensure"
     final val FORkw: NameType       = "for"
     final val FORSOMEkw: NameType   = "forSome"
     final val IFkw: NameType        = "if"
@@ -113,7 +113,7 @@ trait StdNames extends reflect.generic.StdNames with NameManglers {
     final val THROWkw: NameType     = "throw"
     final val TRAITkw: NameType     = "trait"
     final val TRUEkw: NameType      = "true"
-    final val TRYkw: NameType       = "try"
+    final val TRYkw: NameType       = "begin"
     final val TYPEkw: NameType      = "type"
     final val VALkw: NameType       = "val"
     final val VARkw: NameType       = "var"


ビルドされたRuntimeはbuild/packにあるので、build/pack/bin/scalaコマンドでREPLを起動。ちゃんとbuild numberが変わってますね。


f:id:yuroyoro:20101223150650p:image


begin-ensureで例外処理!


f:id:yuroyoro:20101223150651p:image


2.9から入るparallel collectionも入ってますね。STMはまだみたいです。


f:id:yuroyoro:20101223150652p:image


ってことで、みんなでScalaのtrunk追いかけようぜ?