Pascal

Lesezeit: 11 Minuten

Pascal ist eine kompilierte, statisch typisierte Programmiersprache, die seit Anfang der 1970er Jahre von dem schweizer Informatiker Niklaus Wirth entwickelt wurde. Der Name wurde als Tribut an den französischen Mathematiker, Physiker und Philosophen Blaise Pascal gewählt.

Die Sprache Pascal wurde als ISO 7185:1990 (Standard Pascal) und ISO/IEC 10206:1991 (Extended Pascal) standardisiert. Im Laufe der Zeit sind verschiedene Varianten bzw. Erweiterungen von Pascal entstanden, die sich aber nicht vollständig an die Standards halten (bzw. zum Teil auch schon zeitlich davor erschienen sind). Lisa Pascal und Mac Pascal sind Implementierungen von Apple, die erstere für den Apple Lisa, einen der ersten PCs. Eine Spracherweiterung namens Object Pascal wurde in Zusammenarbeit mit Wirth konzipiert und zum Teil von Lisa Pascal und Mac Pascal gemacht.

Der in den 1980er Jahren von Anders Hejlsberg entwickelte Blue Label Pascal Compiler wurde später von Borland akquitiert und zu Turbo Pascal umbenannt. Turbo Pascal wurde später um Object Pascal erweitert. 1995 entwickelte Hejlsberg Delphi als Nachfolger von Turbo Pascal, welches wiederum als Dialekt von Object Pascal verstanden werden kann.

Weitere bekannte Pascal Compiler, die noch aktiv gepflegt werden, sind der in Object Pascal geschriebene Free Pascal Compiler (FPC) mit Unterstützung für Turbo Pascal, Mac Pascal und Delphi, und der GNU Pascal Compiler (GPC) mit eingeschränkter Unterstützung für Turbo Pascal.

Alleinstellungsmerkmale

Pascal war ursprünglich als Lehrsprache konzipiert. Aufgrund der mitgelieferten IDE, sehr schneller Kompilierzeiten und geschicktem Marketing hat Turbo Pascal in den 1980er Jahren sehr schnell an Popularität gewonnen. Seit Mitte der 1990er Jahre gibt es Delphi als einen populären Vertreter des Rapid Application Developments (RAD). Zu der Zeit, wo das Wasserfallmodell noch die Norm war, ermöglichte RAD ein sehr schnelles Prototyping.

Heute bietet Pascal keine wesentlichen Alleinstellungsmerkmale mehr. Als eine sehr schnelle, kompilierte, statisch typisierte Sprache kann es am besten mit C und C++ verglichen werden und differenziert sich von diesen beiden Sprachen vor allem durch seine sehr leicht lesbare Syntax.

Einsatzbereiche

Pascal wird bevorzugt in Bereichen wie dem Militär, der Raumfahrt, Medizintechnik, Energieversorgung und Verkehrstechnik eingesetzt, wo Sicherheit einen sehr hohen Stellenwert hat. Beispielsweise ist die Betriebsleittechnik der Transrapid-Versuchsanlage Emsland in Pascal geschrieben.

In den 1980er Jahren war Pascal weit verbreitet und unter anderem die primär verwendete Sprache auf den PCs Apple II und Apple III. Auch frühere Versionen von Adobe Photoshop und des Skype-Clients sind in Pascal geschrieben (letzteres in Delphi).

Ein heute immer noch sehr populäres in Object Pascal geschriebenes Programm ist der Total Commander. Weitere in Pascal geschriebene Programme sind Beyond Compare, Cheat Engine, FL Studio, HeidiSQL und Uber Chess. Darüber hinaus sind auch einige Spiele in Pascal geschrieben, unter anderem die ersten beiden Teile von Age of Wonders.

Pros

Pascal ist eine leicht zu erlernende Sprache mit einer gut lesbaren Syntax. Als eine kompilierte Sprache ist Pascal ähnlich schnell wie C und bietet eine gute Assembler-Integration für weitere Performanceoptimierungen.

Sprach-Features von Pascal, die ich interessant finde, sind Enums, Sets und eingeschränkte Wertebereiche. Der folgende Code verdeutlicht deren Verwendung:

program hello;
uses crt, sysutils;

type
    Farbe = (rot, gelb, blau);
    Monat = 1..12;
    Buchstaben = set of 'A'..'F';

var
    m: Monat;
    f: Farbe;
    buchstabe: char;
begin
    m := 12;
    f := rot;
    if f = rot then
    begin
        writeln(inttostr(m));
        writeln(f);
        for buchstabe in Buchstaben do
        begin
            write(buchstabe);
        end;
    end;

    {* Der Code gibt folgendes aus:
       12
       rot
      ABCDEF
    *}

end.

