Pascal (Programmiersprache)

Pascal (Programmiersprache)
Pascal
Paradigmen: imperativ, strukturiert
Erscheinungsjahr: 1972
Entwickler: Niklaus Wirth
Typisierung: stark, statisch
Dialekte: UCSD-Pascal, Borland Turbo Pascal
Einflüsse: ALGOL
Beeinflusste: Modula-2, Ada, Oberon, Delphi, WEB

Die Programmiersprache Pascal (benannt nach Blaise Pascal) wurde von Niklaus Wirth an der ETH Zürich 1972 als Lehrsprache eingeführt, um die strukturierte Programmierung zu etablieren.

Inhaltsverzeichnis

Allgemeines zur Sprache

Pascal ist eine Weiterentwicklung von Algol 60. Als Lehrsprache wurde es so einfach und strukturiert wie möglich gestaltet. Ihre große Verbreitung in der professionellen Programmierung fand es als Borland/Turbo Pascal (später Delphi) – gegenüber dem Ur-Pascal wesentlich erweiterte und verbesserte Versionen.

Pascal zeichnet sich durch eine strikte und einfach verständliche Syntax sowie durch den Verzicht auf kontextabhängige Interpretationen des Codes aus. Somit erlaubt Pascal im Vergleich zu Sprachen wie C und Fortran eine gute Lesbarkeit und, verglichen mit den damaligen Versionen von Fortran, auch eine bessere Unterstützung von strukturierter Programmierung.

