Zastanawiam się, jak jest scala generowanie kodu bajtowego, czy używa niektórych bibliotek, takich jak ASM? Lub po prostu napisz binarne pliki .class dla wydajności?W jaki sposób generowany jest bajt kodu scala? Korzystając z niektórych bibliotek, takich jak ASM, lub bezpośrednio zapisuj dane binarne?
Odpowiedz
Począwszy 2,10 kompilator Scala wykorzystuje ASM 4 emitować bajtowego, wspierając -target: JVM-1,5 -target: JVM-1.6 i -target aspekty implementacji JVM-1,7
z backend opisano w:
- elektroluminescencyjna Scala classfiles poprzez ASM http://lamp.epfl.ch/~magarcia/ScalaCompilerCornerReloaded/2012Q2/GenASM.pdf
Kod bajtowy emiter (GenASM, źródło połączone poniżej) wizyty przepływ sterowania wykresu (cfg) zbudowany według poprzedniego etapu i wykorzystuje interfejs API strumieniowego ASM bezpośrednio emitują classfiles:
https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
to jak to wszystko działa teraz. W zakresie możliwości eksperymentalnych pracowałem nad emulacją eksperymentalnego kodu bajtowego, który jest szybszy, częściowo dlatego, że pomija budowanie CFG i bezpośrednio odwiedza Scala Abstract Syntax Trees (używając wtedy API drzewa ASM do budowania klasowych plików w pamięci). Szczegóły:
wygląda oni generowania kodu pośredniego, a następnie przekształcenie go ręcznie do kodu bajtowego Java lub .NET MSIL
Nicea przegląd kompilatora tutaj: https://wiki.scala-lang.org/display/SIW/Overview+of+Compiler+Phases
- 1. W jaki sposób jest generowany identyfikator sesji?
- 2. Jak skompilować asm generowany przez GCC?
- 3. Jak mogę odczytać dane binarne z wfstream?
- 4. Jaki jest najlepszy sposób użycia kodu Pythona z Scala (lub Java)?
- 5. Jaki jest odpowiednik Java tego kodu Scala?
- 6. Jak można odczytać dane binarne z rejestru do tablicy bajtów
- 7. Ciąg na bajt/binarne tablice w PHP
- 8. w jądrze Linux, asm lub asm-generic?
- 9. Korzystając z Roastera, w jaki sposób mogę wygenerować interfejs z określonym typem generycznym (lub typami)?
- 10. Tokenising dane binarne w java
- 11. Dlaczego otrzymuję komunikat "Ciąg lub dane binarne byłyby obcięte" tylko w niektórych przypadkach?
- 12. Wyjaśnienie kodu Asm:
- 13. Odczytaj dane binarne z konsoli. W
- 14. Python POST dane binarne
- 15. Używanie bibliotek java innych firm, takich jak com.jcraft.jsch, z clojure
- 16. Jaki jest najszybszy sposób przekonwertowania wartości float [] na bajt []?
- 17. Przechowuj dane binarne mysql
- 18. Jaki jest najlepszy sposób udostępnienia bibliotek współdzielonych wielu aplikacjom?
- 19. stream.io strumieniowe dane binarne
- 20. W C++, jaki jest najszybszy sposób określenia, czy dwa ciągi lub pliki binarne są różne?
- 21. Czy istnieje wersja programu .irbrc firmy Scala lub inny sposób definiowania niektórych bibliotek domyślnych do używania REPL?
- 22. Wysyłaj dane binarne z Androida w JavaScript
- 23. Jak uniknąć tego samego kodu podczas korzystania z bibliotek C++?
- 24. W jaki sposób Scala Slick tłumaczy kod Scala na JDBC?
- 25. W jaki sposób Ruby obsługuje bajty/pliki binarne?
- 26. Jaki jest tradycyjny sposób obsługi transakcji w Play 2 Scala?
- 27. Jaki jest najłatwiejszy sposób implementacji funkcji Scala PartialFunction w Javie?
- 28. Jaki jest najlepszy sposób udokumentowania kodu Perla?
- 29. Jaki jest dobry sposób debugowania kodu haskell?
- 30. Scala: w jaki sposób Wyliczenie nie jest bezpieczne?
Co przed scala 2.10? – Freewind
Przed 2.10 "GenJVM" był w użyciu. Do tej pory było to EOL'd. GenJVM użył biblioteki manipulacji kodu bajtowego opracowanej wewnętrznie (która nie nadąża za ramkami mapy stosów JDK6, na przykład) –
Zrobiłem to pytanie, ale tylko z powodu twojej odpowiedzi. Świetne informacje! – Andy