Что такое: ‘gcc main.c’

В этом посте объясняется, что происходит, когда вы вводите gcc main.c в свой терминал и нажимаете Enter. Если вы не знаете, что такое терминал, вернитесь к моему предыдущему посту здесь.

Что такое gcc?, - спросите вы. Что такое main.c?, - спросите вы. Коллекция компиляторов GNU (GCC) - это система компиляции, созданная Проектом GNU, поддерживающая различные языки программирования.

«Хммм… хорошо. Но что такое компилятор? ». Компилятор - это программа, которая переводит исходный код с языка программирования в исполняемый файл. «Хорошо, но теперь я не совсем понимаю, что такое исходный код или исполняемый файл. Какая разница?" Отличный вопрос.

Исходный код - это читаемый человеком код, который компьютерные программисты пишут при создании программ, таких как приложение Face Time от Apple или продукт Search от Google. Для того, чтобы эти продукты работали, нужны миллионы, если не миллиарды строк кода, как в приведенном выше коде, но логически гораздо более сложный. Чтобы эти продукты работали, компьютер должен уметь читать этот код. Компьютер не может прочитать код, потому что он находится в исходном коде (удобочитаемом). Он не понимает читаемый человеком код, потому что это машина. Чтобы ваш компьютер мог получать и выполнять инструкции из исходного кода, машина должна скомпилировать его из исходного кода (читаемого человеком) в исполняемый файл (машинный код) с помощью процесса, называемого компиляцией.

«Хорошо, теперь это становится понятным, как машина компилирует ваш код?» И вот оно! Мы можем скомпилировать наш исходный код в исполняемый файл, используя gcc main.c, где gcc - это программа компилятора, а main.c - это файл, который мы хотим скомпилировать из исходного кода в исполняемый файл. В этом конкретном случае мы компилируем файл C и знаем это из-за расширения .c. Имя файла - main.c.

Компилятор, программа gcc в этом примере, выполняет четыре шага для преобразования исходного кода в исполняемый файл. Шаги следующие:

  1. Препроцессор
  2. Подчиняясь
  3. сборка
  4. Связывание

«Ладно, это уже слишком. Вы можете объяснить, что это за четыре шага? »

Препроцессор

Шаг препроцессора удаляет все ваши комментарии из файла, включает и расширяет все ваши заголовочные файлы и заменяет все ваши макросы значениями. На рисунке ниже показано визуальное представление того, как это выглядело бы, если бы вы расширили заголовочный файл <stdio.h>. Обычно в файле не было комментариев, но я добавил их для визуальной документации.

Компиляция

Затем при компиляции ваш предварительно обработанный код преобразуется в код сборки. «Еще одно техническое слово? Com’on. Что такое ассемблерный код? », - спросите вы.

сборка

Ассемблерный код - это код, который в некоторой степени представляет собой удобочитаемое представление машинного кода. Код сборки происходит из языка ассемблера, который разработан специально для взаимодействия с такими устройствами, как микропроцессоры, ядро ​​Linux и маршрутизаторы. Подумайте об устройствах, которые встроены в ваш компьютер или маршрутизатор, чем об управлении устройством, о встроенных системах. В процессе сборки компилятор принимает код сборки и преобразует его в машиночитаемый код. Думайте о машинном коде как о коде единиц и нулей, который может выполняться непосредственно вашим процессором на вашем компьютере.

Связывание

Если у вас более одного файла, ваш файл проходит процесс компиляции, называемый компоновкой. На этапе связывания весь ваш объектный код или машинный код нескольких файлов связывается в один исполняемый файл.

Ура! Теперь у нас есть исполняемый файл, который прошел процесс компиляции, превратив читаемый человеком исходный код в исполняемый файл, который машина может читать и выполнять по желанию, выполняя определенные задачи для компьютера. В конце всего процесса для этой команды gcc main.c ваш исполняемый файл будет называться a.out. Чтобы изменить имя файла на, используйте опцию -o и укажите имя файла. Пример изменения исполняемого файла a.out:

$ gcc main.c -o main

Прокомментируйте ниже или подпишитесь на меня в Twitter @ NTTL_LTTN и напишите мне.