Farbe ist ein Enum mit den Ausprägungen rot, gelb und blau. Die Werte können wie Strings auf stdout ausgegeben und ohne Präfix referenziert werden. Statt als f := Farbe.rot kann also f mit f := rot direkt der Wert „rot“ zugewiesen werden.

Monat ist eine Teilmenge des Integer-Datentypes, der nur Werte von 1 bis 12 erlaubt. Versucht man, m beispielsweise den Wert 13 zuzuweisen, dann resultiert dies in einem Kompilierfehler.

Buchstaben ist ein Set, das die Buchstaben A bis F als Datentyp char enthält. Mit der in-Klausel kann über das Set iteriert werden, oder in einer Bedingung geprüft werden, ob ein Wert im Set enthalten ist.

Cons

Pascal ist eine sehr geschwätzige Sprache. Statt Klammern oder Einrückungen wird ein Block über die Statements begin und end definiert. In Sprachen wie C, Go oder Java wird der Beginn eines Blockes typischerweise in der gleichen Zeile eingeleitet wie z.B. der Schleifen- oder Methodenkopf. In Pascal besteht ein If-Else-Block bereits aus sechs Zeilen zusätzlich zu den eigentlichen Block-Inhalten. Verschachtelungen können dadurch sehr unübersichtlich werden und Funktionen/Prozeduren passen schnell nicht mehr auf eine Bildschirmseite.

Mit Object Pascal ist die Verwendung von Klassen möglich. Sämtliche Felder und Funktionen/Prozeduren einer Klasse müssen als Typ deklariert werden, und werden dann zusätzlich noch implementiert. Der folgende Code verdeutlicht dies:

program hello;
uses crt;

{$MODE OBJFPC}

type HelloWorld = class
    public
        procedure foo();
	    procedure bar();
	    procedure foobar();

procedure HelloWorld.foo();
begin
    writeln('foo');
end;    

procedure HelloWorld.bar();
begin
    writeln('bar');
end;    

procedure HelloWorld.foobar();
begin
    writeln('foobar');
end;
    
end.

Da jede weitere Prozedur/Funktion signifikanten Boilerplate-Code erzeugt, verleitet die doppelte Deklaration meiner Meinung dazu, eher wenige lange und schwer lesbare Prozeduren/Funktionen zu schreiben, als den Inhalt möglichst überschaubar zu halten und schwer lesbare Statements in sprechende Prozeduren/Funktionen auszulagern, wodurch der Code dann sehr technisch wird. Das wiederum führt zu mehr Kommentaren, die erläutern, was der Code eigentlich tut – und wie wir alle wissen ist sich selbst erklärender Code immer besser, als Code mit Kommentaren erklären zu müssen.

Pascal ist eine case-insensitive Sprache, was mir persönlich sehr missfällt. Während es in vielen Sprachen möglich ist foo = new Foo() zu schreiben, muss in Pascal für die Variable ein anderer Name verwendet werden, um Eindeutigkeit zu schaffen, also z.B. myFoo = new Foo(). Die case-insensitive Syntax führt außerdem zu uneinheitlichen Schreibweisen. In vielen Sprachen ist es üblich, dass Klassen mit einem Großbuchstaben beginnen, während Variablen und Methoden mit einem Kleinbuchstaben anfangen. In Pascal gibt es keinen Standard und in vielen Beispielen zur Verwendung von Bibliotheken beginnen sowohl Felder als auch Prozeduren/Funktionen mit einem Großbuchstaben.

Aus lehrender Sicht finde ich die Differenzierung zwischen Prozeduren und Funktionen sinnvoll. Aus praktischer Sicht ist sie aber mehr im Weg als dass sie einen Mehrwert bietet und führt zu eigenartigen Konstruktionen. Prozeduren unterscheiden sich von Funktionen darin, dass sie keinen Rückgabewert haben. Legt man Wert auf pure functions, sollten Funktionen möglichst keine Seiteneffekte aufweisen.

In der Praxis führt dies dazu, dass z.B. vier Integer-Variablen deklariert werden müssen, um über die Prozedur GetDate() des Free Pascal Compilers das aktuelle Jahr zu beziehen. Die Prozedur erwartet vier Integers für den Monat, das Jahr, den Tag des Monats und den Tag der Woche und füllt diese Argumente dann (Seiteneffekt). Wenn mich die anderen Informationen nicht interessieren, führt dies zu mehr Code als nötig, der dann vom Wesentlichen ablenkt und mehr Wartung erfordert, denn es muss natürlich sichergestellt sein, dass die zusätzlichen Variablen nicht zu Programmfehlern führen können.

