440 likes | 699 Views
Programmierkurs Java. Vorlesung am FB Informatik der Universität Oldenburg Vorlesung 2. Dietrich Boles. Gliederung von Vorlesung 2. Programmierung Terminologie Algorithmen Programme Programmiersprachen Klassifikation Abstraktionsebenen Syntaxdiagramme Backus-Naur-Form
E N D
Programmierkurs Java Vorlesung am FB Informatik der Universität Oldenburg Vorlesung 2 Dietrich Boles
Gliederung von Vorlesung 2 • Programmierung • Terminologie • Algorithmen • Programme • Programmiersprachen • Klassifikation • Abstraktionsebenen • Syntaxdiagramme • Backus-Naur-Form • Programmentwicklung • Entwicklungsphasen • Entwicklungswerkzeuge • Compilation • Computer • Arbeitsweise • Hardware • Software • Speicher • Aussagenlogik • Aussagen • Eigenschaften von Aussagen
Programmierung / Terminologie Programmierung: Erstellung von Computerprogrammen Softwareentwicklung: Methoden zum Lösen von Problemen mit dem Computer Algorithmus: Arbeitsanleitung für einen Computer Programmiersprache: computerverständliche Notation zur Formulierung von Algorithmen Programm: in einer Programmiersprache formulierter Algorithmus „Programmieren im Kleinen“: Lösen kleiner Probleme „Programmieren im Großen“: Lösen komplexer Probleme Softwareengineering: Vorgehensmodelle, Entwicklungsmethoden, Entwicklungsumgebungen, Projekt-, Qualitäts- und Konfigurationsmanagement
Programmierung / Algorithmus / Motivation Arbeitsanleitungen: • Kochrezepte • Bastelanleitungen • Partituren • Spielregeln Aufbau: • Menge von Anweisungen Charakteristika: • Anweisungssequenzen • bedingte Anweisungen • Anweisungsschleifen • Zutaten / Voraussetzungen • „schwammige“ Formulierungen
Programmierung / Algorithmus / Definition Definition: • Arbeitsanleitung zum Lösen eines Problems bzw. einer Aufgabe, die so präzise formuliert ist, daß sie von einem Computer ausgeführt werden kann Formulierung von Algorithmen: • Umgangssprachlich • Programmiersprache • Programmablaufpläne • Struktogramme Ausführung von Algorithmen: • durch einen Prozessor (Mensch / Computer) Prozeß • Computer: • schnell • zuverlässig • hohe Speicherfähigkeit
Programmierung / Algorithmus / Formulierung Beispiel: Berechnung der Summe aller Zahlen von 1 bis n Umgangssprachliche Formulierung: Addiere für eine vorgegebene natürliche Zahl n die Zahlen von 1 bis n. Dies ist das Resultat. Programmiersprache: int n = readInt(); int erg = 0; int i = 0; while (i <= n) { erg = erg + i; i = i + 1; } printInt(erg);
Programmierung / Algorithmus / Formulierung Programmablaufpläne / Flußdiagramme:
Programmierung / Algorithmus / Formulierung Struktogramme / Nassi-Shneiderman-Diagramme:
Programmierung / Algorithmus / Eigenschaften theoretisch: • Eindeutigkeit • Parametrisierbarkeit • Finitheit • Ausführbarkeit • Terminierung • Determiniertheit • Determinismus praxisrelevant: • korrekt • vollständig • effizient (Zeit) • sparsam (Speicher) • erweiterbar • wiederverwendbar • portabel • verständlich
Programmierung / Programme Programm:ein in einer Programmiersprache formulierter Algorithmus Programmieren: Erstellen von Programmen Programmierer: Entwickler von Programmen Programmcode, Quellcode, Sourcecode: Programmbeschreibung ausführbares Programm: Programm in maschinenverständlicher Form Programmaufruf: Ausführung eines ausführbaren Programms
Programmiersprachen / Klassifikation Anwender: • Anfänger • Experten Paradigmen: • imperativ • funktional • prädikativ • regelbasiert • objektorientiert Abstrahierungsgrad: • maschinennah • problemorientiert Komplexität: • problemspezifisch • „general-purpose“
Programmiersprachen / Abstraktionsebenen Lexikalik: gültige Zeichen und Wörter der Sprache Syntax: korrekter Aufbau von Sätzen der Sprache Semantik: Bedeutung von Sätzen der Sprachen Pragmatik: Einsatzbereich einer Sprache Token- folge Quell- programm Ableitungs- baum Ziel- programm Lexikalische Analyse (Scanner) Syntaktische Analyse (Parser) Semantische Analyse/ Codegenerierung
Programmiersprachen / Lexikalische Analyse • Entfernung von Trennzeichen und Kommentaren • Erkennung von Token (Zeichen, die bedeutungsmäßig zusammengehören): • Schlüsselwörter • Konstanten • Bezeichner • Symbole • Zeichenketten • ... • Grundbaustein: endlicher Automat • Beschreibung: reguläre Ausdrücke while n > 0 do n := n - 1 ; PASCAL while n > 0 do n := n-1;
Programmiersprachen / Syntaktische Analyse • Überführung einer Tokenfolge in Ableitungsbaum • Untersuchung auf syntaktische Korrektheit • Beschreibung: kontextfreie Grammatiken • Darstellung: Syntaxdiagramme, BNF Zuweisung Variable := Ausdruck n := 3 + i + n Term Term Konstante Variable 3 i
Programmiersprachen / Semantische Analyse • Überprüfung des Ableitungsbaums auf Fehler (kontextsensitive Zusatzbedingungen) • Vorbereitung der Codeerzeugung • Nutzung einer Symboltabelle • attributierte Syntaxbäume
Programmiersprachen / Syntaxdiagramme • Technik zur graphischen Darstellung kontextfreier Grammatiken • Elemente: • Knoten • Ellipsen (Token, Terminale) • Rechtecke (Nichtterminale) • Kanten • knotenverbindende Pfeile • eintretender Pfeil (Eingangskante) • austretender Pfeil (Ausgangskante) • Interpretation: Durchläuft man ein Syntaxdiagramm von der Eingangs- zur Ausgangskante entlang den Pfeilen, dann ist die Folge der Knoteninhalte, die dabei „aufgesammelt“ werden, aus dem Syntaxdiagramm ableitbar.
Programmiersprachen / Syntaxdiagramme Syntaktisch korrekt: Schlangen Delphine Schlangen Elephanten Pinguine Delphine Schlangen Elephanten Pinguine Affen Delphine Schlangen Elephanten Pinguine Elephanten Pinguine Delphine Syntaktisch nicht korrekt: Elephanten Delphine Schlangen Pinguine Schlangen Elephanten Affen Delphine Schlangen Pinguine Schlangen Delphine
Programmiersprachen / Syntaxdiagramme Definition: • Jedes Syntaxdiagramm (SD) besitzt eine Bezeichnung • Elemente eines Syntaxdiagramms sind Knoten (Ellipsen, Rechtecke) und Kanten (Pfeile) • Rechtecke enthalten die Bezeichnung eines (anderen) Syntaxdiagramms • Ellipsen enthalten Token • in jeden Knoten führt genau ein Pfeil hinein • aus jedem Knoten führt genau ein Pfeil hinaus • Pfeile dürfen sich aufspalten bzw. zusammengezogen werden • jedes SD besitzt genau eine eintretende Kante (kein Ausgangsknoten) • jedes SD besitzt genau eine austretende Kante (kein Eingangsknoten)
Programmiersprachen / Syntaxdiagramme S a b D D c Syntaktisch korrekt oder nicht ? • abababccc • ababcccabab • aba • ccccccc • abDc • bababac • ababcdcd • ABABABc
Programmiersprachen / Syntaxdiagramme S a S b Syntaktisch korrekt oder nicht ? • aSb • aab • aaabbb • abbbbbbb • aaabbbaaa L (S) = ?
Programmiersprachen / Syntaxdiagramme n i 2 L = {a (b c) d } | n ist natürliche Zahl oder Null; i ist natürliche Zahl}
Programmiersprachen / BNF Backus-Naur-Form: • Technik zur textuellen Darstellung kontextfreier Grammatiken • Verwendung von Ersetzungsregeln (Produktionen) • besitzen linke und rechte Seite • linke Seite: Nichtterminalsymbol • Nichtterminalsymbol: durch < > gekennzeichnet • Alternativen: durch | gekennzeichnet • e (Epsilon): leere Alternative EBNF: • Erweiterung der BNF (Abkürzungsmöglichkeiten) • [...] bedeutet: Symbole in Klammern können auch wegfallen • {...} bedeutet: Symbole in Klammern können beliebig oft wiederholt werden
Programmiersprachen / BNF BNF: <Zoo> ::= „Schlangen“ <Säugetiere-und-mehr> <Säugetiere-und-mehr> ::= <Säugetiere> „Pinguine“ <Säugetiere-und-mehr> | <Säugetiere> „Delphine“ <Säugetiere> ::= „Elephanten“ | „Affen“ | e
Programmiersprachen / BNF EBNF: <Zoo> ::= „Schlangen“ <Säugetiere> {„Pinguine“ <Säugetiere>} „Delphine“ <Säugetiere> ::= „Elephanten“ | „Affen“ | e
Problem Analyse Entwurf Implementierung Test Programm Programmentwicklung / Entwicklungsphasen D o k u m e n t a t i o n
Programmentwicklung / Entwicklungsphasen Analyse: • Untersuchung des Problems und des Problemumfelds • Diskussion mit anderen Personen • Fragestellungen / Tätigkeiten: • Problemstellung exakt und vollständig • gegebene Initialzustände und Eingabeparameter • gewünschte Endzustände und Ausgabewerte • Randbedingungen, Constraints Entwurf: • Entwicklung des Algorithmus • kreativer Prozeß (Auffassungsgabe, Intelligenz, Erfahrung) • Fragestellungen / Tätigkeiten: • existierende Lösungen für vergleichbare Probleme • allgemeinere Probleme • rekursive Aufteilung des Problems in Teilprobleme • Durchführung des Entwurfsprozeß für Teilprobleme • Zusammensetzen der Lösungen der Teilprobleme zur Lösung des Gesamtproblems
Programmentwicklung / Entwicklungsphasen Implementierung: • Übertragung des Entwurfs in eine Programmiersprache • Fragestellungen / Tätigkeiten: • Editieren • Compilieren Test: • Überprüfung des Programms auf logische und technische Fehler • man kann nur die Existenz von Fehlern nachweisen, nicht die Abwesenheit! • Fragestellungen / Tätigkeiten: • Korrektheit • Vollständigkeit • Debugging • Teststrategien: • andere Personen testen lassen • Testmengen konstruieren (Randfälle/Grenzwerte finden) • nach Fehlerbeseitigung erneut testen
Programmentwicklung / Entwicklungsphasen Dokumentation: • Exakte Problemstellung • Beschreibung der generellen Lösungsidee • Beschreibung des Algorithmus • Programmcode • Beschreibung der Testmengen • Protokolle der Testläufe • aufgetretene Probleme • alternative Lösungsansätze Weitere Tätigkeiten: • Effizienzverbesserung • Wartung • Portierung
Programmentwicklung / Entwicklungswerkzeuge Editore: Manipulation des Programmcodes Compiler: Transformation eines Quellprogramms in ein Zielprogramm Interpreter: inkrementelle Abarbeitung des Quellcodes Debugger: Erkennung von Laufzeitfehlern Dokumentationshilfen: Erstellung von Teilen der Dokumentation Laufzeitsystem: Hilfsprogramme bei der Programmausführung Programmbibliotheken: Sammlungen fertiggestellter Programme
Computer • Gerät zur automatischen Verarbeitung von Daten • Computer setzen sich zusammen aus • Hardware (physikalische Geräte; Zentraleinheit plus periphere Geräte) • Software (Programme) • Arbeitsweise:
Computer / Hardware Von-Neumann-Rechnerarchitektur:
Computer / Hardware Von-Neumann-Prinzipien: • Computer besteht aus fünf Funktionseinheiten • Unabhängigkeit von zu bearbeitenden Problemen • Steuerung mit Hilfe von Programmen • Programme und Daten werden im Speicher abgelegt • Binäre Codierung aller Daten • Unterteilung des Speichers in gleichgroße Zellen • aufeinanderfolgende Befehle in aufeinanderfolgenden Zellen • (sequentieller) Zugriff durch Steuerwerk (via Befehlsadresse) • Sprungbefehle • arithmetische Befehle (Addition, Multiplikation, ...) • logische Befehle (Negation, Konjunktion, Vergleiche, ...) • Transportbefehle • Schiebeoperationen • Ein-/Ausgabebefehle
Computer / Software • Betriebssystem: Menge aller Programme, die den Betrieb eines Computer bewältigt: • Prozeßverwaltung • Speicherverwaltung • Dateiverwaltung • Geräteverwaltung • ... • Festplatte: billiger Hintergrundspeicher • Dateien: logische Behälter zum Speichern von Daten • Verzeichnisse: Hilfsmittel für eine übersichtliche Strukturierung von Dateien • Window-System: Aufteilung des Bildschirm in unabhängige „Windows“ • Window-Manager: Verwalter von „Windows“ • Anlegen • Verschieben • Vergrößern • ...
Computer / Speicher • Speicher: Aufbewahrung von Programmen und Daten • 1 Bit: kleinstes Speicherelement (2 Zustände: 0 und 1) • 1 Byte: 8 Bit (2 Zustände) Speicherzelle • 1 Wort: 4 oder 8 Speicherzellen • mathematische Grundlage: Dualsystem • 2 anstelle von 10 Ziffern (Dezimalsystem) • Operationen (Addition, Multiplikation, ...) wie gewohnt • Umrechung: 8 18 : 2 = 9 R 0 9 : 2 = 4 R 1 4 : 2 = 2 R 0 2 : 2 = 1 R 0 1 : 2 = 0 R 1 1101 = 1*2 + 0*2 * 1*2 + 1*2 = 13 2 0 1 2 3 10
Aussagenlogik / Aussagen • Aussage (boolescher Ausdruck): • Satz, dem eindeutig ein Wahrheitswert wahr (true, T) oder falsch (false, F) zugeordnet werden kann • „Ein Tisch ist ein Möbelstück“ • „Geh nach Hause“ (keine Aussage) • Verknüpfung von Aussagen durch Operatoren: • Negation („!“) • Konjunktion („&&“) • Disjunktion („||“) • Wahrheitstafeln:
Aussagenlogik / Aussagen Syntax von Aussagen: • !P • P && Q • P || Q • P || (!Q) • (P || (!Q && P) • P || !Q && R • P || !(Q && R) • (P || Q) && R
Aussagenlogik / Eigenschaften von Aussagen • Kommutativgesetz • Assoziativgesetz • Distributivgesetz • Priorität: ( ! > && > || ) • Assoziativität: (!: rechts; &&, ||: links) • Tautologie: P || !P (immer true) • Widerspruch: P && !P (immer false)
Aussagenlogik / Eigenschaften von Aussagen zu zeigen: !P && !Q <=> !(P || Q)