Ein wichtiges Konzept, das Wirth zur Anwendung brachte, ist die starke Typisierung (engl. "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 Type 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 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 ist die 2005 eingeführte Betriebsleittechnik IV der Transrapid-Versuchsanlage Emsland in Pascal programmiert. Eine pascalähnliche Notation wird von jeher in der Informatik und Mathematik zur Darstellung von Algorithmen benutzt. Aus didaktischen Gründen, es seien hier die Typstrenge, hohe Fehlersicherheit und frei verfügbare portierbare Pascalcompiler (Free Pascal, GNU Pascal) genannt, wird im aktuellen Informatikunterricht Pascal ebenfalls häufig eingesetzt. Im Hobby-Bereich erlangte Pascal zeitweilig eine sehr weite Verbreitung, die jedoch mit neueren Microsoft-Windows-Versionen wieder zurückging.

Datentypen

Pascal kennt als einfache Datentypen char, boolean, integer, real und ordinale Datentypen. In einigen Dialekten wurden die einfachen numerischen Datentypen erweitert, um passende Wortlängen abzudecken. Strukturierte Datentypen sind array, record, set (Mengen) und file. Der Datentyp text entspricht der Definition type text = file of char;

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 auftauchen. Dabei gibt es klar verständliche Prinzipien über die Sichtbarkeit von Deklarationen in übergeordneten Funktionen und Prozeduren.

Steuerkonstrukte

Steuerkonstrukte sind if then else, case (in Dialekten mit einem else oder otherwise versehen), for, repeat, while und goto. Da Pascal der strukturierten Programmierung dient, soll das goto lediglich strukturerhöhend eingesetzt werden. Pascal unterstützt in seiner Urform keine Anweisungen, mit denen Prozeduren oder Schleifen hart verlassen werden können. Als strukturerhöhendes goto werden Sprünge ans Ende von Prozeduren oder unmittelbar hinter Schleifenenden akzeptiert, sofern sich dadurch umfangreiche Konstruktionen schlecht lesbarer if-Anweisungen oder undurchschaubarer boolescher Ausdrucke vermeiden lassen. Viele Pascal-Compiler erlauben keine goto, die zu instabilen Systemzuständen führen, z. B. der Sprung in den Anweisungsblock einer Schleife oder eines if.

Nachteile

Da die Sprache als Lehrsprache konzipiert war, wies das Standard-Pascal einige Merkmale auf, die den kommerziellen Einsatz erschwerten: Das Konzept für Dateizugriffe („file I/O“) war nicht mächtig, die Laufzeitbibliothek wenig umfangreich, und Zeichenketten konnten nur über Umwege (packed array) direkt im Code verwendet werden. Das führte dazu, dass praktisch jede kommerzielle Implementierung hierzu eigene Lösungen anbot, was zunächst (ähnlich wie die Diversifizierung bei C) zu eigenen Pascal-Dialekten und damit zu Kompatibilitätsproblemen führte. Mit der monopolartigen Dominanz der Borland Turbo-Pascal-Produkte verschwanden diese Unterschiede fast vollständig.

Ein anderer wesentlicher Nachteil war, dass eine Modularisierung im Sinne getrennter Compilierung nicht vorgesehen war – was mit der Weiterentwicklung Modula-2 geändert wurde. Plattformspezifische Implementierungen sahen dafür eigene Lösungen vor (z. B. die Units von Turbo-Pascal, oder später die Module in ANSI/ISO Extended Pascal).

Compiler

Der erste Pascal-Compiler selbst 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 sogenannte 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 UCSD Pascal freigegeben.

Bei den meisten Pascal-Compilern handelte es sich um Single-Pass-Compiler, d. h. der Compiler muss die Quelle nur ein einziges Mal lesen und analysieren. Das Design der Sprache war so gehalten, um genau das zu ermöglichen. Bei der damaligen geringen Geschwindigkeit der Rechner war dies ein großer Vorteil.

Unterschiede zu C

  • Sehr hohe Prozesssicherheit – Da Pascal sowie der Quasi-Standard Borland/Turbo-Pascal eine strikte Trennung unterschiedlicher Typen vorsehen, kommen „versteckte/automatische“ 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 Compilieren die Korrektheit der Typen kontrollieren (gleiches gilt für Array-Grenzen, Integer-Überlauf, Wrap-Around-Fehler, Stack-Überlauf u. ä., die in anderen Programmiersprachen wie z. B. C/C++ häufig subtile und schwer zu lokalisierende (Laufzeit-)Fehler erzeugen).
  • keine nullterminierten Zeichenketten – Standard Pascal hatte zwar Zeichenketten-Literale, aber keinen Typ string (s. oben). In einigen späteren Versionen werden Zeichenketten nicht durch ein Null-Byte terminiert, sondern es wird die Länge im ersten Byte String[0]) gespeichert und über die Funktion length(<Bezeichner>) abgefragt. Somit beginnt das erste Nutzzeichen bei String[1]. Dies hatte eine sehr schnelle Verarbeitung (deutlich schneller als in Borland/GNU C/C++) zur Folge, aber auch den Nachteil, dass Zeichenketten nicht beliebig lang sein konnten. In vielen Implementierungen (z. B. Turbo Pascal) war für die Speicherung der Zeichenkettenlänge ein Byte vorgesehen, so dass die Länge auf 255 Zeichen begrenzt ist. Größere Zeichenketten mussten selbst definiert werden (z. B. als Array of char), sofern sie nicht (wie z. B. in Borland Pascal 7) durch die Compilerhersteller bereits implementiert wurden. Im Extended Pascal-Standard wurden Zeichenketten als Scheme-Typ definiert. Auch hier muss die Kapazität angegeben werden, sie wird aber in runde Klammern geschrieben, und es gibt keine formale Längenbeschränkung: String(10240).
  • strikte Trennung zwischen Funktionen und Prozeduren – Pascal trennt strikt zwischen einer Funktion (Rückgabewert) und einer Prozedur (kein Rückgabewert, Typ void in C). Eine Funktion darf nicht als Prozedur aufgerufen werden – d. h. der Rückgabewert muss stets entgegengenommen werden. Seit Turbo Pascal 4.0 (1991) ist dies jedoch möglich: Funktionen können auch ohne Entgegennahme des Funktionsergebnisses aufgerufen werden.
  • Deklarationen – Variablen und Typdefinitionen dürfen nicht innerhalb der Implementierung einer Funktion/Prozedur (zwischen BEGIN und END) deklariert werden – dies muss in einem speziellen Block im Definitionsteil geschehen. Anders als C erlaubt Pascal die Deklarationen lokaler Funktionen bzw. Prozeduren, sog. „nested Functions“, was die Erweiterung des Sprachumfanges durch den Benutzer erheblich vereinfacht.
  • Bezeichner – In Pascal ist die Groß-/Kleinschreibung bei Bezeichnern (Typen, Konstanten, Variablen, Funktionen/Prozeduren) irrelevant. Programmfehler durch Tippfehler z. B. Max statt MAX werden dadurch vermieden.
  • Semikolon – Das Semikolon wird nicht wie in C als Befehlsabschluss interpretiert, sondern als Trennzeichen zwischen Anweisungen. Vor einem END oder UNTIL kann es somit weggelassen werden. Vor einem ELSE darf es in der Regel gar nicht stehen, da sonst der IF-Zweig als abgeschlossen angesehen werden würde. Ein Fall, bei dem es vor dem ELSE steht (und stehen muss), ist am Ende einer CASE-Auflistung.
  • Delimiter – Für Zeichenketten-Literale und Zeichen-Literale wird dasselbe Begrenzungszeichen (Delimiter), nämlich der Apostroph, verwendet.
  • Zuweisungen – Zuweisungen an Variablen werden durch die Sequenz := definiert, das Gleichheitszeichen allein dient dem Vergleich. Damit werden „mathematisch falsche“ Ausdrücke z. B. i = i + 1 vermieden.
  • Operatoren – Pascal verwendet die Operatoren and, or, not, div (nur für Integer, bei Real ist es /), mod und <> anstatt der C-Operatoren &&, ||, !, /, % und !=. Die „Short Circuit“-Funktionalität von && und || in C (sobald das Ergebnis feststeht, nämlich wenn der linke Teil beim and FALSE beziehungsweise beim or TRUE ist, wird der rechte nicht mehr ausgewertet) schloss N. Wirth explizit aus, da compilerinterne Optimierungsvorgänge die Reihenfolge der Auswertung verändern können. Spätere Pascalversionen implementierten eine lokal oder global zuschaltbare „Short Circuit“-Funktionalität, so dass der Programmierer im Einzelfall entscheiden kann, welche Art der Auswertung er wünscht. In Standard-Pascal gibt es keine Bitoperationen für Integer (wie &, |, ^ und ~ von C), aber stattdessen den Typ set of (mit den Operatoren *, + und - für Durchschnitt, Vereinigung und Mengendifferenz).
  • strenge Typentrennung – u. a. ist Char nicht austauschbar mit Integer, die Umwandlung muss mit den Funktionen ord() und chr() durchgeführt werden. Dadurch werden verdeckte (oder ungewollte) Umwandlungen vermieden z. B. führt die Anweisung i = 7/2 zu einer Fehlermeldung, wenn i vom Typ Integer = Ganzzahl ist da 7/2 = 3.5 keine Ganzzahl ist. Spätere Pascalversionen (z. B. Turbo Pascal) führten zusätzlich „explizite“ Typumwandlungen, sog. „type casts“, ein, so dass z. B. mit longint(i) der Wertebereich der Ganzzahlvariablen i erweitert oder eingeschränkt werden konnte. In Standard-Pascal musste dafür ein Umweg über (den Missbrauch von) Variantenrecords (union in C) genommen werden.

