1 Einführung

Werbung
ALP 2, Hannes Federrath, Sommersemester 2002
22.4.02
1 Einführung
Programmiersprachen:
•
Ermöglichen formale Beschreibung von Problemlösungsverfahren, die auf einem Computer
oder Computersystemen ausführbar sind.
•
Bilden die Basis zur Entwicklung von Software und Betriebssystemen.
1.1 Phasen des SW-Entwicklungsprozesses
Programmentwicklung erfordert im Allgemeinen mindestens ein zweistufiges Verfahren:
•
Entwurfsphase: Formulierung eines abstrakten Problemlösungsverfahrens in Form eines
Algorithmus
•
Codierungsphase: Transformation des Algorithmus in ein Programm; dabei Verwendung
von Kontrollstrukturen und Datentypen
Es gibt keinen Algorithmus zum Schreiben eines Programms bzw. Algorithmus.
•
Wie komme ich vom Problem zur Lösung oder spezieller: Welche Phasen muss ich
durchlaufen, um vom Problem zum Programm zu kommen?
1
•
Die Entwicklung einer Software sollte im Idealfall folgende Phasen durchlaufen:
Problem
Dokumentation beschreibt:
Problemanalyse
Welche generellen Leistungen
soll das System erbringen?
Anforderungsanalyse
Was soll das System im
einzelnen leisten?
Spezifikation
Wie funktioniert das System?
Implementierung
Dokumentation
Programm
1.2 Verarbeitung von Programmiersprachen
1.2.1 Programmübersetzung
Präprozessor ‡ Compiler ‡ Binder und Lader
Präprozessor:
•
Vorbereitung des Quellcodes für Compiler
•
textuelle Ersetzungen von Codesegmenten
•
Makro-Ersetzung und Einkopieren von Deklarationsdateien bei C
Beispiel:
#include <stdio.h> // Einkopieren von stdio.h
#define ende(x) ((x=='\0')||(x=='\n')||(x=='\r')||(x=='\t')) // Makro
...
if (ende(zeichen))
wird ersetzt zu
if (((zeichen =='\0')||( zeichen =='\n')||( zeichen =='\r')||( zeichen =='\t')))
2
Compiler:
•
Überführen des in einer höheren Programmiersprache formulierten Programms
(Algorithmus) in eine andere Sprache, z.B. eine Maschinensprache
•
Erzeugen des Codes der Zielsprache. Phasen der Codeerzeugung:
Quellcode
Lexikalische Analyse
Syntaxanalyse
semantische Analyse
Zwischencode-Erzeugung
Code-Optimierung
Code-Erzeugung
scanning: Symbole der Sprache erkennen und
gruppieren.
parsing: Symbole zu grammatikalischen
Sätzen zusammenfassen.
Quellprogramm auf semantische Fehler (z.B.
Typfehler) überprüfen und Parse-Baum mit
zusätzlichen Informationen über die
verwendeten Bezeichner anreichern.
Manche Compiler erzeugen Code für eine
„abstrakte Maschine“.
Verbessern des Zwischencodes, um
effizienten Maschinencode zu erhalten.
Erzeugen des Maschinencodes.
Zielprogramm
Binder und Lader:
•
Zusammenfassen verschiedener Maschinencode-Fragmente (mit relativen Adressen) zu
einem ausführbaren Programm (z.B. Code aus Bibliotheken und eigener Code)
•
Umwandeln relativer in absolute Adressen und Laden des Programms an eine geeignete
Stelle im Hauptspeicher
1.2.2 Interpreter
Ein Interpreter analysiert wie ein Compiler den Quelltext, führt aber keine vollständige Übersetzung
in Maschinensprache durch.
•
Programmtext wird entweder unmittelbar ausgeführt oder
•
in einen Zwischencode übersetzt, der den Zwischencode interpretiert.
Beispiele: Perl, Basic
3
1.3 Programmierparadigmen
Programmierparadigmen beschreiben grundsätzliche Problemlösungsstrategien zum
„Programmieren im Großen“.
Etwa 1970: strukturierte (prozedurale) Programmierung:
•
Stepwise refinement
•
Problem wird in kleine, leichter lösbare Probleme zerlegt und die Teillösungen werden zu
einer Gesamtlösung zusammengesetzt (Top-Down-Ansatz)
•
Für kleinere Probleme gut geeignet („Programmieren im Kleinen“)
•
Weniger geeignet für den Entwurf und die Pflege größere Softwareprojekte
Weitere Paradigmen:
•
objektorientierte Programmierung (C++, Java)
•
deklarative Programmierung (Prolog, meist als Logikprogrammierung angewendet)
•
funktionale Programmierung (Lisp, Haskell)
1.4 Syntax, Semantik und EBNF
Die Syntax einer Programmiersprache bescheibt die Menge der erlaubten Zeichenketten für
Programme. Die Syntax fast aller Sprachen wird heute unter Verwendung kontextfreier
Grammatiken angegeben. Als formales Beschreibungsmittel werden die Backus-Naur-Form (BNF)
und die erweiterte Backus-Naur-Form (EBNF) und Syntaxdiagramme benutzt.
Die Semantik einer Programmiersprache definiert die Bedeutung der einzelnen Sprachkonstrukte.
Die Semantik der Sprachkonstrukte wird für die meisten Programmiersprachen heute textuell
beschrieben
Erweiterte Backus-Naur-Form (EBNF) zur formalen Beschreibung der Syntax einer
Programmiersprache. Eine EBNF enthält folgende Metazeichen:
Metazeichen in EBNF Bedeutung
<Sprachkonstrukt>
Sprachkonstrukt der Programmiersprache
<l> ::= <r>
Ableitungsregel: Der linke Teil <l> wird durch den rechten Teil
<r> definiert.
|
alternative Definition (oder)
{ }
Das in Mengenklammern eingeschlossene Konstrukt kann 0mal oder mehrfach vorkommen.
[ ]
Das in Intervallklammern eingeschlossene Konstrukt kann 0mal oder höchstens 1-mal vorkommen.
nach: U. Schneider, D. Werner (Hrsg.): Taschenbuch der Informatik. Fachbuchverlag Leipzig,
2.Aufl., 2000, 297f.
1.5 Java — die Sprache für ALP 2 (und folgende)
•
„Internet-Programmiersprache“
4
•
ab 1992 von Sun Microsystems vorgestellt
•
objektorientierte Programmiersprache
•
Vorläufer: C++, Smalltalk
Die wichtigsten Grundelemente objektorientierter Programmierung sind Klassen und die
eigentlichen Objekte (Instanzen).
Klasse ‡ Anlegen des Objektes ‡ Objekt (Instanz)
„Mein erstes Java-Programm“: (Dateiname: SayHello.java)
public class SayHello {
public static void main(String[] args) {
Mouth mouth = new Mouth();
mouth.say("Hello, world");
}
}
class Mouth {
public void say(String what) {
System.out.println(what);
}
}
29.4.02
Das Anlegen eines Objektes erfolgt mit dem reservierten Wort
new.
Das reservierte Wort public bestimmt die „Sichtbarkeit“ eines Objektes bzw. einer Methode
(dazu später mehr).
Die Methode main ist eine sog. Klassenmethode (auch: statische Methode, static), d.h. sie
benötigt keine Instantiierung der Klasse um ausführbar zu sein.
Der Zugriff auf Methoden (und Variablen) fremder Objekte erfolgt durch
<Objektname>.<Methodenname>. Beispiel: mouth.say(…)
Übersetzen (in Konsole):
> javac SayHello.java
Eine Datei mit der Endung .class wird erzeugt. Diese enthält einen plattformunabhängigen
Bytecode.
Ausführen (in Konsole):
> java SayHello
Hello, world
> _
Wo gibt es Java?
•
Ausführungsumgebung ist heute in fast allen Betriebssystemen enthalten
•
Entwicklungsumgebung (Java Development Kit, JDK) gibt es ebenfalls für die meisten
Betriebssysteme: http://java.sun.com/j2se/
5
Grundgerüst eines Java-Programms:
public class <Bezeichner> {
public static void main (String[] args) {
// Dies ist ein Kommentar,
// hier kommen die Anweisungen hin ...
}
}
Wichtig: Die Zeichenkette die im Quellcode hinter dem reservierten Wort class steht, ist ein
Bezeichner. Die Datei muss <Bezeichner>.java heißen.
Objektorientiertes Programmiergerüst für Java-Programme:
public class ALP2Wrapper {
public ALP2Wrapper { } // Konstruktor
void functionToImplement() {
// hier wird das zu implementierende
// Problem geloest
System.out.println("ALP2 macht Spass!");
}
public static void main(String[] args) {
ALP2Wrapper w = new ALP2Wrapper(); // Aufruf Konstruktor
w.functionToImplement();
}
}
6
Herunterladen