Во-первых, пояснение: Java не является полностью статически скомпилированной и скомпилированной так, как C ++. Он компилируется в байт-код, который затем интерпретируется JVM. JVM может выполнять своевременную компиляцию на родном машинном языке, но не обязана этого делать.
Ближе к делу: я думаю, что главное практическое отличие - это интерактивность. Поскольку все интерпретируется, вы можете взять небольшой фрагмент кода, проанализировать и запустить его в соответствии с текущим состоянием среды. Таким образом, если вы уже выполнили код, инициализирующий переменную, у вас был бы доступ к этой переменной и т. Д. Это действительно поддается таким вещам, как функциональный стиль.
Однако интерпретация стоит дорого, особенно если у вас большая система с большим количеством ссылок и контекста. По определению, это расточительно, потому что идентичный код, возможно, придется интерпретировать и оптимизировать дважды (хотя в большинстве сред выполнения для этого есть некоторое кеширование и оптимизация). Тем не менее, вы платите за время выполнения и часто нуждаетесь в среде выполнения. Вы также вряд ли увидите сложные межпроцедурные оптимизации, потому что в настоящее время их производительность недостаточно интерактивна.
Следовательно, для больших систем, которые не собираются сильно меняться, и для определенных языков имеет смысл предварительно скомпилировать и предварительно связать все, выполнить все оптимизации, которые вы можете сделать. В результате получается очень экономичная среда выполнения, которая уже оптимизирована для целевой машины.
Что касается генерации исполняемых файлов, это не имеет к этому никакого отношения, ИМХО. Часто можно создать исполняемый файл из скомпилированного языка. Но вы также можете создать исполняемый файл из интерпретируемого языка, за исключением того, что интерпретатор и среда выполнения уже упакованы в исполняемый файл и скрыты от вас. Это означает, что вы, как правило, по-прежнему оплачиваете затраты времени выполнения (хотя я уверен, что для некоторых языков есть способы перевести все в исполняемый файл в виде дерева).
Я не согласен с тем, что все языки можно сделать интерактивными. Некоторые языки, такие как C, настолько привязаны к машине и всей структуре ссылок, что я не уверен, что вы сможете создать значимую полноценную интерактивную версию.
person
Uri
schedule
16.07.2010