C programmieren: Wie arbeitet ein C-Compiler? (2024)

C programmieren: Wie arbeitet ein C-Compiler?

Prof. Dr. Christian Siemers *

Wie entsteht aus geschriebenem C-Code ein Programm, dass das Zielsystem auch versteht und Umsetzen kann? In diesem Beitrag sehen wir uns Aufbau und Arbeitsweise des C-Compilers genauer an.

Unser vorheriger Grundlagenartikeln zum Programmiere mit C befasste sich speziell mit der Standardbibliothek und dem Präprozessor der Programmiersprache. Speziell letzterer ist eines der Elemente, mit dem geschriebener C-Code auch in eine Form umgewandelt wird, die der Rechner umsetzen kann, die sog. Maschinensprache. Dieser Vorgang nennt sich auch Compiling.

Die vier Compilerphasen beim Programmieren mit C

Die Übersetzung eines in C geschriebenen Programms erfolgt in insgesamt vier Phasen, von denen der Compiler an zweien unmittelbar beteiligt ist. Die vier Phasen sind:

Bildergalerie

Bildergalerie mit 12 Bildern
  • Präprozessorphase
  • Frontendphase des Compilers
  • Backendphase des Compilers
  • Linkerphase

Die Präprozessorphase wurde bereits erwähnt. Hierbei handelt es sich um eine Vorbereitung des zu übersetzenden Sourcecodes. Textmakros werden ersetzt, die so genannten include-Dateien eingesetzt, Kommentare gelöscht, die Zeilen immer durch ein Newline-Zeichen getrennt usw. Der Output dieser Phase ist ein reiner Sourcecode, der bislang noch keine Überprüfung oder Übersetzung erfahren hat.

Im Frontend des Compilers (siehe Bild 1) wird dieser Sourcecode eingelesen (Scanner) und überprüft (Parser). Ziel ist es dabei, die korrekte Syntax zu überprüfen, eine erste Syntaxumwandlung und erste Optimierungen durchzuführen. Das Ziel dieser Phase ist ein Zwischencode, der noch von dem Zielsystem (dem Mikroprozessor) unabhängig ist, aber dennoch die Umsetzung in Assembler- oder Maschinensprache vorbereitet. Der Output dieses Frontendteils wird im nächsten Abschnitt genauer betrachtet.

Im Backend des Compilers erfolgt das Einlesen des Zwischencodes (intermediate representation, IR), die Umsetzung in Assemblersprache einschließlich der maschinenspezifischen Optimierung und der Assemblerlauf. Ziel dieses Abschnitts ist der so genannte Objektcode, der neben dem Maschinencode – noch unvollständig – auch Informationen zu den Daten und Programmabschnitten mitführt.

Der Linker liest dann abschließend den Objektcode ein, dazu die angegebenen Standard- und spezifischen Bibliotheken, und fügt das zusammen. Nunmehr sind alle Adressen, auch die der aus der Bibliothek genutzten Funktionen (wie etwa printf) bekannt, und der Maschinencode kann mit allen Adressen vervollständigt werden. Output des Linkers ist ein ausführbarer Maschinencode (in einem File-format).

Die Erzeugung des Zwischencodes

Für den Zwischencode existiert kein genormtes Format, jeder Compiler nutzt dort seine hauseigene Syntax. Besonders interessant ist jedoch das Lance2-Compiler-System, das aus C ein low-level-C erzeugt und dieses als Zwischencode nutzt. Diese Untermenge von C, die dieses Compilersystem als Zwischencode (Intermediate Representation, IR) nutzt, ist natürlich beschränkt. Wesentliche Merkmale sind:

Anweisungen (Statements):

  • Zuweisungen (Assignments): a = b + c, y = function( a, b ), ...
  • Sprünge (Jumps): goto label_1; (diese Sprünge sind Compiler-berechnet und somit ”zugelassen“)
  • Bedingte Sprünge (Conditional Jumps): if( cond ) goto label_2;
  • Marken (Label): label_1:
  • Rücksprung ohne Rückgabewert (return void): return;
  • Rücksprung mit Rückgabewert (return value): return x;

Ausdrücke (Expressions):

  • Symbole: main, a, count …
  • Binäre Ausdrücke (binary expressions): a * b, x / y …
  • Unäre Ausdrücke (unary expressions): ~a, *p …
  • Type Casts: (int), (char)
  • Konstanten (in verschiedenen Formaten): -5, 3.141592653589

Ein kurzer Blick in die obige Liste verrät, dass bei den Anweisungen Schleifen wie for, while und do .. while komplett fehlen. Diese Schleifen werden durch die aufgezählten Konstrukte abgebildet bzw. in diese übersetzt, und es gilt noch zu zeigen, wie dies erfolgt.

