scalacをするのとしないのと

http://d.hatena.ne.jp/daisun/20080322/1206163454
の最後に書いた、コンパイルしなくても動くとか動かないとかの謎。
いまだ理解できていないし答えも出ていないけど
とりあえず考えたことをまとめておく。

Javaは?

まず、scalaJVM上で動作するのでJavaについて考えてみる。
Javaは、

  1. .javaファイルを作成
  2. javacでコンパイル
  3. .classファイルが生成される
  4. javaで.classファイルを実行

Javaはいったん.javaファイルをJVMが読む中間ファイル(.class)にコンパイル
して、JVMがそのファイルを実行する。

scalaは?

  1. .scalaファイルを生成
  2. scalacでコンパイル
  3. .classファイルが生成される
  4. scalaで.classファイルを実行

ただし、
scala ファイル
でも実行できるコードもあり。これが曲者。

scalaインタプリタ

そもそもスクリプト言語インタプリタが逐次内部でコンパイルして
実行してたはず。
scalaスクリプト言語。ってことはscalaインタプリタが入っている?
だから、PythonRubyのように対話型のインターフェイスがある?

逐次実行を実験

以下をファイルに書いて実行してみる。

var hoge = new Hoge
hoge.f

class Hoge(){
    def f() = 
      print("xxx")
}

Hogeがないって怒られる。

では。以下をscalacでコンパイルして実行

object O(){
    def main(args: Array[String]){
        var hoge = new Hoge
        hoge.f
    }
}

class Hoge(){
    def f() = 
        print("xxx")
}

ちゃんと動く。
これは、コンパイル時に最適化しているからだろう。

JVMとの関係は?

うまく表現できないけど、
Java
.class <-> JVM
のやりとり。

scala
.class <-> (scalaインタプリタ) <-> JVM
のやりとり。

と考えてみる。

scalaはみている?

もしかして、scalaは、.classファイルであれば、JVMに処理をまかせて、
他のファイルであれば、スクリプト言語として、scalaインタプリタ
逐次、JVMとやりとり(?)して処理を実行している?
ように、読み込ますファイルをチェックして実行方法を変えているの
ではないかな?
そうするとすこし理にかなってくるように思う。
う〜ん。まだまだ理解できない、周りは真っ暗闇状態だ。