Die Backus-Naur-Form
Die Backus-Naur-Form (kurz BNF) ist eine formale Metasprache (aus dem Griechischen „meta“ [über] – „Sprache über Sprache“) zur Darstellung von Grammatiken und Syntaxregeln von Programmiersprachen. I.d.R. - und im Rahmen dieser Vorlesung - wird die Erweiterte Backus-Naur-Form (EBNF) verwendet.
Formale Grammatiken
Syntax
Sprache
Ermöglichen die Beschreibung und Analyse von Sprachen (u.a. Programmiersprachen) sowie die Definition einer Syntax.
Die bestimmte Menge von erlaubten Zeichenketten, die aus einem Zeichenvorrat zusammengesetzt werden können.
Alle Wörter, die eine Grammatik erzeugen können, nennt man deren Sprache.
Eine Grammatik G besteht aus 4 Teilen (V, E, R, S)
Eine endliche Menge V von Variablen (oder Nichtterminalsymbole), die ersetzt werden können. Variablen werden als „Platzhalter“ benutzt.
Eine Menge E von Endsymbolen (oder Terminalsymbole), die nicht mehr ersetzt werden können. E wird auch als Alphabet bezeichnet.
Eine Menge R von (Produktions-)Regeln, für die Ersetzung von Variablen.
Die Startvariable S, für den Ableitungsvorgang
Ableitungsvorgang
Mit einem Ableitungsvorgang lassen sich ausgehend von der Startvariable (S) Produktionsregeln (R) anwenden, die neue Zeichenfolgen erzeugen, welche wiederum weiter ersetzt werden können.
Zeichenfolgen werden als Worte bezeichnet, wobei „Wort“ eine breitere Bedeutung als in der natürlichen Sprache hat (kann z.B. „Satz“ oder „Programm“ umfassen).
Der Algorithmus, durch den aus einer Grammatik Wörter erzeugt werden können, lautet
1. Beginne mit Startvariable S
2. Ersetze eine Variable im aktuellen Wort mit Hilfe einer Regel aus R
3. Enthält das aktuelle Wort noch Variablen, wiederhole Schritt 2
Die Chomsky-Hierarchie

Compiler

Lexikalische Analyse
Syntaktische Analyse
Semantische Analyse
--> Ob Variablen deklariert und initialisiert werden, bevor sie überhaupt benutzt werden.
--> Es kann nicht mehrere Variablen geben, die den gleichen Namen haben (Ambiguität).
Codeoptimierung und Codegenerierung
Zwischencode wird erzeugt
Erzeugter Zwischencode wird optimiert
Objektdateien werden erzeugt
Interpreter
Ein Interpreter ist ein Programm, welches Quellcode im Gegensatz zu Compilern nicht in eine auf dem System direkt ausführbare Datei umwandelt, sondern den Code einliest, analysiert und ausführt.
Vorteil: Unabhängigkeit von Betriebssystem und Hardwarearchitektur.
Nachteil: Langsamere Ausführung im Vergleich zu kompilierten Programmen.
Programmiersprachen – Klassifizierung

Wirkung
Die Zustände, in denen sich ein Programm befinden kann, werden durch die Werte seiner Variablen bestimmt. Die Werte aller Variablen eines Programms definieren den globalen Zustand. Die Wirkung (side effect) eines Programms bezeichnet die Veränderung des Zustands, in dem sich eine abstrakte Maschine befindet. Ein Programm hat eine Wirkung, wenn sich mehr als dessen return statement ändert.
referenzielle Transparenz
Die referenzielle Transparenz besagt, dass der Wert eines Ausdrucks ausgetauscht werden kann, ohne das Programm zu verändern. Voraussetzung dafür ist, dass:
• der Wert eines Ausdrucks in einem Quelltext nur von seiner Umgebung abhängt und nicht vom Zeitpunkt seiner Auswertung und
• der Ausdruck keine Wirkung hat.
Bei zustandsfreien Programmiersprachen:
es existiert kein globaler Zustand.
--> Dadurch führen gleiche Eingaben immer zu gleichen Ausgaben.
--> Daten werden lokal erzeugt, aber Programme haben keine Wirkung (side effects)
Bei zustandsbehafteten Programmiersprachen:
--> Wirken auf den Zustand der Maschine (z.B. Verändern von Inhalten des Speichers).
--> Daten werden erzeugt und global/dauerhaft verändert.
Bei imperativen Programmiersprachen
--> Die Imperative Programmierung ist die Grundlage der meisten Programmiersprachen (inkl. Assemblersprache).
Bei deklarativen Programmiersprachen
Funktionale Programmierung
Vorteile funktionaler Programmierung
Nachteile funktionaler Programmierung
Logische Programmierung
Basiert auf der Prädikatenlogik
Logische Programmierung
Ein Programm besteht aus:
Ein Interpreter wird befragt und berechnet eine Lösungsaussage aus den Axiomen und den Schlussregeln.
Einsatzgebiete:
Imperatives Paradigma:
Prozedurales-modulares Paradigma:
--> Algorithmen in überschaubare Teile zu zerlegen
--> den Quellcode universeller und wiederverwendbar zu machen
Objektorientierte Programmierung
Die Objektorientierung (OO) dient der Beschreibung von Problemumgebungen, bei der einzelne Komponenten durch Objekte modelliert werden. Zu deren Beschreibung werden nicht nur deren Eigenschaften (Attribute) herangezogen, sondern auch die zugehörigen Verhalten/Fähigkeiten (Methoden).
Vorteile der Objektorientierung
• Intuitive Modellierung von Problemen aus der realen Welt. Abstraktionskonzepte der OO sind der Realität nachempfunden (Klassen, Objekte/Ausprägungen, Vererbung, Nachrichtenaustausch)
• Durch Datenkapselung:
• ist Software modularer und gut wiederverwendbar
• wird die Gültigkeit von Variablen klarer
• wird Klarheit geschaffen wenn vieles in Programmen parallel laufen muss (z.B. Logik und grafische Benutzeroberfläche)
• Geeignet für große Softwareprojekte
Objektorientierte Programmierung – Vor- und Nachteile

Objektorientierte Programmierung

Einsatzbereiche der Programmiersprache JAVA

JAVA Vor- und Nachteile

Einsatzbereiche der Programmiersprache C++

C++ Vor- und Nachteile