Der wichtigste Zusatz, das Zwischencodeformat betreffend, besteht noch in der Beschränkung der Ausdrücke und der Zuweisungen: Sie werden auf ein 3-Adressformat eingeschränkt, d.h., eine Wertzuweisung an ein links stehendes Symbol (a = ...) wird rechtsseitig durch einen unären oder einen binären Ausdruck bestimmt. Längere „Kettenrechnungen“ müssen dementsprechend in Teilrechnungen mit Einfügung temporärer Variablen geteilt werden, eine Aufgabe, die dem Compiler zufällt. Der Grund für diese Einschränkung ist sehr offen-sichtlich: Dem 3-Adressformat entsprechen häufig direkt Assemblerbefehle (etwa: ADD R3, R1, R2, was R3 = R1 + R2 bedeutet).

Bild 2 zeigt die Übersetzung einer if/else if/else-Verzweigung. Dabei wird deutlich, dass nur if-Konstrukte mit anschließendem Sprung (also zusammengefasst der ”bedingte Sprung“) genutzt werden. Die Bedingungen selbst müssen dabei invertiert ausgewertet werden, da ja die Liste der Anweisungen, die bei Erfüllung der ursprünglichen Bedingung auszuführen sind, nun übersprungen werden.

Dies mag etwas holprig wirken, denn bei Zulassung einer üblichen if-Verzweigung wäre dies wesentlich einfacher zu übersetzen. Diese Form der Übersetzung hat jedoch den entscheidenden Vorteil, dass nur bedingte Sprünge verwendet werden, und die lassen sich 1:1 in eine Sequenz von Assemblerbefehlen übersetzen, wie etwa:

cmp R1, R2; (Auswertung der Bedingung)
beq LABEL_IF_1;

Bild 3 zeigt die Übersetzung der while-Schleife, Bild 4 die der etwas komplexeren for-Schleife. In beiden Fällen werden bedingte und unbedingte Sprünge verwendet, um die Schleifenstruktur entsprechend abzubilden, wobei die Bedingung auch wieder invertiert verwendet werden müssen, um den Sprung aus der Schleife zu beschreiben. Entsprechend den hier gezeigten Codeabschnitten können nun auch die switch/case-Verzweigung (Bild 5) und die do..while-Schleife (Bild 6) übersetzt werden, wobei die Mehrfach-Fallunterscheidung (switch/case) etwas komplexer ist.

(ID:45439187)

C programmieren: Wie arbeitet ein C-Compiler? (2024)

FAQs

How to run C file in compiler? ›

How to Compile and Run C Program in Command Prompt?
  1. STEP 1: Check for Compiler. Run the command 'gcc -v' to check if you have a compiler installed. ...
  2. STEP 2: Create the Program. Create a c program and store it in your system. ...
  3. STEP 3: Change the Directory. ...
  4. STEP 4: Compile the program. ...
  5. STEP 5: Run the Program.
Jul 23, 2024

How hard is it to write a C compiler? ›

Writing a compiler is not too difficult. Most of the techniques and procedures are well researched and documented. The best thing is that you can pick the parts that are useful and stop instead of implementing the full blown end to end pipeline.

How to pass in C programming? ›

There are two ways to pass parameters in C: Pass by Value, Pass by Reference.
  1. Pass by Value. Pass by Value, means that a copy of the data is made and stored by way of the name of the parameter. ...
  2. Pass by Reference. A reference parameter "refers" to the original data in the calling function.

How do you compile C code step by step? ›

Step 1: Open your terminal, navigate to the directory containing your C file using the cd command. Step 2: Type gcc myfile.c -o hello to compile your C file. The -o hello part of the command names the output file "hello". Step 3: Run your program by typing ./myfile.

How to work a compiler? ›

Three-stage compiler structure
  1. The front end scans the input and verifies syntax and semantics according to a specific source language. ...
  2. The middle end performs optimizations on the IR that are independent of the CPU architecture being targeted. ...
  3. The back end takes the optimized IR from the middle end.

Is C harder than Python? ›

Python is easier than C to learn. But C helps to learn the fundamentals of programming while Python focuses on doing the job. Because Python is made in C doesn't mean you need to learn it. It is supposed to be an opposite and make a fast learning environment, unlike C.

Which C compiler is best for beginners? ›

What is the best C compiler for beginners? Turbo C is one of the best C Compilers. It is a perfect tool for beginners to learn and start practicing codes. This does not suggest the keywords or mistakes in code while writing, which can be helpful for the new coder to grasp more.

What is the hardest C language to learn? ›

