Я хочу понять эту разницу между интерпретируемыми языками и компилируемыми языками. Много объяснений можно найти в Интернете, и я понимаю их все.
Но вопрос в том, что программное обеспечение распространяется как exe (на windows) как конечный продукт.
Так что, если я напишу свою программу на Python / Java и скомпилирую ее в exe, будет ли это работать так же быстро, как если бы я писал и компилировал в C / C ++?
Нет, не будет. Дело не в формате файла, а в сложности элементарных строительных блоков, которые язык компилирует в этом отношении.
На практике большинство языков компилируется. Ява есть и Python, внутри интерпретатора, на самом деле тоже. Однако существует разница в том, насколько сложным является выполнение строительных блоков целевого двоичного кода.
Для C ++ все концепции отображаются непосредственно на концепции низкого уровня, понятные ЦП. Недостатком является то, что такие вещи, как условия гонки, неопределенного поведения. Код просто не определяет, что должно происходить в различных угловых случаях, и программист несет ответственность за их обработку. Программисты также несут ответственность за управление ресурсами, потому что нет сборщика и тому подобное.
Для Java концепции сопоставлены с инструкциями виртуальной машины. Они могут быть интерпретированы (что включает в себя некоторое их дополнительное декодирование), или они могут быть дополнительно скомпилированы с машинными инструкциями либо своевременно (как стандартная виртуальная машина настольного компьютера), либо заранее (как текущая среда выполнения Android). делает), но каждый будет все еще более сложным для выполнения. Назначения будут иметь префиксы блокировок, чтобы гарантировать, что они не генерируют недопустимые значения в условиях гонки, сборщик мусора работает в памяти, ищет правильные указатели и копирует объекты, у объектов довольно много дополнительной нагрузки, и многие вещи проверил, так что это может быть приятно и генерировать исключения при ошибках, а не сбой, как в C ++.
И питон еще сложнее. На самом деле он не выполняет код Python параллельно (за исключением блокировки системных вызовов) вообще из-за гарантий, предоставляемых языком, есть также сборщик, на этот раз тот, который обновляет счетчик ссылок в каждой операции, и объекты имеют намного больше накладных расходов, потому что большинство обращений к членам на самом деле являются поисками хеш-таблиц — в отличие от простой загрузки C ++ из указателя со смещением. И еще больше проверка всего. Разница в скорости на порядки. На самом деле, между Java и Python разница гораздо большая, чем между C ++ и Java.
Компиляция в машинный код, напрямую интерпретируемый процессором, немного помогает. Но языки более высокого уровня увеличивают накладные расходы из-за их семантики, а не из-за того, что они интерпретируются.
Это сказало, @linuxuser правильно, что преобразование кода Java или Python делает не фактически переводим его в машинный код, но просто связываем интерпретатор и код для запуска в пакете, поэтому выигрыша нет просто потому, что на самом деле разницы нет.
нет
Причина, по которой скомпилированные программы на C работают так быстро, заключается в том, что код на C компилируется в язык ассемблера, который разработан специально для вашего процессора. Java и Python работают медленнее, потому что Java должна работать в JVM, а Python должен запускаться интерпретатором Python, что замедляет работу.
Существуют инструменты, которые могут конвертировать скрипты Python и программы Java в исполняемые файлы Windows, однако эти исполняемые файлы не создают язык ассемблера из ваших программ на Java и Python. Код Java должен выполняться на JVM, а код Python должен выполняться через интерпретатор Python. Вы не можете «скомпилировать» программу на Python или Java и получить язык ассемблера так же, как вы делаете с C. (На самом деле вы можете скомпилировать Java в нативный код, но я вполне уверен, что инструменты, на которые вы ссылаетесь в этом вопросе, не те которые конвертируют Java в родной ассемблерный код)
Эти инструменты, которые преобразуют код Python и код Java в исполняемые файлы, на самом деле просто объединяют интерпретатор Python в исполняемый файл и используют его для запуска кода Python или автоматически загружают JVM, а затем используют его для запуска кода Java.
Вот пример программы Jar to exe. Как видите, он просто создает исполняемый файл, который автоматически загружает последнюю версию JVM, а затем запускает ваш Java-код с загруженной JVM.
Когда виртуальная машина недоступна, оболочка может автоматически загрузить и установить подходящую JVM, или просто отобразить сообщение или перенаправить пользователя на веб-сайт.
Вот инструмент для преобразования скриптов Python в exe. Как вы можете видеть, он просто упаковывает интерпретатор Python в исполняемый файл вместе с вашим кодом и запускает ваш код с помощью встроенного интерпретатора Python. Прокрутите вниз до «Что это за файлы?» раздел.
На практике нет.
Языки C / C ++ были написаны как лучший ассемблер. Их основные операции были разработаны, чтобы хорошо соответствовать процессорам 1970 года.
Впоследствии процессоры были вынуждены работать быстро, и поэтому они были разработаны на основе инструкций, которые могут сделать C / C ++ быстрее.
Эта тесная связь с семантикой языка и кремния дала старт сообществу C / C ++.
Примером преимущества C / C ++ является то, как простые типы и объекты могут быть созданы в стеке. Стек реализован как стек процессора, и объекты будут действительны только тогда, когда их стек вызовов является текущим.
Java / python реализуют все свои объекты в бесплатном хранилище, имея лямбды и замыкания, которые растягивают срок службы их объектов за пределы стека вызовов, который их создает. Бесплатный магазин — более дорогостоящий способ создания объектов, и это одно из наказаний, которое принимает язык.
JIT, компилирующий байт-код java / python, может восполнить некоторые различия и (теоретически) превзойти производительность кода C / C ++.
Когда JIT компилируется, язык компилируется на основе процессора на коробке (возможно, с лучшими возможностями, чем при написании кода), со знанием точных данных, которые используются с кодом. Это означает, что Jit-компилятор настроен на точное использование кода. Скорее, чем лучшая догадка компилятора.