2016-12-12 3 views
0

Это может быть самый начальный вопрос, и не только для Scala (я также хочу знать то же самое для Java), но где реализация базовых методов в базовом классе? Например, операция умножения имеет некоторые перегруженные методы, и только о интерфейсе написано. (https://github.com/scala/scala/blob/2.12.x/src/library/scala/Int.scala#L392-L405)Где реализуются базовые методы, такие как '+', '*', '/' (Арифметические операторы) в Scala?

Но, когда я озираюсь там, ничего не найдено. Как я могу узнать об их реализации?

+1

Возможно, я ошибаюсь, но на Java они не являются обычными методами, они являются специальными операторами (например, 'instanceof',' public', 'synchronized' и т. Д.). – Gabriel

ответ

6

Фактической реализации этих методов не существует. Для JVM эти методы даже не существуют. Они переводятся компилятором на bytecode instruction. Например, метод + по адресу Int переведен в инструкцию байтового кода iadd.

Вы можете увидеть байт-код, который генерирует scalac в REPL: iload означает «надавить локальную переменную в стек». iadd извлекает два значения из стека, добавляет их, как если бы они были целыми числами, и возвращает результат обратно в стек.

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 
} 

В случае scala.js нечто подобное происходит, но вместо JVM байт-код, JavaScript-код получает генерируется.