However, C++ is generally considered a more difficult language to learn than other popular programming languages, such as Python or JavaScript, due to its complex syntax and steep learning curve.

Can I complete C in one day? ›

No, you cannot learn C in one day. (I assume you have not learned programming, and your exam is about programming in C; If you did have a lot of programming experience -e.g. in lower level languages semantically similar to C, like Ada, PL/1, Algol, Rust or Pascal- you might learn C in a few days).

How to learn C quickly? ›

Understand the type of data that you are working with, such as whether it's an integer or a character. C is based on data types, so understanding this characteristic is the foundation for writing programs that work well. Learn the operators. Operators are symbols that tell the compiler program what to do.

How to write C program easily? ›

Begin your 1st C Program
  1. Open any text editor or IDE and create a new file with any name with a .C extension. e.g. helloworld.c.
  2. Open the file and enter the below code: #include <stdio.h> int main() { printf("Hello, World!" ); return 0; } Run Code >>
  3. Compile and run the code.
May 27, 2024

How to compile in C VS Code? ›

Use keys Cmd + Shift + B to compile and run the C language codes in VSCode.

How to compile using GCC in C? ›

Things You Should Know
  1. To make sure GCC is installed, run the command gcc --version.
  2. Type gcc source_file. c -o program_name and press Enter to compile your source code.
  3. Replace source_file with the name of your source code file, and program_name with the name you'd like to give your compiled program.
Mar 13, 2024

What is compiler process in C? ›

The C compilation process converts the input source code into object code or machine code. Pre-processing, Compiling, Assembling, and Linking are the four phases in the compilation process. C source files are typically named with . c extension.

Does C need a compiler? ›

As C is a mid-level language, it needs a compiler to convert it into an executable code so that the program can be run on our machine.

Top Articles
Is CVS Minute Clinic the Same as Urgent Care? A Comprehensive Comparison
acupunctuurdelft.nl Reviews | scam, legit or safe check | Scamadviser
R/Honkaistarrail
How To Check Your Rust Inventory Value? 🔫
Forum Phun Extra
Boost Mobile 69Th Ashland
Best Seafood Buffet In Laughlin Nevada
Charli D'Amelio: Wie die junge Amerikannerin TikTok-Sensation wurde
Are Pharmacy Open On Sunday
Tear Of The Kingdom Nsp
Inmate Inquiry Mendocino
Beach Umbrella Home Depot
Local Dog Boarding Kennels Near Me
Walgreens Boots Alliance, Inc.: Konsensus der Analysten und Kursziel | A12HJF | US9314271084 | MarketScreener
Body Rub Phoenix
Church Bingo Halls Near Me
Belle Fourche Landfill
Upper Rank Demons Wiki
Omni Id Portal Waconia
Ice Crates Terraria
Bunni.soph
Christopher Goosley Obituary
What Happened To Zion Judah Satterfield
Hmr Properties
Mylaheychart Login
Evertote.ca
Ashley Kolfa*ge Leaked
Nephi Veterinarian
Tamilrockers.com 2022 Isaimini
Gestalt psychology | Definition, Founder, Principles, & Examples
Bayada Bucks Catalog 2023
Webmail.unt.edu
Antique Wedding Favors
Mybackpack Bolles
인민 을 위해 복무하라 다시보기
Gmail Psu
Otter Bustr
Leccion 4 Lesson Test
About My Father Showtimes Near Megaplex Theatres At Mesquite
Frigjam
Wells Fargo Hiring Hundreds to Develop New Tech Hub in the Columbus Region
Craigslist General Fresno
Obituaries Cincinnati Enquirer
Rennlist Com Forums
Terraria Cement Mixer
Tuw Academic Calendar
Rush Copley Swim Lessons
The Top 6 Most Expensive Hermès Birkin Bags
Dicks: The Musical Showtimes Near Regal Galleria Mall
Nashville Predators Wiki
Choices’ summer movie preview
Latest Posts
Article information

Author: Dr. Pierre Goyette

Last Updated:

Views: 6179

Rating: 5 / 5 (70 voted)

Reviews: 93% of readers found this page helpful

Author information

Name: Dr. Pierre Goyette

Birthday: 1998-01-29

Address: Apt. 611 3357 Yong Plain, West Audra, IL 70053

Phone: +5819954278378

Job: Construction Director

Hobby: Embroidery, Creative writing, Shopping, Driving, Stand-up comedy, Coffee roasting, Scrapbooking

Introduction: My name is Dr. Pierre Goyette, I am a enchanting, powerful, jolly, rich, graceful, colorful, zany person who loves writing and wants to share my knowledge and understanding with you.