Zu weiterem Boilerplate-Code führt die strikte Typisierung. In Java beispielsweise können alle Objekte und auch primitive Datentypen in einem String konkateniert werden. In Pascal führt dies zu Kompilierfehlern. Um z.B. einen Integer in einem String auszugeben, muss eine entsprechende String-Formatierungsfunktion oder die Funktion IntToStr() verwendet werden. Pascal kennt übrigens keine mehrzeiligen Zeichenketten. Der Typ string, ein array of char, hält maximal 255 Zeichen. Um beliebig lange Strings abzubilden, kann stattdessen der Typ AnsiString verwendet werden.

Pascal verwendet als Zuweisungsoperator := was mathematisch sauberer ist als der Operator = aber vor allem auch bedeutet, dass man jedes Mal zwei Zeichen für den Zuweisungsoperator eingeben muss. Bei vielen Tastaturlayouts sind das zwei Mal zwei Tasten, wenn beide Zeichen nur bei gedrückter Shift-Taste erzeugt werden können.

Als Rückgabewert in Funktionen dient der Name der Funktion selbst. Für eine Funktion namens getAbsoluteDatabaseFilename() mit einer Zeile Code bedeutet dies, dass diese Zeile eine Zuweisung der implizit vorhandenen Variable getAbsoluteDatabaseFilename ist. In einigen Pascal-Dialekten existiert außerdem eine implizite Variable result, die stattdessen verwendet werden kann.

Pascal erfordert, dass jede Anweisung mit einem Semikolon beendet wird. Allerdings ist dies in manchen Situationen nicht erforderlich, wie z.B. in der letzten Anweisung einer Prozedur/Funktion. Es gibt auch Situationen, in denen ein Semikolon zu einem Kompilierfehler führt, z.B. in einer Anweisung unmittelbar vor dem Schlüsselwort else.

Deklarationen befinden sich in Pascal außerhalb des Bodies. In einer Prozedur/Funktion wird der Body durch die Statements begin und end begrenzt. Möchte man lokale Variablen für diese Prozedur/Funktion deklarieren, so muss man dies in einem separaten Bereich mit dem Schlüsselwort var oberhalb dieses Bodies tun. Auch Variablen wie Zähler in einer For-Schleife müssen in diesem Bereich deklariert werden. Den Grundsatz, Variablen erst dann zu deklarieren, wenn man sie auch benötigt, kann man in Pascal nicht befolgen.

Pascal bietet keine nativen Collections abseits von Arrays und Sets. Arrays haben entweder eine feste Länge, oder die Länge muss mit SetLength() explizit gesetzt werden. Für dynamische Arrays, deren Größe zu Beginn nicht feststeht, etwa weil sie zum Einlesen von externen Daten verwendet werden, muss darauf geachtet werden, die Größe dynamisch anzupassen, damit es nicht zu einer EAccessViolation kommt. Assoziative Arrays (Maps) gibt es im Standard-Pascal nicht.

Die verschiedenen Pascal-Compiler sind untereinander nicht kompatibel. Viele Funktionen der Standard-Bibliotheken sind Compiler-spezifisch.

Genau wie C hat Pascal keine automatische Speicherbereinigung. Dadurch können Pascal-Programme extrem schnell sein, es erhöht sich aber auch die Gefahr von Programmfehlern und im speziellen Memory Leaks.

Datenblatt

NamePascal
Webseite
Erscheinungsjahr1970
Aktuellste Version (Stand 10. Oktober 2021)Pascal wird nicht versioniert, aber es gibt zwei ISO-Standards aus den Jahren 1990 und 1991.

ISO/IEC 7185:1990 (ISO-Standard von „Standard Pascal“)
ISO/IEC 10206:1990 Extended Pascal (wird z.B. von Free Pascal zum Zeitpunkt dieses Artikels noch nicht unterstützt)
Typisierungstatisch
Paradigmenimperativ
prozedural
objektorientiert
ProsCons
leicht zu erlernen mit gut lesbarer Syntaxsehr verbose Syntax
sehr schnell und speichereffizientcase-insensitive
Mächtige Assembler-IntegrationDifferenzierung von Prozeduren und Funktionen
Enums, Sets und Typen mit eingeschränktem Wertebereichstrikte Typisierung, z.B. auch bei der String-Konkatenierung
keine mehrzeiligen Strings
Zuweisungsoperator besteht aus zwei Zeichen
eigentümliche Behandlung von Rückgabewerten
Variablen werden in einem getrennten Bereich deklariert
keine nativen Datentyp für Maps, Größenmanagement für dynamische Arrays erforderlich
Pascal-Compiler untereinander nicht kompatibel, viele Compiler-spezifische Bibliotheken
manuelle Speicherverwaltung

virtuallet

virtuallet ist ein kleines Programm von mir, welches ich in diversen Programmiersprachen implementiert habe. Hier geht es direkt zum Pascal-Code von virtuallet auf GitLab. Hier gibt es weitere Infos zu virtuallet.

- Webseite von Free Pascal