СТРУКТУРА ЯЗЫКА C
Привет, люди, несколько месяцев назад я начал #doingthehardthings в ALX SE, и это эпическое путешествие. Чтобы понять все концепции, которые мы уже изучили, я решил заново изучить первоначальные концепции C и сделать для нас некоторые заметки. Так что добро пожаловать и давайте учиться вместе.
Во-первых, я собираюсь рассказать о нашем первом задании по языку C. Задание требовало понимания концепций в:
- Процесс компиляции C
- Написание сценариев оболочки
- Команды GCC
- Написание простых программ
Итак, прежде чем мы перейдем к задачам, давайте кратко рассмотрим эти концепции.
ПРОЦЕСС КОМПИЛЯЦИИ C.
Мы рассмотрим эти этапы:
- Препроцессор
- Сборник
- Сборка
- Линкер
Основной процесс можно проиллюстрировать следующим образом:
Источник: https://www.geeksforgeeks.org/compiling-a-c-program-behind-the-scenes/
Итак, что это значит?
а. Исходный файл
Это ваш основной код. Например:-
#include <stdio.h> int main() { printf("Hello, World!"); return (0); }
б. Препроцессор
Это первый шаг в процессе компиляции. Препроцессор делает следующее:
- Удаляет комментарии
- Включает файлы из библиотеки заголовков. В данном случае из стандартной библиотеки ввода-вывода.
- Раскрывает макросы.
При этом создается файл .i.
c. Подборка
Процесс компиляции включает в себя: -
- Разбивка кода на токены
- Проверяет, соответствует ли код синтаксису C
- Проверяет правильность использования переменных и функций
- Преобразует код в ассемблерный код, специфичный для целевой структуры.
При этом создается файл .s.
d. Сборка
Здесь создается объектный файл. Объектный файл означает, что существующий код преобразуется в машинный язык.
Он создает файл .o.
e. Linker
Компоновщик отвечает за объединение нескольких объектных файлов и разрешение ссылок между ними. Именно здесь выполняется все связывание вызовов функций и их определение.
Теперь, когда у нас есть общее представление о том, как работает процесс компиляции C, давайте теперь рассмотрим концепцию сценариев оболочки.
КАК НАПИСАТЬ шелл-скрипты
ЧТО ТАКОЕ СЦЕНАРИИ ОБОЛОЧКИ?
Это компьютерная программа, предназначенная для запуска в оболочке Unix/Linux.
Сценарии оболочки используются для:
- Автоматизация повторяющихся задач
- Объединение нескольких команд в один скрипт для удобства
- Мониторинг системы
КАК СОЗДАВАТЬ шелл-скрипты
Первое, что вам нужно знать, это то, что существует множество видов ракушек. Наиболее распространенным является Bash (Bourne Again Shell). Другие: sh, csh и tcsh.
В нашем случае мы будем использовать Bash.
Основной процесс:
- Создайте новый файл с расширением .sh. — сценарии оболочки обычно представляют собой текстовые файлы с расширением .sh.
- Добавьте строку shebang, указывающую тип оболочки, которую вы используете. В этом случае это будет: -
#!/bin/bash
- Напишите код скрипта — это включает комбинацию переменных и функций для вашего скрипта.
- Сохраните файл сценария
- Сделайте скрипт исполняемым. - для того, чтобы сделать это: -
Открытый терминал
Перейдите в каталог, в котором сохранен скрипт.
Используйте следующую команду:
chmod +x script.sh
где script.sh — имя вашего сценария оболочки
Запустите скрипт — выполните следующие действия:
Открытый терминал
Перейдите в каталог, в котором сохранен скрипт.
Используйте следующую команду: -
./script.sh
Где script.sh — это имя вашего сценария оболочки.
Вот как вы можете создать сценарий оболочки.
Следующая концепция, которую мы собираемся рассмотреть, — это понимание команд GCC.
ОБЩИЕ КОМАНДЫ GCC
GCC расшифровывается как GNU Compiler Collection и является одним из наиболее распространенных компиляторов в программировании.
Я использую GCC для компиляции своих скриптов и хочу показать вам, как сделать то же самое.
Во-первых, давайте рассмотрим некоторые из наиболее распространенных команд GCC и способы их применения.
Основной синтаксис GCC:
gcc [options] [source_file] [object_files] [-o output_file]
Вот некоторые из основных команд GCC
- gcc file.c — компилирует исходный файл C (file.c) и создает исполняемый файл с именем a.out.
- gcc -o output file.c — компилирует исходный файл C (file.c) и создает исполняемый файл с определенным именем (output).
- gcc -E file.c — выводит предварительно обработанную версию исходного файла C (file.c) на терминал.
- gcc file1.c file2.c — компилирует несколько исходных файлов C (file1.c и file2.c) и создает исполняемый файл (по умолчанию a.out).
- gcc -o output file1.c file2.c — компилирует несколько исходных файлов C и создает исполняемый файл с определенным именем (выходной файл).
- gcc -c file.c — компилирует исходный файл C (file.c) и создает объектный файл (file.o) без компоновки.
- gcc -o output file.o — связывает один или несколько объектных файлов (file.o) и создает исполняемый файл с определенным именем (output).
- gcc -Wall file.c — включает большинство предупреждающих сообщений во время компиляции, чтобы помочь выявить потенциальные проблемы.
- gcc -Werror file.c — интерпретирует предупреждающие сообщения как ошибки, что приводит к сбою компиляции при обнаружении каких-либо предупреждений.
Это всего лишь несколько команд. Для получения дополнительной информации вы можете использовать команду man gcc на терминале Unix или щелкнуть здесь, чтобы получить доступ к документации GCC.
Тем не менее, теперь мы можем ответить на несколько вопросов, например:
1. Как написать сценарий, который запускает файл через препроцессор в другой файл.
Для этого мы будем использовать GCC -E. Выходной код будет таким:
#!/bin/bash gcc -E $CFILE -o c
- Первая строка - шебанг.
- gcc -E указывает GCC выполнять только стадию предварительной обработки, а не компилировать.
- $CFILE — это переменная, представляющая имя исходного файла C для предварительной обработки. Фактическое значение переменной будет предоставлено при выполнении скрипта.
- -o указывает имя выходного файла
- c- имя выходного файла
2. Как написать скрипт, который компилирует c-файл, но не связывает
Для этого мы будем использовать GCC — c. Код будет: -
#!/bin/bash gcc -c $CFILE
Вы также можете использовать gcc -S для создания ассемблерного кода файла C и сохранения его в выходном файле. Код будет:
#!/bin/bash gcc -S $CFILE
Наконец, давайте рассмотрим простой пример программы на C.
Допустим, вы хотите написать программу, которая печатает «Программирование — это развлечение для интересных людей», после чего следует новая строка.
Программа будет выглядеть так:
#include<stdio.h> int main(void) { printf("Programming is fun for interesting people,\n"); return (0); }
Вот разбивка программы: -
- #include‹stdio.› — эта строка представляет собой директиву препроцессора, включающую стандартную библиотеку ввода-вывода (stdio.h). Он предоставляет функциональные возможности для операций ввода и вывода, таких как printf, используемый в коде.
- int main(void): в этой строке объявляется основная функция, которая является точкой входа в программу. Он имеет целочисленный возвращаемый тип (int) и не принимает аргументов (void). Это указывает на то, что программа не будет получать никаких аргументов командной строки.
- \n — символ новой строки, создающий пустую строку.
- return (0);: Эта строка используется для выхода из основной функции и возврата значения. В этом случае возвращает 0, что условно свидетельствует об успешном выполнении программы.
Примерно так выглядит простая программа на языке C и интерпретируется ее код.
Большое спасибо, что дочитали до этого момента, дайте мне знать, что вы думаете в разделе комментариев
ДАЛЬНЕЙШЕЕ ЧТЕНИЕ
https://www.geeksforgeeks.org/preprocessor-works-c/
https://www.geeksforgeeks.org/compiling-a-c-program-behind-the-scenes/
https://www.tutorialspoint.com/cprogramming/c_preprocessors.htm