Статья о программировании на c и компиляции файлов .c

Что такое С?

C – это язык программирования, один из тысяч используемых в настоящее время языков программирования. C существует уже несколько десятилетий и завоевал широкое признание, поскольку дает программистам максимальный контроль и эффективность.

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

Компилятор C: доступен бесплатно и называется «cc» или «gcc».

Что такое ГЦК?

GCC (Коллекция компиляторов GNU) считается наиболее важной частью свободного программного обеспечения. Ранее назывался компилятором GNU C.

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

Понимание основных операций

когда мы GCC файл main.c, произойдет четыре основных шага

Предварительная обработка — это первый этап любой компиляции C. Требуется исходный код для удаления комментариев, включает заголовки, расширение макроса. После предварительной обработки GCC создает временный файл с расширением «.i».

Так как он вставляет содержимое заголовочных файлов в наш файл исходного кода. Файл, сгенерированный препроцессором, больше исходного файла.

Вот вывод предварительно обработанного файла:

# 1 "C:/Program Files (x86)/CodeBlocks/MinGW/include/stdio.h" 1 3 # 293 "C:/Program Files (x86)/CodeBlocks/MinGW/include/stdio.h" 3  int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) fprintf (FILE*, const char*, ...);  int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) printf (const char*, ...);  int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) sprintf (char*, const char*, ...);   int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) scanf (const char*, ...);  int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) sscanf (const char*, const char*, ...);

Компиляция — это второй проход. Он принимает выходные данные препроцессора и исходный код и генерирует исходный код на ассемблере. После компиляции он генерирует промежуточный код на языке ассемблера как <file-name.s>.

Как выглядит файлcompile.s:

_main:  
pushl %ebp  
movl %esp, %ebp  
andl $-16, %esp  
subl $16, %esp  
call ___main  
movl $LC0, (%esp)  
call _printf  
movl $0, %eax  
leave  
ret  
.ident "GCC: (tdm-1) 4.9.2"  
.def _printf; .scl 2; .type 32; .endef

Сборка — это третий этап компиляции. Он берет исходный код сборки и преобразует его в машинные коды (10010).

Вывод ассемблера хранится в так называемом объектном файле. После успешной сборки генерирует <file-name.o> (в Linux) или <file-name.obj> (в Windows).

Этот файл закодирован на низкоуровневом машинном языке и не может быть просмотрен с помощью текстовых редакторов. Однако, если вы все же откроете это в блокноте, это будет выглядеть так:

compilation.a file
L     J       .text           $   Ü   ,           0`.data                               @ 0À.bss                                € 0À.rdata                            @ 0@/4                               @ 0@U‰åƒäðƒìè    Ç$    è    ¸    ÉÃLearn at Codeforwin!    GCC: (tdm-1) 4.9.2  
          
           .file       þÿ  gcompilation.c     _main                            .text          !                .data                            .bss                             .rdata                                                         ___main          _printf             .rdata$zzz .rdata$zzz

Связывание — это заключительный этап компиляции. Он принимает один или несколько объектных файлов или библиотек в качестве входных данных и объединяет их для создания одного (обычно исполняемого) файла. Он связывает все вызовы функций с их исходным определением. Это означает, что функция printf() привязывается к своему исходному определению.

все это происходит в мгновение ока с помощью программного обеспечения, известного как gcc.