Подтвердить что ты не робот

Как работает программа, написанная на С++?

Когда мы запускаем java-программу, если JRE не установлена, она не работает.
Я узнал, что большинство известных приложений, таких как браузер Chrome Chrome, написано на С++. Итак, как Windows запускает такую ​​программу без какой-либо среды времени выполнения для С++? Что действительно происходит при установке?

4b9b3361

Ответ 1

Итак, как Windows запускает такую ​​программу без какого-либо времени выполнения среда для С++?

Посылка вопроса на самом деле неверна. По крайней мере, в Windows на самом деле среда С++ для среды выполнения. Один компонент этой среды выполнения (возможно, самый важный) называется C Runtime или CRT.: -)

Обычно, когда ваша программа даже входит в функцию main(), CRT выполняет кучу инициализационных процедур, а когда вы возвращаетесь из функции main(), она очищается после себя. Весь смысл этого танца - обеспечить стандартную функциональность, которую требуют практически все программы на C и С++.

Если вы когда-либо сталкивались с ошибкой, связанной с отсутствующим msvcrt.dll или чем-то вроде этого (например, msvcr110.dll для более новых программ) при запуске программы Windows, отсутствие CRT - это то, о чем жалуется программа. msvcrt.dll - это файл, реализующий CRT. Это означает "Microsoft Visual C Runtime".

Очевидно, что msvcrt.dll и его родственники поставляются с операционной системой Windows, поэтому вы, как правило, не сталкиваетесь с проблемами с отсутствующей средой выполнения, в отличие от JRE, которая должна быть установлена ​​либо пользователем, либо производителем компьютера.

Однако приложения Windows С++ скомпилированы для использования определенной версии MSVCRT, и если у вас неправильная версия MSVCRT, тогда операционная система будет жаловаться так же, как если бы она отсутствовала. * Какие установщики обычно делают заключается в том, чтобы проверить, что ОС имеет правильную версию, и если она не копирует ее где-то на вашем компьютере из своих установочных файлов.

Однако MSVCRT не является необходимым и достаточным условием для работы всех программ Windows. Вполне возможно написать программу, которая не зависит от MSVCRT, а также вполне возможно, что программа Windows будет иметь зависимости, отличные от MSVCRT. Практически все нетривиальные программы Windows будут зависеть от MSVCRT и других компонентов операционной системы. Установщик программы также проверил бы их.

Существуют некоторые важные различия между JRE и MSVCRT. Одно большое различие заключается в том, что JRE реализует среду виртуальной машины для приложений Java (что позволяет ей "кросс-платформенные" возможности), которые могут включать компиляцию вовремя и т.д., В то время как MSVCRT предоставляет только стандартные функции и ничего не делает о коде сборки ваших программ на С++.


* Это не совсем корректно, так как приложения на С++ могут статически ссылаться на MSVCRT, что не зависит от DLL. Однако большинство приложений Windows С++ динамически ссылаются на него, и в этом случае необходима правильная DLL.

Ответ 2

Вопрос кажется очевиден, но если мы копаем немного, это кажется далеким от очевидного. Позвольте мне дать вам более абстрактный взгляд:

Каждый язык может быть "выполнен" подходящей машиной, которая связывает язык с конкретным аппаратным обеспечением "делает" операцию. Разница заключается в том, как делается "проводка": насколько прямо она и когда он настроен.

Окно (но то же самое работает и для Linux) - это, как минимум, набор функций, которые могут быть вызваны некоторыми "жизненно важными" DLL (например, Kernel.dll), которые будут вызываться машинным кодом процессора.

Программы C, как правило, транслируются во время компиляции в машинный код, в котором системные вызовы соблюдают этот "протокол". Программа, которая не требует каких-либо других функций, может быть выполнена nativelly в этой среде.

Программа, требующая других функций, может:

  • Ссылка статически на библиотеку, которая реализует функции в машинный код (на самом деле включает их код): и это делает программу по-прежнему исполняемой.
  • Динамически связывать эти библиотеки: программе необходимо загрузить и связать эту библиотеку при запуске или во время выполнения: если эти библиотеки уже являются частью операционной системы, программа просто запускается, в противном случае эти библиотеки должны быть размещены где-то в способ, которым программа может их найти (это относится к поддержке времени выполнения C, для версии, отличной от той, которая используется для компиляции самой ОС).

Java-программа, кстати, язык Java был разработан и реализован, не переводится непосредственно в машинный код. Он преобразуется в промежуточный язык (байтовый код), который должен использоваться как "enter" для интерпретатора (java-машины), который фактически выполняет свою инструкцию, действуя в машинный код на лежащую в основе машину.

Поскольку сама Windows не написана на Java, для нее не нужен такой интерпретатор, поэтому вы не можете найти ее непосредственно при установке Windows, но вам нужно разместить ее там, если вам это нужно.

Ответ 3

чтобы уточнить, что java-программа скомпилирована в байт-код через jdk, а затем запускается в jre

программа С++ напрямую скомпилируется на машиносчитываемый код, так же, как jre должен быть скомпилирован для запуска в windows

Ответ 4

Runtime (или стандартные библиотеки C или С++) обычно устанавливаются с операционной системой (glibc, msvcrt,...).

Программы C/С++ также могут быть "статически" скомпилированы, где части библиотеки, которые используются программой, связаны (объединены) с исполняемым файлом, поэтому программа имеет библиотеки в своем собственном двоичном файле.

Что касается "Виртуальной машины", которая выполняет Java-код. С++ обычно скомпилирован в собственный машинный код системы, на котором он будет запущен. CPU - это не виртуальная машина, которая будет запускать ее.

Также возможно скомпилировать программы на С++ в различные типы "байт-кода" (.NET CLR, LLVM), но это менее распространено.