Standards

Es gibt drei Standards, die sich auf Pascal beziehen:

  1. Standard Pascal: ANSI/IEEE770X3.97-1993 oder ISO 7185:1990;
  2. Extended Pascal: ANSI/IEEE770X3.160-1989 oder ISO/IEC 10206:1991;
  3. sowie einen Entwurf zu „Object-Oriented Extensions to Pascal“.

Allerdings sind - wie bei den meisten anderen Programmiersprachen auch - nur die wenigsten Compiler zu diesen Standards vollständig kompatibel. Diese Tatsache verleitete Scott A. Moore zu der bissigen Bemerkung „Pascal is, unfortunately, very much a great improvement on its successors“ („Pascal ist leider so ziemlich eine große Verbesserung seiner Nachfolger“ – damals bereits ein geflügelter Satz, der schon früher über ALGOL, welches auch C und C++ wesentlich beeinflusst hat, oft gesagt worden war).

Selbst großen Compilern wie Delphi oder FreePascal fehlen bis heute einige Elemente aus Standard Pascal, während Extended Pascal von kaum einem unterstützt wird. Lediglich Prospero Pascal ist vollständig kompatibel zu Extended Pascal, während auch GNU Pascal vollständige Kompatibilität anstrebt.

Pascal und Mac OS

