СТРУКТУРА ЯЗЫКА 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

https://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html