mini|Niklaus Wirth (2009), der Entwickler von Pascal
Pascal ist eine Anfang der 1970er Jahre entwickelte imperative Programmiersprache.
Pascal wurde von Niklaus Wirth an der ETH Zürich als Lehrsprache eingeführt, um die strukturierte Programmierung zu lehren.Niklaus Wirth: The Programming Language Pascal. In: Acta Informatica. Band 1, 1971, S. 35–63, doi:10.1007/BF00264291.
Allgemeines Pascal ist eine Weiterentwicklung von Algol 60. Es lehnt sich in seiner Syntax an die englische Grammatik an. Dies soll die Lesbarkeit für Programmiereinsteiger verbessern; Pascal ist daher als Lehrsprache geeignet. Seine Verbreitung in der professionellen Programmierung fand es als Borland/Turbo Pascal, später Object Pascal. Jene sind, gegenüber dem Ur-Pascal, wesentlich erweiterte Versionen.
Ein wichtiges Konzept der Fehlersicherheit, das Wirth zur Anwendung brachte, ist die starke Typisierung (englisch „strong typing“): Variablen sind bereits zur Übersetzungszeit einem bestimmten Datentyp zugeordnet, und dieser kann nicht nachträglich verändert werden. Typenstrenge bedeutet, dass Wertzuweisungen ausschließlich unter Variablen gleichen Typs erlaubt sind. In Pascal gibt es von diesem strikten Zwang lediglich wenige Ausnahmen: Wertzuweisungen der Form [Variable vom Typ real] := [Wert vom Typ integer]. In Extended-Pascal Wertzuweisungen von ganzzahligen oder reellen Zahlen an Variablen vom Typ complex. Wertzuweisungen von eingeschränkten Wertebereichen eines ordinalen Typs. Beispiel: type int10 = 1 .. 10; Werte dieses Typs können dann Integervariablen zugewiesen werden. Wertzuweisungen von Mengen eines eingeschränkten Wertebereiches eines ordinalen Typs. Beispiel: type set10 = set of 1 .. 10; set20 = set of 1 .. 20; Werte des Typs set10 können dann Variablen des Typs set20 zugewiesen werden. Wertzuweisungen auf eingeschränkte Wertebereiche eines ordinalen Typs oder einer Menge. In diesem Fall rufen Werte bzw. Mengen-Elemente außerhalb des Zielbereichs einen Laufzeitfehler hervor. Wertzuweisungen zwischen unterschiedlichen String-Typen, inkl. char, Zeichen-Arrays gemäß Standard-Pascal und den verschiedenen String-Typen in Extended-Pascal, Borland Pascal usw. Sofern die Länge des Wertes nicht innerhalb der Kapazität des Ziels liegt, ergibt sich auch hier ein Laufzeitfehler.
Heute findet Pascal noch im universitären Bereich (Entwicklung/Ausbildung) und in sicherheitskritischen Bereichen (z. B. Verkehrstechnik, Energieversorgung, Medizintechnik, Raumfahrt, Militär, teilweise im Banken- und Versicherungswesen) Anwendung. Dies beruht hauptsächlich auf der guten Prüfbarkeit und Wartbarkeit des Codes und der klaren Zuordnung der Variablen. So war die 2005 eingeführte Betriebsleittechnik IV der 2011 stillgelegten Transrapid-Versuchsanlage Emsland in Pascal programmiert. Eine pascalähnliche Notation wurde in der Informatik und Mathematik zur Darstellung von Algorithmen benutzt. Aus didaktischen Gründen, es seien hier die Typstrenge, Fehlersicherheit und frei verfügbare portierbare Pascalcompiler (Free Pascal, GNU Pascal) genannt, wird im aktuellen Informatikunterricht Pascal ebenfalls noch eingesetzt. Im Hobby-Bereich erlangte Pascal zeitweilig eine weite Verbreitung.
Syntax Hallo Welt Ein Hallo-Welt-Programm sieht in Pascal folgendermaßen aus:
program Hallo(output); begin writeln('Hallo Welt') end.
In der Pascal-Version, die im 1973 erschienenen Revised Report beschrieben wird, sind die Textdateien input und output vordefinierte Programmparameter. Sie als Programmparameter aufzuführen ist (in dieser Pascal-Version jedenfalls) ausdrücklich verboten. Daher ist das folgende Programm äquivalent zum obigen. In Dialekten wie Delphi wird der Programmkopf (nahezu) ignoriert und kann komplett entfallen, falls er jedoch vorhanden ist, muss er syntaktisch korrekt sein.
program Hallo; begin writeln('Hallo Welt') end.
Ein Detail am Rande: In manchen alten Beispielen findet man ein readln nach dem writeln-Befehl. Das war nur notwendig, weil die I/O-Architektur der CDC Cyber 6000, auf der Wirth den ersten Pascal-Compiler entwickelte, das benötigte, um die internen Puffer zu leeren – sonst wäre im interaktiven Betrieb keine Ausgabe zu sehen gewesen. IDEs (integrierte Entwicklungsumgebungen) konnte man mit diesem readln zwingen, am Ende der Programmausführung nicht sofort wieder in den Editor-Modus umzuschalten, was die Ausgabe bei manchen IDEs (z. B. Turbo-Pascal) sonst hätte verschwinden lassen. Im Batch-Betrieb war das ohnehin nie notwendig.
Datentypen Standarddatenypen Datentyp Werte integer Ganze Zahlen, etwa 4, 0 oder -17 real Gleitkommazahlen, etwa 0.4 oder -17.74445 boolean die Werte true und false char ein einzelnes Zeichen, etwa a oder f Jeder Variablen muss in einer Variablendeklaration ein Datentyp zugeordnet werden. Der Datentyp bestimmt, welche möglichen Werte die Variable während des Programmablaufs speichern kann. In Pascal gibt es vier einfache Standardtypen, nämlich integer, real, boolean und char.
Die Längen der verschiedenen Datentypen außer boolean sind abhängig vom Compiler. Weiterhin haben viele Implementationen noch weitere vordefinierte einfache Datentypen.
Selbstdefinierte Datentypen In Pascal ist es möglich, neben den vier Standardtypen eigene einfache Datentypen zu definieren. Dabei handelt es sich entweder um Aufzählungstypen oder Ausschnittstypen. Um einen neuen Aufzählungstyp zu definieren, schreibt man alle Werte, die eine Variable dieses Typs speichern können soll, der Reihe nach auf. Im folgenden Beispiel wird ein neuer Typ mit dem Namen Besteck definiert: Besteck = (Gabel, Messer, Loeffel)
Einen Ausschnittstyp definiert man, wenn der Wertebereich eines umfassenderen Typs nicht voll ausgeschöpft wird. Wenn eine Variable beispielsweise nur die Zahlen zwischen 0 und 255 speichern können soll, so ist es möglich, den Datentyp integer auf diese Teilmenge einzuschränken. Im folgenden Beispiel wird ein neuer Typ mit dem Namen byte definiert: byte = 0 .. 255;
Strukturierte Datentypen Pascal bietet Programmierern vier strukturierte Datentypen, die es ermöglichen, mehrere Werte in einer Variablen zu speichern. In einem Feld (array) kann eine feste, also während der Laufzeit unveränderbare Anzahl von Werten gespeichert werden, die alle vom selben Datentyp sein müssen. Im folgenden Beispiel wird ein Feld definiert, in dem maximal 100 ganze Zahlen abgespeichert werden können: BeispielFeld = array [1..100] of integer;
In einer Menge (set) können ebenfalls Werte vom selben Datentyp gespeichert werden, allerdings wird nur festgehalten, welche Werte in der Menge enthalten sind, wobei es nicht darauf ankommt, wie oft ein einzelner Wert genannt wurde oder in welcher Reihenfolge die Werte genannt wurden. Ein Beispiel für die Definition einer Menge: BeispielMenge = set of 13..55;
In einem Verbund (record) kann eine feste Anzahl von Werten gespeichert werden, wobei die Werte von verschiedenem Datentyp sein dürfen. Ein Beispiel einer Definition:
Person = record Alter : 0..150; Haarfarbe : (braun, blond, schwarz); Groesse : real; kurzsichtig : boolean end;
Eine beliebig lange Folge von Werten desselben Typs kann in Pascal mithilfe des Datentyps file () dargestellt werden. Beispiel einer Definition: BeispielDatei = file of integer
Zeiger Hauptzweck der Verwendung von Zeigern ist in Pascal das Erstellen von verschiedenen Datenstrukturen, je nach den Vorstellungen des Programmierers. So lassen sich mithilfe von Zeigern etwa Listen und Bäume erstellen, die bei der Speicherung von Daten Vorteile gegenüber Feldern, Mengen, Verbünden und Dateien bieten. Ein weiterer Vorteil von Zeigern ist, dass Zeigervariablen den von ihnen benötigten Speicherplatz während der Laufzeit anfordern können. Der Programmierer muss also nicht schon im Vorhinein definieren, wie viel Platz die Variablen seines Programms bei der Ausführung benötigen werden und kann grundsätzlich vom Minimum ausgehen, über das, je nach Bedarfsfall, hinaus erweitert wird.
Programmstrukturen Charakteristisch für Pascal ist das Konzept der Verschachtelung von Prozeduren und Funktionen. Im Deklarationsteil einer Prozedur oder Funktion können andere Prozeduren und Funktionen definiert werden, die außerhalb nicht sichtbar sind. Beispiel:
program HalloWelt; procedure foo; procedure bar; begin writeln('Hallo Welt'); end; begin bar end; begin foo; (* kein Compilerfehler *) bar (* Compilerfehler, da bar nicht sichtbar *) end.
Kontrollstrukturen Bedingte Anweisung und Verzweigung Als bedingte Anweisungen und Verzweigungen stehen in Pascal die if- und die case-Anweisung zur Verfügung. Ein Beispiel einer if-Verzweigung:
if 1 = 2 then writeln ('wird nicht ausgeführt') else if 1 = 1 then writeln ('wird ausgeführt') else writeln ('wird nicht ausgeführt');
Schleifen Pascal bietet drei Arten von Schleifen. Soll vor jedem Schleifendurchlauf eine Abbruchbedingung geprüft werden, verwendet man die while-Anweisung, für eine Prüfung nach jedem Durchlauf die repeat-Anweisung. Für eine vorgegebene Anzahl von Durchläufen gibt es die for-Anweisung.
while wert < 100 do wert := wert + 1;
for i:= 1 to 100 do wert := wert + 1;
repeat wert := wert + 1 until wert > 100;
Die with-Anweisung ist keine Schleife, sie vereinfacht nur die Zugriffe auf Komponenten eines Record.
Sprunganweisungen können mit goto auch verwendet werden, dessen Gebrauch jedoch umstritten ist (siehe Artikel zu Sprunganweisungen).
Compiler Pascal-Compiler sind überwiegend Single-Pass-Compiler, d. h. die Quelle wird nur ein einziges Mal gelesen und analysiert. Das Design der Sprache war so gehalten, um genau das zu ermöglichen. Bei der damaligen geringen Geschwindigkeit der Rechner Anfang der 1970er Jahre war dies ein großer Vorteil.
Der erste Pascal-Compiler entstand auf der CDC Cyber 6000 der ETH Zürich. Daraus entstand dann Pascal 6000, das als erste operative Version eines Compilers der Sprache gesehen werden kann.
Ein zweiter Pascal-Compiler – der P4 „Portable Pascal Compiler“ von Urs Ammann, Kesav Nori und Christian Jacobi – stammte ebenfalls von der ETH Zürich. Der P4 erzeugte eine plattformunabhängige, als Assemblersprache ausgelegte Zwischensprache, den P-Code, der durch eine virtuelle Maschine (ein Programm) interpretiert wird. Später entstanden dann Compiler, die auf dem P4 basierten. Die verbreitetste Version wurde unter dem Namen UCSD Pascal bekannt, das auf vielen Systemen implementiert wurde, u. a. auf Apple II und Texas Instruments TI-99/4A und wesentlich zur Verbreitung der Sprache sowohl (zuerst) in den Vereinigten Staaten, später auch in Europa beitrug. Im Mai 2006 wurden die Quelltexte von Version II.0 freigegeben.
Besonderheiten Sehr hohe Prozesssicherheit
Da Pascal sowie der Quasi-Standard Borland/Turbo-Pascal eine strikte Trennung unterschiedlicher Typen vorsehen und die Zuweisungskompatibilität von Ausdrücken beachten, kommen implizite Typumwandlungen, anders als in C, praktisch nicht vor. Insbesondere bei der Übergabe von Daten (z. B. aus externen Dateien, aber auch innerhalb des Programms) an Funktionen oder Prozeduren kann der Compiler schon beim Kompilieren die Korrektheit der Typen kontrollieren.
Keine nullterminierten Zeichenketten