A czy just in time compilation w przypadku jsa kompiluje kod do kodu maszynowego czy tylko do kodu bajtowego? Jeśli tylko do kodu bajtowego to jak potem ten kod jest kompilowany do kodu maszynowego?
Normalnie musisz napisać kod, który wygeneruje kod, który potem skompilujesz i otrzymujesz binarkę lub po prostu dostajesz wskaźnik z adresem gdzie jest opcode wygenerowany.
Przykładowo w C to tworzysz kod i kompilujesz AOT:
printf("Dupa\n");
A dynamicznie to robisz tak, możesz zrobić AOT lub JIT kompilacje.
gcc_jit_param *param_format = gcc_jit_context_new_param(ctxt, NULL, const_char_ptr_type, "format");
gcc_jit_function *printf_func = gcc_jit_context_new_function (ctxt, NULL, GCC_JIT_FUNCTION_IMPORTED, gcc_jit_context_get_type(ctxt, GCC_JIT_TYPE_INT), "printf", 1, ¶m_format, 1);
gcc_jit_rvalue *args[1];
args[0] = gcc_jit_context_new_string_literal(ctxt, "Dupa\n");
gcc_jit_block *block = gcc_jit_function_new_block(func, NULL);
gcc_jit_block_add_eval(block, NULL, gcc_jit_context_new_call(ctxt, NULL, printf_func, 1, args));
gcc_jit_block_end_with_void_return(block, NULL);
Najtrudniejsze to napisać reguły do generowania dynamicznie całego kodu, ale to akurat powinno być zaimplementowane w silniku.
W przypadku dynamicznych języków jak javascript nie wiesz jaki typ danych będzie przekazany do funkcji więc AoT kompilacja z góry odpada i dopiero po pierwszym uruchomieniu można wydedukować typy danych.
Jak masz typowany język lub hint typy to teoretycznie wygenerujesz AoT bez czekania na pierwsze uruchomienie danej funkcji.