связь между языком программирования и ОС API - PullRequest
4 голосов
/ 15 октября 2010

Есть методы на языке программирования в C ++, такие как

cout<<"hello world".

при компиляции вызывает ли системный вызов для выполнения фактической работы ИЛИ компилируется ли он непосредственно в двоичный код и выполняется ли он ядром?

если он использует OS API, разные платформы используют разные OS API, как язык может быть одинаковым?

Ответы [ 2 ]

3 голосов
/ 15 октября 2010

хорошо, в самых простых терминах, которые я могу придумать.

Язык компилируется в исполняемый код, который вы написали, и это связано с библиотеками кода, написанного для рассматриваемой платформы.Код библиотеки может быть стандартизирован путем определения API.Для каждой платформы обычно нужна отдельная стандартная библиотека.Для большинства платформ также доступен API нижнего уровня (определяется ОС).В стандартных языковых библиотеках есть выбор доступа к API-интерфейсам ОС или прямой репликации функций.Вы можете поспорить, что в большинстве случаев будет использоваться OS API - но это не единственный вариант, как я уже указывал.

Хорошо, давайте рассмотрим ваш пример:

cout << "hello world";

позволяетскажу, что вы компилируете это.По сути, ваша компиляция по существу превратит это в вызов, который отправляет строку в фрагмент кода, который либо выполняет вызов API api (скажем, с именем WriteStringToConsole), либо может выполнять вызовы компонентов более низкого уровня, таких как видеокарта, для отображенияпиксели, которые прописывают содержимое строки.Или это может пойти где-нибудь между.Это выбор.Все, что имеет значение, это то, что определение языка превращается в вызов какой-то стандартной функции компилятором на платформе по вашему выбору.

Теперь выбор, будет ли код записывать на машину или должен делать вызовы ОС, является выбором.сделано дизайнерами ОС.Например, в MS DOS вы можете писать напрямую на оборудование.Однако в текущих версиях WINDOWS разработчики ОС используют много тактик, чтобы обеспечить достижение целей проектирования системы, таких как безопасность или стабильность и т. Д., И они могут заставить вас использовать определенные вызовы ОС в стандартной библиотеке вместо вызовов более низкого уровня.

Однако все это сводится к одному.Вы пишете код на языке, который изготовитель компилятора сделал совместимым с одной или несколькими стандартными библиотеками.ПРИМЕЧАНИЕ. Возможно, вы сами написали некоторые из этих библиотек (например, код многократного использования, например, функции на вашем языке).

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

Редактировать: это упрощение слишком грубое.Работа компилятора - просто превратить ваш код на выбранном вами языке в код, который можно выполнить.Линкер берет это и объединяет со стандартными библиотеками.Выбор библиотеки за вами, хотя компоновщик может по умолчанию скрытно скрываться, пока вы не будете готовы сделать осознанный выбор.Задача библиотеки состоит в том, чтобы решить, какие вызовы делать.

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

1 голос
/ 15 октября 2010

идея C \ C ++ состоит в том, чтобы писать один раз - COMPILE много, в отличие от java, который нужно писать один раз запустить много.В принципе, вы правы, когда вы компилируете базовые cout \ printf \ put и т. Д., Которые являются только заголовками в программе, реализация фактически находится либо в файле dll \ so, либо в статическом объекте obj \ file (удалите статическую ссылку,делает вашу исполняемую переносную или динамическую ссылку, которая делает зависимости между вашим программным обеспечением и библиотеками, с которыми оно было скомпилировано (версия включена)).Эта реализация обычно поставляется с компилятором (VS \ gcc), если вы не получаете некоторые внешние библиотеки, которые содержат некоторое низкоуровневое взаимодействие с системой.

...