хорошо, в самых простых терминах, которые я могу придумать.
Язык компилируется в исполняемый код, который вы написали, и это связано с библиотеками кода, написанного для рассматриваемой платформы.Код библиотеки может быть стандартизирован путем определения API.Для каждой платформы обычно нужна отдельная стандартная библиотека.Для большинства платформ также доступен API нижнего уровня (определяется ОС).В стандартных языковых библиотеках есть выбор доступа к API-интерфейсам ОС или прямой репликации функций.Вы можете поспорить, что в большинстве случаев будет использоваться OS API - но это не единственный вариант, как я уже указывал.
Хорошо, давайте рассмотрим ваш пример:
cout << "hello world";
позволяетскажу, что вы компилируете это.По сути, ваша компиляция по существу превратит это в вызов, который отправляет строку в фрагмент кода, который либо выполняет вызов API api (скажем, с именем WriteStringToConsole), либо может выполнять вызовы компонентов более низкого уровня, таких как видеокарта, для отображенияпиксели, которые прописывают содержимое строки.Или это может пойти где-нибудь между.Это выбор.Все, что имеет значение, это то, что определение языка превращается в вызов какой-то стандартной функции компилятором на платформе по вашему выбору.
Теперь выбор, будет ли код записывать на машину или должен делать вызовы ОС, является выбором.сделано дизайнерами ОС.Например, в MS DOS вы можете писать напрямую на оборудование.Однако в текущих версиях WINDOWS разработчики ОС используют много тактик, чтобы обеспечить достижение целей проектирования системы, таких как безопасность или стабильность и т. Д., И они могут заставить вас использовать определенные вызовы ОС в стандартной библиотеке вместо вызовов более низкого уровня.
Однако все это сводится к одному.Вы пишете код на языке, который изготовитель компилятора сделал совместимым с одной или несколькими стандартными библиотеками.ПРИМЕЧАНИЕ. Возможно, вы сами написали некоторые из этих библиотек (например, код многократного использования, например, функции на вашем языке).
Язык - это ваш API в простом смысле.Язык может использовать множество других API (библиотек), и некоторые из них являются более стандартными, чем другие.Эти библиотеки будут затем использовать другие библиотеки / API и т. Д. До тех пор, пока некоторые электроны не перейдут по электрической дорожке.Однако эта парадигма фактически продолжается и дальше, поскольку электрические компоненты также имеют стандартизированные API-интерфейсы, просто их реализации отличаются от программного обеспечения.
Редактировать: это упрощение слишком грубое.Работа компилятора - просто превратить ваш код на выбранном вами языке в код, который можно выполнить.Линкер берет это и объединяет со стандартными библиотеками.Выбор библиотеки за вами, хотя компоновщик может по умолчанию скрытно скрываться, пока вы не будете готовы сделать осознанный выбор.Задача библиотеки состоит в том, чтобы решить, какие вызовы делать.
Теперь, если вы пишете код и не делаете собственные вызовы ОС, а просто вызываете библиотеку стандартного набора, тогда вы начинаете что-то получать.называется переносимым кодом, который может быть перенесен на другую платформу, скомпилирован и, таким образом, выполнен там.Опять же, это упрощение, так как есть много других специфических для платформы вещей, которые нужно учитывать.На самом деле вы можете продвинуться дальше с помощью процесса, называемого кросс-компиляцией, где вы компилируете на одной платформе, но код будет выполняться на другой, но я оставляю это как упражнение для читателя.