Historisch interessant ist die Tatsache, dass Apple bei der Entwicklung des Betriebssystems und der darauf laufen Applikationen des Apple-II-Nachfolgers Macintosh auf Pascal gesetzt hatte. Hierzu wurde bei Apple in einem von Larry Tesler geführten Team unter Konsultation von Niklaus Wirth eine eigene Object-Pascal-Variante entwickelt, die von einer früheren objekt-orientierten Pascal-Variante namens Clascal abgeleitet wurde, welche schon auf Lisa verfügbar war. Object Pascal war für die Unterstützung von MacApp, einem Macintosh Application Framework erforderlich, das heute unter den Begriff Klassen-Bibliothek fallen würde. Object Pascal wurde 1986 fertig gestellt. Apple beendete den Fokus auf Object Pascal mit der Umstellung von Motorola 68K-CPUs auf PowerPC-CPUs von IBM im Jahre 1994 mit der Betriebssystem-Version Mac OS 7.5. Zwecks Rückwärtskompatibilität blieb die Übergabe von Parametern für Betriebssystemaufrufe bis zur letzten Mac-OS-Version 9.2.2 des Jahres 2002 an Pascal-Konventionen angelehnt.

Implementierungen (Compiler, Interpreter und IDEs)

Pascal hatte von Anfang an im universitären Bereich sehr großen Erfolg, was sich u. a. auch in der Programmiersprache Ada niederschlug, die sehr stark an der Syntax von Pascal angelehnt ist. Ebenfalls fand es weite Verbreitung, auch im kommerziellen Bereich, mit den Produkten der Firma Borland Turbo Pascal, Borland Pascal und Delphi. Diese Versionen sind durch starke Erweiterungen des ursprünglichen Sprachstandards gekennzeichnet. Die Objektorientierung wurde dabei mit Version 5.5 eingeführt.

Heute gibt es einige freie Implementationen:

  • Free Pascal – Ein unter der GNU Lesser General Public License stehendes Open-Source-Projekt, das sich zum Ziel gesetzt hat, einen freien 32/64-Bit-Compiler zu erzeugen, der 100-prozentig kompatibel zu Turbo Pascal und Delphi sein soll und mittlerweile eine leichte Portierung von Pascal-Programmen auf fast alle gängigen Betriebssysteme und Hardwareplattformen ermöglicht.
  • GNU Pascal – Ein Pascal-Compiler, der als Frontend zur GNU Compiler Collection konzipiert ist. Es ist kein Bestandteil der GCC selbst, ist aber durch die Verwendung der GCC plattformunabhängig. Die Entwicklung von GPC hat sich zuletzt verzögert.
  • Virtual Pascal – Diese inzwischen freie Implementierung eines Borland-kompatiblen Pascal-Compilers für OS/2 wurde auch auf andere Plattformen portiert, wird aber seit 2005 nicht mehr weiterentwickelt.

