Odpowiedź Keno jest na miejscu, ale może dam mu trochę więcej szczegółów na temat tego, co się dzieje i co zamierzamy z tym zrobić.
Obecnie istnieje tylko w trybie JIT LLVM:
- Istnieje bardzo trywialne tłumacza dla niektórych prostych stwierdzeń najwyższego poziomu.
- Cały inny kod jest wstawiany do kodu maszynowego przed wykonaniem. Kod jest agresywnie wyspecjalizowany przy użyciu typów wykonawczych wartości, do których kod jest stosowany, propagowanych w programie przy użyciu dynamicznego wnioskowania typu.
ten sposób Julia dostaje dobrą wydajność nawet gdy kod jest napisane bez adnotacji typu: jeśli zadzwonisz f(1)
otrzymasz kod specjalizuje Int64
- rodzaj 1
na systemach 64-bitowych; jeśli zadzwonisz pod numer f(1.0)
, otrzymasz wersję z nową wersją wyspecjalizowaną na Float64
- typ 1.0
we wszystkich systemach. Ponieważ każda skompilowana wersja funkcji wie, jakie typy będzie uzyskiwać, może działać z prędkością zbliżoną do C. Możesz go sabotować, pisząc i używając funkcji "typu niestabilnego", których typ zwracania zależy od danych wykonawczych, a nie tylko typów, ale staraliśmy się tego nie robić przy projektowaniu języka podstawowego i biblioteki standardowej.
Większość Julii jest pisana sama w sobie, a następnie przetwarzana, typowana i wprowadzana, więc uruchomienie całego systemu od zera zajmuje około 15-20 sekund. Aby przyspieszyć, dysponujemy systemem etapowym, w którym analizujemy składnię, wpisujemy, a następnie buforujemy zserializowaną wersję typu AST w pliku sys.ji
. Ten plik jest następnie ładowany i używany do uruchamiania systemu po uruchomieniu julia
. Żaden kod LLVM lub kod maszynowy nie jest buforowany w sys.ji
, tak więc cały proces JL LVM musi być nadal wykonywany za każdym razem, gdy uruchamiany jest julia
, co trwa około 2 sekund.
To 2-sekundowe opóźnienie uruchamiania jest dość denerwujące i mamy plan na jego naprawienie. Podstawowym planem jest możliwość kompilowania całych programów Julia do plików binarnych: albo pliki wykonywalne, które można uruchamiać, albo biblioteki współdzielone, które można wywoływać z innych programów tak, jakby były po prostu współdzielonymi bibliotekami C. Czas uruchomienia binarnego będzie jak każdy inny program C, więc 2-sekundowe opóźnienie uruchomienia zniknie.
Dodatek 1: Od listopada 2013 roku, wersja rozwój Julia nie ma już opóźnienie uruchomienia 2-sekundową ponieważ precompiles biblioteki standardowej postaci kodu binarnego. Czas uruchamiania jest nadal 10 razy wolniejszy niż w Pythonie i Ruby, więc jest miejsce na poprawę, ale jest dość szybki. Następnym krokiem będzie umożliwienie wstępnej kompilacji pakietów i skryptów, tak aby ci mogli uruchamiać się tak samo szybko jak sama Julia.
Dodatek 2: Od czerwca 2015 r. Deweloperska wersja Julii prekompiluje wiele pakietów automatycznie, umożliwiając szybkie ładowanie. Następnym krokiem jest statyczna kompilacja całych programów Julii.
Zostało to zaimplementowane w nocnych koszulkach Julii i zostanie dołączone do wydania 0.3. Czas uruchomienia znacznie się poprawił. –