A Scala Tutorial for Java programmers を淡々と写経するよ (1)

| | コメント(0)

Scalaは、JVMで動作するオブジェクト指向関数型言語らしいですよ。詳しい話はよくわかりませんが、なんとなく心の片隅にひっかかっていたので、ちょっと触ってみることにしました。

まずはインストールです。Macなので、Mac portsをつかえば簡単にできます。Emacs向けにscala-modeも用意されているので、ついでにインストールすれば準備は万端になります。

% port install scala
% sudo install -m 644 /opt/local/share/scala/misc/scala-tool-support/emacs/*.el /Applications/Emacs.app/Contents/Resources/site-lisp/

とりあえず、初心者向けのドキュメントがあるっぽいので、そちらを淡々と写経していきましょう。JavaプログラマのためのScalaチュートリアルとあるので、私にはぴったりです。

A Scala Tutorial for Java Programmers

1 Introduction

ドキュメントの前書きですね。このドキュメントの目的は、Scalaの概観を既にオブジェクト指向言語、とくにJavaの知識がある人に向けて解説するためにあるということがかかれていました。

2 A first example

まずはHello Worldからですね。

object HelloWorld {
  def main(args : Array[String]) {
    println("Hello, World")
  }
}

mainはJavaと似ています。

本文によると、

  • コマンドライン引数はargsに格納されている。
  • mainメソッドは返り値を宣言しない手続きメソッドである。
  • object HelloWorldという宣言はHelloWorldクラスとそのインスタンスをつくる。また、それはシングルトンオブジェクトとなる。
  • staticはScalaに存在しない。シングルトンオブジェクトをつかう。
だそうです。疑問として、

  • printlnのレシーバは何か。
ということをおもいつきましたが、とりあえずはそっと目をつぶっておきます。

2.1 Compiling the example

コンパイルは scalac コマンドをつかうようです。scalacで先ほどのコード(2.scalaファイル)をコンパイルすると、2つのクラスファイルができあがりました。

$ scalac 2.scala
$ ls
2.scala           HelloWorld$.class HelloWorld.class
$ javap HelloWorld
Compiled from "2.scala"
public final class HelloWorld extends java.lang.Object{
    public static final int $tag();
    public static final void main(java.lang.String[]);
}
% javap HelloWorld\$
Compiled from "2.scala"
public final class HelloWorld$ extends java.lang.Object implements scala.ScalaObject{
    public static final HelloWorld$ MODULE$;
    public static {};
    public HelloWorld$();
    public void main(java.lang.String[]);
    public int $tag();
}

この時点で、もう色々と疑問は尽きませんが、ここは大人になって黙っておきます。

2.2 Running the example

それでは、実行してみましょう。特別に用意されたscalaコマンドで実行できるようです。

$ scala -classpath . HelloWorld
Hello, World

Javaコマンドから実行できるでしょうか。

$ java -classpath . HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: scala/ScalaObject
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at HelloWorld.main(2.scala)

ScalaObjectがないとおこられてしまいます。そこで、Scalaのライブラリをクラスパスに追加して実行してみます。

$ java -classpath .:/opt/local/share/java/scala-library.jar HelloWorld
Hello, World

おお、動作しましたね。

コメントする

著者について

高井直人
高井 直人
takai@recompile.net

ソフトウェアエンジニア。1977年横浜生まれ。大学在学中からネットワークや情報技術にたずさわる。Web制作会社などを経て、現在はシステムインテグレータに勤務。エンタープライズRubyをテーマに社内標準の策定などに従事している。

タグクラウド

ウェブページ

Powered by Movable Type 4.1-en-release-26-r1141-20080104