Хорошо, во-первых, я не хочу никаких огненных войн или чего-то подобного.Мой более крупный вопрос носит более теоретический характер и будет включать несколько примеров.
Итак, как я уже писал, я не могу понять, как интерпретируемый язык может быть даже мало эффективным.И поскольку он современный, я возьму Java в качестве примера.
Давайте вернемся к тем дням, когда не было JIT-компиляторов.У Java есть виртуальная машина, которая в основном является ее аппаратным обеспечением.Вы пишете код, после чего он компилируется в байт-код для выполнения хотя бы некоторой работы с виртуальной машины, это нормально.Но, учитывая, насколько сложным может быть даже набор команд RISC в аппаратном обеспечении, я даже не могу придумать, как это сделать на программном эмулируемом оборудовании.
У меня нет опыта написания виртуальных машин, поэтому я не знаю, как именно это делаетсяэффективный уровень, но я не могу придумать ничего более эффективного, чем тестирование каждой инструкции на соответствие и выполнение соответствующих действий.Вы знаете, что-то вроде: if(instruction=="something") { (do it) } else if(instruction=="something_diffrent"){ (do it) }
и т.д ....
Но это должно быть очень медленно.И все же, даже если есть статьи о том, что java был медленнее, чем JIT-компиляторы, они все еще говорят, что это не так медленно.Но для эмуляции требуется много тактов реального HW для выполнения одной инструкции байт-кода.
И все же, даже целые платформы основаны на Java.Например, Android.И первые версии Android не имели JIT-компилятора.Они были истолкованы.Но не должен ли Android быть ужасно медленным?И все же это не так.Я знаю, что когда вы вызываете какую-то функцию API из библиотеки Android, они пишутся в машинном коде, поэтому они эффективны, и это очень помогает.
Но представьте, что вы бы написали свой собственный игровой движок из sratch, используя API только для отображения изображений.Вам нужно будет выполнить много операций копирования массива, много вычислений, которые будут ужасно медленными при эмуляции.
А теперь несколько примеров, как я и обещал.Поскольку я в основном работаю с микроконтроллерами, я нашел JVM для микроконтроллера Atmel AVR.Скажи, что 8 МГц MCU может делать 20 000 опткодов Java в секунду.Но поскольку AVR может выполнять большинство инструкций за один или два цикла, скажем, в среднем 6000000 инструкций.Это дает нам то, что JVM без JIT-компилятора медленнее машинного кода в 300 раз.Так почему же Java стала настолько популярной без JIT-компилятора?Не слишком ли это плохая потеря производительности?Я просто не могу этого понять.Спасибо.