diff options
author | Christian Cleberg <hello@cleberg.net> | 2024-09-01 21:54:51 -0500 |
---|---|---|
committer | Christian Cleberg <hello@cleberg.net> | 2024-09-01 21:54:51 -0500 |
commit | 17d0e7fa0f46eae4ef284af4593e33ad24da3bef (patch) | |
tree | f75dd3e5d1cd25b1986d4c046e921170bd388fcc /content/blog/2018-11-28-cpp-compiler.org | |
parent | cb26788d15e7370333818e0c348e8a68a40d8415 (diff) | |
download | cleberg.net-17d0e7fa0f46eae4ef284af4593e33ad24da3bef.tar.gz cleberg.net-17d0e7fa0f46eae4ef284af4593e33ad24da3bef.tar.bz2 cleberg.net-17d0e7fa0f46eae4ef284af4593e33ad24da3bef.zip |
format 2018 to 2020 blog posts
Diffstat (limited to 'content/blog/2018-11-28-cpp-compiler.org')
-rw-r--r-- | content/blog/2018-11-28-cpp-compiler.org | 99 |
1 files changed, 46 insertions, 53 deletions
diff --git a/content/blog/2018-11-28-cpp-compiler.org b/content/blog/2018-11-28-cpp-compiler.org index 7b4c21e..d610cd8 100644 --- a/content/blog/2018-11-28-cpp-compiler.org +++ b/content/blog/2018-11-28-cpp-compiler.org @@ -5,14 +5,13 @@ * A Brief Introduction -[[https://en.wikipedia.org/wiki/C%2B%2B][C++]] is a general-purpose -programming language with object-oriented, generic, and functional -features in addition to facilities for low-level memory manipulation. +[[https://en.wikipedia.org/wiki/C%2B%2B][C++]] is a general-purpose programming language with object-oriented, generic, and +functional features in addition to facilities for low-level memory manipulation. -The source code, shown in the snippet below, must be compiled before it -can be executed. There are many steps and intricacies to the compilation -process, and this post was a personal exercise to learn and remember as -much information as I can. +The source code, shown in the snippet below, must be compiled before it can be +executed. There are many steps and intricacies to the compilation process, and +this post was a personal exercise to learn and remember as much information as I +can. #+begin_src cpp #include <iostream> @@ -27,24 +26,19 @@ int main() *** An Overview -Compiling C++ projects is a frustrating task most days. Seemingly -nonexistent errors keeping your program from successfully compiling can -be annoying (especially since you know you wrote it perfectly the first -time, right?). - -I'm learning more and more about C++ these days and decided to write -this concept down so that I can cement it even further in my own head. -However, C++ is not the only compiled language. Check out -[[https://en.wikipedia.org/wiki/Compiled_language][the Wikipedia entry -for compiled languages]] for more examples of compiled languages. - -I'll start with a wonderful, graphical way to conceptualize the C++ -compiler. View -[[https://web.archive.org/web/20190419035048/http://faculty.cs.niu.edu/~mcmahon/CS241/Notes/compile.html][The -C++ Compilation Process]] by Kurt MacMahon, an NIU professor, to see the -graphic and an explanation. The goal of the compilation process is to -take the C++ code and produce a shared library, dynamic library, or an -executable file. +Compiling C++ projects is a frustrating task most days. Seemingly nonexistent +errors keeping your program from successfully compiling can be annoying +(especially since you know you wrote it perfectly the first time, right?). + +I'm learning more and more about C++ these days and decided to write this +concept down so that I can cement it even further in my own head. However, C++ +is not the only compiled language. Check out [[https://en.wikipedia.org/wiki/Compiled_language][the Wikipedia entry for compiled +languages]] for more examples of compiled languages. + +I'll start with a wonderful, graphical way to conceptualize the C++ compiler. +View [[https://web.archive.org/web/20190419035048/http://faculty.cs.niu.edu/~mcmahon/CS241/Notes/compile.html][The C++ Compilation Process]] by Kurt MacMahon, an NIU professor, to see the +graphic and an explanation. The goal of the compilation process is to take the +C++ code and produce a shared library, dynamic library, or an executable file. ** Compilation Phases @@ -53,28 +47,27 @@ compiling C++ code. *** Step 1 -The first step is to expand the source code file to meet all -dependencies. The C++ preprocessor includes the code from all the header -files, such as =#include <iostream>=. Now, what does that mean? The -previous example includes the =iostream= header. This tells the computer -that you want to use the =iostream= standard library, which contains -classes and functions written in the core language. This specific header -allows you to manipulate input/output streams. After all this, you'll -end up which a temporary file that contains the expanded source code. +The first step is to expand the source code file to meet all dependencies. The +C++ preprocessor includes the code from all the header files, such as =#include +<iostream>=. Now, what does that mean? The previous example includes the +=iostream= header. This tells the computer that you want to use the =iostream= +standard library, which contains classes and functions written in the core +language. This specific header allows you to manipulate input/output streams. +After all this, you'll end up which a temporary file that contains the expanded +source code. -In the example of the C++ code above, the =iostream= class would be -included in the expanded code. +In the example of the C++ code above, the =iostream= class would be included in +the expanded code. *** Step 2 -After the code is expanded, the compiler comes into play. The compiler -takes the C++ code and converts this code into the assembly language, -understood by the platform. You can see this in action if you head over -to the [[https://godbolt.org][GodBolt Compiler Explorer]], which shows -C++ being converted into assembly dynamically. +After the code is expanded, the compiler comes into play. The compiler takes the +C++ code and converts this code into the assembly language, understood by the +platform. You can see this in action if you head over to the [[https://godbolt.org][GodBolt Compiler +Explorer]], which shows C++ being converted into assembly dynamically. -For example, the =Hello, world!= code snippet above compiles into the -following assembly code: +For example, the =Hello, world!= code snippet above compiles into the following +assembly code: #+begin_src asm .LC0: @@ -120,17 +113,17 @@ _GLOBAL__sub_I_main: *** Step 3 -Third, the assembly code generated by the compiler is assembled into the -object code for the platform. Essentially, this is when the compiler -takes the assembly code and assembles it into machine code in a binary -format. After researching this online, I figured out that a lot of -compilers will allow you to stop compilation at this step. This would be -useful for compiling each source code file separately. This saves time -later if a single file changes; only that file needs to be recompiled. +Third, the assembly code generated by the compiler is assembled into the object +code for the platform. Essentially, this is when the compiler takes the assembly +code and assembles it into machine code in a binary format. After researching +this online, I figured out that a lot of compilers will allow you to stop +compilation at this step. This would be useful for compiling each source code +file separately. This saves time later if a single file changes; only that file +needs to be recompiled. *** Step 4 -Finally, the object code file generated by the assembler is linked -together with the object code files for any library functions used to -produce a shared library, dynamic library, or an executable file. It -replaces all references to undefined symbols with the correct addresses. +Finally, the object code file generated by the assembler is linked together with +the object code files for any library functions used to produce a shared +library, dynamic library, or an executable file. It replaces all references to +undefined symbols with the correct addresses. |