• Keine Ergebnisse gefunden

Übersetzung und Ausführung

N/A
N/A
Protected

Academic year: 2022

Aktie "Übersetzung und Ausführung"

Copied!
17
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Programmieren in C

für Elektrotechniker

Kapitel 5: Programmerzeugung

§ Präprozessor

§ Programmübersetzung

§ Fehlersuche

§ Debugger

§ Entwicklungsumgebungen

Programmieren in C

Bernd Schürmann

Programmerzeugung

main.c sub1.c sub2.c

Compiler (Übersetzer)

main.obj sub1.obj sub2.obj Texteditor

Binder (Linker)

Lader (Loader) Beispiel.exe

Beispiel.exe

Include-Dateien

Bibliotheken

auf Festplatte

auf Festplatte

auf Festplatte

im Arbeitsspeicher

Quellprogramme

übersetzte Programme

ablauffähiger Objektcode

ausgeführtes Programm im Speicher

Übersetzung und Ausführung

Präprozessor (Textersetzung)

(2)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Präprozessor

Präprozessor

§ Aufgaben

• Einfügen von Dateien (#include ...)

• Ersetzen von Text (#define ...)

• Bedingte Übersetzung (#if ...)

§ Syntax

#Direktive Text <return> Interpretation durch den Präprozessor bis zum Zeilenende.

#Direktive Text1\ Interpretation durch den Präprozessor Text2<return> über zwei (oder mehrere) Zeilen.

Programmieren in C Präprozessor

§ Einfügen von Dateien

#include <filename>

• Präprozessor sucht in den typischen Include-Verzeichnissen nach der Datei filename, z.B. in /usr/include.

#include "filename"

• Präprozessor sucht zunächst im aktuellen Verzeichnis und dann in den typischen Include-Verzeichnissen nach der Datei filename.

• Nach dem Einkopieren des Inhalts der Datei filenamewird der Präprozessor den einkopierten Text analysieren.

(3)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Präprozessor

§ Ersetzen von Text

• Typische Anwendungen: - symbolische Konstanten - Makros

#define HUND DOG

• Ersetzt alle Vorkommen HUNDdurch DOG.

• Keine Ersetzung von -HUNDERT

-" Dies ist ein HUND. "

Programmieren in C

Bernd Schürmann

Präprozessor

§ Ersetzen von Text

• Typische Anwendungen: - symbolische Konstanten - Makros

#define Bezeichner (Par_1, …, Par_n) Ersatztext

• Setzt den Ersatztext an den Stellen Bezeichnerein, wobei die aktuellen Parameter in den Ersatztexteingesetzt werden.

• Beispiel:

#define evalmac(z) z*=(z+1)/2 /* Gauß-Formel */

....

int a = 5;

evalmac(a);

....

è ....

int a = 5;

a*=(a+1)/2;

....

Achtung:

Makros sehen aus wie Funktionen

(àAufruf und Parameterersetzung zur Laufzeit), es handelt sich aber um eine Textersetzung zur Übersetzungszeit.

(4)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Präprozessor

§ Bedingte Übersetzung

#if konstanter_Ausdruck #ifdef Symbol

#elif konstanter_Ausdruck #if defined(Symbol)

#else #ifndef Symbol

#endif

• Anwendungen z.B. - Anpassung des Programms an das Rechnersystem - Einbinden von Test-Code

• Beispiel

#include <stdio.h>

#include <limits.h>

#define TESTVERSION int main (void) {

#if INT_MAX > 32767 int i;

#else long i;

#endif

#ifdef TESTVERSION

printf ("Test: sizeof (int) = %d\n", sizeof (int));

printf ("Test: sizeof (long) = %d\n", sizeof (long));

#endif ... }

Programmieren in C Präprozessor

§ Vordefinierte Standard-Makros

__LINE__ Liefert Zeilennummer, in der __LINE__ steht.

__FILE__ Liefert den Dateinamen, in dem __FILE__ steht.

__DATE__ Liefert das aktuelle Datum im US_Format als Zeichenkette.

__TIME__ Liefert die aktuelle Uhrzeit im Format hh:mm:ss als Zeichenkette.

(5)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Programmieren in C

für Elektrotechniker

Kapitel 5: Programmerzeugung

§ Präprozessor

§ Programmübersetzung

§ Fehlersuche

§ Debugger

§ Entwicklungsumgebungen

Programmieren in C

Bernd Schürmann

Programmerzeugung

main.c sub1.c sub2.c

Compiler (Übersetzer)

main.obj sub1.obj sub2.obj Texteditor

Binder (Linker)

Lader (Loader) Beispiel.exe

Beispiel.exe

Include-Dateien

Laufzeitsystem

auf Festplatte

auf Festplatte

auf Festplatte

im Arbeitsspeicher

Quellprogramme

übersetzte Programme

ablauffähiger Objektcode

ausgeführtes Programm im Speicher

Übersetzung und Ausführung

Präprozessor (Textersetzung)

(6)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Programmerzeugung

Compiler (Übersetzer)

§ Quellcode à Maschinencode (Assembler

, vgl. EIT-Vorlesung

)

§ Syntax einer Programmiersprache durch Metasprache definiert

Beispiel: Ausschnitt aus C-Syntax in Backus-Naur-Form

<stmt> ::= <labeled-stmt> | <expr-stmt> | <compound-stmt>

| <select-stmt> | <iter-stmt> | <jump-stmt>

<labeled-stmt> ::= ….

<expr-stmt> ::= {<expr>}? ;

<select-stmt> ::= if ( <expr> ) <stmt>

| if ( <expression> ) <stmt> else <stmt>

| switch ( <expression> ) <stmt>

<iter-stmt> ::= while ( <expression> ) <stmt>

| do <stmt> while ( <expr> ) ;

| for ( {<expr>}? ; {<expr>}? ; <expr>}? )

<stmt>

<expr> ::= <assignment-expr>

| <expr> , <assignment-expr>

ànicht näher in dieser Vorlesung

Programmieren in C Programmerzeugung

Übersetzung in 5 Schritten

§ Lexikalische Analyse

à

Programm: Scanner

Erkennung der „Grundeinheiten“ einer Programmiersprache (à Token):

Wörter, Zahlen, Trennzeichen etc.

/* File: hello_world.c */

#include <stdio.h>

int main (void) {

printf (”Hello, world!\n“);

return 0;

}

T1 = /* File: ...c */

T2 = #include T3 = <

T4 = stdio.h T5 = >

T6 = int T7 = main T8 = ( T9 = void ...

T20 = }

(7)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Programmerzeugung

Übersetzung in 5 Schritten

§ Syntaxanalyse

à

Programm: Parser

Syntax (Grammatik): Regelwerk, das beschreibt, welche Folge von Tokens zulässig ist.

à

vgl. Deutsch: Satz ::= <Subj> <Prädikat> <Obj> .

Parser: Teil des Compilers, der das Programm auf korrekte Syntax

prüft und in seine syntaktische Struktur zerlegt.

<Programm>

<Include> <Function>

<Typedef>

main

<Parameters> <Body>

stdio.h

... ... ...

Programmieren in C

Bernd Schürmann

Programmerzeugung

Übersetzung in 5 Schritten

§ Semantische Analyse

§

analysiert die Bedeutung der Programmteile

§

erzeugt abstrakten Zwischencode

à

keine vollständige semantische Analyse, sondern Analyse der Bedeutung von Namen

(

à

Sichtbarkeits-, Gültigkeits-, Typregeln – s.u.)

§

statische Semantik: vom Compiler überprüft

§

dynamische Semantik: erst zur Laufzeit prüfbar

(àLaufzeitsystem – s.u.)

(8)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Programmerzeugung

Übersetzung in 5 Schritten

§ Optimierungen u.a.

§

Speicherplatz

§

Rechenzeit

àandere Vorlesungen

Programmieren in C Programmerzeugung

Übersetzung in 5 Schritten

§ Codeerzeugung

Zwischencode à Maschinencode

à

Einsetzen von Adressen

(9)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Programmerzeugung

main.c sub1.c sub2.c

Compiler (Übersetzer)

main.obj sub1.obj sub2.obj Texteditor

Binder (Linker)

Lader (Loader) Beispiel.exe

Beispiel.exe

Include-Dateien

Laufzeitsystem

auf Festplatte

auf Festplatte

auf Festplatte

im Arbeitsspeicher

Quellprogramme

übersetzte Programme

ablauffähiger Objektcode

ausgeführtes Programm im Speicher

Übersetzung und Ausführung

Präprozessor (Textersetzung)

Programmieren in C

Bernd Schürmann

Laufzeitsystem

§ Komponenten, die zur Ausführung eines Programms notwendig sind, z.B.

§ Betriebssystem

§ Prüfung der dynamischen Semantik

§ Fehlerbehandlung

§ Interpreter (nicht bei C)

§ Binder (Linker)

Fügt Objektcode einzelner Module (Übersetzungseinheiten) zusammen.

§ Auflösung von Querreferenzen.

§ Hinzufügen von Bibliotheken.

Ergebnis: einheitlicher Adressraum für gesamtes Programm.

Laufzeitsystem

Globale Variablen main() sub1() sub2()

sub_n() Bibliotheksfktn. /

Laufzeitsystem

Heap Stack 0

ablauffähiges Programm

selbst geschriebene Funktionen

2n-1 Adressen

. . .

(10)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Laufzeitsystem

§ Komponenten, die zur Ausführung eines Programms notwendig sind, z.B.

§ Betriebssystem

§ Prüfung der dynamischen Semantik

§ Fehlerbehandlung

§ Interpreter (nicht bei C)

§ Lader (Loader)

§ Programm wird in Arbeitsspeicher geladen.

§ Programm wird gestartet

(evtl. mit Eingabe von Argumenten – s.u.).

Laufzeitsystem

Programmieren in C

Programmieren in C

für Elektrotechniker

Kapitel 5: Programmerzeugung

§ Präprozessor

§ Übersetzer

§ Fehlersuche

§ Debugger

§ Entwicklungsumgebungen

(11)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Fehlersuche in Programmen

§ Goldene Regeln für Programmierer

§ Alles, was schiefgehen kann, wird auch schiefgehen.

§ Alles, was nicht schiefgehen kann, wird voraussichtlich doch schiefgehen.

àProgramme systematisch testen!

In der Praxis:

§Debugging-Werkzeuge

§Testumgebungen

§ Fehlerklassen

§ Syntaxfehler: vom Compiler entdeckt

§ Laufzeitfehler: viel schwerer zu entdecken

Fehlersuche in Programmen

nicht in der Vorlesung

Programmieren in C

Bernd Schürmann

Fehlersuche in Programmen

§ Grundlegende Guidelines

§ Programme gut strukturieren

• Kleine Funktionen, die gut zu strukturieren sind.

• Aufrufhierarchie funktionsweise von unten nach oben testen.

§ Funktionen testen

• Funktionen einzeln mit Hilfe von Testprogrammen überprüfen.

§ Testausgaben einsetzen àspäter wieder löschen!

§ Prüfen des allgemeinen Falls,

aber auch aller Sonderfälle (Eingabewerte 0,” ”, …)

• Bei Verzweigungen möglichst Werte nahe der Grenze wählen

• Beispiel: if (u <= 30) { . . .

}

àtesten mit 29.9999, 30.0, 30.0001

• Achtung: Viele Fehler treten erst nach langer Zeit auf (wenn kritische Datenkonstellationen zufällig auftreten).

Fehlersuche in Programmen

(12)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Fehlersuche in Programmen

§ Ausgabe von temporären Werten

§ Testausgaben

Temporäre Ausgaben im Programm (àprintf(…)),

die im „Produktivsystem“ wieder gelöscht/auskommentiert werden.

§ Nutzung des Präprozessors (s.o.)

Über die Direktive if …Code nur während der Testzeit in das Programm einbinden.

• Beispiel: #include <stdio.h>

#define TEST int main (void) {

#ifdef TEST

printf („Test: Wert der Variable x an Zeile %d: %d\n", __LINE__, x);

#endif ... }

Fehlersuche in Programmen

Programmieren in C

Programmieren in C

für Elektrotechniker

Kapitel 5: Programmerzeugung

§ Präprozessor

§ Übersetzer

§ Fehlersuche

§ Debugger

§ Entwicklungsumgebungen

(13)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Fehlersuche in Programmen

Programm, das andere Programme ausführt (àInterpreter) und den Benutzer die Kontrolle über das ausgeführte Programm gibt.

èGrößter Freund eines Programmierers. J

§ Typische Aufgaben und Aktionen

• Breakpoints: Programmstellen, an denen die Programmausführung anhält.

• Einzelschritte: Programm (-teile) werden Anweisung für Anweisung durchlaufen.

• Anzeige aktueller Variablenwerte.

• Setzen von Variablenwerten.

• Anzeige des Systemzustands.

Debugger

Programmieren in C

Bernd Schürmann

Fehlersuche in Programmen

§ Beispiel: GNU debugger (gdb)

àgrafische Oberfläche unter dev-C++.

• C-Programm muss mit „-g“-Option übersetzt worden sein.

gcc –g hello_world.c –o hello_world

• Wichtige Befehle

Debugger

b N Breakpoint in Zeile N.

b fn Breakpoint zu Beginn der Funktionfn.

d M Lösche breakpoint Nr. M.

info bp Listet alle breakpoints.

r run– Programmstart bis breakpoint oder Fehler.

c continue– analog zu r - ab breakpoint.

f Programmausführung, bis Funktion beendet wurde.

s / n step / next– Ausführung einer Zeile/Anweisung.

s N Ausführung von n Anweisungen.

p <var> Ausgabe des aktuellen Werts der Variablen var.

w <var> Watch. Stopp und Ausgabe von varbei Änderung.

u / d Eine Ebene höher/tiefer im Stack.

q Quit.

(14)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Fehlersuche in Programmen

#include <stdio.h>

int sub(int x) {

printf("x hat den Wert %d\n", x);

}

int main() { int i;

printf("Programmstart.\n");

sub(i);

return 0;

}

• Beispiel: Ein Programm, das eine Variable imit 5belegen und diesen Wert in der Funktion subausgeben soll.

àIst das Programm korrekt?

% cc -g -o temp temp.c

% ./temp Programmstart.

x hat den Wert 4231

Übersetzung und Ausführung des Programms:

Fehler:Es wird nicht der erwartete Wert 5ausgegeben.

Programmieren in C Fehlersuche in Programmen

% gdb temp GDB is free ...

(gdb) break main

Breakpoint 1 at 0x160f: file temp.c, line 5.

(gdb) run

Starting program: /home/james/tmp/temp Breakpoint 1, main () at temp.c:5 (gdb) n

Programmstart.

(gdb) s

sub (x=4231) at temp.c:2 (gdb)

àxhat den falschen Wert.

(gdb) up

#1 0x1625 in main () at temp.c:8 (gdb) p i

$1 = 4231

àErkannt, dass i nicht mit 5belegt wurde.

Überspringe Aufruf-Code.

àbreakpoint gesetzt.

Ausführung bis main(). àgdp stoppt bei main(). Gehe zur nächsten Anweisung.

Nächste Zeile: Funktion sub().

Eine Ebene höher.

Ausgabe von i.

(15)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Variablennamen wählen: watch hinzufügen.

click: breakpoint setzen

Debugger aufrufen.

gdb-Kommando: up.

C-Ausdruck auswerten.

CPU-Fenster:

Programmumgebung.

Programmieren in C

Bernd Schürmann

Programmieren in C

für Elektrotechniker

Kapitel 5: Programmerzeugung

§ Präprozessor

§ Übersetzer

§ Fehlersuche

§ Debugger

§ Entwicklungsumgebungen

(16)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Laufzeitsystem

(IDE –

integrated development environment

)

§ Programmsystem mit folgenden Komponenten:

• Editor (meist sprachsensitiv)

• Compiler

• Binder, Lader

• Debugger

• Projektverwaltung (Verwaltung aller Dateien)

• Modellierung (z.B. UML)

Integrierte Entwicklungsumgebung

Programmieren in C Laufzeitsystem

(IDE – integrated development environment)

§ Beispiel: Eclipse

• open source, ursprünglich für Java, mittlerweile plugins für viele Sprachen

• sprachsensitiver Editor

• leistungsstarke Suche

• CVS-Unterstützung (Concurrent Versions System)

• Debugger

Integrierte Entwicklungsumgebung

(17)

Programmieren in C

5. Programmerzeugung Bernd Schürmann

Laufzeitsystem

(IDE – integrated development environment)

§ Beispiel: MS Visual Studio Express (VSE)

• kostenlose Microsoft-Entwicklungsumgebung

• sprachsensitiver Editor (Einfärbung)

• Debugger

• optimiert für Web-Entwicklung

Integrierte Entwicklungsumgebung

Referenzen

ÄHNLICHE DOKUMENTE

Eine Verwertung oder Weitergabe der Texte und Abbildungen, insbesondere durch Vervielfältigung, ist ohne vorherige schriftliche Genehmigung des Verlages.

Das Konzept von Sichten f¨ur pr¨aprozessorbasierte Implementierungen kann auch leicht erweitert werden, so dass nicht nur Sichten auf einzelne Features, sondern auch editierbare

[r]

13. Die sphärischen Coordinaten bestimmen nur die Richtung, in welcher uns das Gestirn erscheint, wobei jener Punct der Richtung, in welchem sich dasselbe thatsächlich befindet,

(a) #include: Anweisung für Präprozessor (kein C++ Befehl); Einlesen von Datei iostream : Ein/Ausgabe. cmath :

Wir erhalten approximativ eine logarithmische Spirale, welche aber nicht in den Ur- sprung einmündet, sondern ins Sauschwänzlein der Abbildung

The interrupt option provides each of the input channels with I/O data and service interrupt control which enables the external device to interrupt the computer

While the squareroot term will diverge the exponential term will converge to zero.. This means, the velocity of the atoms doesn't