Co jest w środku gotowych klas?

0

Postanowiłem sobie otworzyć klasę Math. w dokumentacji Oracle. Ku mojemu wielkiemu zdziwieniu wypisane są wszystkie metody a wraz z nimi jest cały opis. Nie ma jednak kodu w sensie mechaniki działania. Nie ma kodu np na potęgowanie. Dlaczego? Gdzie on jest? I jak działa JAVA skoro nawet w IntelillJ jest dokładnie to samo? Czy to wszystko jest skompilowanie do kodu dwójkowego i dlatego nie można tego zobaczyć? Pozostaje nam sam opis... chciałbym to zobaczyć chociażby miało mi wypalić oczy :)

1

Chodzi ci o metody z modyfikatorem native? Ich implementacja znajduje się bibliotekach skompilowanych do kodu natywnego. Te które są w JRE są w dużej mierze specjalnie obsługiwane przez VMkę, ale ogólnymi mechanizmami pozwalającym tworzyć własne metody typu native są np JNI czy JNA.

0

Native też ale nie tylko. Bo np najprostszym przypadku w "public static double sqrt(double a) return StrictMath.sqrt(a);}" nie ma w kodzie słowa native i właściwie na tym cała magia się kończy. Ale komentarzu jest coś o native i JIT. Gdzie mogę obejrzeć taki kod dla tego przypadku?
Wiadomo to ciekawość, nie potrzebuję tego do życia ale do szczęścia tak :)

1

Nie bardzo cię rozumiem. Wchodzisz do implementacji tegoż StrictMath.sqrt a tam masz public static native double sqrt(double a); czyli kod jest napisany w C i java ładuje skompilowaną wersje.
Jak bardzo ciekawi cię jak to wygląda to ściągnij sobie np. źródła openjdk np.
https://github.com/openjdk-mirror/jdk7u-jdk/blob/f4d80957e89a19a29bb9f9807d2a28351ed7f7df/src/share/native/java/lang/StrictMath.c
A tam widać że wołają sobie https://github.com/openjdk-mirror/jdk7u-jdk/blob/f4d80957e89a19a29bb9f9807d2a28351ed7f7df/src/share/native/java/lang/fdlibm/src/e_sqrt.c

0

tam nie ma żadnego C jest tylko "public static native double sqrt(double a);" i komentarz poniżej.

2

Do pliku .java nie wrzucisz kodu w C, więc zamiast tego oznacza się metodę jako native, ciało zostawia się puste, a potem za pomocą JNI czy innego interfejsu VMka odpala kod napisany w C. (zamiast C mogą być oczywiście inne języki kompilowane do kodu natywnego)

1

Dodatkowo te wstawki nazywa się "intrinsics" - to "zaufane" C - jak Ty użyjesz JNI to jest to dość wolne i upierdliwe (safepoint overwhelming - dlatego jak już wchodzisz z JNI do c, to warto żeby to miało sens i faktycznie dawało efekt, np: tomcat-native ), tutaj można założyć że JVM wie co woła. To lista którą maintaintuje Andrei Pangin https://gist.github.com/apangin/8bc69f06879a86163e490a61931b37e8#file-jdk-9-intrinsics - wszystkie takie wstawki które możesz napotkać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1