Прежде чем мы поговорим о том, что делает GCC, давайте рассмотрим, что же такое GCC. GCC — это программа-компилятор (или компилятор), которую мы используем для компиляции программ, написанных на языке C. Как следует из названия, компилятор компилирует код, то есть берет удобочитаемый ввод и переводит его в машиночитаемый вывод для понимания компьютером. Оттуда компьютер преобразует исходный код в исполняемый файл. Компиляторы бывают однопроходными или многопроходными. Однопроходные компиляторы, которые, как правило, быстрее альтернативных, компилируют программу за один проход, пропуская промежуточные шаги, которые могут присутствовать в других компиляторах. Таким образом, многопроходные компиляторы компилируют программы в несколько этапов. Хотя многопроходные компиляторы работают медленнее, возможность остановить компиляцию на любом этапе процесса позволяет программисту выполнять очень специфические и сложные оптимизации для создания более качественного кода. Компиляторы используются исключительно для скомпилированных языков; интерпретируемые языки, очевидно, вместо этого используют интерпретаторы. GCC является официальным компилятором проекта GNU, крупного совместного проекта свободного программного обеспечения, ответственного за Linux. Первоначально называвшийся Компилятор GC, позже он был переименован в Коллекцию компиляторов Gnu после того, как была добавлена ​​поддержка дополнительных языков. Сегодня GCC является одним из наиболее широко используемых компиляторов в мире.

Так как же работает GCC? Допустим, у вас есть файл test.c. Чтобы начать процесс компиляции, введите в оболочку следующее:

$ gcc test.c

Если код работает без ошибок, теперь у вас должен быть исполняемый файл с именем a.out в вашем текущем рабочем каталоге. Это выходной файл по умолчанию для GCC. Использование параметра -o с GCC укажет новое имя файла назначения. Чтобы вызвать исполняемый файл exec, введите:

$ gcc text.c -o exec 

Еще одна полезная опция для GCC — -Wall, которая активирует все стандартные предупреждающие сообщения. Это особенно полезно, когда ваш код не компилируется; вместо того, чтобы рвать на себе волосы, пытаясь найти случайную точку с запятой, вы можете прочитать сообщения об ошибках, чтобы понять, что пошло не так. Следовательно, правильно скомпилированная программа с проверкой на ошибки может быть получена следующим образом:

$ gcc -Wall text.c -o exec

Итак, теперь мы знаем, что дает вам GCC. Но как оно туда попало? GCC — это многопроходный компилятор с четырьмя отдельными шагами. Давайте пройдемся по четырем компонентам один за другим.

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

Сначала исходный код пропускается через препроцессор. Это самый простой шаг, так как в основном вырезаются комментарии и лишние пробелы. Чтобы остановить компиляцию после этапа препроцессора, используйте опцию -E

$ gcc -E test.c

Вывод только предварительно обработанной программы отправляется на стандартный вывод в формате предварительно обработанного исходного кода (который в основном выглядит так же, как исходный исходный код). Этот код будет иметь то же имя, что и исходный файл, с расширением .c, измененным на .i.

Компилятор

Затем предварительно обработанный исходный код пропускается через компилятор для создания файла ассемблера. Этот файл на ассемблере используется определенными процессорами для подготовки кода к следующим шагам. Чтобы остановить процесс компиляции, используйте параметр -c.

$ gcc -c test.c

Это выводит в объектный файл, который заменяет суффикс .c или .i на .o.

Ассемблер

Затем объектный файл отправляется на ассемблер, где

Это первая точка, где вывод находится в двоичном формате. Попробуйте использовать less для просмотра машинного кода — не очень красиво, не так ли? Чтобы остановить процесс компиляции перед компоновщиком, но после предварительной обработки, компиляции и сборки, используйте параметр -S

$ gcc -S test.c

Файл машинного кода имеет расширение .s.

Линкер

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

Чтобы выполнить вашу новую скомпилированную программу, просто запустите ее со стандартной нотацией ./, убедившись, что вы ввели правильное имя исполняемого файла (в нашем примере exec). )

$ ./exec
compile me this, batman...

Итак, теперь вы знаете, что такое компилятор, как запустить GCC и как он работает. Для более подробного объяснения обязательно ознакомьтесь с справочной страницей, набрав

$ man gcc

Удачной компиляции!