Некоторые вопросы о генерале C

Я пытаюсь полностью понять процесс про написание кода на некотором языке к выполнению ОС. В моем случае язык был бы C, и ОС будет Windows. До сих пор я прочитал много различных статей, но я не уверен, понимаю ли я право процесса, и я хотел бы спросить Вас, если Вы знаете некоторые хорошие статьи о некоторых предметах, я не мог бы найти.

Так, что я думаю, что знаю о C (и в основном другие языки):

Сам компилятор C обрабатывает только типы данных, основные математические операции, операции указателей и работу с функциями. Работой с функциями я имею в виду, как передать аргумент ей, и как быть произведенным от функции. Во время компиляции вызов функции заменяется передающими аргументами стеку, и чем если бы функция не является подставляемой, ее вызов заменяется некоторым символом для компоновщика. Компоновщик, чем находит функциональное определение и заменяет символ для перехода обращения к той функции (и конечно, чем переход назад к программе).

Если вышеупомянутое обычно верно, и я разбираюсь в нем, где к финалу .exe файл на самом деле компоновщик сохраняет функции? После основного () функция? И что создает .exe заголовок? Компилятор или Компоновщик?

Теперь, дополнительные возможности C, сегодня известного как C стандартная библиотека, являются набором функций и объявлениями их, что другие программисты записали, чтобы расширить и упростить использование языка C. Но эти функции как printf () были (или мог быть?) записанный на другом языке или ассемблере. И там прибывает мой следующий вопрос, может быть, например, printf () функция быть записанным в чистом C без использования ассемблера?

Я знаю, что это - довольно большой вопрос, но я просто главным образом хочу знать, чтобы выдержать я прав или нет. И доверяйте мне, я прочитал много статей о сети, и я не спрошу Вас, Если я мог бы найти их информацией вместе об одном месте в одной статье. Insted, которые я должен соединить частью, собирают информацию, таким образом, я не уверен, прав ли я.Спасибо.

6
задан Grace Note 18 May 2010 в 13:03
поделиться

3 ответа

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

Компилятор C просто берет код C и генерирует объектные файлы, содержащие машинный язык. Большую часть объектного файла занимает содержимое функций. Простой вызов функции в C, например, будет представлен в скомпилированной форме как операторы низкого уровня для помещения вещей в стек, изменения указателя инструкций и т. Д.

Библиотека C и любые другие библиотеки, которые вы могли бы использовать, уже используются доступны в скомпилированном виде.

Компоновщик - это то, что объединяет все соответствующие объектные файлы, разрешает все зависимости (например, один объектный файл, вызывающий функцию в стандартной библиотеке), а затем создает исполняемый файл.

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

Формат исполняемого файла зависит от операционной системы, но большая часть тела исполняемого файла в Windows очень похожа на тело объектных файлов. Представьте, что кто-то объединил все объектные файлы, а затем добавил немного клея. Клей загружает связанные вещи, а затем вызывает main (). Когда я был ребенком, например, люди получали удовольствие от «замены клея», чтобы добавить еще одну функцию перед main (), которая отображала бы экран-заставку с их именем.

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

6
ответ дан 17 December 2019 в 00:06
поделиться

Я новый пользователь, и эта система не позволяет мне размещать более одной ссылки. Чтобы обойти это ограничение, я опубликовал некоторую идею в своем блоге http://zhinkaas.blogspot.com/2010/04/how-does-c-program-work.html . Мне потребовалось некоторое время, чтобы получить все ссылки, но в целом они должны помочь вам начать работу.

1
ответ дан 17 December 2019 в 00:06
поделиться

Компилятор отвечает за перевод всех ваших функций, написанных на C, в сборку, которую он сохраняет в объектном файле (например, DLL или EXE). Итак, если вы напишете файл .c, в котором есть основная функция и несколько других функций, компилятор переведет все из них в сборку и сохранит их вместе в EXE-файле. Затем, когда вы запускаете файл, загрузчик (который является частью ОС) знает, что сначала нужно запустить основную функцию. В остальном функция main такая же, как и любая другая функция компилятора.

Компоновщик отвечает за разрешение любых ссылок между функциями и переменными в одном объектном файле со ссылками в других файлах. Например, если вы вызываете printf (), поскольку вы сами не определяете функцию printf (), компоновщик отвечает за то, чтобы вызов printf () попал в нужную системную библиотеку, в которой определена printf (). Это делается во время компиляции.

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

0
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: