2016-12-12 14 views
0

これは最初の質問であり、スカラだけでなく(私はJavaについても同じことを知りたい)、基礎クラスの基本メソッドの実装はどこですか?たとえば、乗算演算にはいくつかのオーバーロードされたメソッドがあり、インタフェースについてのみ書かれています。 (https://github.com/scala/scala/blob/2.12.x/src/library/scala/Int.scala#L392-L405Scalaの '+'、 '*'、 '/'(算術演算子)のような基本的なメソッドの実装はどこですか?

しかし、私がそこを見ると何も見つかりません。どのように私は彼らの実装について知ることができますか?

+1

私は間違っているかもしれませんが、Javaでは通常のメソッドではなく、特別な演算子( 'instanceof'、' public'、 'synchronized'など)です。 – Gabriel

答えて

6

これらのメソッドの実際の実装はありません。 JVMでは、これらのメソッドは実際には存在しません。それらはコンパイラによってbytecode instructionに翻訳されます。たとえば、Intのメソッド+は、バイトコード命令iaddに変換されます。

スカラックがRE​​PLで生成するバイトコードを確認できます。 iloadは、「スタック上のローカル変数をプッシュする」という意味です。 iaddは、スタックから2つの値をポップし、整数であるかのように追加し、結果をスタックに戻します。同様の問題が発生したscala.js何かの場合は、代わりにコードが生成されますjavascriptのJVMバイトコードの

scala> class Foo { def foo(a: Int, b: Int) = a.+(b) } 
defined class Foo 

scala> :javap -c -p -filter Foo 
Compiled from "<console>" 
public class Foo { 
    public int foo(int, int); 
    Code: 
     0: iload_1 
     1: iload_2 
     2: iadd 
     3: ireturn 

    public Foo(); 
    Code: 
     0: aload_0 
     1: invokespecial #24     // Method java/lang/Object."<init>":()V 
     4: return 
} 

関連する問題