Zbliżanie się do elementów wewnętrznych Java / JVM [zamknięte]

15

Programuję w Javie od około 8 lat i znam język dość dobrze jako programista, ale moim celem jest pogłębienie wiedzy na temat elementów wewnętrznych. Brałem udział w studiach licencjackich z projektowania PL, ale były to bardzo obszerne przeglądy akademickie (w Schemacie, IIRC).

Czy ktoś może zasugerować trasę, aby zacząć zagłębiać się w szczegóły? W szczególności, czy istnieją konkretne tematy (powiedzmy, wyrzucanie śmieci), które mogą być bardziej dostępne lub być dobrym punktem wyjścia? Czy istnieje przyzwoita książka wysokiego poziomu na temat elementów wewnętrznych JVM i projektu języka programowania Java? Moje obecne podejście będzie zaczynać od specyfikacji JVM i badań w razie potrzeby.

spinning_plate
źródło
2
Moim osobistym podejściem byłoby (i jest) znalezienie prawdziwego powodu tych wszystkich małych „powodów, dla których to dokładnie tak działa” w Javie. Jak zdefiniowane jest auto-boxowanie, jak działają typy ogólne. Co z var-args? Co faktycznie robi SUPERflaga w plikach klas? Większość z nich jest opisana w samej specyfikacji JVM, ale wymaga trochę pracy, aby wydostać się z tego do mózgu ;-)
Joachim Sauer

Odpowiedzi:

13

Zrobiłem to trochę, kiedy zacząłem od Java, lata temu. Moje podejście polegało na odczytaniu specyfikacji VM i przyjrzeniu się wynikowi javap -c, który wyświetla zdemontowany kod bajtowy klasy. Próbowałem także utworzyć klasy Java z określonym kodem bajtowym, używając asemblera kodu bajtowego Java. Istnieje asembler o nazwie jasmin , jeśli chcesz tego spróbować.

Możesz także zajrzeć do dokumentu Lambda Expression Translation , który opublikował Brian Goetz z Oracle, który obejmuje strategię, która będzie używana do tłumaczenia lambd (zasadniczo zamknięć), które są dodawane w Javie 8.

Możesz także pobrać kod źródłowy maszyny wirtualnej Hotspot z OpenJDK oraz wersję kompilatora javac z wczesnym dostępem z obsługą lambda (repozytorium hg) dla JDK 8, jeśli naprawdę masz ochotę zanurzyć się w głębokim końcu puli.

Zaglądanie do śmieci jest prawdopodobnie dobrym pomysłem. Szybkie wyszukiwanie ujawniło ten artykuł dr. Dobbsa na temat GC-a po pierwsze śmieci. Nie wiem, czy to dobre wprowadzenie. Zakładam, że wiesz już o zbieraczach śmieci typu mark-and-sweep i generacyjnych; jeśli nie, najpierw będziesz chciał przeczytać o nich.

David Conrad
źródło
3

Kilka dodatkowych pomysłów:

  • Zaangażuj się w projekt OpenJDK . Włamując się do niego, nic nie przebije zrozumienia wewnętrznych elementów niektórych programów!
  • Zobacz, jak inne języki JVM (np. Clojure lub Scala) generują kod dla JVM
  • Wykonaj mini-projekt, który Cię interesuje i wymaga użycia elementów wewnętrznych JVM. Być może używając czegoś takiego jak ASM do manipulowania kodem bajtowym ...
mikera
źródło
2

Jeśli nie znasz jeszcze formatu kodu bajtowego Java, zastanów się nad napisaniem małego kompilatora, który tworzy prawidłowy kod bajtowy Java (lub asembler Jasmin) i sprawia, że ​​działa poprawnie.

Widok „Hello World” lub „4” (biorąc pod uwagę 2 + 2) wygenerowany przez Twój kod jest bardzo satysfakcjonujący.


źródło