What is a compiler?
A compiler is a program that takes source code (e.g., C, C++, Go) and converts into executable machine code (binary). There are lots of compilers that can compile source code written in different programming languages.
As an example, let’s take a closer look at what the GCC compiler does.
Four stages of compilation
There are four stages to GCC’s compilation process:
- Preprocessing
- Compilation
- Assembling
- Linking
Let’s consider how these stages work when compiling a simple hello world program like the following:
#include <stdio.h>
int main() {
printf("Hello world!\n");
return 0;
}
1. Preprocessing
The preprocessor (cpp) looks for preprocessor directives (e.g., #include <stdio.h>
) and replaces them with the contents of the corresponding system file (e.g., stdio.h
). The result is another C program file ending with the .i
suffix.
2. Compilation
The compiler (cc1) translates the hello.i
file into the text file hello.s
which is an assembly-language program. For example, the main
function would be translated to:
main:
subq $8, %rsp
movl $.LC0, %edi
call puts
movl $0, %eax
addq $8, %rsp
ret
3. Assembly
The assembler (as
) translates the hello.s
into machine-level instructions, packages them into a form known as a relocatable object program and stores the result in the object file hello.o
. This is a binary file.
4. Linking
The linker (ld
) looks at the hello.o
program and merges any other required object files needed to run it. For example, the hello world program uses printf
which resides in a separated precompiled printf.o
object file. The linker will merge all these dependencies to create a single executable hello
file that is ready to be loaded inton memory and executed.
Sources
- Bryant, R. and O’Hallaron, D., 2015. Computer systems. pp.41-44.
Thanks for your comment 🙏. Once it's approved, it will appear here.
Leave a comment