Integrierte Entwicklungsumgebungen:

  • Lazarus – Eine Entwicklungsumgebung für Free Pascal, die auch verschiedene Komponenten zur Verfügung stellt. Die IDE ist sehr Delphi-ähnlich gestaltet und verwendet unter Unix das GTK+ als Grafik-Toolkit, unter Windows (win32/win64/wince) setzt es auf der nativen API auf, und auf Apple-Betriebssystemen kann wahlweise die native Carbon-API oder das X-Window-System verwendet werden. Darüber hinaus unterstützt Lazarus Cross Compiling, so dass auch Software für weitere Plattformen wie Windows CE, OS/2, Palm OS oder Nintendo DS entwickelt werden kann. Lazarus ist noch nicht fertiggestellt, in kurzen Abständen werden aber neue Betaversionen veröffentlicht, die – je nach Plattform in unterschiedlichem Maße – einen wachsenden Teil der geplanten Funktionalität implementieren.
  • Dev-Pascal – Eine unter Windows laufende IDE, die auf Free-Pascal oder GNU-Pascal als Compiler aufsetzen kann. Wird nicht mehr weiterentwickelt.

Hallo Welt

Das Beispielprogramm Hallo Welt sieht in Pascal folgendermaßen aus:

 program Hallo(output);
 begin
  writeln('Hallo Welt');
 end.

oder in neueren Pascal-Versionen sieht das Programm so aus:

 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 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.

Weiterentwicklungen

Literatur

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем написать реферат

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Programmiersprache/Zeittafel — Jahr Name Entwickler, Hersteller Vorläufer, Vorgänger 1840 Erstes Programm Ada Lovelace * 1946 Plankalkül Konrad Zuse * 1952 A 0 Grace Hopper * …   Deutsch Wikipedia

  • Programmiersprache Perl — Perl Paradigmen: prozedural, modular, teilweise objektorientiert Erscheinungsjahr: 1987 Entwickler: Larry Wall, Perl Porter Aktuelle  …   Deutsch Wikipedia

  • Programmiersprache C — C Paradigmen: imperativ, strukturiert Erscheinungsjahr: 1972 Entwickler: Dennis Ritchie Bell Labs wichtige Implementierungen …   Deutsch Wikipedia

  • Pascal — Das Wort Pascal bezeichnet: Pascal (Vorname), einen männlichen Vornamen Pascal (Einheit), eine abgeleitete SI Einheit des Drucks Pascal (Programmiersprache) Pascal (Krater), einen Einschlagskrater auf dem Mond Pascal (Film), einen Film von… …   Deutsch Wikipedia

  • Programmiersprache Pascal — Pascal Paradigmen: imperativ, strukturiert Erscheinungsjahr: 1972 Entwickler: Niklaus Wirth Dialekte: UCSD Pascal …   Deutsch Wikipedia

  • PASCAL — Paradigmen: imperativ, strukturiert Erscheinungsjahr: 1972 Entwickler: Niklaus Wirth Dialekte: UCSD Pascal …   Deutsch Wikipedia

  • PASCAL — PASCẠL 〈EDV〉 höhere Programmiersprache für strukturierte Programmierung, Weiterentwicklung von ALGOL * * * Pạs|cal [nach dem frz. Physiker u. Religionsphilosophen B. Pascal (1623–1662)], das; s, ; Einheitenzeichen: Pa: im SI die abgeleitẹte… …   Universal-Lexikon

  • Pascal: Gründe der Vernunft und Gründe des Herzens —   Einer der zahlreichen Kritiker René Descartes war Blaise Pascal, der schon allein deswegen berufener als viele andere argumentieren konnte, weil er wie Descartes das Erkenntnisideal der mathematischen Exaktheit pflegte. Blaise Pascal war Sohn… …   Universal-Lexikon

  • PASCAL — [... kal] das; s Kurzw. aus engl. primary algorithmic scientific commercial application language, angelehnt an ↑Pascal> eine Programmiersprache, die umfangreiche Möglichkeiten für strukturiertes Programmieren bietet (EDV) …   Das große Fremdwörterbuch

  • PASCAL — PASCẠL 〈EDV〉 höhere Programmiersprache für strukturierte Programmierung, Weiterentwicklung von ALGOL …   Lexikalische Deutsches Wörterbuch

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”