21.01.2013 Aufrufe

Programmiersprache - Retroware.de

Programmiersprache - Retroware.de

Programmiersprache - Retroware.de

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Esotherische<br />

<strong>Programmiersprache</strong>n<br />

Übersicht über die gängisten<br />

<strong>Programmiersprache</strong>n<br />

PDF erstellt mit Hilfe <strong>de</strong>s OpenSource-Werkzeugs „mwlib“. Für weitere Informationen siehe http://co<strong>de</strong>.pediapress.com/<br />

PDF generated at: Sun, 28 Mar 2010 21:20:52 UTC


Inhalt<br />

Artikel<br />

ActionScript 1<br />

Algol 60 3<br />

AppleScript 5<br />

Assemblersprache 8<br />

B (<strong>Programmiersprache</strong>) 14<br />

BASIC 15<br />

Borland Delphi 19<br />

C (<strong>Programmiersprache</strong>) 19<br />

C+ + 26<br />

C- Sharp 33<br />

COBOL 36<br />

D (<strong>Programmiersprache</strong>) 44<br />

DarkBASIC 46<br />

FORTRAN 50<br />

FreeBASIC 56<br />

Hallo Welt 58<br />

Java (<strong>Programmiersprache</strong>) 60<br />

JavaScript 69<br />

Lua 82<br />

Objective- C 84<br />

Pascal (<strong>Programmiersprache</strong>) 100<br />

PEARL 106<br />

Perl (<strong>Programmiersprache</strong>) 107<br />

PHP 123<br />

Profan (<strong>Programmiersprache</strong>) 131<br />

PureBasic 133<br />

Python (<strong>Programmiersprache</strong>) 137<br />

REALbasic 147<br />

Ruby (<strong>Programmiersprache</strong>) 148<br />

Smalltalk (<strong>Programmiersprache</strong>) 159<br />

Turbo Pascal 168<br />

Visual Basic 171<br />

Esotherische <strong>Programmiersprache</strong>n 180


Esoterische <strong>Programmiersprache</strong> 180<br />

Brainfuck 182<br />

Brainfuck2D 187<br />

Referenzen<br />

Quelle(n) und Bearbeiter <strong>de</strong>s/<strong>de</strong>r Artikel(s) 193<br />

Quelle(n), Lizenz(en) und Autor(en) <strong>de</strong>s Bil<strong>de</strong>s 197<br />

Artikellizenzen<br />

Lizenz 198


ActionScript 1<br />

ActionScript<br />

ActionScript<br />

Designer: Gary Grossman<br />

Entwickler: Adobe Systems<br />

Aktuelle Version: 3.0 (27. Juni 2006)<br />

Typisierung: stark, statisch<br />

Einflüsse: JavaScript, Java<br />

Betriebssystem: plattformunabhängig<br />

www.adobe.<strong>de</strong> [1]<br />

ActionScript (kurz: AS) ist eine <strong>Programmiersprache</strong> <strong>de</strong>s US-amerikanischen Softwareunternehmens Adobe<br />

Systems auf Basis <strong>de</strong>s ECMAScript-Standards (ECMA-262) und kann in einer Reihe von Adobe-Produkten<br />

eingesetzt wer<strong>de</strong>n, so zum Beispiel Adobe Flash, Flex und Air. Somit kann man von einfachen Flash-Animationen<br />

bis hin zu komplexen Webanwendungen, sogenannten Rich Internet Application, aber auch neuerdings<br />

Desktop-Anwendungen (Adobe Air) erstellen. Die Sprache wur<strong>de</strong> ursprünglich von Macromedia entwickelt, das im<br />

Dezember 2005 von Adobe Systems übernommen wur<strong>de</strong>.<br />

Während Flash selbst anfangs zur Darstellung von Medieninhalten, wie Animationen und Filmen, diente, kam mit<br />

ActionScript die Möglichkeit interaktiver Anwendungen und Datenverarbeitung hinzu.<br />

Funktion<br />

Die Sprache wird in <strong>de</strong>r integrierten Entwicklungsumgebung (IDE) Adobe Flash entwickelt, die auch das Debuggen<br />

unterstützt. Anwendungsseitig wird sie vom Flash-Player, eigenständig o<strong>de</strong>r als Browser-Plugin beim Abspielen<br />

eines Flash-Scripts interpretiert. Laut einer Statistik von Macromedia verfügen über 97 % [2] aller Browser über ein<br />

Flash-Player-Plugin.<br />

Mittlerweile gibt es auch eine Reihe kommerzieller sowie quelloffener Werkzeuge von an<strong>de</strong>ren Herstellern, die<br />

ebenfalls Flash-Filme erzeugen können; Beispiele aus <strong>de</strong>m Open-Source-Bereich sind Ming und OpenLaszlo.<br />

ActionScripts arbeiten stets ereignisorientiert. Sie wer<strong>de</strong>n also nur nach einem eingetretenen Ereignis ausgeführt.<br />

Dazu gehören etwa:<br />

• Schlüsselbil<strong>de</strong>r – sobald <strong>de</strong>r Player ein bestimmtes Schlüsselbild abspielt<br />

• Schaltflächensymbole – <strong>de</strong>r Nutzer fährt mit <strong>de</strong>r Maus über eine Schaltfläche o<strong>de</strong>r klickt diese an<br />

• MovieClip-Symbole – eingebettete MovieClips lösen selbst Ereignisse aus<br />

• Intervallimpulse – Gestartete Intervalle (mit IRQs zu vergleichen) lösen <strong>de</strong>n Aufruf aus


ActionScript 2<br />

ActionScript 3.0<br />

ActionScript 3.0 stellt eine große, nichtkompatible Erweiterung <strong>de</strong>r Sprache dar, die auf Entwürfen zu ECMAScript<br />

4 beruht. U.a. enthält AS3 Typ<strong>de</strong>klarationen und -überprüfungen zur Compile-Zeit und klassenbasierte<br />

Objektorientierung. Gera<strong>de</strong> diese großen Än<strong>de</strong>rungen führten zum Abbruch <strong>de</strong>r Entwicklung von ECMAScript 4.0,<br />

so dass ActionScript jetzt ein isolierter Vertreter dieses Sprachentwurfs ist.<br />

Zur Ausführung <strong>de</strong>s kompilierten Zwischenco<strong>de</strong>s wird eine völlig neugeschriebene virtuelle Maschine benutzt.<br />

Literatur<br />

• Norbert Busche: Das Einsteigerseminar Macromedia Flash-MX-2004-Programmierung mit ActionScript 2.0.<br />

Vmi Buch, 2004, ISBN 3-8266-7277-1.<br />

• Tobias Hauser: Einstieg in ActionScript. Galileo Press, 2006, ISBN 3-89842-774-9.<br />

• Caroline und Matthias Kannengiesser: ActionScript Praxisbuch – Studienausgabe. Franzis, 2005, ISBN<br />

3-7723-6645-7.<br />

• Colin Moock: ActionScript für Flash MX – Die Referenz. O'Reilly Verlag, 2003, ISBN 3-89721-355-9.<br />

• Colin Moock: ActionScript für Flash MX – Das Handbuch. O'Reilly Verlag, 2003, ISBN 3-89721-354-0.<br />

• Colin Moock: Essential ActionScript 3. O'Reilly Verlag, 2007, ISBN 0-596-52694-6.<br />

Siehe auch<br />

• Adobe Flash<br />

• Adobe Flex<br />

• haXe (<strong>Programmiersprache</strong>) – alternative Sprache zum Einsatz in SWF-Dateien und Webanwendungen<br />

• Flash Development Tools – proprietäres Eclipse-Plugin zur Entwicklung von ActionScript<br />

Weblinks<br />

• ActionScript-Programmierstil-Standards [3] (PDF, englisch)<br />

• ActionScript 2.0 Referenzhandbuch (von Macromedia) [4]<br />

• ActionScript 3.0 Referenzhandbuch (von Adobe) [5]<br />

• ECMAScript-Sprachspezifikation [6] (englisch)<br />

• Einführung Actionscript 3.0 [7] (<strong>de</strong>utsch)<br />

• Tutorials (von Macromedia) [8] (englisch)<br />

• as3compile [9] Freier Compiler für ActionScript 3.0<br />

Referenzen<br />

[1] http:/ / www. adobe. <strong>de</strong>/<br />

[2] Verbreitungsstatistik (http:/ / www. adobe. com/ products/ player_census/ flashplayer/ version_penetration. html)<br />

[3] http:/ / www. macromedia. com/ <strong>de</strong>vnet/ mx/ flash/ whitepapers/ actionscript_standards. pdf<br />

[4] http:/ / livedocs. macromedia. com/ flash/ 8_<strong>de</strong>/ main/ wwhelp/ wwhimpl/ js/ html/ wwhelp. htm?href=Part4_ASLR2. html<br />

[5] http:/ / livedocs. adobe. com/ flash/ 9. 0_<strong>de</strong>/ ActionScriptLangRefV3/<br />

[6] http:/ / www. ecma-international. org/ publications/ standards/ Ecma-262. htm<br />

[7] http:/ / www. kurztutorial. info/ actionscript3/ inhalt. htm<br />

[8] http:/ / www. actionscript. org<br />

[9] http:/ / www. swftools. org


Algol 60 3<br />

Algol 60<br />

Die <strong>Programmiersprache</strong> Algol 60 wur<strong>de</strong> von 1958–1963 unter <strong>de</strong>r Führung <strong>de</strong>r Association for Computing<br />

Machinery (ACM) und <strong>de</strong>r Gesellschaft für Angewandte Mathematik und Mechanik (GAMM), später dann <strong>de</strong>r<br />

International Fe<strong>de</strong>ration for Information Processing (IFIP), entwickelt. Beteiligt waren unter an<strong>de</strong>rem John Backus,<br />

Friedrich Ludwig Bauer, John McCarthy, Peter Naur, Alan J. Perlis, Heinz Rutishauser und Klaus Samelson. Der<br />

Name Algol ist eine Kurzform für Algorithmic Language, 60 steht für das Jahr <strong>de</strong>r »Fastfertigstellung« (ein<br />

Diskussionsentwurf wur<strong>de</strong> als International Algorithmic Language (IAL) o<strong>de</strong>r Algol 58 bekannt; die endgültige<br />

Fassung (als »Revised Report« tituliert) stammt aus <strong>de</strong>m Jahre 1963).<br />

Der Sprachentwurf<br />

Algol 60 war als international entwickelte, von kommerziellen Interessen unabhängige, portable, prozedurale<br />

<strong>Programmiersprache</strong> in erster Linie für wissenschaftliche, das hieß damals numerische, Zwecke gedacht. Es gab aber<br />

auch wichtige nichtnumerische Anwendungen, weil ihre Einfachheit und für damalige Verhältnisse weitgehen<strong>de</strong><br />

Freiheit von Restriktionen sie angenehm zu benutzen machte.<br />

So wur<strong>de</strong> das Betriebssystem <strong>de</strong>r Burroughs B5000 Rechner in einer ALGOL-Version (ESPOL)<br />

programmiert; ein an<strong>de</strong>res Beispiel ist ein bibliothekarisches Katalogsystem für die Telefunken TR 4. Vgl.<br />

auch die Sprache JOVIAL, von ALGOL 58 abgeleitet, die jahrzehntelang zur Programmierung von<br />

Prozessrechnern in <strong>de</strong>r Luft- und Raumfahrt (Avionik) diente.<br />

Algol 60 war ein Meilenstein in <strong>de</strong>r Geschichte <strong>de</strong>r <strong>Programmiersprache</strong>n:<br />

• Mit ihr begann die saubere Definition von Spracheigenschaften unabhängig von (und vor) je<strong>de</strong>r Implementierung<br />

(an<strong>de</strong>rs als dies noch bei LISP war [1] ).<br />

• Der Algol 60 Report führte die formale Definition <strong>de</strong>r Syntax mit Hilfe <strong>de</strong>r Backus-Naur-Form ein, die bald<br />

allgemein üblich wur<strong>de</strong>.<br />

• ALGOL zeigte <strong>de</strong>n Wert eines klaren und einfachen Sprachkerns auf, eine Erfahrung, die bald Peter Landin zu<br />

seinem Sprachentwurf ISWIM inspirieren und so die meisten nach ALGOL entwickelten <strong>Programmiersprache</strong>n<br />

beeinflussen sollte.<br />

• ALGOL schrieb – gegen <strong>de</strong>n Trend <strong>de</strong>r Zeit – Laufzeitprüfungen vor, eine Entscheidung, die erst langsam<br />

gewürdigt und nachgeahmt wur<strong>de</strong>.<br />

• Auch die Unterscheidung zwischen <strong>de</strong>r Sprache an sich und ihrer technischen (Eingabe-) Darstellung (die auf<br />

vorhan<strong>de</strong>nen Geräte Rücksicht nehmen musste) fand Beifall, aber nur wenige Nachfolger. [2]<br />

Als (unerwartet) großes Problem erwies sich, dass die Ein-/Ausgabe nicht geregelt wor<strong>de</strong>n war, so dass <strong>de</strong>ren<br />

Implementierungen stark zwischen <strong>de</strong>n Compilern variieren. Beispielsweise wird ein Text einmal mit <strong>de</strong>m<br />

OUTSTRING- und einmal mit <strong>de</strong>m WRITETEXT-Befehl (beispielsweise bei <strong>de</strong>r Electrologica X1) ausgegeben.<br />

Eigenschaften<br />

Die Metho<strong>de</strong> <strong>de</strong>r sequentiellen Formelübersetzung von Bauer und Samelson ermöglichte es, auf viele Restriktionen<br />

zu verzichten, wie sie etwa FORTRAN kannte. Die darin enthaltene I<strong>de</strong>e <strong>de</strong>s Stapelspeichers ermöglichte dann auch<br />

rekursive Prozeduren (Dijkstra).<br />

Vom λ-Kalkül inspiriert war die Möglichkeit innerer Prozedur<strong>de</strong>finitionen (»Blockstruktur«). ‚begin‘-Blöcke<br />

(anonyme Prozeduren) wur<strong>de</strong>n vor allem dazu benutzt, Fel<strong>de</strong>r mit variablen Grenzen im Kellerspeicher anzulegen.<br />

Sichtbarkeit und Gültigkeitsbereich <strong>de</strong>r Variablen waren dabei korrekt lexikalisch <strong>de</strong>finiert. Vorgesehen waren auch<br />

‚own‘-Variablen, <strong>de</strong>ren Lebensdauer <strong>de</strong>r Programmlauf sein sollte (vgl. ‚static‘ in C); gera<strong>de</strong> dies wur<strong>de</strong> aber häufig<br />

nicht implementiert.


Algol 60 4<br />

Ebenfalls vom λ-Kalkül waren die Parameterübergabe-Modi genommen:<br />

• Wertparameter (Schlüsselwort ‚value‘) wur<strong>de</strong>n vor <strong>de</strong>m Aufruf ausgewertet (Strikte Auswertung – »erst<br />

Auswerten, dann Einsetzen«).<br />

• Für Namensparameter, <strong>de</strong>fault, war die Semantik einer textuellen Einsetzung vorgeschrieben (Nichtstrikte (lazy)<br />

Auswertung – »erst Einsetzen, dann Auswerten«). Dies führte im Zusammenhang mit Speichervariablen zu<br />

gewissen Schwierigkeiten, erlaubte im Prinzip aber eine elegante Formulierung von Integralen und ähnlichen<br />

Aufgaben:<br />

integriere (alpha*x*x, x, a, b)<br />

(Jensen's <strong>de</strong>vice). Zur Implementierung verwandte man thunks, Closures von anonymen Funktionen (und<br />

benannt »nach <strong>de</strong>m Geräusch, das sie auf <strong>de</strong>r 7090 machten«).<br />

Algol führte mit LISP das Prinzip <strong>de</strong>r Formatfreiheit in <strong>Programmiersprache</strong>n ein. Dabei hat ein Schlüsselwort<br />

immer dieselbe Be<strong>de</strong>utung, unabhängig von <strong>de</strong>r Position im Programm. Außer<strong>de</strong>m ist <strong>de</strong>r Beginn einer neuen Zeile<br />

<strong>de</strong>m Leerzeichen gleichgestellt. In <strong>de</strong>n damals vorherrschen<strong>de</strong>n Sprachen FORTRAN und COBOL war die<br />

Positionierung <strong>de</strong>r Anweisungen auf <strong>de</strong>n Lochkarten dagegen entschei<strong>de</strong>nd – ein Schlüsselwort konnte je nach<br />

Position eine an<strong>de</strong>re Be<strong>de</strong>utung haben. Auch die Zeileneinteilung war bei diesen Sprachen nicht frei.<br />

Beispiel<br />

Das folgen<strong>de</strong> (vollständige) Algol-60-Programm gibt "HALLO, WELT" auf <strong>de</strong>m Ausgabekanal 2 aus:<br />

'COMMENT' HALLO, WELT PROGRAMM IN ALGOL 60;<br />

'BEGIN'<br />

'END'<br />

OUTSTRING(2,'('HALLO, WELT')');<br />

Wirkungen/Be<strong>de</strong>utung/Nachfolger<br />

ALGOL war ein Fortschritt gegenüber <strong>de</strong>n meisten seiner Nachfolger. -- C. A. R. Hoare.<br />

In <strong>de</strong>r Praxis fand Algol weniger Anwendung als FORTRAN o<strong>de</strong>r COBOL; das min<strong>de</strong>rte aber nicht seinen<br />

langfristigen Einfluss (s. o.). Lange Zeit war Algol 60 im aka<strong>de</strong>mischen Bereich vorbildlich.<br />

Der wichtigste Nachfolger war Simula 67.<br />

Nach John C. Reynolds folgten die meisten Sprachen nicht Algol 60, son<strong>de</strong>rn ISWIM; er selbst stellte mit Forsythe<br />

eine Fortentwicklung in <strong>de</strong>r Algol-Tradition vor. [3]<br />

Algol 68 war <strong>de</strong>m Namen zum Trotz ein völliger Neuentwurf, <strong>de</strong>r ein geteiltes Echo fand. Niklaus Wirth entwickelte<br />

alternativ Algol W, woraus in <strong>de</strong>r Weiterentwicklung Pascal wer<strong>de</strong>n sollte.


Algol 60 5<br />

Siehe auch<br />

• Liste <strong>de</strong>r <strong>Programmiersprache</strong>n<br />

• Namensparameter<br />

Literatur<br />

• H.T. <strong>de</strong> Beer: The History of the ALGOL Effort. [4] 2006. – vi, 97 pp. (M.Sc. thesis, TU Eindhoven)<br />

• Heinz Rutishauser: Description of Algol 60. – Berlin, 1967. (Handbook for automatic computation; 1,a)<br />

• Albert A. Grau; U. Hill; Hans Langmaack: Translation of Algol 60. – Berlin, 1967. (Handbook for automatic<br />

computation; 1,b)<br />

Weblinks<br />

• http:/ / www. gnu. org/ software/ marst/ marst. html - MARST: an Algol-to-C translator<br />

Referenzen<br />

[1] Erst mit Scheme wur<strong>de</strong> das an<strong>de</strong>rs; später wur<strong>de</strong> auch in Common-Lisp <strong>de</strong>r Geburtsfehler <strong>de</strong>s dynamischen Geltungsbereichs (dynamic<br />

scope) korrigiert.<br />

[2] Etwa Fortress. Vgl. ISWIM und Pepper/Hofstedt, Funktionale Programmierung (2006), »Jenseits von ASCII« (S. 4)<br />

[3] http:/ / citeseer. ist. psu. edu/ reynolds96<strong>de</strong>sign. html<br />

[4] http:/ / heer<strong>de</strong>beer. org/ ALGOL/ The_History_of_ALGOL. pdf<br />

AppleScript<br />

Entwickler: Apple<br />

AppleScript<br />

Aktuelle Version: 2.1.1 (9. November 2009)<br />

Betriebssystem: Mac OS, Mac OS X<br />

Kategorie: <strong>Programmiersprache</strong>,<br />

Skriptsprache<br />

Deutschsprachig: nein<br />

<strong>de</strong>veloper.apple.com/applescript [1]<br />

AppleScript ist eine Skriptsprache von Apple, die ein Bestandteil von Mac OS ist. AppleScript dient dazu, Mac<br />

OS-Programme zu automatisieren, zu erweitern und innerhalb eines Rechnernetzes fernzusteuern.<br />

Die erste Version von AppleScript basierte auf <strong>de</strong>m HyperCard-Projekt. HyperCard beinhaltete mit <strong>de</strong>r<br />

Skriptsprache HyperTalk eine auf <strong>de</strong>r englischen Sprache basieren<strong>de</strong> Skriptsprache. Dadurch sind<br />

AppleScript-Programme auch für Personen, die nicht programmieren können, relativ einfach zu verstehen.


AppleScript 6<br />

Sprachsyntax<br />

Apple hat sich traditionell das Ziel gesetzt, einfach zu bedienen<strong>de</strong> Computer und Software zu verbreiten. In dieser<br />

Philosophie hat Apple AppleScript so entwickelt, dass es an die natürliche englische Sprache angepasst ist.<br />

Der Aufruf einer objektorientierten Metho<strong>de</strong> geschieht unter AppleScript wie folgt:<br />

character 1 of item 2 of {"one", "two", "three"}<br />

Auf Deutsch wür<strong>de</strong> es so heißen:<br />

Zeichen 1 <strong>de</strong>s Elementes 2 von {"one", "two", "three"}<br />

In „gewöhnlichen“ Sprachen wie Java dagegen wie folgt:<br />

String[] x = {"one","two","three"};<br />

char y = x[1].charAt(0);<br />

Es ist hier ersichtlich, dass Apple sich bemüht, AppleScript auf <strong>de</strong>r Basis <strong>de</strong>r englischen Sprache zu setzen und nicht<br />

<strong>de</strong>m Trend <strong>de</strong>r traditionellen <strong>Programmiersprache</strong>n zu folgen.<br />

Applikationsübergreifen<strong>de</strong> Kommunikation<br />

AppleScript wird primär dazu benutzt, an<strong>de</strong>re Programme von einem Programm aus „fernzubedienen“. Mac OS<br />

bietet AppleEvents an, ein applikationsübergreifen<strong>de</strong>s Kommunikationsprotokoll, mit <strong>de</strong>m es möglich ist,<br />

Nachrichten von einer Applikation zu einer an<strong>de</strong>ren Applikation zu sen<strong>de</strong>n, so dass diese sich wie gewünscht<br />

verhält.<br />

So kann man zum Beispiel aus einem Skript heraus eine Applikation anweisen, ein bestimmtes Dokument zu öffnen.<br />

Mit <strong>de</strong>m Wort „tell“ wird eine solche Nachricht z. B. an Word geschickt:<br />

tell application "Microsoft Word"<br />

open file "Diplomarbeit" of fol<strong>de</strong>r "Dokumente" of disk "Studium"<br />

end tell<br />

Auf Deutsch:<br />

Sage Anwendung "Microsoft Word"<br />

öffne Dokument "Diplomarbeit" aus <strong>de</strong>m Ordner "Dokumente" <strong>de</strong>r<br />

Festplatte "Studium"<br />

En<strong>de</strong> <strong>de</strong>r Nachricht<br />

AppleScript zur Automatisierung<br />

AppleScript ist nicht nur für applikationsübergreifen<strong>de</strong> Aufgaben entworfen. Es kann auch eingesetzt wer<strong>de</strong>n, zum<br />

Beispiel um häufig wie<strong>de</strong>rkehren<strong>de</strong> Aufgaben zu automatisieren o<strong>de</strong>r Berechnungen durchzuführen. Ein Beispiel:<br />

set pix to 72<br />

set answer to text returned of (display dialog "Enter in the number of<br />

inches" <strong>de</strong>fault answer "1")<br />

display dialog answer & "in = " & (answer * pix) & "px"<br />

Auf Deutsch wür<strong>de</strong> es so heißen:<br />

setze pixel auf 72<br />

setze antwort auf zurückgegebener Text von (zeige Dialog "Gib die Länge<br />

in Zoll ein" Standardantwort "1")


AppleScript 7<br />

zeige Dialog antwort & "in = " & (antwort * pixel) &<br />

"pixel"<br />

Es zeigt ein Dialogfeld und fragt nach <strong>de</strong>r Länge in Inches. Es wird dann berechnet, wie viele Pixel es auf dieser<br />

Länge geben wird. Ein zweites Dialogfeld zeigt dann das Resultat.<br />

AppleScript-Dialekte<br />

Apple ließ für eine kurze Zeit das AppleScript sogar so erweitern, dass man die Skripte nicht zwingend auf Englisch<br />

schreiben musste. Man sollte die Skripts in <strong>de</strong>r eigenen Muttersprache schreiben können. So wur<strong>de</strong> die<br />

Skriptterminologie auf Französisch, Japanisch und Italienisch übersetzt und Mac OS konnte diese von einem Dialekt<br />

in einen an<strong>de</strong>ren Dialekt übersetzen. Dies funktionierte zwar, doch die Entwickler von Macintosh-Software<br />

(außerhalb von Apple) unterstützten die Mehrsprachigkeit von AppleScript wegen <strong>de</strong>s großen Aufwan<strong>de</strong>s nur<br />

unzureichend. Da auch <strong>de</strong>r Support umständlich war, wur<strong>de</strong> diese I<strong>de</strong>e in Mac OS 8.5 und höher nicht mehr weiter<br />

verfolgt.<br />

Literatur<br />

• Detlef Schulz: AppleScript - <strong>de</strong>r automatische Mac / [Detlef Schulz]. SmartBooks, Pfäffikon, SZ 2009, ISBN<br />

978-3-908497-78-3, S. 844.<br />

Weblinks<br />

• http:/ / <strong>de</strong>veloper. apple. com/ referencelibrary/ ScriptingAutomation/ idxAppleScript-date. html<br />

• http:/ / www. macosxautomation. com/ applescript/<br />

• http:/ / www. applescriptsourcebook. com/<br />

• AppleScript für absolute Starter [2]<br />

Referenzen<br />

[1] http:/ / <strong>de</strong>veloper. apple. com/ applescript/<br />

[2] http:/ / www. fischer-bayern. <strong>de</strong>/ applescript/ html/ ebook. html


Assemblersprache 8<br />

Assemblersprache<br />

Eine Assemblersprache ist eine spezielle <strong>Programmiersprache</strong>, welche die Maschinensprache einer spezifischen<br />

Prozessorarchitektur in einer für <strong>de</strong>n Menschen lesbaren Form repräsentiert. Je<strong>de</strong> Computerarchitektur hat folglich<br />

ihre eigene Assemblersprache.<br />

Übersicht<br />

Ein Programm in Assemblersprache wird auch als Assemblerco<strong>de</strong> bezeichnet. Es wird durch einen speziellen<br />

Compiler, ebenfalls Assembler genannt, in direkt ausführbare Maschinensprache (auch Maschinenco<strong>de</strong>)<br />

umgewan<strong>de</strong>lt. Die umgekehrte Umsetzung von Maschinenco<strong>de</strong> in menschenlesbaren Assemblerco<strong>de</strong> wird<br />

Disassemblierung genannt. Allerdings lassen sich dabei beiläufige Informationen wie Bezeichner und Kommentare<br />

nicht wie<strong>de</strong>rherstellen, da diese bereits bei <strong>de</strong>r Compilierung unwie<strong>de</strong>rbringlich verloren gingen, was ein Verstehen<br />

<strong>de</strong>s Programms erschwert.<br />

Programme in Assemblersprache zeichnen sich dadurch aus, dass man die komplette Bandbreite <strong>de</strong>s Computers<br />

ausnutzen und Hardwarechips direkt programmieren kann. Weil Assemblerprogramme faktisch auf<br />

Maschinenco<strong>de</strong>-Ebene arbeiten, sind sie oftmals erheblich kleiner und schneller als Programme, die einen ähnlichen<br />

Grad an Komplexität aufweisen, aber eine Hochsprache als Basis haben. Der Compiler einer höheren<br />

<strong>Programmiersprache</strong> erzeugt meistens mehr Co<strong>de</strong>, weil er stark generalisiert geschrieben wer<strong>de</strong>n muss. Die<br />

zwingen<strong>de</strong> Nutzung von Assemblersprache ist heutzutage selten erfor<strong>de</strong>rlich, außer wenn Programme bzw. Teile<br />

davon sehr zeitkritisch sind (beispielsweise bei <strong>de</strong>r Programmierung von Gerätetreibern für Grafikkarten) o<strong>de</strong>r nur<br />

einen sehr geringen Speicherplatzbedarf aufweisen dürfen (z. B. in eingebetteten Systemen) o<strong>de</strong>r einfach noch keine<br />

Hochsprach-Bibliotheken existieren, z. B. bei völlig neuer Technik. Prinzipiell wird immer mehr an maschinennaher<br />

Programmierung – die Domäne von Assembler – heute durch höhere <strong>Programmiersprache</strong>n abge<strong>de</strong>ckt. Auch steht<br />

<strong>de</strong>r Möglichkeit <strong>de</strong>r Erstellung effizienter Programme die erschwerte Wartbarkeit von Assemblerprogrammen<br />

gegenüber. Weitere Nachteile von Assemblerco<strong>de</strong> sind u. a. höhere Fehleranfälligkeit (durch erhöhte Komplexität),<br />

damit verbun<strong>de</strong>n extrem großer Programmieraufwand bei umfangreichen Projekten und die (praktische)<br />

Unmöglichkeit <strong>de</strong>s Portierens auf eine an<strong>de</strong>re Hardware.<br />

Unter <strong>de</strong>m Aspekt <strong>de</strong>r Geschwindigkeitsoptimierung kann <strong>de</strong>r Einsatz von Assemblerco<strong>de</strong> auch bei verfügbaren<br />

hochoptimierten Compilern noch seine Berechtigung haben, muss aber differenziert betrachtet und für die<br />

spezifische Anwendung abgewogen wer<strong>de</strong>n. Bei komplexer Technik wie Intel Itanium und verschie<strong>de</strong>nen DSPs<br />

kann ein Compiler u. U. durchaus besseren Co<strong>de</strong> erzeugen als ein durchschnittlicher Assemblerprogrammierer, da<br />

das Ablaufverhalten solcher Architekturen mit komplexen mehrstufigen intelligenten Optimierungen (z. B.:<br />

Out-of-Or<strong>de</strong>r Excecution, Pipeline-Stalls, …) hochgradig nichtlinear ist. Die Geschwindigkeitsoptimierung wird<br />

immer komplexer, da zahlreiche Nebenbedingungen eingehalten wer<strong>de</strong>n müssen, ein gleichermaßen wachsen<strong>de</strong>s<br />

Problem für die durchaus immer besser wer<strong>de</strong>n<strong>de</strong>n Compiler <strong>de</strong>r Hochsprachen als auch für Programmierer <strong>de</strong>r<br />

Assemblersprache. Für einen optimalen Co<strong>de</strong> wird immer mehr Kontextwissen benötigt (z. B.: Cachenutzung,<br />

räumliche und zeitliche Lokalität <strong>de</strong>r Speicherzugriffe), welches <strong>de</strong>r Assembler-Programmierer teilweise (im<br />

Gegensatz zum Compiler) durch Laufzeitprofiling <strong>de</strong>s ausgeführten Co<strong>de</strong>s in seinem angestrebten Anwendungsfeld<br />

gewinnen kann. Ein Beispiel hierfür ist <strong>de</strong>r SSE-Befehl MOVNTQ, welcher wegen <strong>de</strong>s fehlen<strong>de</strong>n Kontextwissens<br />

von Compilern kaum optimal eingesetzt wer<strong>de</strong>n kann.


Assemblersprache 9<br />

Beschreibung<br />

Programmbefehle in Maschinensprache - Instruktionen - sind einfache Bitmuster, die sich aus <strong>de</strong>n Opco<strong>de</strong>s und <strong>de</strong>n<br />

zugehörigen Daten bil<strong>de</strong>n. Da die Zahlenwerte <strong>de</strong>r Opco<strong>de</strong>s schwieriger zu merken sind, verwen<strong>de</strong>t eine<br />

Assemblersprache besser merkbare Kürzel, so genannte mnemonische Symbole (kurz Mnemonics).<br />

Beispiel:<br />

Der folgen<strong>de</strong> Befehl in <strong>de</strong>r Maschinensprache von x86-Prozessoren<br />

10110000 01100001<br />

entspricht <strong>de</strong>m Assemblerbefehl<br />

movb $0x61, %al ; AT&T-Syntax (Zeichen nach einem „;“ gelten als<br />

Kommentare)<br />

bzw.<br />

mov al, 61h ; Intel-Syntax<br />

und be<strong>de</strong>utet, dass <strong>de</strong>r hexa<strong>de</strong>zimale Wert 61 (97 <strong>de</strong>zimal) ins Register ‚al‘ gela<strong>de</strong>n wer<strong>de</strong>n soll (al: dabei steht das<br />

‚a‘ für das Register, und das ‚l‘ für low, was praktisch <strong>de</strong>m ersten Teil <strong>de</strong>s Registers entspricht). Der zweite Teil <strong>de</strong>s<br />

Registers wird mit einem ‚h‘ ausgezeichnet, das ‚h‘ steht für High (Also: ‚ah‘). Soll das ganze Register (je nach<br />

Speicherbedarfs <strong>de</strong>s Typs, <strong>de</strong>r gespeichert wer<strong>de</strong>n soll) angesprochen wer<strong>de</strong>n, wird ‚l‘ bzw. ‚h‘ durch ein ‚x‘ ersetzt:<br />

‚ax‘. Mit Computerhilfe kann man das eine in das an<strong>de</strong>re weitgehend eins zu eins übersetzen. Jedoch wer<strong>de</strong>n<br />

Adressumformungen vorgenommen, so dass man symbolische Adressen benutzen kann. Im Allgemeinen haben die<br />

Assembler neben <strong>de</strong>n eigentlichen Co<strong>de</strong>s auch Steueranweisungen, die die Programmierung bequemer machen, zum<br />

Beispiel zur Definition eines Basisregisters.<br />

Häufig wer<strong>de</strong>n komplexere Assemblersprachen (Makroassembler) verwen<strong>de</strong>t, um die Programmierarbeit zu<br />

erleichtern. Makros sind dabei Bruchstücke von Assemblerco<strong>de</strong>, <strong>de</strong>r vor <strong>de</strong>m eigentlichen Assemblieren automatisch<br />

an Stelle <strong>de</strong>r Makroaufrufe eingefügt wird. Dabei können einfache Parameterersetzungen vorgenommen wer<strong>de</strong>n. Die<br />

Disassemblierung von <strong>de</strong>rart generiertem Co<strong>de</strong> ergibt allerdings <strong>de</strong>n reinen Assemblerco<strong>de</strong> ohne die beim<br />

Übersetzen expandierten Makros.<br />

Beispielprogramme<br />

Hello World in Assemblersprache (MASM für MS-DOS)<br />

DATA SEGMENT ;- Beginn <strong>de</strong>s Datensegments<br />

Meldung db "Hello World" ;- Die Zeichenkette "Hello World"<br />

db "$" ;- Endzeichen <strong>de</strong>r Zeichenkette<br />

DATA ENDS ;- En<strong>de</strong> <strong>de</strong>s Datensegment<br />

CODE SEGMENT ;- Beginn <strong>de</strong>s Co<strong>de</strong>segements<br />

ASSUME CS:CODE,DS:DATA ;- Dem Assembler die Segmente mitteilen<br />

Anfang: ;- Label für <strong>de</strong>n Anfang <strong>de</strong>s Programms<br />

mov ax, DATA ;- das Daten...<br />

mov ds, ax ; ...segment festlegen<br />

mov dx, offset Meldung ;- <strong>de</strong>n Text in das auf DS bezogene<br />

Datenregister la<strong>de</strong>n<br />

mov ah, 09h ;- Die Unterfunktion 9 <strong>de</strong>s<br />

Betriebssysteminterrupts 21h auswählen<br />

int 21h ;- <strong>de</strong>n Betriebssysteminterrupt 21h (hier


Assemblersprache 10<br />

erfolgt Ausgabe <strong>de</strong>s Texts) aufrufen<br />

mov ax, 4C00h ;- Die Unterfunktion 4Ch<br />

(Programmbeendigung) <strong>de</strong>s Betriebssysteminterrupts 21h festlegen<br />

int 21h ;- diesen Befehl wie<strong>de</strong>rum ausführen<br />

CODE ENDS ;- En<strong>de</strong> <strong>de</strong>s Co<strong>de</strong>segments<br />

END Anfang ;- <strong>de</strong>m Assembler das En<strong>de</strong> <strong>de</strong>s Labels Anfang<br />

mitteilen<br />

Hello World in Assemblersprache (NASM für MS-DOS)<br />

ORG 100h ; Startoffset auf 100h setzen (Startpunkt<br />

für COM-Programme)<br />

mov ax, cs ; Wert <strong>de</strong>s Co<strong>de</strong>segmentregisters in Register<br />

ax übertragen<br />

mov ds, ax ; Datensegment auf Wert von ax setzen<br />

mov ah, 09h ; DOS-Funktion zum Schreiben von Text<br />

mov dx, Meldung ; Adresse <strong>de</strong>s Textes<br />

int 21h ; DOS-Funktion ausführen<br />

mov ax, 4C00h ; DOS-Funktion um das Programm zu been<strong>de</strong>n<br />

int 21h<br />

Meldung: db "Hello World" ; Unser Text<br />

db "$" ; Markiert das En<strong>de</strong> <strong>de</strong>r Zeichenkette<br />

Hello World in Assemblersprache (MIPS-Architektur)<br />

.data<br />

out: .asciiz "Hallo Welt" # Die Zeichenkette zum Ausgeben<br />

(als Label)<br />

.text<br />

main: li $v0, 4 # Befehl 4 ('print_string') in Register<br />

schreiben<br />

la $a0, out # Argument für <strong>de</strong>n Systemaufruf in das<br />

Argumentregister schreiben<br />

(Ausgabe)<br />

syscall # Ausführung <strong>de</strong>r Systemfunktion<br />

li $v0, 10 # Befehl 10 ('exit') in Register schreiben<br />

syscall # Ausführung <strong>de</strong>r Systemfunktion<br />

(Programmen<strong>de</strong>)


Assemblersprache 11<br />

Hello World in Assemblersprache (Jasmin)<br />

; HelloWorld.j<br />

.byteco<strong>de</strong> 50.0<br />

.source HelloWorld.java<br />

.class public HelloWorld<br />

.super java/lang/Object<br />

.method public ()V<br />

.limit stack 1<br />

.limit locals 1<br />

aload_0<br />

invokespecial java/lang/Object/()V<br />

return<br />

.end method<br />

.method public static main([Ljava/lang/String;)V<br />

.limit stack 2<br />

.limit locals 1<br />

getstatic java/lang/System/out Ljava/io/PrintStream;<br />

ldc "Hello World!"<br />

invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V<br />

return<br />

.end method<br />

Der zum Assembler-Quelltext HelloWorld.j zugehörige Java-Quelltext HelloWorld.java lautet:<br />

/* HelloWorld.java */<br />

public class HelloWorld {<br />

}<br />

public static void main(String[] args) {<br />

}<br />

System.out.println("Hello World!");<br />

Verschie<strong>de</strong>ne Assemblersprachen<br />

Je<strong>de</strong> Computerarchitektur hat ihre eigene Maschinensprache und damit Assemblersprache. Vereinzelt existieren<br />

sogar mehrere verschie<strong>de</strong>ne Assemblersprachen (und zugehörige Assembler) für die gleiche Prozessorarchitektur.<br />

Die Beispiele oben sind für x86-Prozessoren. Die Sprachen unterschei<strong>de</strong>n sich in Anzahl und Typ <strong>de</strong>r Operationen.<br />

Jedoch haben alle Architekturen die folgen<strong>de</strong>n grundlegen<strong>de</strong>n Operationen:<br />

• Daten lesen und schreiben innerhalb <strong>de</strong>s Zentralspeichers sowie Datenaustausch mit Registern,<br />

• einfache arithmetische Operationen (mit Gleitkommaprozessoren auch komplexe),<br />

• einfache logische Operationen,<br />

• einfache Kontrolle <strong>de</strong>s Programmflusses.<br />

Bestimmte Rechnerarchitekturen haben oft auch komplexere Befehle wie z. B.:<br />

• einen großen Speicherblock im Hauptspeicher verschieben;


Assemblersprache 12<br />

• höhere Arithmetik wie Sinus-, Kosinus- und Wurzelberechnung (entwe<strong>de</strong>r über spezielle Zusatzprozessoren<br />

realisiert o<strong>de</strong>r über Softwareroutinen);<br />

• eine einfache Operation (z. B. Addition) auf einen Vektor von Werten anwen<strong>de</strong>n;<br />

• massive, direkte Parallelprogrammierbarkeit <strong>de</strong>s Prozessors, etwa bei digitalen Signalprozessoren;<br />

• Unterbrechungssteuerungen, die beson<strong>de</strong>rs für Prozessrechner benötigt wer<strong>de</strong>n;<br />

• Aufrufe von Ein- bzw. Ausgabegeräten;<br />

• Synchronisation mit an<strong>de</strong>ren Prozessoren für SMP-Systeme.<br />

Geschichte<br />

Früher wur<strong>de</strong>n Betriebssysteme in einer Assemblersprache geschrieben. Heute wer<strong>de</strong>n jedoch Hochsprachen<br />

bevorzugt, in <strong>de</strong>n meisten Fällen C. Allerdings müssen häufig kleine Assemblerroutinen hardwarenahe Aufgaben in<br />

Betriebssystemen übernehmen. Dazu gehört zum Beispiel das Speichern von Registern in Schedulern, o<strong>de</strong>r bei <strong>de</strong>r<br />

x86-Architektur <strong>de</strong>r Teil <strong>de</strong>s Boot-Loa<strong>de</strong>rs, <strong>de</strong>r innerhalb <strong>de</strong>s 512 Byte großen Master Boot Records untergebracht<br />

sein muss. Auch Teile von Gerätetreibern wer<strong>de</strong>n in Assemblersprache geschrieben, falls aus <strong>de</strong>n Hochsprachen kein<br />

effizienter Hardware-Zugriff möglich ist. Manche Hochsprachencompiler erlauben es, direkt im eigentlichen<br />

Quellco<strong>de</strong> Assemblerco<strong>de</strong>, sogenannte Inline-Assembler-Routinen, einzubetten.<br />

Bis ca. 1990 wur<strong>de</strong>n die meisten Computerspiele in Assemblersprachen programmiert, da nur so auf Heimcomputern<br />

und <strong>de</strong>n damaligen Spielkonsolen eine akzeptable Spielgeschwindigkeit und eine <strong>de</strong>n kleinen Speicher dieser<br />

Systeme nicht sprengen<strong>de</strong> Programmgröße zu erzielen war. Noch heute gehören Computerspiele zu <strong>de</strong>n<br />

Programmen, bei <strong>de</strong>nen am ehesten kleinere assemblersprachliche Programmteile zum Einsatz kommen, um so<br />

Prozessorerweiterungen wie SSE zu nutzen.<br />

Bei vielen Anwendungen für Geräte, die von Mikrocontrollern gesteuert sind, war früher oft eine Programmierung in<br />

Assembler notwendig, um die knappen Ressourcen dieser Mikrocontroller optimal auszunutzen. Dies gilt heute<br />

praktisch nur noch, wenn wegen Massenproduktion möglichst günstige und damit minimale Mikrocontroller<br />

verwen<strong>de</strong>t wer<strong>de</strong>n sollen und das Programm nicht zu komplex ist. Um Co<strong>de</strong> für solche Mikrocontroller zu erzeugen,<br />

wer<strong>de</strong>n Cross-Assembler bei <strong>de</strong>r Entwicklung eingesetzt. Mo<strong>de</strong>rne C-Compiler haben aber auch in diesem Bereich<br />

die Assembler abgelöst. Nicht zuletzt aufgrund größerer Programmspeicher bei gleichen Kosten für die Chips fallen<br />

die Vorteile von Hochsprachen gegenüber <strong>de</strong>n teils verschwin<strong>de</strong>nd geringen Vorteilen <strong>de</strong>r Assemblersprache immer<br />

mehr ins Gewicht.<br />

Vorteile<br />

Von erfahrenen Programmierern geschriebene Assemblerprogramme sind fast immer <strong>de</strong>utlich schneller als die<br />

Produkte <strong>de</strong>r Hochsprachencompiler. [1] [2] Beispielsweise sind im Bereich <strong>de</strong>s wissenschaftlichen Rechnens die<br />

[3] [4]<br />

schnellsten Varianten mathematischer Bibliotheken wie BLAS weiterhin die mit Assembler-Co<strong>de</strong> optimierten.<br />

Auch lassen sich gewisse sehr systemnahe Operationen bzw. Operationen unter Umgehung <strong>de</strong>s Betriebssystems<br />

(z.B. direktes Schreiben in <strong>de</strong>n Bildschirmspeicher) immer noch nicht in allen Hochsprachen ausführen. Der Nutzen<br />

von Assembler liegt auch in <strong>de</strong>m Verstehen, wie ein System arbeitet und funktioniert, um damit in Hochsprachen<br />

umständliche Konstrukte zu vermei<strong>de</strong>n. Auch heute noch wird an vielen Hochschulen Assembler gelehrt. Es geht<br />

darum, ein Gefühl für <strong>de</strong>n Rechner und seine Arbeitsweise zu bekommen.<br />

Es gibt Fälle, in <strong>de</strong>nen diskrete Berechnungen einfacher und effizienter direkt in Assembler geschrieben wer<strong>de</strong>n. Die<br />

meisten Hochsprachencompiler übersetzen zuerst in Assemblerco<strong>de</strong> o<strong>de</strong>r können diesen optional ausgeben, so dass<br />

man Details genauer betrachten und gewisse Stellen von Hand optimieren kann.


Assemblersprache 13<br />

Nachteile<br />

Da Assemblerprogramme sehr hardwarenah geschrieben wer<strong>de</strong>n, weil die unterschiedlichen Spezifikationen <strong>de</strong>r<br />

einzelnen Prozessorentypen individuell verschie<strong>de</strong>ne Maschinenco<strong>de</strong>-Befehlssätze erfor<strong>de</strong>rn, kann ein<br />

Assemblerprogramm nicht auf ein an<strong>de</strong>res Computersystem übertragen wer<strong>de</strong>n ohne die Programmstruktur<br />

anzupassen. Das erfor<strong>de</strong>rt häufig ein komplettes Neuschreiben <strong>de</strong>s Programmtextes. Im Gegensatz dazu muss bei<br />

Hochsprachen nur <strong>de</strong>r Compiler individuell auf ein an<strong>de</strong>res Betriebssystem angepasst (neu geschrieben) wer<strong>de</strong>n, da<br />

dieser im Regelfall <strong>de</strong>n Programmco<strong>de</strong> in eine für das Betriebssystem verwertbare Form umwan<strong>de</strong>lt. Das<br />

Betriebssystem seinerseits übernimmt die Vermittlung zur Hardwareebene.<br />

Das Programmieren in Assembler ist oft mit einer großen Anzahl an Einzelbefehlen verbun<strong>de</strong>n, da häufig kleinste<br />

Informationseinheiten in einzelnen Speicherzellen manipuliert wer<strong>de</strong>n müssen. Wür<strong>de</strong> man <strong>de</strong>n Funktionsumfang<br />

eines einzelnen Hochsprachenbefehls in einer Assemblersprache realisieren wollen, entstün<strong>de</strong> dabei ein komplettes<br />

Programm.<br />

Literatur<br />

• Gerhard Niemeyer: Einführung in das Programmieren in ASSEMBLER, <strong>de</strong> Gruyter, 1989, ISBN 3-11-012174-3<br />

• Joachim Roh<strong>de</strong>: Assembler Ge-Packt, Mitp-Verlag, 2000, ISBN 978-3-8266-1756-0<br />

• Joachim Roh<strong>de</strong>, Marcus Roming: Assembler: Grundlagen <strong>de</strong>r Programmierung, Mitp-Verlag, 2006, ISBN<br />

978-3-8266-1469-9<br />

• Jeff Duntemann: Assembly Language Step-by-Step, Wiley, 2000. ISBN 0-471-37523-3<br />

• Paul Carter: PC Assembly Language, kostenloses E-Book, 2001, auf <strong>de</strong>r Website [5] erhältlich<br />

• Robert Britton: MIPS Assembly Language Programming, Prentice Hall, 2003. ISBN 0-13-142044-5<br />

• Randall Hy<strong>de</strong>: The Art of Assembly Language, No Starch Press, 2003. ISBN 1-886411-97-2 als PDF o<strong>de</strong>r HTML<br />

[6]<br />

• Steve McConnell [7]: Co<strong>de</strong> Complete, Microsoft Press, 1993, ISBN 1-55615-484-4<br />

Weblinks<br />

• Randall Hy<strong>de</strong>s 'The Art of Assembly Language' als HTML und PDF version [6]<br />

• Assembler X86 Befehlslisten/OpCo<strong>de</strong> und Beschreibungen [8]<br />

• Assembler-Programmierung unter Linux [9]<br />

• i8086.<strong>de</strong> 8086/88 Assembler Befehlsreferenz [10]<br />

• Pentium Befehlssatz und Takttabelle [11]<br />

Referenzen<br />

[1] Bit-field-badness (englisch) (http:/ / hardwarebug. org/ 2010/ 01/ 30/ bit-field-badness/ ). hardwarebug.org (30. Januar 2010). Abgerufen am<br />

4. März 2010.<br />

[2] GCC makes a mess (englisch) (http:/ / hardwarebug. org/ 2009/ 05/ 13/ gcc-makes-a-mess/ ). hardwarebug.org (13. Mai 2009). Abgerufen am<br />

4. März 2010.<br />

[3] Writing the Fastest Co<strong>de</strong>, by Hand, for Fun: A Human Computer Keeps Speeding Up Chips (englisch) (http:/ / www. nytimes. com/ 2005/ 11/<br />

28/ technology/ 28super. html?_r=1). New York Times, John Markoff (28. November 2005). Abgerufen am 4. März 2010.<br />

[4] BLAS Benchmark-August2008 (http:/ / eigen. tuxfamily. org/ in<strong>de</strong>x. php?title=Benchmark-August2008). eigen.tuxfamily.org (1. August<br />

2008). Abgerufen am 4. März 2010.<br />

[5] http:/ / drpaulcarter. com/ pcasm/<br />

[6] http:/ / webster. cs. ucr. edu/ AoA/ in<strong>de</strong>x. html<br />

[7] http:/ / www. stevemcconnell. com/<br />

[8] http:/ / runtime-basic. net/ Assembler:Funktionen:Beschreibung-Kurz-CPU<br />

[9] http:/ / www. lcs-chemie. <strong>de</strong>/ assemb. htm<br />

[10] http:/ / www. i8086. <strong>de</strong>/ asm/ 8086-88-asm. html<br />

[11] http:/ / www. schellong. <strong>de</strong>/ pent. htm


B (<strong>Programmiersprache</strong>) 14<br />

B (<strong>Programmiersprache</strong>)<br />

Die <strong>Programmiersprache</strong> B wur<strong>de</strong> 1969 von Ken Thompson und Dennis Ritchie entwickelt. B ist stark beeinflusst<br />

von BCPL und ist Vorgänger <strong>de</strong>r <strong>Programmiersprache</strong> C.<br />

B ist vor allem aus sprachhistorischen Grün<strong>de</strong>n interessant, da es die Entwicklung von BCPL zu C genauer<br />

dokumentiert. Es wur<strong>de</strong> für die Übersetzung auf einer DEC PDP-7 mit 8 kb RAM entwickelt. Später wur<strong>de</strong> es auf<br />

PDP-11-Maschinen und Honeywell-Mainframes portiert, wo es zum Beispiel für das bekannte AberMUD von Alan<br />

Cox bis in die 1990er-Jahre benutzt wur<strong>de</strong>.<br />

Aufgrund <strong>de</strong>r eingeschränkten Hardwareressourcen auf <strong>de</strong>r Zielmaschine PDP-7 fehlen B einige BCPL-Merkmale,<br />

die die Übersetzung aufwändiger machen wür<strong>de</strong>n. Beispielsweise sind keine verschachtelten Funktions<strong>de</strong>finitionen<br />

möglich. Ebenso wegen <strong>de</strong>r eingeschränkten Ressourcen erzeugte <strong>de</strong>r B-Compiler auf <strong>de</strong>r PDP-7 einen einfachen<br />

Zwischenco<strong>de</strong>, <strong>de</strong>r von einem Interpreter zur Laufzeit interpretiert wer<strong>de</strong>n muss. [1]<br />

In B gab es wie in BCPL o<strong>de</strong>r Forth nur einen Datentyp, <strong>de</strong>ssen Be<strong>de</strong>utung sich erst durch die benutzten Operatoren<br />

und Funktionen ergab. B ist also typlos. Es gab bereits viele Spracheigenschaften, die man in C fin<strong>de</strong>n kann. Einige<br />

Programme sind sogar ohne Probleme noch mit heutigen C-Compilern übersetzbar.<br />

Co<strong>de</strong>-Beispiel<br />

main() { auto c; auto d; d=0; while(1) { c=getchar(); d=d+c; putchar(c); } } Dieses Programm lässt sich auch noch<br />

mit heutigen C-Compilern (im K&R- o<strong>de</strong>r traditional-Modus) übersetzen. Es ist jedoch kein ANSI-C.<br />

Weblinks<br />

• Die originale Sprachspezifikation [2] (englisch)<br />

• bell-labs.com B-Tutorial [3] (englisch)<br />

Referenzen<br />

[1] D. Ritchie, The Development of the C Language (http:/ / cm. bell-labs. com/ cm/ cs/ who/ dmr/ chist. html) in History of Programming<br />

Languages, ACM Press and Addison-Wesley, 1996, ISBN 0-201-89502-1<br />

[2] http:/ / cm. bell-labs. com/ cm/ cs/ who/ dmr/ kbman. html<br />

[3] http:/ / www. cs. bell-labs. com/ cm/ cs/ who/ dmr/ btut. html


BASIC 15<br />

BASIC<br />

BASIC ist eine <strong>de</strong>r am weitesten verbreiteten imperativen<br />

<strong>Programmiersprache</strong>n. Sie wur<strong>de</strong> 1964 von John George Kemeny und<br />

Thomas Eugene Kurtz am Dartmouth College entwickelt und verfügte<br />

in ihrer damaligen Form noch nicht über die Merkmale <strong>de</strong>r<br />

strukturierten Programmierung, son<strong>de</strong>rn arbeitete mit Zeilennummern<br />

und Sprungbefehlen (GOTO). Mittlerweile gibt es eine Vielzahl<br />

verschie<strong>de</strong>ner BASIC-Dialekte, von <strong>de</strong>nen einige <strong>de</strong>r jüngeren alle<br />

Elemente höherer <strong>Programmiersprache</strong>n aufweisen, so etwa<br />

Objektorientierung.<br />

Das Apronym „BASIC“ steht für „Beginner’s All-purpose Symbolic<br />

Instruction Co<strong>de</strong>“, was so viel be<strong>de</strong>utet wie „symbolische<br />

Allzweck-<strong>Programmiersprache</strong> für Anfänger“. Die Abkürzung als Wort<br />

gesehen be<strong>de</strong>utet außer<strong>de</strong>m „grundlegend“. Dies zeigt das Design-Ziel<br />

klar: Eine einfache, für Anfänger geeignete <strong>Programmiersprache</strong> zu<br />

erschaffen. Außer in manchen Produktnamen wird das Wort „BASIC“<br />

grundsätzlich in Großbuchstaben geschrieben.<br />

Allgemeines<br />

Die Sprache wur<strong>de</strong> aufgrund von acht Prinzipien entworfen:<br />

• Für Anfänger leicht zu erlernen.<br />

• Universell einsetzbar.<br />

• Erweiterbarkeit <strong>de</strong>r Sprache für Experten.<br />

• Interaktivität.<br />

• Klare Fehlermeldungen.<br />

• Kurze Antwortzeiten.<br />

• Hardwareunabhängigkeit.<br />

• Betriebssystemunabhängigkeit.<br />

Geschichte<br />

Ausschnitt aus einem Basic-Listing<br />

BASIC wur<strong>de</strong> 1964 von John George Kemeny und Thomas Eugene Kurtz am Dartmouth College entwickelt, um <strong>de</strong>n<br />

Elektrotechnikstu<strong>de</strong>nten <strong>de</strong>n Einstieg in die Programmierung gegenüber Algol und Fortran zu erleichtern. Am 1. Mai<br />

1964 um vier Uhr Ortszeit, New Hampshire, liefen die ersten bei<strong>de</strong>n BASIC-Programme simultan auf einem<br />

GE-225-Computer von General Electric im Keller <strong>de</strong>s Dartmouth College. BASIC wur<strong>de</strong> dann viele Jahre lang von<br />

immer neuen Informatikstu<strong>de</strong>nten an diesem College weiterentwickelt, zu<strong>de</strong>m propagierten Kemeny und Kurtz es ab<br />

<strong>de</strong>n späten 1960er Jahren an mehreren Schulen <strong>de</strong>r Gegend, die erstmals Computerkurse in ihr Unterrichtsprogramm<br />

aufnehmen wollten. BASIC war entsprechend <strong>de</strong>m Wunsch seiner „Väter“ für die Schulen kostenlos, im Gegensatz<br />

zu fast allen an<strong>de</strong>ren damals üblichen <strong>Programmiersprache</strong>n, die meist mehrere tausend Dollar kosteten. Viele <strong>de</strong>r<br />

damaligen großen Computerhersteller (wie etwa DEC) boten wegen <strong>de</strong>r leichten Erlernbarkeit <strong>de</strong>r Sprache und ihrer<br />

lizenzgebührfreien Verwendbarkeit bald BASIC-Interpreter für ihre neuen Minicomputer an; viele mittelständische<br />

Unternehmen, die damals erstmals in größerer Zahl Computer anschafften, kamen so mit BASIC in Berührung.<br />

Einige <strong>de</strong>r so mit BASIC vertrauten Schüler, Stu<strong>de</strong>nten und im Mittelstand tätigen Programmierer waren etwas<br />

später in <strong>de</strong>r kurzlebigen Bastelcomputer-Szene Mitte <strong>de</strong>r 1970er-Jahre aktiv, die <strong>de</strong>n kommerziellen


BASIC 16<br />

Microcomputern vorausging, und machten BASIC dort bekannt; kaum eine an<strong>de</strong>re damals verbreitete Hochsprache<br />

eignete sich so gut wie (ein abgespecktes) BASIC für <strong>de</strong>n extrem beschränkten Speicherplatz dieser ersten<br />

Microcomputer. Seinen Höhepunkt erlebte BASIC mit <strong>de</strong>n aus <strong>de</strong>n Bastelcomputern hervorgehen<strong>de</strong>n ersten<br />

Heimcomputern. En<strong>de</strong> <strong>de</strong>r 1970er- und Anfang <strong>de</strong>r 1980er-Jahre, die nahezu alle als Benutzeroberfläche und<br />

Programmierumgebung einen BASIC-Interpreter besaßen. Prominente Beispiele sind Sinclair ZX80 und ZX81, <strong>de</strong>r<br />

Tandy TRS 80, <strong>de</strong>r Schnei<strong>de</strong>r/Amstrad CPC, <strong>de</strong>r Apple II, die Atari 8-Bit Heimcomputer o<strong>de</strong>r <strong>de</strong>r meistverkaufte<br />

Heimcomputer aller Zeiten, <strong>de</strong>r Commodore 64. Aber auch die Vorläufer <strong>de</strong>r Personalcomputer, wie zum Beispiel<br />

von Philips, konnten mit CP/M-BASIC interpretierend o<strong>de</strong>r kompiliert arbeiten. Die weitaus meisten dieser BASICs<br />

stammten von Microsoft. BASIC war Microsofts erstes und in <strong>de</strong>n frühen Jahren wichtigstes Produkt, mehrere Jahre<br />

bevor mit MS-DOS das erste Betriebssystem dieser Firma auf <strong>de</strong>n Markt kam.<br />

Praktisch alle Besitzer von Heimcomputern hatten damals zumin<strong>de</strong>st Grundkenntnisse in BASIC, da die meisten<br />

Rechner beim Einschalten <strong>de</strong>n Basic-Interpreter starteten, welcher das La<strong>de</strong>n weiterer Programme unter<br />

Verwendung von BASIC-Befehlen erlaubte. Auch als Mitte <strong>de</strong>r 1980er Jahre grafische Benutzeroberflächen mit <strong>de</strong>m<br />

Macintosh, Amiga und <strong>de</strong>m Atari ST Einzug hielten, wur<strong>de</strong>n bei diesen weiter BASIC-Interpreter mitgeliefert. Auch<br />

gab es zusätzliche käufliche Versionen von BASIC-Dialekten. Mittels Compilern konnten einige BASIC-Dialekte<br />

direkt in <strong>de</strong>utlich schnellere Maschinenprogramme übersetzt bzw. unter Umgehung <strong>de</strong>s Interpreters direkt in<br />

Aufruflisten <strong>de</strong>r zugrun<strong>de</strong>liegen<strong>de</strong>n Interpreter-Funktionen übersetzt wer<strong>de</strong>n. Das seit 1981 verbreitete MS-DOS<br />

enthielt ebenfalls einen BASIC-Interpreter – zunächst BASICA bzw. GW-BASIC, später QBasic – <strong>de</strong>r in<br />

Deutschland an vielen Schulen eine Rolle im Unterricht <strong>de</strong>r Informatik spielte. Zu dieser Zeit setzte aber ein Wan<strong>de</strong>l<br />

ein, weil an<strong>de</strong>re Hochsprachen wie beispielsweise C für die Heimcomputer verfügbar wur<strong>de</strong>n o<strong>de</strong>r die Ressourcen<br />

<strong>de</strong>s jeweiligen Systems vom mitgelieferten BASIC-Interpreter nur unzulänglich unterstützt wur<strong>de</strong>n, was <strong>de</strong>n<br />

Programmierer dazu zwang, sich mit Assembler vertraut zu machen.<br />

Durch die Umsetzung als Interpreter-Sprache waren die frühen BASIC-Dialekte außer<strong>de</strong>m <strong>de</strong>utlich langsamer als die<br />

meisten an<strong>de</strong>ren, in <strong>de</strong>r Regel compilerbasierten Hochsprachen. Dies machte es beson<strong>de</strong>rs für zeitkritische<br />

Anwendungen unattraktiv bzw. führte zur Verwendung von Unterprogrammen in Maschinensprache, die oft mit<br />

POKE-Anweisungen von BASIC aus in <strong>de</strong>n Hauptspeicher geschrieben wur<strong>de</strong>n. Solche Programme waren natürlich<br />

nicht portabel. Deshalb und wegen <strong>de</strong>r Zersplitterung in unzählige Dialekte gilt BASIC als fast nicht portabel. Mit<br />

Einführung von Visual Basic ab Version 5 erzielte Microsoft <strong>de</strong>utliche Erfolge in Bezug auf die<br />

Verarbeitungsgeschwindigkeit, die aber <strong>de</strong>n zuvor verlorenen Bo<strong>de</strong>n nicht wie<strong>de</strong>r rückgewinnen konnten.<br />

Mit <strong>de</strong>r Zeit nahm <strong>de</strong>r Anteil <strong>de</strong>r Menschen zu, die einen Computer nur bedienen, aber nicht programmieren<br />

konnten. Hauptgrund dafür, dass BASIC zwischenzeitlich fast in Vergessenheit geraten war, war aber, dass nach<br />

<strong>de</strong>m Zusammenbruch <strong>de</strong>r großen Heim- und Bürocomputer-Hersteller Atari und Commodore <strong>de</strong>r Markt von<br />

Windows-PCs dominiert wur<strong>de</strong>. Bei diesen war kein BASIC-Interpreter inbegriffen, mit <strong>de</strong>m man<br />

Windows-Programme hätte schreiben können.<br />

Microsoft besann sich allerdings auf die eigene Tradition und führte das kommerzielle Visual Basic für die schnelle<br />

Entwicklung von Windows-basierten Anwendungen ein. Der Co<strong>de</strong> wur<strong>de</strong> nicht mehr zur Laufzeit interpretiert,<br />

son<strong>de</strong>rn von einem Compiler während <strong>de</strong>r Programmentwicklung in maschinennahen Byteco<strong>de</strong> beziehungsweise in<br />

späteren Versionen sogar in nativen Maschinenco<strong>de</strong> übersetzt. Durch diese Maßnahme konnte die Geschwindigkeit<br />

und die Stabilität <strong>de</strong>r Programmausführung <strong>de</strong>utlich gesteigert wer<strong>de</strong>n. Da auch die Geschwindigkeit <strong>de</strong>r Computer<br />

immer mehr zunahm, wur<strong>de</strong> Visual Basic außer<strong>de</strong>m für professionelle Entwicklungen immer interessanter. Mit<br />

Einführung von objektorientierten Sprachelementen wur<strong>de</strong> <strong>de</strong>r Versuch unternommen, Visual Basic mit an<strong>de</strong>ren<br />

objektorientierten <strong>Programmiersprache</strong>n wie C++ gleichziehen zu lassen.<br />

Basic wird in <strong>de</strong>n Office-Produkten von Microsoft und auch in einigen weiteren Anwendungen als VBA erfolgreich<br />

zur internen Makro-Programmierung eingesetzt. Viele Softwarehersteller bieten ebenfalls auf Basic basieren<strong>de</strong><br />

<strong>Programmiersprache</strong>n zur internen Makro-Programmierung ihrer Produkte an.


BASIC 17<br />

Beson<strong>de</strong>rs in Europa hat sich Visual Basic in <strong>de</strong>r Entwicklergemeinschaft nur in begrenztem Maße behaupten<br />

können. Es bot zwar eine bessere und viel einfachere Anbindung an Windows als je<strong>de</strong> an<strong>de</strong>re <strong>Programmiersprache</strong>,<br />

war aber langsamer. Erst mit <strong>de</strong>r Implementierung von Visual Basic innerhalb <strong>de</strong>s .NET-Systems gelang es, die<br />

strukturellen Schwächen von BASIC zu überwin<strong>de</strong>n. Gleichzeitig aber be<strong>de</strong>utete dieser Schritt das En<strong>de</strong> von Visual<br />

Basic als eigenständige <strong>Programmiersprache</strong>. Innerhalb <strong>de</strong>s .NET-Systems han<strong>de</strong>lt es sich bei Visual Basic .NET nur<br />

noch um eine Sprach-Implementierung neben an<strong>de</strong>ren. Mit Einführung <strong>de</strong>r JIT-Compiler und .NET als Basis für alle<br />

Microsoft-Sprachen besteht zwischen <strong>de</strong>r Verarbeitungsgeschwindigkeit von BASIC und an<strong>de</strong>ren<br />

<strong>Programmiersprache</strong>n kein großer Unterschied mehr.<br />

Das Ziel einer plattformunabhängigen <strong>Programmiersprache</strong> hat sich nie erfüllt. Im Gegensatz zum gut<br />

standardisierten C entstan<strong>de</strong>n von BASIC hun<strong>de</strong>rte Dialekte, die allesamt bis auf gewisse grundsätzliche<br />

Ähnlichkeiten inkompatibel zueinan<strong>de</strong>r sind. Die Gemeinsamkeiten beschränken sich auf die reine<br />

Datenverarbeitung, während je<strong>de</strong>r Hersteller im Zuge <strong>de</strong>r gleichzeitig verlaufen<strong>de</strong>n rasanten Hardware-Entwicklung<br />

seine eigenen, auf die jeweilige Hardware abgestimmten Befehle für Ein- und Ausgabe implementierte.<br />

<strong>Programmiersprache</strong><br />

Zu Beginn <strong>de</strong>r Basic-Programmierung bauten sich Befehle wie folgt auf:<br />

1. Zeilennummer Befehl [Parameter1, Parameter2 ...]<br />

2. Zeilennummer Variable1=Variable2<br />

Zeilennummer: Ein fortlaufen<strong>de</strong>r Wert, <strong>de</strong>r i. d. R. in 10er-Schritten ansteigt, damit später nachträglich Zeilen (mit<br />

Befehlen) hinzugefügt wer<strong>de</strong>n können, die dann dazwischen liegen<strong>de</strong> Nummern erhalten.<br />

Befehl: Ein beliebiger Befehl wie INPUT.<br />

Parameter: Ein o<strong>de</strong>r mehrere Werte, die einem Befehl übergeben wer<strong>de</strong>n können.<br />

Die Zuweisung von Werten ist in Beispiel 2 unten gezeigt. Die Variable, <strong>de</strong>r ein Wert zugewiesen wer<strong>de</strong>n soll, steht<br />

vor <strong>de</strong>m Gleichheitszeichen; <strong>de</strong>r Ausdruck, <strong>de</strong>ssen Wert <strong>de</strong>r Variablen zugewiesen wer<strong>de</strong>n soll, steht dahinter.<br />

Beispiele für übliche Befehle:<br />

INPUT [Text], Variable1 [,Variable2,...] - Per Eingabe wer<strong>de</strong>n <strong>de</strong>r/<strong>de</strong>n<br />

Variablen Werte zugewiesen auf <strong>de</strong>m Bildschirm steht Text<br />

PRINT [Text] - auf <strong>de</strong>m Bildschirm wird ein Text ausgegeben<br />

LOCATE X,Y - Legt die aktuelle Schreibposition <strong>de</strong>s Cursors fest.<br />

PSET X,Y - Zeichnet einen Punkt auf <strong>de</strong>m Bildschirm<br />

CLS - Löscht <strong>de</strong>n Anzeigebereich<br />

Programmierbeispiel<br />

Das folgen<strong>de</strong> Beispiel zeigt einen typischen BASIC-Co<strong>de</strong>. Viele Befehle, die sich in neueren Sprachen etabliert<br />

haben, gibt es bei <strong>de</strong>m im Beispiel verwen<strong>de</strong>ten BASIC noch nicht. Dadurch war <strong>de</strong>r Programmierer gezwungen,<br />

unstrukturiert zu programmieren. Ein Vorteil von BASIC war jedoch, dass es einfache Möglichkeiten zur<br />

Zeichenkettenverarbeitung bereithielt (siehe Zeile 70 - 90 im Beispielprogramm).<br />

10 INPUT "Geben Sie bitte Ihren Namen ein"; A$<br />

20 PRINT "Guten Tag, "; A$<br />

30 INPUT "Wie viele Sterne möchten Sie?"; S<br />

35 S$ = ""<br />

40 FOR I = 1 TO S<br />

50 S$ = S$ + "*"


BASIC 18<br />

55 NEXT I<br />

60 PRINT S$<br />

70 INPUT "Möchten Sie noch mehr Sterne?"; Q$<br />

80 IF LEN(Q$) = 0 GOTO 70<br />

90 L$ = LEFT$(Q$, 1)<br />

100 IF (L$ = "J") OR (L$ = "j") THEN GOTO 30<br />

110 PRINT "Auf Wie<strong>de</strong>rsehen";<br />

120 FOR I = 1 TO 200<br />

130 PRINT A$; " ";<br />

140 NEXT I<br />

150 PRINT<br />

Standards<br />

• ANSI. ISO Standard for Minimal BASIC (ISO/IEC 6373:1984 “DATA PROCESSING—PROGRAMMING<br />

LANGUAGES—MINIMAL BASIC”)<br />

• ANSI Standard. ISO Standard für Vollbasic (ISO/IEC 10279:1991 “INFORMATION<br />

TECHNOLOGY—PROGRAMMING LANGUAGES—FULL BASIC”)<br />

• ANSI Ad<strong>de</strong>ndum Defining Modules (X3.113 INTERPRETATIONS-1992 “BASIC TECHNICAL<br />

INFORMATION BULLETIN # 1 INTERPRETATIONS OF ANSI 03.113-1987”)<br />

• ISO Ad<strong>de</strong>ndum Defining Modules (ISO/IEC 10279:1991/ Amd 1:1994 “MODULES AND SINGLE<br />

CHARACTER INPUT ENHANCEMENT”)<br />

Die meisten existieren<strong>de</strong>n Interpreter und Compiler halten sich allerdings nicht o<strong>de</strong>r nur teilweise an diese<br />

Vorgaben.<br />

Literatur<br />

• Dr. Hans-Joachim Sacht: BASIC-Dialekte. Humboldt-Taschenbuchverlag, München 1985, ISBN 3-581-66524-7.<br />

• Rü<strong>de</strong>ger Baumann: BASIC – Eine Einführung in das Programmieren. Klett Verlag, Stuttgart 1980 ISBN<br />

3-12-717700-3<br />

• Dr. Hans-Joachim Sacht: <strong>Programmiersprache</strong> BASIC – Schritt für Schritt. Humboldt-Taschenbuchverlag,<br />

München 1983 ISBN 3-581-66456-9<br />

Weblinks<br />

• Offizielle <strong>de</strong>utsche KBasic-Seite [1]<br />

• DseWiki: Deutsches Software Entwickler Wiki [2]<br />

• BASIC-Tutorial für absolute Neulinge [3]<br />

• Basic Tutorial für Einsteiger [4]<br />

• Übersicht über die BASIC-Befehle [5]<br />

• BASIC [6]<br />

• GAMBAS [7]<br />

• Die größte <strong>de</strong>utsche Seite zu QBasic [8]<br />

• Liste von BASIC-Compilern mit Screenshots [9] (englisch)


BASIC 19<br />

Referenzen<br />

[1] http:/ / www. KBasic. <strong>de</strong><br />

[2] http:/ / www. wikiservice. at/ dse/ wiki. cgi?SpracheBasic<br />

[3] http:/ / www. o-bizz. <strong>de</strong>/ qbtuts/ omastut/ in<strong>de</strong>x. htm<br />

[4] http:/ / www. tutorials. at<br />

[5] http:/ / www. chemie. fu-berlin. <strong>de</strong>/ lehre/ edv/ basic. html<br />

[6] http:/ / www. ma<strong>de</strong>asy. <strong>de</strong>/ 2/ basic. htm<br />

[7] http:/ / www. ma<strong>de</strong>asy. <strong>de</strong>/ 7/ gambas. htm<br />

[8] http:/ / www. qbasic. <strong>de</strong><br />

[9] http:/ / basic. mindteq. com<br />

Borland Delphi<br />

1. WEITERLEITUNG Embarca<strong>de</strong>ro Delphi<br />

C (<strong>Programmiersprache</strong>)<br />

Paradigmen: imperativ, strukturiert<br />

Erscheinungsjahr: 1972<br />

Entwickler: Dennis Ritchie & Bell Labs<br />

wichtige Implementierungen: GCC, MSVC, Borland C, Portland Group, Intel<br />

Einflüsse: B (BCPL,CPL), ALGOL 68, Assembler<br />

C<br />

Beeinflusste: awk, C++, C#, Objective-C, D, Java, JavaScript, Perl, PHP<br />

C ist eine imperative <strong>Programmiersprache</strong>, die <strong>de</strong>r Informatiker Dennis Ritchie in <strong>de</strong>n frühen 1970er Jahren an <strong>de</strong>n<br />

Bell Laboratories für das Betriebssystem Unix entwickelte. Seit<strong>de</strong>m ist sie auf vielen Computersystemen verbreitet.<br />

Die Anwendungsbereiche von C sind sehr verschie<strong>de</strong>n. Es wird zur System- und Anwendungsprogrammierung<br />

eingesetzt. Die grundlegen<strong>de</strong>n Programme aller Unix-Systeme und die Systemkerne vieler Betriebssysteme sind in C<br />

programmiert. Zahlreiche Sprachen, wie C++, Objective-C, C#, Java, PHP o<strong>de</strong>r Perl orientieren sich an <strong>de</strong>r Syntax<br />

und an<strong>de</strong>ren Eigenschaften von C.<br />

Überblick<br />

C ist eine <strong>Programmiersprache</strong>, die auf fast allen Computersystemen zur Verfügung steht. Sie zählt zu <strong>de</strong>n<br />

sogenannten prozeduralen <strong>Programmiersprache</strong>n. Um <strong>de</strong>n Wildwuchs zahlreicher Dialekte einzudämmen, wur<strong>de</strong> C<br />

mehrfach standardisiert (C89, C95, C99, ISO-C). Abgesehen vom Mikrocontrollerbereich, wo eigene Dialekte<br />

existieren, sind die meisten aktuellen PC-/Server-Implementierungen eng an <strong>de</strong>n Standard angelehnt; eine<br />

vollständige Implementierung aktueller Standards ist aber selten. In <strong>de</strong>n meisten C-Systemen mit Laufzeitumgebung<br />

steht auch die genormte Standard C Library zur Verfügung. Dadurch können C-Programme, die keine sehr<br />

hardware-nahe Programmierung enthalten, in <strong>de</strong>r Regel gut auf an<strong>de</strong>re Zielsysteme portiert wer<strong>de</strong>n. Konzeptionell<br />

ist C auf einfache Kompilierbarkeit ausgelegt. Die Compiler erzeugen in <strong>de</strong>r Regel aber auch nur wenig Co<strong>de</strong> zur<br />

Gewährleistung <strong>de</strong>r Sicherheit zur Laufzeit <strong>de</strong>r Programme.<br />

Die Verbreitung von C ist hoch, und viele Programmierschnittstellen für Anwendungsprogramme wer<strong>de</strong>n in Form<br />

von C-Schnittstellen implementiert.


C (<strong>Programmiersprache</strong>) 20<br />

Geschichte<br />

Frühe Entwicklungen<br />

C wur<strong>de</strong> 1971–1973 von Dennis Ritchie in <strong>de</strong>n Bell Laboratories für die Programmierung <strong>de</strong>s damals neuen<br />

UNIX-Betriebssystems entwickelt. Er stützte sich dabei auf die <strong>Programmiersprache</strong> B, die Ken Thompson in <strong>de</strong>n<br />

Jahren 1969/70 geschrieben hatte. B wie<strong>de</strong>rum geht auf die von Martin Richards Mitte <strong>de</strong>r 1960er-Jahre entwickelte<br />

<strong>Programmiersprache</strong> BCPL zurück. Ritchie schrieb auch <strong>de</strong>n ersten Compiler für C. 1973 war die Sprache so weit<br />

ausgereift, dass man nun <strong>de</strong>n Unix-Kernel für <strong>de</strong>n PDP-11 neu in C schreiben konnte.<br />

K&R C<br />

1978 veröffentlichten Brian W. Kernighan und Dennis Ritchie die erste Auflage von The C Programming Language<br />

(<strong>de</strong>utsch: Programmieren in C). Die darin beschriebene Fassung von C, die nach <strong>de</strong>n Buchautoren „K&R C“ genannt<br />

wird, erweiterte die ursprüngliche Sprache um neue Schlüsselwörter wie long int o<strong>de</strong>r unsigned int und führte<br />

erstmals die I/O-Standardbibliothek ein. Bis zur Standardisierung <strong>de</strong>r Sprache diente die von Kernighan und Ritchie<br />

geschriebene Spezifikation als informelle Referenz für das Programmieren in C.<br />

Normen und Standards<br />

→ Hauptartikel: Varianten <strong>de</strong>r <strong>Programmiersprache</strong> C<br />

C verbreitete sich rasch und wur<strong>de</strong> laufend weiterentwickelt. Das führte dazu, dass das von Kernighan und Ritchie<br />

beschriebene C nicht mehr <strong>de</strong>m C entsprach, das von <strong>de</strong>n Compilern unterstützt wur<strong>de</strong>. Um eine Normierung <strong>de</strong>r<br />

Sprache zu erreichen, setzte das American National Standards Institute (ANSI) 1983 ein Komitee namens X3J11 ein,<br />

das 1989 schließlich die Norm ANSI X3.159-1989 Programming Language C verabschie<strong>de</strong>te. Ein Jahr später<br />

übernahm die ISO diesen Standard (mit kleinen Än<strong>de</strong>rungen) als C90. 1995 veröffentlichte die ISO eine Ergänzung<br />

zum Standard (C95) und 1999 schließlich ISO/IEC 9899:1999. Mit diesem Standard, <strong>de</strong>r als C99 bekannt ist, flossen<br />

auch aus C++ bekannte Erweiterungen zurück in die Sprache C.<br />

Verwendung<br />

Das Haupteinsatzgebiet von C liegt in <strong>de</strong>r Systemprogrammierung, einschließlich <strong>de</strong>r Erstellung von<br />

Betriebssystemen und <strong>de</strong>r Programmierung von eingebetteten Systemen. Der Grund liegt in <strong>de</strong>r Kombination von<br />

erwünschten Charakteristiken wie Portabilität und Effizienz mit <strong>de</strong>r Möglichkeit, Hardware direkt anzusprechen und<br />

dabei niedrige Anfor<strong>de</strong>rungen an die Laufzeitumgebung zu haben.<br />

Auch Programme für Endanwen<strong>de</strong>r wer<strong>de</strong>n oft in C erstellt.<br />

Wegen <strong>de</strong>r relativ hohen Geschwindigkeit und geringen Co<strong>de</strong>größe wer<strong>de</strong>n Compiler, Programmbibliotheken und<br />

Interpreter an<strong>de</strong>rer höherer <strong>Programmiersprache</strong>n (wie zum Beispiel die Java Virtual Machine) oft in C<br />

implementiert.<br />

C wird als Zwischenco<strong>de</strong> einiger Implementierungen höherer <strong>Programmiersprache</strong>n verwen<strong>de</strong>t. Dabei wird diese<br />

zuerst in C-Co<strong>de</strong> übersetzt, <strong>de</strong>r dann kompiliert wird. Dieser Ansatz wird entwe<strong>de</strong>r verwen<strong>de</strong>t, um die Portabilität zu<br />

erhöhen (C-Compiler existieren für nahezu je<strong>de</strong> Plattform) o<strong>de</strong>r aus Bequemlichkeit, da kein maschinenspezifischer<br />

Co<strong>de</strong>generator entwickelt wer<strong>de</strong>n muss. Einige Compiler, die C auf diese Art benutzen, sind EiffelStudio, Esterel,<br />

Gambit, <strong>de</strong>r Glasgow Haskell Compiler, einige LISP-Compiler, Lush, PyPy, Sather, Squeak und Vala.<br />

C wur<strong>de</strong> als <strong>Programmiersprache</strong> und nicht als Zielsprache für Compiler entworfen. Als Zwischensprache ist es<br />

daher eher schlecht geeignet. Das führte zu C-basierten Zwischensprachen wie C--.<br />

C wird oft für die Erstellung von Anbindungen genutzt (zum Beispiel Java Native Interface). Diese Anbindungen<br />

erlauben es Programmen, die in einer an<strong>de</strong>ren Hochsprache geschrieben sind, Funktionen aufzurufen, die in C<br />

implementiert wur<strong>de</strong>n. Der umgekehrte Weg ist oft ebenfalls möglich und kann verwen<strong>de</strong>t wer<strong>de</strong>n, um in C


C (<strong>Programmiersprache</strong>) 21<br />

geschriebene Programme mit einer an<strong>de</strong>ren Sprache zu erweitern (zum Beispiel mod perl).<br />

Eigenschaften<br />

• C gehört zu <strong>de</strong>n imperativen <strong>Programmiersprache</strong>n.<br />

• C besitzt eine relativ kleine Menge an Schlüsselwörtern. Die Anzahl <strong>de</strong>r Schlüsselwörter ist so gering, weil viele<br />

Aufgaben, welche in an<strong>de</strong>ren Sprachen über eigene Schlüsselwörter realisiert wer<strong>de</strong>n, über einzubin<strong>de</strong>n<strong>de</strong><br />

Bibliotheksroutinen (zum Beispiel die Ein- und Ausgabe auf <strong>de</strong>r Konsole o<strong>de</strong>r Dateien und die Verwaltung <strong>de</strong>s<br />

dynamischen Speichers) o<strong>de</strong>r über spezielle syntaktische Konstrukte (zum Beispiel Variablen<strong>de</strong>klarationen)<br />

realisiert wer<strong>de</strong>n.<br />

• C ermöglicht direkte Speicherzugriffe und sehr hardwarenahe Konstrukte. Es eignet sich daher gut zur<br />

Systemprogrammierung. Sollen Programme portierbar sein, sollte von diesen Möglichkeiten aber möglichst<br />

wenig Gebrauch gemacht wer<strong>de</strong>n.<br />

• C schränkt direkte Speicherzugriffe kaum ein. Dadurch kann <strong>de</strong>r Compiler (an<strong>de</strong>rs als zum Beispiel in Pascal) nur<br />

sehr eingeschränkt bei <strong>de</strong>r Fehlersuche helfen. Aus diesem Grund ist C für sicherheitskritische Anwendungen<br />

(Medizintechnik, Verkehrsleittechnik, Raumfahrt) weniger geeignet.<br />

• C enthält einige sicherheitskritische Funktionen; so überschreibt zum Beispiel gets(), eine Funktion <strong>de</strong>r<br />

Standardbibliothek, frem<strong>de</strong> Speicherbereiche (Pufferüberlauf), wenn es auf eine unpassen<strong>de</strong> (zu lange) Eingabe<br />

stößt. Der Fehler ist innerhalb von C we<strong>de</strong>r bemerk- noch abfangbar. Um <strong>de</strong>n großen Vorteil von C – die<br />

Existenz zahlreicher älterer Quellco<strong>de</strong>s – nicht zu verlieren, unterstützen auch aktuelle Implementierungen<br />

weiterhin diese und ähnliche Funktionen, warnen jedoch in <strong>de</strong>r Regel, wenn sie beim Übersetzen im Quelltext<br />

benutzt wer<strong>de</strong>n.<br />

• Historisch bedingt existieren in C keine Funktionen zur positionierten Ausgabe. Es existieren jedoch zahlreiche<br />

Bibliotheken, die für das jeweilige Zielsystem eine solche Ausgabe ermöglichen.<br />

• C verwen<strong>de</strong>t im Quellco<strong>de</strong> einige Son<strong>de</strong>rzeichen (zum Beispiel „{“, „|“ und „&“), die in <strong>de</strong>r Vergangenheit nicht<br />

auf allen Zielsystemen zur Verfügung stan<strong>de</strong>n. Das hat dazu geführt, dass C sich auf jenen Systemen nicht<br />

verbreiten konnte. C bietet zwar eine Alternativschreibweise über Trigraphen, was jedoch die Lesbarkeit <strong>de</strong>s<br />

Quelltextes enorm verschlechtert.<br />

• Eine Modularisierung in C erfolgt auf Dateiebene. Eine Datei bil<strong>de</strong>t eine Übersetzungseinheit; intern benötigte<br />

Funktionen und Variablen können so vor an<strong>de</strong>ren Dateien verborgen wer<strong>de</strong>n. Die Bekanntgabe <strong>de</strong>r öffentlichen<br />

Funktionsschnittstellen erfolgt mit sogenannten Hea<strong>de</strong>r-Dateien. Damit verfügt C über ein schwach ausgeprägtes<br />

[1] [2]<br />

Modulkonzept.<br />

Die <strong>Programmiersprache</strong> C wur<strong>de</strong> mit <strong>de</strong>m Ziel entwickelt, eine echte Sprachabstraktion zur Assemblersprache zu<br />

implementieren. Es sollte eine direkte Zuordnung zu wenigen Maschineninstruktionen geben, um die Abhängigkeit<br />

von einer Laufzeitumgebung zu minimieren. Als Resultat dieses Designs ist es möglich, C-Co<strong>de</strong> auf einer sehr<br />

hardwarenahen Ebene zu schreiben, analog zu Assemblerbefehlen. Die Portierung eines C-Compilers auf eine neue<br />

Prozessorplattform ist, verglichen mit an<strong>de</strong>ren Sprachen, wenig aufwändig. Beispielsweise ist <strong>de</strong>r freie<br />

GNU-C-Compiler (gcc) für eine Vielzahl unterschiedlicher Prozessoren und Betriebssysteme verfügbar. Für <strong>de</strong>n<br />

Entwickler be<strong>de</strong>utet das, dass unabhängig von <strong>de</strong>r Zielplattform fast immer auch ein C-Compiler existiert. C<br />

unterstützt damit wesentlich die Portierbarkeit von Programmen, sofern <strong>de</strong>r Programmierer auf Assemblerteile im<br />

Quelltext und/o<strong>de</strong>r hardwarespezifische C-Konstrukte verzichten kann. Bei <strong>de</strong>r Mikrocontroller-Programmierung ist<br />

C die mit Abstand am häufigsten verwen<strong>de</strong>te Hochsprache.


C (<strong>Programmiersprache</strong>) 22<br />

Datentypen<br />

Je<strong>de</strong>r Ausdruck und je<strong>de</strong>r Bezeichner in C hat einen bestimmten Datentyp. C unterschei<strong>de</strong>t zwischen:<br />

• Objekttypen (object types)<br />

• Funktionstypen (function types)<br />

• unvollständige Typen (incomplete types)<br />

Außer<strong>de</strong>m wird zwischen Basisdatentypen (basic types) und abgeleiteten Typen (<strong>de</strong>rived types) unterschie<strong>de</strong>n.<br />

Basisdatentypen<br />

C verfügt über 19 Basisdatentypen (eng. basic types). Diese wer<strong>de</strong>n in Datentypen für Ganzzahl-, und<br />

Gleitkommazahlen aufgeteilt. Die verschie<strong>de</strong>nen Typen ermöglichen bei unterschiedlichem Speicherbedarf das<br />

Speichern von Daten aus einem unterschiedlich großen maximalen Wertebereich.<br />

• void ist <strong>de</strong>r leere Datentyp. Er kann keine Werte aufnehmen. void ist ein unvollständiger Typ, darum können<br />

keine Variablen von diesem Typ <strong>de</strong>klariert wer<strong>de</strong>n. Ein Rückgabetyp void be<strong>de</strong>utet, dass die Funktion keinen<br />

Wert zurückgibt. Eine Variable vom Typ void * zeigt auf Objekte mit unspezifiziertem Typ.<br />

• _Bool dient zur Repräsentation von Wahrheitswerten. Er existiert als eigener Datentyp seit C99 und kann nur die<br />

Werte 0 und 1 aufnehmen. Die Größe eines _Bools ist plattformabhängig und kann größer als ein char sein!<br />

• char und wchar_t dienen zur Speicherung alphanumerischer Daten. Sie wer<strong>de</strong>n in C als Ganzzahl-Datentypen<br />

(mit beson<strong>de</strong>ren Eigenschaften) behan<strong>de</strong>lt. Außer<strong>de</strong>m repräsentiert ein char die kleinste adressierbare Einheit in<br />

C. Die Größe von Objekten und Typen wird stets als ganzzahliges Vielfache von einem char angegeben.<br />

• int ist <strong>de</strong>r Standarddatentyp für ganzzahlige Werte. Für eventuell größere o<strong>de</strong>r kleinere Wertebereiche existieren<br />

die Typen char, short int, long int und (seit C99) long long int. Der Verzicht auf festgeschriebene Größen und<br />

Wertebereiche, um möglichst viele Architekturen zu unterstützen, wird durch <strong>de</strong>finierte minimale Wertebereiche<br />

und die folgen<strong>de</strong> feste Relation abgemil<strong>de</strong>rt:<br />

signed char ≤ short int ≤ int ≤ long int ≤ long long int.<br />

(„≤“ be<strong>de</strong>utet dabei, dass <strong>de</strong>r rechts stehen<strong>de</strong> Typ alle Werte <strong>de</strong>s links stehen<strong>de</strong>n Typs aufnehmen kann.)<br />

Zu all diesen Typen existieren noch vorzeichenlose Typen, die durch ein vorangestelltes unsigned notiert<br />

wer<strong>de</strong>n. Diese benötigen <strong>de</strong>n gleichen Speicherplatz wie ihre entsprechen<strong>de</strong>n vorzeichenbehafteten Typen.<br />

Optional können die vorzeichenbehafteten Typen auch durch ein vorangestelltes signed gekennzeichnet<br />

wer<strong>de</strong>n und das Schlüsselwort int kann bei <strong>de</strong>n mehrteiligen Typnamen entfallen.<br />

Der Typ char ist ein eigener Datentyp, <strong>de</strong>r jedoch – je nach Plattform – entwe<strong>de</strong>r zu signed char o<strong>de</strong>r zu<br />

unsigned char ein i<strong>de</strong>ntisches Bit-Layout und i<strong>de</strong>ntische Rechenregeln besitzen muss.<br />

Für je<strong>de</strong>n Typ schreibt <strong>de</strong>r Standard eine Min<strong>de</strong>stgröße vor; In einer Implementierung können die Werte auch<br />

größer sein. Die tatsächliche Größe eines Typs ist in <strong>de</strong>r Hea<strong>de</strong>rdatei abgelegt. INT_MAX ersetzt<br />

<strong>de</strong>r Präprozessor beispielsweise durch <strong>de</strong>n Wert, <strong>de</strong>n <strong>de</strong>r Typ int maximal annehmen kann. [3]<br />

• float, double und long double sind die drei Datentypen für Gleitkommazahlen. Auf <strong>de</strong>n meisten Architekturen<br />

entsprechen float und double <strong>de</strong>n IEEE-Datentypen. Welchen Wertebereich ein Gleitkommazahltyp auf einer<br />

Implementierung einnimmt, ist ebenfalls plattformabhängig; <strong>de</strong>r Standard legt nur wie<strong>de</strong>r fest, dass <strong>de</strong>r<br />

Wertebereich von float nach double und von double nach long double jeweils entwe<strong>de</strong>r gleich bleibt o<strong>de</strong>r<br />

zunimmt. Die genauen Eigenschaften und Wertebereiche auf <strong>de</strong>r benutzten Architektur können über die<br />

Hea<strong>de</strong>rdatei ermittelt wer<strong>de</strong>n. [4]<br />

Zusätzlich existieren seit C99 noch drei Gleitkomma-Datentypen für komplexe Zahlen, welche aus <strong>de</strong>n drei<br />

Gleitkommatypen abgeleitet sind: float _Complex, double _Complex und long double _Complex. Ebenfalls in C99<br />

eingeführt wur<strong>de</strong>n Gleitkomma-Datentypen für rein imaginäre Zahlen: float _Imaginary, double _Imaginary und<br />

long double _Imaginary. Diese 3 Typen sind jedoch auch in einer hosted-Umgebung optional, während die


C (<strong>Programmiersprache</strong>) 23<br />

_Complex-Typen nur in einer freestanding-Umgebung entfallen dürfen. [5]<br />

Abgeleitete Typen<br />

Aus <strong>de</strong>n Basisdatentypen und bereits <strong>de</strong>klarierten abgeleiteten Typen lassen sich beliebig viele weitere Typen<br />

ableiten. Abgeleitete Typen wer<strong>de</strong>n wie folgt aufgeteilt:<br />

Fel<strong>de</strong>r (array types)<br />

Zu je<strong>de</strong>m Typ T existieren Feldtypen <strong>de</strong>rart „Feld von n Elementen vom Typ T“, die dann T[n] geschrieben<br />

wer<strong>de</strong>n.<br />

Zeiger (pointer types)<br />

Zu je<strong>de</strong>m Typ T existiert ein Typ „Zeiger auf T“, <strong>de</strong>r T* geschrieben wird.<br />

Funktionen (function types)<br />

Zu je<strong>de</strong>m Typ T existieren Typen „Funktion, die ein T zurückgibt“. Dies wird durch Anhängen von ()<br />

gekennzeichnet, wobei in die Klammern ggf. noch die Typen <strong>de</strong>r Funktionsparameter geschrieben wer<strong>de</strong>n.<br />

zusammengesetzte Typen (structure types und union types)<br />

Hierbei wer<strong>de</strong>n mehrere Objekte zu einem neuen Typ zusammengefasst.<br />

Deklarationen<br />

Bevor Variablen, Typen und Funktionen in C verwen<strong>de</strong>t wer<strong>de</strong>n können, müssen sie <strong>de</strong>klariert wer<strong>de</strong>n. Eine so<br />

<strong>de</strong>klarierte Variable, Typ o<strong>de</strong>r Funktion erhält einen Namen (Bezeichner). Die Vergabe von Bezeichnern ist an<br />

bestimmte Regeln gebun<strong>de</strong>n:<br />

• Das erste Zeichen eines Variablennamens muss ein Buchstabe o<strong>de</strong>r Unterstrich sein.<br />

• Die folgen<strong>de</strong>n Zeichen dürfen nur die Buchstaben A–Z und a–z, Ziffern und <strong>de</strong>r Unterstrich sein.<br />

• Ein Bezeichner darf kein Schlüsselwort <strong>de</strong>r Sprache – zum Beispiel if, void und auto – sein.<br />

Seit C95 sind auch Zeichen aus <strong>de</strong>m Universal Character Set in Bezeichnern erlaubt, sofern die Implementierung es<br />

unterstützt. Die erlaubten Zeichen sind in Anhang D <strong>de</strong>s ISO-C-Standards aufgelistet. Vereinfacht gesagt, sind es all<br />

jene Zeichen, die in irgen<strong>de</strong>iner Sprache als Buchstabe o<strong>de</strong>r buchstabenähnliches Zeichen Verwendung fin<strong>de</strong>n. Im<br />

Quelltext lassen sich diese Zeichen plattformunabhängig über eine Escape-Sequenz wie folgt ersetzen:<br />

• \uXXXX (wobei X für eine Hexa<strong>de</strong>zimalziffer steht) für Zeichen mit einem Co<strong>de</strong> von 00A0 hex bis FFFF hex .<br />

• \UXXXXXXXX für alle Zeichen mit einem Co<strong>de</strong> ≥00A0 hex .<br />

Das folgen<strong>de</strong> Beispiel in <strong>de</strong>r <strong>Programmiersprache</strong> C <strong>de</strong>klariert und <strong>de</strong>finiert die Namen variable_1 und<br />

variable_2 als Variablen vom Typ Integer:<br />

void beispiel1()<br />

{<br />

}<br />

int variable_1, variable_2;<br />

Sprach<strong>de</strong>sign<br />

Ein C-Programm wird durch <strong>de</strong>n sogenannten Linker o<strong>de</strong>r Bin<strong>de</strong>r aus Objektco<strong>de</strong> zum ausführbaren<br />

Computerprogramm gebun<strong>de</strong>n. Dabei können mehrere Objektco<strong>de</strong>dateien zu einem Programm zusammengefasst<br />

wer<strong>de</strong>n. Die Objektco<strong>de</strong>dateien ihrerseits wer<strong>de</strong>n durch <strong>de</strong>n Compiler aus Textdateien erzeugt (übersetzt), die eine<br />

Anzahl Funktions- und Variablen<strong>de</strong>finitionen enthalten. Neben Programmen kann man aber auch noch Bibliotheken<br />

erstellen. Diese wer<strong>de</strong>n ähnlich wie Programme gebun<strong>de</strong>n o<strong>de</strong>r zu einem Archiv zusammengefasst. Diese<br />

Bibliotheken können dann in einem späteren Bin<strong>de</strong>vorgang wie<strong>de</strong>rum zu einem Programm hinzugebun<strong>de</strong>n wer<strong>de</strong>n.


C (<strong>Programmiersprache</strong>) 24<br />

Auf diese Weise kann man verhin<strong>de</strong>rn, dass für je<strong>de</strong>s zu erzeugen<strong>de</strong> Programm unzählige (in größeren Systemen<br />

durchaus hun<strong>de</strong>rte bis tausen<strong>de</strong>) unverän<strong>de</strong>rliche Objektco<strong>de</strong>dateien immer wie<strong>de</strong>r erneut gebun<strong>de</strong>n wer<strong>de</strong>n müssen.<br />

Das Design <strong>de</strong>r <strong>Programmiersprache</strong>, die Technik <strong>de</strong>s Linkens und verschie<strong>de</strong>ne zu festen Sprachelementen<br />

gewor<strong>de</strong>ne Funktionen und Festlegungen sind eng mit <strong>de</strong>m Design unixoi<strong>de</strong>r Betriebssysteme verbun<strong>de</strong>n, so die Art<br />

und Weise <strong>de</strong>r Signalbearbeitung, die Ein- und Ausgabe mit Standard-Datenströmen (Streams) und das Verfahren<br />

<strong>de</strong>s Startens und Been<strong>de</strong>ns eines Programms.<br />

Beispielprogramm in C<br />

Der folgen<strong>de</strong> Quelltext stellt ein einfaches C-Programm dar, das die Textzeile Hallo Welt!, gefolgt von einem<br />

Zeilenumbruch, ausgibt. Dieses Beispiel folgt <strong>de</strong>n Vorgaben <strong>de</strong>s ANSI-C-Standards; an<strong>de</strong>re Versionen dieses<br />

Programms sind im Artikel Hallo-Welt-Programm beschrieben.<br />

#inclu<strong>de</strong> <br />

#inclu<strong>de</strong> <br />

int main(void)<br />

{<br />

printf("Hallo Welt!\n");<br />

return EXIT_SUCCESS;<br />

} /* end main() */<br />

Erläuterungen<br />

In <strong>de</strong>r ersten Zeile ermöglicht die Präprozessoranweisung #inclu<strong>de</strong> die spätere Verwendung von<br />

Funktionen aus <strong>de</strong>r Ein-/Ausgabe-Bibliothek stdio (auch „standard-input/output“ genannt). Diese inclu<strong>de</strong>-Anweisung<br />

veranlasst <strong>de</strong>n C-Präprozessor, vor <strong>de</strong>r Übersetzung die Hea<strong>de</strong>rdatei stdio.h in <strong>de</strong>n Quelltext zu kopieren, die unter<br />

an<strong>de</strong>rem eine Deklaration <strong>de</strong>r weiter unten verwen<strong>de</strong>ten Ausgabefunktion printf enthält. In <strong>de</strong>r zweiten Zeile wird<br />

die Hea<strong>de</strong>rdatei stdlib.h eingebun<strong>de</strong>n, die anstatt eines festen numerischen Werts die symbolische Konstante<br />

EXIT_SUCCESS <strong>de</strong>finiert, damit die erfolgreiche Programmausführung <strong>de</strong>m Aufrufer plattformunabhängig<br />

signalisiert wer<strong>de</strong>n kann (siehe Zeile 7 <strong>de</strong>s Programms). Inclu<strong>de</strong>-Anweisungen können zwar an je<strong>de</strong>r Stelle im<br />

Quelltext eingefügt wer<strong>de</strong>n, meist wer<strong>de</strong>n sie jedoch an <strong>de</strong>n Anfang eines Programmtextes gestellt, um die<br />

Übersichtlichkeit zu erhöhen.<br />

In <strong>de</strong>r vierten Zeile beginnt das eigentliche Programm mit <strong>de</strong>r Definition <strong>de</strong>r Funktion main. Sie ist die<br />

Einstiegsfunktion eines C-Programms. main wird automatisch als erste Funktion aufgerufen. Anfang und En<strong>de</strong> <strong>de</strong>r<br />

Funktion main wer<strong>de</strong>n durch die bei<strong>de</strong>n geschweiften Klammern markiert.<br />

Die erste Anweisung innerhalb <strong>de</strong>r Funktion main ruft die Funktion printf auf. Die zweite Anweisung ist die<br />

Sprunganweisung return EXIT_SUCCESS;. Diese legt <strong>de</strong>n Rückgabewert von main fest. Damit wird <strong>de</strong>r<br />

„Erfolgsstatus“ <strong>de</strong>s ausgeführten Programms zum Ausdruck gebracht. Der Wert EXIT_SUCCESS be<strong>de</strong>utet hier<br />

fehlerfreie Ausführung.<br />

In <strong>de</strong>r letzten Zeile folgt auf die schließen<strong>de</strong> geschweifte Klammer ein Kommentar, eingeschlossen durch die<br />

Zeichenfolgen /* und */. Kommentare wer<strong>de</strong>n bei <strong>de</strong>r Übersetzung ignoriert; sie sind in erster Linie für <strong>de</strong>n<br />

menschlichen Leser gedacht, können aber auch von automatischen Software-Dokumentationswerkzeugen<br />

ausgewertet wer<strong>de</strong>n.


C (<strong>Programmiersprache</strong>) 25<br />

Die Standardbibliothek<br />

Die C-Standardbibliothek ist integraler Bestandteil einer gehosteten C-Implementation. Sie enthält unter an<strong>de</strong>rem<br />

Makros und Funktionen, die mittels <strong>de</strong>r Standard-Hea<strong>de</strong>r-Datei verfügbar gemacht wer<strong>de</strong>n. Auf freistehen<strong>de</strong>n<br />

Implementationen dagegen kann <strong>de</strong>r Umfang <strong>de</strong>r Standardbibliothek eingeschränkt sein.<br />

Literatur<br />

• Brian W. Kernighan, Dennis Ritchie: Programmieren in C, Hanser Fachbuch, 2. Auflage, 1990, ISBN<br />

3-446-15497-3.<br />

• Samuel P. Harbison III, Guy Lewis Steele junior: C a reference manual, Prentice Hall, 2002, ISBN<br />

0-13-089592-X.<br />

Weblinks<br />

• Ritchie über die Geschichte von C [6] (englisch)<br />

• Abhandlung über die Urzeiten von C und Compilerversionen von 1972/73 [7] (englisch)<br />

• Programming in C – umfangreiche Linksammlung [8] (englisch)<br />

• FAQ [9] <strong>de</strong>r Newsgroup <strong>de</strong>.comp.lang.c<br />

• C von A bis Z [10] Onlinebuch Einstieg in C von Jürgen Wolf<br />

Referenzen<br />

[1] Scheler, Stilkerich, Schrö<strong>de</strong>r-Preikschat: Komponenten/Module (PDF) (http:/ / www4. informatik. uni-erlangen. <strong>de</strong>/ Lehre/ SS07/ V_EZS2/<br />

Skript/ 05_Komponenten. pdf)<br />

[2] Bertrand Meyer: Objektorientierte Softwareentwicklung. Hanser, Wien, München; Prentice Hall Internat. 1990, S. 406 ISBN 3-446-15773-5.<br />

[3] Klaus Schmaranz: Softwareentwicklung in C, Springer, 2001, Seite 29 ff.<br />

[4] Helmut Herold und Wolfgang Unger: "C"-Gesamtwerk, te-wi Verlag, 2. Auflage, München, 1992, 2-5 bis 2-7<br />

[5] ISO/IEC 9899:1999 Kapitel 7.6.2 Absatz 3<br />

[6] http:/ / cm. bell-labs. com/ cm/ cs/ who/ dmr/ chist. html<br />

[7] http:/ / cm. bell-labs. com/ cm/ cs/ who/ dmr/ primevalC. html<br />

[8] http:/ / www. lysator. liu. se/ c/<br />

[9] http:/ / www. dclc-faq. <strong>de</strong>/ inhalt. htm<br />

[10] http:/ / www. galileocomputing. <strong>de</strong>/ openbook/ c_von_a_bis_z/


C++ 26<br />

C+ +<br />

C++<br />

Paradigmen: Multiparadigmen (imperativ, strukturiert, objektorientiert, generisch, funktionale)<br />

Erscheinungsjahr: 1979<br />

Entwickler: Bjarne Stroustrup<br />

Typisierung: statisch, explizit, schwach<br />

wichtige Implementierungen: C++ Buil<strong>de</strong>r,<br />

GCC,<br />

MS Visual C++,<br />

Intel C++ Compiler<br />

Standardisierungen: ISO/IEC C++ 1998,<br />

ISO/IEC C++ 2003<br />

Einflüsse: C, Simula, Ada, ALGOL 68, CLU, ML<br />

Beeinflusste: C#, Java, PHP, Perl, D, Go<br />

C++ ist eine von <strong>de</strong>r ISO standardisierte höhere <strong>Programmiersprache</strong>. Sie wur<strong>de</strong> ab 1979 von Bjarne Stroustrup bei<br />

AT&T als Erweiterung <strong>de</strong>r <strong>Programmiersprache</strong> C entwickelt. C++ wur<strong>de</strong> als Mehrzwecksprache konzipiert und<br />

unterstützt mehrere Programmierparadigmen, wie die objektorientierte, generische und prozedurale<br />

Programmierung. C++ ermöglicht sowohl die effiziente und maschinennahe Programmierung, als auch eine<br />

Programmierung auf hohem Abstraktionsniveau.<br />

Anwendungsgebiete<br />

C++ wird sowohl in <strong>de</strong>r Systemprogrammierung als auch in <strong>de</strong>r Anwendungsprogrammierung eingesetzt. Typische<br />

Anwendungsfel<strong>de</strong>r in <strong>de</strong>r Systemprogrammierung sind Betriebssysteme, eingebettete Systeme, virtuelle Maschinen,<br />

Treiber und Signalprozessoren. C++ nimmt hier oft <strong>de</strong>n Platz ein, <strong>de</strong>r früher ausschließlich Assemblersprachen und<br />

<strong>de</strong>r <strong>Programmiersprache</strong> C vorbehalten war. Aus <strong>de</strong>r Domäne <strong>de</strong>r Anwendungsprogrammierung wur<strong>de</strong> C++ mit <strong>de</strong>m<br />

Aufkommen <strong>de</strong>r Sprachen Java und C# zum Teil zurückgedrängt.<br />

Eigenschaften<br />

Sprach<strong>de</strong>sign<br />

Die Sprache C++ legt einen Schwerpunkt auf die Sprachmittel zur Entwicklung von Bibliotheken und favorisiert<br />

dadurch verallgemeinerte Mechanismen gegenüber in die Sprache integrierten Einzellösungen für typische<br />

Problemstellungen.<br />

Eine <strong>de</strong>r Stärken von C++ ist auch die Kombinierbarkeit von effizienter, maschinennaher Programmierung mit<br />

mächtigen Sprachmitteln, die einfache bis komplexe Implementierungs<strong>de</strong>tails zusammenfassen und weitgehend<br />

hinter abstrakten Befehlsfolgen verbergen. Dabei kommt vor allem die Template-Metaprogrammierung zum Zuge,<br />

eine Technik, die eine nahezu kompromisslose Verbindung von Effizienz und Abstraktion erlaubt.


C++ 27<br />

Kompatibilität mit C<br />

Um an die Verbreitung <strong>de</strong>r <strong>Programmiersprache</strong> C anzuknüpfen, wur<strong>de</strong> C++ als Erweiterung von C gemäß <strong>de</strong>m<br />

damaligen Stand von 1990 (ISO/IEC 9899:1990, auch kurz C90 genannt) entworfen.<br />

Die Kompatibilität mit C zwingt C++ aber auch zur Fortführung einiger dadurch übernommener Nachteile. Dazu<br />

zählt die teilweise schwer verständliche C-Syntax, <strong>de</strong>r als überholt gelten<strong>de</strong> Präprozessor sowie verschie<strong>de</strong>ne von<br />

<strong>de</strong>r jeweiligen Plattform abhängige Details <strong>de</strong>r Sprache. Plattformabhängigkeiten erschweren die Portierung von<br />

C++-Programmen zwischen unterschiedlichen Rechnertypen, Betriebssystemen und Compilern.<br />

Die letzten Än<strong>de</strong>rungen an C fan<strong>de</strong>n im Jahr 1999 statt (ISO/IEC 9899:1999, auch kurz C99 genannt), also nach <strong>de</strong>r<br />

Normung von C++, sodass dort eingeflossene Än<strong>de</strong>rungen nicht in C++ berücksichtigt wer<strong>de</strong>n konnten. C-Compiler,<br />

die <strong>de</strong>n Stand <strong>de</strong>r ISO-Norm von 1999 umsetzen, sind aber noch nicht sehr verbreitet. Die theoretisch dadurch<br />

entstan<strong>de</strong>nen Inkompatibilitäten spielen <strong>de</strong>shalb in <strong>de</strong>r Praxis bislang keine große Rolle. Um <strong>de</strong>nnoch einem<br />

Auseinan<strong>de</strong>rdriften <strong>de</strong>r Sprachen vorzubeugen, wer<strong>de</strong>n die Spracherweiterungen von C bei <strong>de</strong>r in Arbeit<br />

befindlichen C++-Version berücksichtigt.<br />

Sprachmerkmale im Detail<br />

C++ basiert auf <strong>de</strong>r <strong>Programmiersprache</strong> C wie in ISO/IEC 9899:1990 beschrieben. Zusätzlich zu <strong>de</strong>n in C<br />

vorhan<strong>de</strong>nen Möglichkeiten bietet C++ weitere Datentypen sowie neuartige Typenumwandlungsmöglichkeiten,<br />

Klassen mit Mehrfachvererbung und virtuellen Funktionen, Ausnahmebehandlung, Templates (Schablonen),<br />

Namensräume, Inline-Funktionen, Überla<strong>de</strong>n von Operatoren und Funktionsnamen, Referenzen, Operatoren zur<br />

Freispeicherverwaltung und mit <strong>de</strong>r C++-Standardbibliothek eine erweiterte Bibliothek.<br />

C++ ist eine so genannte „Multiparadigmen-Sprache“, die verschie<strong>de</strong>ne Programmiertechniken unterstützt:<br />

• Prozedurale Programmierung<br />

• Modulare Programmierung<br />

• Strukturierte Programmierung<br />

• Programmierung mit selbst<strong>de</strong>finierten Datentypen (abstrakte Datentypen)<br />

• Objektorientierte Programmierung (siehe auch Polymorphie (Vielgestaltigkeit))<br />

• Generische Programmierung mittels Templates.<br />

Siehe auch: Programmierparadigma, C++-Metaprogrammierung<br />

Hallo-Welt-Programm in C++<br />

Der folgen<strong>de</strong> Quelltext stellt ein einfaches C++-Programm dar, das die Meldung „Hallo Welt!“ auf <strong>de</strong>m<br />

Standardausgabemedium ausgibt:<br />

#inclu<strong>de</strong> <br />

#inclu<strong>de</strong> <br />

int main()<br />

{<br />

}<br />

std::cout


C++ 28<br />

Umsetzung<br />

C++-Compiler<br />

Die Implementierung eines C++-Compilers gilt als aufwändig. Seit <strong>de</strong>r Fertigstellung <strong>de</strong>r Sprachnorm 1998 dauerte<br />

es mehrere Jahre, bis die Sprache von C++-Compilern weitestgehend unterstützt wur<strong>de</strong>.<br />

Zu <strong>de</strong>n be<strong>de</strong>utendsten C++-Compilern gehören:<br />

• Der g++ ist die C++-Ausprägung <strong>de</strong>r GNU Compiler Collection (GCC); g++ ist quelloffen, frei verfügbar. Der<br />

g++ unterstützt viele Betriebssysteme (darunter Unix, Linux, Mac OS X, Windows und AmigaOS) und<br />

Prozessorplattformen. Derzeit dient eine Son<strong>de</strong>ranfertigung <strong>de</strong>s Compilers namens ConceptGCC als Prüfmittel<br />

für verschie<strong>de</strong>ne geplante C++-Spracherweiterungen. GNU C++ existiert seit 1987 und ist somit einer <strong>de</strong>r<br />

ältesten C++-Compiler. [1]<br />

• Der in Microsoft Visual C++ enthaltene Compiler ist einer <strong>de</strong>r verbreitetsten für das Betriebssystem Windows.<br />

• Der Comeau C++ ist <strong>de</strong>rzeit <strong>de</strong>r einzige Compiler, <strong>de</strong>r export von Templates integriert hat und damit <strong>de</strong>r<br />

einzige, <strong>de</strong>r alle C++-Sprachmittel enthält. Das so genannte „Front-End“ <strong>de</strong>s Compilers, also <strong>de</strong>r Teil, <strong>de</strong>r die<br />

Analyse-Phase implementiert, wur<strong>de</strong> von <strong>de</strong>r Firma Edison Design Group (EDG) erstellt, die sich auf die<br />

Entwicklung von Compiler-Front-Ends spezialisiert hat und <strong>de</strong>ren C++-Front-End auch in vielen an<strong>de</strong>ren<br />

kommerziellen C++-Compilern integriert ist. Der Comeau-Compiler kann auch über das Internet ausprobiert<br />

wer<strong>de</strong>n.<br />

• Der Intel C++ Compiler verwen<strong>de</strong>t ebenfalls das erwähnte C++-Front-End von EDG. Der Intel C++ Compiler<br />

erzeugt Maschinenco<strong>de</strong> für die Intel-Prozessoren unter <strong>de</strong>n Betriebssystemen Windows, Linux und MacOS X. Da<br />

die mit <strong>de</strong>m Intel C++ Compiler erzeugten Programme <strong>de</strong>n Befehlssatz <strong>de</strong>r Intel-Prozessoren beson<strong>de</strong>rs gut<br />

ausnutzen, erzeugen sie beson<strong>de</strong>rs effiziente Programme für Intel-Prozessoren.<br />

• Der Borland C++ Buil<strong>de</strong>r ist ein im Developer Studio enthaltener C++-Compiler.<br />

C++-Programmierung<br />

Das breite Leistungsspektrum und die vielfältigen Gestaltungsmöglichkeiten <strong>de</strong>r Sprache führen zu verhältnismäßig<br />

langen Einarbeitungszeiten. Außer<strong>de</strong>m wird die Verwendung von Programmierrichtlinien aus Grün<strong>de</strong>n <strong>de</strong>r<br />

Wartbarkeit und Fehleri<strong>de</strong>ntifizierung mehr als in an<strong>de</strong>ren Sprachen angeraten. Demgegenüber ist <strong>de</strong>r Stand vieler<br />

Lehrbücher und Lehrveranstaltungen veraltet. Lehrinhalte stimmen oft nicht mit <strong>de</strong>r Realität existieren<strong>de</strong>r Compiler<br />

überein.<br />

Vergleich mit an<strong>de</strong>ren Sprachen<br />

Objective-C<br />

C++ war nicht <strong>de</strong>r einzige Ansatz, die <strong>Programmiersprache</strong> C um Eigenschaften zu erweitern, die das<br />

objektorientierte Programmieren vereinfachen. In <strong>de</strong>n 1980er Jahren entstand die <strong>Programmiersprache</strong> Objective-C,<br />

die sich aber im Gegensatz zu C++ an Smalltalk und nicht an Simula orientierte. Die Syntax von Objective-C<br />

unterschei<strong>de</strong>t sich unter an<strong>de</strong>rem wegen <strong>de</strong>r Smalltalk-Wurzeln stark von C++. Objective-C ist <strong>de</strong>utlich weniger weit<br />

verbreitet als C++. Bekannteste Einsatzgebiete von Objective-C sind die Programmierschnittstelle OpenStep und das<br />

Betriebssystem Mac OS X.


C++ 29<br />

Java und C#<br />

[2] [3]<br />

Die <strong>Programmiersprache</strong>n Java und C# verfügen über eine ähnliche, ebenfalls an C angelehnte Syntax wie C++,<br />

sind auch objektorientiert und unterstützen seit einiger Zeit Typparameter, weshalb ein Vergleich mit ihnen<br />

beson<strong>de</strong>rs naheliegend ist. Trotz äußerlicher Ähnlichkeiten unterschei<strong>de</strong>n sie sich aber konzeptionell von C++, zum<br />

Teil beträchtlich.<br />

Generische Techniken ergänzen die objektorientierte Programmierung um Typparameter und erhöhen so die<br />

Wie<strong>de</strong>rverwertbarkeit einmal kodierter Algorithmen. Die generischen Java-Erweiterungen sind jedoch lediglich auf<br />

Klassen, nicht aber auf primitive Typen o<strong>de</strong>r Datenkonstanten anwendbar; Abhilfe bietet Java hier allerdings mittels<br />

sogenannter Wrapper-Klassen, welche für primitive Typen entsprechen<strong>de</strong> Klassen zur Verfügung stellen (z. B.<br />

Integer als Wrapper für <strong>de</strong>n primitiven Typ int). Demgegenüber beziehen die generischen Spracherweiterungen<br />

von C# auch die primitiven Typen mit ein. Dabei han<strong>de</strong>lt es sich allerdings um eine Erweiterung für Generik zur<br />

Laufzeit, die die auf Kompilationszeit zugeschnittenen C++-Templates zwar sinnvoll ergänzen, nicht aber ersetzen<br />

können.<br />

Gera<strong>de</strong> die generische Programmierung macht C++ zu einem mächtigen Programmierwerkzeug. Während die<br />

objektorientierte Programmierung in Java und C# nach wie vor <strong>de</strong>n zentralen Abstraktionsmechanismus darstellt, ist<br />

diese Art <strong>de</strong>r Programmierung in C++ rückläufig. So wer<strong>de</strong>n tiefe Klassenhierarchien vermie<strong>de</strong>n, und zu Gunsten<br />

<strong>de</strong>r Effizienz und <strong>de</strong>r Minimierung <strong>de</strong>s Ressourcenverbrauchs verzichtet man in vielen Fällen auf Polymorphie,<br />

einen <strong>de</strong>r fundamentalen Bestandteile <strong>de</strong>r objektorientierten Programmierung.<br />

Siehe auch: Simula, Smalltalk<br />

Entstehung und Weiterentwicklung<br />

Entstehungsgeschichte<br />

C++ wur<strong>de</strong> von Bjarne Stroustrup ab 1979 in <strong>de</strong>n AT&T Bell Laboratories entwickelt. Ausgangspunkt waren<br />

Untersuchungen <strong>de</strong>s UNIX-Betriebssystemkerns in Bezug auf verteiltes Rechnen.<br />

Auf die I<strong>de</strong>e für eine neue <strong>Programmiersprache</strong> war Stroustrup schon durch Erfahrungen mit <strong>de</strong>r<br />

<strong>Programmiersprache</strong> Simula im Rahmen seiner Doktorarbeit an <strong>de</strong>r Cambridge University gekommen. Simula<br />

erschien zwar geeignet für <strong>de</strong>n Einsatz in großen Software-Projekten, die Struktur <strong>de</strong>r Sprache erschwerte aber die<br />

für viele praktische Anwendungen erfor<strong>de</strong>rliche Erzeugung hocheffizienter Programme. Demgegenüber ließen sich<br />

effiziente Programme zwar mit <strong>de</strong>r Sprache BCPL schreiben, für große Projekte war BCPL aber wie<strong>de</strong>rum<br />

ungeeignet.<br />

Mit <strong>de</strong>n Erfahrungen aus seiner Doktorarbeit erweiterte Stroustrup nun die <strong>Programmiersprache</strong> C um ein<br />

Klassenkonzept, für das die Sprache Simula-67 das primäre Vorbild war. Die Wahl fiel auf die <strong>Programmiersprache</strong><br />

C, eine Mehrzwecksprache, die schnellen Co<strong>de</strong> produzierte und einfach auf an<strong>de</strong>re Plattformen zu portieren war. Als<br />

<strong>de</strong>m Betriebssystem UNIX beiliegen<strong>de</strong> Sprache hatte C außer<strong>de</strong>m eine nicht unerhebliche Verbreitung. Zunächst<br />

fügte er <strong>de</strong>r Sprache Klassen (mit Datenkapselung) hinzu, dann abgeleitete Klassen, ein strengeres Typsystem,<br />

Inline-Funktionen und Standard-Argumente.<br />

Während Stroustrup „C with Classes“ („C mit Klassen“) entwickelte (woraus später C++ wur<strong>de</strong>), schrieb er auch<br />

cfront, einen Compiler, <strong>de</strong>r aus C with Classes zunächst C-Co<strong>de</strong> als Zwischenresultat erzeugte. Die erste<br />

kommerzielle Version von cfront erschien im Oktober 1985.<br />

1983 wur<strong>de</strong> C with Classes in C++ umbenannt. Erweiterungen darin waren: virtuelle Funktionen, Überla<strong>de</strong>n von<br />

Funktionsnamen und Operatoren, Referenzen, Konstanten, än<strong>de</strong>rbare Freispeicherverwaltung und eine verbesserte<br />

Typüberprüfung. Die Möglichkeit von Kommentaren, die an das Zeilenen<strong>de</strong> gebun<strong>de</strong>n sind, wur<strong>de</strong> wie<strong>de</strong>r aus BCPL<br />

übernommen (//).


C++ 30<br />

1985 erschien die erste Version von C++, die eine wichtige Referenzversion darstellte, da die Sprache damals noch<br />

nicht standardisiert war. 1989 erschien die Version 2.0 von C++. Neu darin waren Mehrfachvererbung, abstrakte<br />

Klassen, statische Elementfunktionen, konstante Elementfunktionen und die Erweiterung <strong>de</strong>s Schutzmo<strong>de</strong>lls um<br />

protected. 1990 erschien das Buch The Annotated C++ Reference Manual, das als Grundlage für <strong>de</strong>n<br />

darauffolgen<strong>de</strong>n Standardisierungsprozess diente.<br />

Relativ spät wur<strong>de</strong>n <strong>de</strong>r Sprache Templates, Ausnahmebehandlung, Namensräume, neuartige Typumwandlungen und<br />

Boolesche Typen hinzugefügt.<br />

Im Zuge <strong>de</strong>r Weiterentwicklung <strong>de</strong>r Sprache C++ entstand auch eine gegenüber C erweiterte Standardbibliothek.<br />

Erste Ergänzung war die Stream-I/O-Bibliothek, die Ersatz für traditionelle C-Funktionen wie zum Beispiel printf()<br />

und scanf() bietet. Eine <strong>de</strong>r wesentlichen Erweiterungen <strong>de</strong>r Standardbibliothek kam später durch die Integration<br />

großer Teile <strong>de</strong>r bei Hewlett-Packard entwickelten Standard Template Library (STL) hinzu.<br />

Nach jahrelanger Arbeit wur<strong>de</strong> schließlich 1998 die endgültige Fassung <strong>de</strong>r Sprache C++ (ISO/IEC 14882:1998)<br />

genormt. 2003 wur<strong>de</strong> ISO/IEC 14882:2003 verabschie<strong>de</strong>t, eine Nachbesserung <strong>de</strong>r Norm von 1998.<br />

Die vorhan<strong>de</strong>nen Performance-Probleme <strong>de</strong>r Sprache C++, die Rechenzeit und Speicherplatz betreffen, wer<strong>de</strong>n auf<br />

hohem Niveau zusammen mit Lösungen im Technical Report ISO/IEC TR 18015:2006 diskutiert. Das Dokument ist<br />

zum Download von ISO freigegeben.<br />

Der Name „C++“<br />

Der Name ist eine Wortschöpfung von Rick Mascitti und wur<strong>de</strong> zum ersten Mal im Dezember 1983 benutzt. Der<br />

Name kommt von <strong>de</strong>r Verbindung <strong>de</strong>r Vorgängersprache C und <strong>de</strong>m Inkrement-Operator „++“, <strong>de</strong>r <strong>de</strong>n Wert einer<br />

Variablen inkrementiert (auf <strong>de</strong>n nächsten Wert erhöht).<br />

Weiterentwicklung <strong>de</strong>r <strong>Programmiersprache</strong> C++<br />

Um mit <strong>de</strong>n aktuellen Entwicklungen <strong>de</strong>r sich schnell verän<strong>de</strong>rn<strong>de</strong>n Computer-Technik Schritt zu halten, aber auch<br />

zur Ausbesserung bekannter Schwächen, erarbeitet das C++-Standardisierungskomitee <strong>de</strong>rzeit die nächste größere<br />

Revision von C++, die inoffiziell mit C++0x abgekürzt wird, worin die Ziffernfolge eine grobe Einschätzung <strong>de</strong>s<br />

möglichen Erscheinungstermins an<strong>de</strong>uten soll. Im November 2006 wur<strong>de</strong> <strong>de</strong>r Zieltermin für die Fertigstellung auf<br />

das Jahr 2009 festgelegt und die Abkürzung C++09 dafür eingeführt. Im Juli 2009 wur<strong>de</strong> dieser Termin auf<br />

frühestens 2010 geän<strong>de</strong>rt.<br />

Die vorrangigen Ziele für die Weiterentwicklung von C++ sind Verbesserungen im Hinblick auf die<br />

Systemprogrammierung sowie zur Erstellung von Programmbibliotheken. Außer<strong>de</strong>m soll die Erlernbarkeit <strong>de</strong>r<br />

Sprache für Anfänger verbessert wer<strong>de</strong>n.<br />

Berücksichtigung aktueller technischer Gegebenheiten<br />

C++ <strong>de</strong>ckt einige typische Problemfel<strong>de</strong>r <strong>de</strong>r Programmierung noch nicht ausreichend ab, zum Beispiel die<br />

Unterstützung von Nebenläufigkeit (Threads), <strong>de</strong>ren Integration in C++, insbeson<strong>de</strong>re für die Verwendung in<br />

Mehrprozessorumgebungen, eine Überarbeitung <strong>de</strong>r Sprache unumgänglich macht. Durch ein überarbeitetes<br />

Speichermo<strong>de</strong>ll sollen Garantien <strong>de</strong>r Sprache für <strong>de</strong>n nebenläufigen Betrieb festgelegt wer<strong>de</strong>n, um Mehr<strong>de</strong>utigkeiten<br />

in <strong>de</strong>r Abarbeitungsreihenfolge sowohl aufzulösen als auch in bestimmten Fällen aufrechtzuerhalten und dadurch<br />

Spielraum für Optimierungen zu schaffen. Eine eigene Bibliothek zur Unterstützung von Threads durch die<br />

C++09-Standardbibliothek wird ebenfalls durch <strong>de</strong>n neuen Sprachstandard eingeführt.


C++ 31<br />

Verbesserungen am Sprachkern<br />

Zu <strong>de</strong>n weitreichen<strong>de</strong>ren Spracherweiterungen gehört die Typinferenz zur Ableitung von Ergebnistypen aus<br />

Ausdrücken und die R-Wert-Referenzen, mit <strong>de</strong>ren Hilfe sich als Ergänzung zu <strong>de</strong>m bereits vorhan<strong>de</strong>nen Kopieren<br />

von Objekten dann auch ein Verschieben realisieren lässt.<br />

Erweiterung <strong>de</strong>r Programmbibliothek<br />

Im April 2006 gab das C++-Standardisierungskomitee <strong>de</strong>n so genannten ersten technischen Report (TR1) heraus,<br />

eine nichtnormative Ergänzung zur aktuell gültigen, 1998 <strong>de</strong>finierten Bibliothek, mit <strong>de</strong>r Erweiterungsvorschläge<br />

vor einer möglichen Übernahme in die C++-Standardbibliothek auf ihre Praxistauglichkeit hin untersucht wer<strong>de</strong>n<br />

sollen. Viele Compiler-Hersteller liefern <strong>de</strong>n TR1 mit ihren Produkten aus.<br />

Enthalten sind im TR1 u. a. reguläre Ausdrücke, [4] verschie<strong>de</strong>ne intelligente Zeiger, [5] ungeordnete assoziative<br />

Container, [6] eine Zufallszahlenbibliothek, [7] Hilfsmittel für die C++-Metaprogrammierung, Tupel [8] sowie<br />

numerische und mathematische Bibliotheken. [9] Die meisten dieser Erweiterungen stammen aus <strong>de</strong>r<br />

Boost-Bibliothek, woraus sie mit minimalen Än<strong>de</strong>rungen übernommen wur<strong>de</strong>n. Außer<strong>de</strong>m sind sämtliche<br />

Bibliothekserweiterungen <strong>de</strong>r 1999 überarbeiteten <strong>Programmiersprache</strong> C (C99) in einer an C++ angepassten Form<br />

enthalten. [10]<br />

Mit Ausnahme <strong>de</strong>r numerischen und mathematischen Bibliotheken wur<strong>de</strong> die Übernahme aller TR1-Erweiterungen<br />

in die kommen<strong>de</strong> Sprachnorm C++0x bereits vom C++-Standardisierungskomitee beschlossen.<br />

Siehe auch<br />

• C++-Standardbibliothek<br />

• Ressourcenbelegung ist Initialisierung (RAII)<br />

• C++/CLI<br />

• Embed<strong>de</strong>d C++, eine Variante <strong>de</strong>r Sprache C++ für eingebettete Systeme.<br />

Literatur<br />

• Bjarne Stroustrup: Die C++-<strong>Programmiersprache</strong>. 4. Auflage. Addison-Wesley, 2009, ISBN 978-3-8273-2823-6<br />

(Standardwerk zu C++, Grundkenntnisse in C von Vorteil.).<br />

• Bjarne Stroustrup: The Design and Evolution of C++. Addison-Wesley, 1994, ISBN 978-0201543308 (Das Buch<br />

beschreibt die Entwicklung und Design von C++; Vom Sprach<strong>de</strong>signer geschrieben.).<br />

• Bjarne Stroustrup: Programming -- Principles and Practice Using C++.. Addison-Wesley, 2008, ISBN<br />

978-0321543721 (Einführung in die Programmierung; Standardwerk für Texas A&M<br />

Einstiegsprogrammierkurse).<br />

• Andrew Koenig, Barbara E. Moo: Intensivkurs C++. 1. Auflage. Pearson Studium, 2003, ISBN 3-8273-7029-9<br />

(Vergriffen, Anfängerbuch, ein gewisses Grundverständnis <strong>de</strong>r Programmierung ist von Vorteil.).<br />

• Scott Meyers: Effektiv C++ Programmieren – 55 Möglichkeiten, Ihre Programme und Entwürfe zu verbessern.<br />

1. Auflage. Addison-Wesley, 2006, ISBN 3-8273-2297-9 (Zur Vertiefung bereits vorhan<strong>de</strong>ner C++-Kenntnisse.).<br />

• Scott Meyers: Mehr Effektiv C++ programmieren – 35 neue Wege zur Verbesserung Ihrer Programme und<br />

Entwürfe. 1. Auflage. Addison-Wesley, 1997, ISBN 3-8273-1275-2 (Vertiefung vorhan<strong>de</strong>ner C++-Kenntnisse.).<br />

• Herb Sutter: Exceptional C++. 1. Auflage. Addison-Wesley, 2000, ISBN 3-8273-1711-8 (Vertiefung<br />

vorhan<strong>de</strong>ner C++-Kenntnisse.).<br />

• Andrei Alexandrescu: Mo<strong>de</strong>rnes C++ Design – Generische Programmierung und Entwurfsmuster angewen<strong>de</strong>t.<br />

1. Auflage. Mitp-Verlag, 2003, ISBN 3-8266-1347-3 (Ein Standardwerk zur C++-Metaprogrammierung, setzt ein<br />

tiefes Verständnis von C++ voraus.).


C++ 32<br />

• Bruce Eckel: Thinking in C++, Volume 1: Introduction to Standard C++. 2. Auflage. Prentice Hall, 2000, ISBN<br />

0-13-979809-9 (Online [11] ).<br />

• Bruce Eckel: Thinking in C++, Volume 2: Practical Programming. 1. Auflage. Prentice Hall, 2003, ISBN<br />

0-13-035313-2 (Online [11] ).<br />

• Herbert Schildt: Learn C++ from the Ground Up. 3. Auflage. McGraw Hill - Osborne, 2003, ISBN<br />

978-0-0722-2897-7.<br />

Weblinks<br />

• Webauftritt <strong>de</strong>s C++-Standardisierungskomitees [12] , englisch<br />

• Bjarne Stroustrup über die Geschichte von C++ zwischen 1991 und 2006 (HOPL-III) [13] , englisch<br />

• Links zum Thema C++ [14] im Open Directory Project<br />

Referenzen<br />

[1] Bjarne Stroustrup: Evolving a language in and for the real world: C++ 1991-2006 (http:/ / www. cs. tamu. edu/ news/ items?id=1797)<br />

[2] Java - A Bit of History (http:/ / java. sun. com/ docs/ books/ jvms/ second_edition/ html/ Introduction. doc. html)<br />

[3] Peter Drayton, Ted Neward, Ben Albahari: C# in a Nutshell: A Desktop Quick Reference. 2. Auflage. O'Reilly, 2003, ISBN<br />

978-0-5960-0526-9.<br />

[4] regex_proposal (http:/ / www. open-std. org/ jtc1/ sc22/ wg21/ docs/ papers/ 2003/ n1429. htm)<br />

[5] A Proposal to Add General Purpose Smart Pointers to the Library Technical Report (http:/ / www. open-std. org/ jtc1/ sc22/ wg21/ docs/<br />

papers/ 2003/ n1450. html)<br />

[6] A Proposal to Add Hash Tables to the Standard Library (http:/ / www. open-std. org/ jtc1/ sc22/ wg21/ docs/ papers/ 2003/ n1456. html)<br />

[7] A Proposal to Add an Extensible Random Number Facility to the Standard Library (Revision 2) (http:/ / www. open-std. org/ jtc1/ sc22/<br />

wg21/ docs/ papers/ 2003/ n1452. html)<br />

[8] http:/ / www. open-std. org/ jtc1/ sc22/ wg21/ docs/ papers/ 2002/ n1403. pdf<br />

[9] C++ Mathematical Special Functions Proposal (http:/ / www. open-std. org/ jtc1/ sc22/ wg21/ docs/ papers/ 2003/ n1422. html)<br />

[10] ISO/IEC JTC1/SC22/WG21 N1568 (http:/ / www. open-std. org/ jtc1/ sc22/ wg21/ docs/ papers/ 2004/ n1568. htm)<br />

[11] http:/ / jamesthornton. com/ eckel/<br />

[12] http:/ / www. open-std. org/ jtc1/ sc22/ wg21/<br />

[13] http:/ / www. cs. tamu. edu/ news/ items?id=1797<br />

[14] http:/ / www. dmoz. org/ World/ Deutsch/ Computer/ Programmieren/ Sprachen/ C+ + /


C-Sharp 33<br />

C- Sharp<br />

Der korrekte Titel dieses Artikels lautet „C#“. Diese Schreibweise ist aufgrund technischer Einschränkungen nicht<br />

möglich.<br />

Falsche Vorlage!<br />

Bitte ersetze durch<br />

Paradigmen: strukturiert, imperativ, objektorientiert, funktional<br />

Erscheinungsjahr: 2001<br />

Entwickler: Microsoft<br />

Aktuelle Version: 3.0 (2009)<br />

Typisierung: statisch, stark<br />

Einflüsse: C, C++, Delphi, SQL, Java, Modula-3, Visual Basic<br />

Beeinflusste:<br />

Java [1]<br />

.<br />

C#<br />

Betriebssystem: alle, für die eine CLI-Implementierung existiert (z. B. Microsofts CLR <strong>de</strong>s .NET-Frameworks o<strong>de</strong>r Novells<br />

Mono)<br />

C# (lies engl. c sharp, englische Aussprache [ˌsiːˈʃɑːp]) ist eine vom Softwarehersteller Microsoft im Rahmen seiner<br />

.NET-Strategie entwickelte <strong>Programmiersprache</strong>. C# ist bei ECMA [2] und ISO als Standard registriert.<br />

Die aktuelle Version von C# ist 3.0, welche im Jahr 2007 gleichzeitig mit <strong>de</strong>m .NET Framework 3.5 verabschie<strong>de</strong>t<br />

wur<strong>de</strong>. Die nächste Version 4.0 ist aktuell in Entwicklung.<br />

Konzept<br />

C# greift Konzepte <strong>de</strong>r <strong>Programmiersprache</strong>n Java, C++, SQL, C sowie Delphi auf. C# zählt zu <strong>de</strong>n<br />

objektorientierten <strong>Programmiersprache</strong>n und unterstützt sowohl die Entwicklung von sprachunabhängigen<br />

.NET-Komponenten als auch COM-Komponenten für <strong>de</strong>n Gebrauch mit Win32-Applikationen.<br />

Einige <strong>de</strong>r Elemente von C++, die im Allgemeinen als unsicher gelten, wie beispielsweise Zeiger, wer<strong>de</strong>n in C# nur<br />

für sogenannten „unsicheren Co<strong>de</strong>“ erlaubt, <strong>de</strong>r in Zonen mit eingeschränkten Rechten (z. B. bei Programmen, die<br />

aus Webseiten heraus ausgeführt wer<strong>de</strong>n) ohne die Zuteilung erweiterter Rechte nicht ausgeführt wird.<br />

Als .NET-Sprache verfügt auch C# über Sprachunterstützung für Attribute und Delegaten. Attribute erlauben es,<br />

Informationen über eine Klasse, ein Objekt, o<strong>de</strong>r eine Metho<strong>de</strong> zu speichern, die zur Laufzeit ausgewertet wer<strong>de</strong>n<br />

können. Man spricht hierbei auch von Metadaten. Ein Delegat kann auf Metho<strong>de</strong>n einer Klasse verweisen. Das<br />

Konzept lässt sich mit Funktionszeigern vergleichen. Im Unterschied zu diesen enthalten Delegaten zusätzlich auch<br />

Verweise auf die zu <strong>de</strong>n Metho<strong>de</strong>n gehören<strong>de</strong>n Objekte. Ein Aufruf eines Delegaten ruft also Metho<strong>de</strong>n auf, <strong>de</strong>nen<br />

implizit ein Objektzeiger als Parameter übergeben wird. Außer<strong>de</strong>m müssen Delegaten typensicher <strong>de</strong>klariert wer<strong>de</strong>n,<br />

was zur Folge hat, dass Inkompatibilitäten <strong>de</strong>r Metho<strong>de</strong>nsignaturen zwischen aufrufen<strong>de</strong>m Delegat und <strong>de</strong>r<br />

aufzurufen<strong>de</strong>n Metho<strong>de</strong> schon während <strong>de</strong>r Compilierung aufgelöst wer<strong>de</strong>n.<br />

Ab <strong>de</strong>r Version 2.0 von C#, das mit .NET-Framework 2.0 freigegeben wur<strong>de</strong>, unterstützt C# neben generischen<br />

Typen (engl. generics) auch anonyme Metho<strong>de</strong>n, Generatoren und partielle Klassen. Generische Typen, Iteratoren<br />

und partielle Klassen sind Bestandteil <strong>de</strong>s .NET-Frameworks 2.0 und stehen somit auch an<strong>de</strong>ren<br />

.NET-<strong>Programmiersprache</strong>n wie beispielsweise VB.NET zur Verfügung.


C-Sharp 34<br />

Standardisierung<br />

Microsoft reichte im August 2000 zusammen mit Hewlett-Packard und <strong>de</strong>r Intel Corporation C# bei <strong>de</strong>r<br />

Normungsorganisation Ecma International zur Normung ein. Im Dezember 2001 veröffentlichte die ECMA die<br />

Norm ECMA-334 C# Language Specification. 2003 wur<strong>de</strong> C# von <strong>de</strong>r ISO genormt (ISO/IEC 23270).<br />

Im Juni 2005 genehmigte die ECMA die dritte Version (C# 2.0) <strong>de</strong>r C#-Spezifikationen und aktualisierte die<br />

bisherige Norm ECMA-334. Hinzu kamen die partiellen Klassen, anonyme Metho<strong>de</strong>n, nullable types und Generics,<br />

die Ähnlichkeiten zu <strong>de</strong>n C++-Templates aufweisen. Im Juli 2005 übergab die ECMA die Standards und<br />

zugehörigen TRs an die ISO/IEC JTC 1.<br />

Die ECMA-Spezifikation 334 <strong>de</strong>ckt nur die Sprache C# ab. Programme, die in C# geschrieben wer<strong>de</strong>n, nutzen<br />

gewöhnlich das .NET-Framework, welches teilweise durch an<strong>de</strong>re Spezifikationen beschrieben wird und teilweise<br />

proprietär ist. Dennoch ist die Sprache C# prinzipiell plattformunabhängig. Das von Ximian (jetzt Novell) initiierte<br />

Projekt Mono ermöglicht beispielsweise auch Linuxnutzern, C# für Entwicklungen auf ihrem Betriebssystem<br />

einzusetzen.<br />

Microsoft veröffentlichte die dritte Version von C# mit <strong>de</strong>m .NET-SDK 2.0 und Visual Studio 2005 im November<br />

2005.<br />

Microsoft stellte klar, dass C#, genauso wie an<strong>de</strong>re .NET-Sprachen, einen wichtigen Bestandteil seiner<br />

Softwarestrategie sowohl für <strong>de</strong>n internen als auch für <strong>de</strong>n externen Gebrauch darstelle. Das Unternehmen<br />

übernimmt eine aktive Rolle in <strong>de</strong>r Vermarktung <strong>de</strong>r Sprache als Teil seiner gesamten Geschäftsstrategie.<br />

Verfügbarkeit von integrierten Entwicklungsumgebungen<br />

Neben <strong>de</strong>r von Microsoft vertriebenen Entwicklungsplattform Microsoft Visual Studio aus <strong>de</strong>m eigenen Hause gibt<br />

es inzwischen auch Entwicklungsumgebungen (IDEs) an<strong>de</strong>rer Hersteller für C#:<br />

• SharpDevelop – (Open-Source)<br />

• MonoDevelop – IDE für Windows und Unix-basierte Betriebssysteme (Open-Source)<br />

• Visual C# Express (Eingeschränkte kostenlose Version von Microsoft Visual Studio)<br />

• XNA Game Studio – IDE von Microsoft zur Spieleentwicklung<br />

• C#-Buil<strong>de</strong>r von Borland (Verwen<strong>de</strong>t <strong>de</strong>n Microsoft C#-Compiler in Lizenz)<br />

• Baltie, C#-IDE für Kin<strong>de</strong>r.<br />

Compiler<br />

→ Hauptartikel Common Language Infrastructure<br />

• Das OpenSource-Projekt dotGNU entwickelt eine freie .NET-Version inklusive C#-Compiler und beherrscht<br />

Windows.Forms<br />

• Das OpenSource-Projekt mono entwickelt eine freie und plattformunabhängige .NET-Version inklusive<br />

C#-Compiler


C-Sharp 35<br />

Der Name C#<br />

C♯ ist ursprünglich ein Symbol für <strong>de</strong>n in <strong>de</strong>r Musik durch ein Kreuz (♯) um einen Halbton erhöhten Ton C, das Cis<br />

– englisch C sharp. [3] Da das Kreuz allerdings auf keiner Standardtastatur direkt eingegeben wer<strong>de</strong>n kann, wird bei<br />

<strong>de</strong>r Schreibung <strong>de</strong>s Namens in <strong>de</strong>r Regel das typographisch ähnliche Rautenzeichen # als Ersatzdarstellung<br />

gewählt. [4]<br />

Sprachelemente von C#<br />

→ Hauptartikel Sprachelemente von C#<br />

Das folgen<strong>de</strong> typische Hallo-Welt-Programm soll als C#-Syntaxbeispiel für ein einfaches Konsolen-Programm<br />

dienen:<br />

class Program<br />

{<br />

}<br />

public static void Main()<br />

{<br />

}<br />

System.Console.WriteLine("Hallo Welt!");<br />

Mit LINQ können Datenbankabfragen direkt im Quelltext eingebun<strong>de</strong>n wer<strong>de</strong>n.<br />

Sprach<strong>de</strong>rivate<br />

• Spec#<br />

• Sing#<br />

• Cω<br />

• eXtensible C# (XC#)<br />

• Multiprocessor C# (MC#)<br />

• Metaphor<br />

• Polyphonic C#<br />

• Vala für Programme <strong>de</strong>s GNOME-Projektes<br />

Literatur<br />

• Frank Eller: Visual C# 2008. Addison-Wesley 2008, ISBN 978-3-8273-2641-6.<br />

• Golo Ro<strong>de</strong>n: Auf <strong>de</strong>r Fährte von C#. Springer-Verlag, 2008, ISBN 978-3-540-27888-7 (Volltext online unter<br />

gui<strong>de</strong> to C# [5] ).<br />

• Andreas Kühnel: Visual C# [6] . Galileo Computing, 2008, ISBN 978-3-8362-1172-7 (Volltext online).<br />

• Daniel Moses, Johannes Nowak: C# Programmieren unter .NET. Franzis’ Verlag GmbH, 2002, ISBN<br />

3-7723-7224-4.<br />

• Dirk Louis, Shinja Strasser: Microsoft Visual C# 2008 - Das Entwicklerbuch. Microsoft Press, 2008, ISBN<br />

978-3-86645-507-8.<br />

• Klaus Fahnenstich, Rainer G. Haselier: Richtig einsteigen: Programmieren lernen mit Visual C# 2008. Microsoft<br />

Press, ISBN 978-3-86645-207-7.<br />

• Jürgen Bayer: C# Co<strong>de</strong>book. Addison-Wesley Verlag, 2009, ISBN 3-8273-2576-5


C-Sharp 36<br />

Weblinks<br />

• Links zum Thema C-Sharp [7] im Open Directory Project<br />

Referenzen<br />

[1] Java 5 catches up with C# (http:/ / www. barrycornelius. com/ papers/ java5/ onefile/ )<br />

[2] ECMA-Spezifikation <strong>de</strong>r Sprache (http:/ / www. ecma-international. org/ publications/ standards/ Ecma-334. htm)<br />

[3] Töne <strong>de</strong>r C-Dur-Tonleiter (http:/ / www. helmut-eisel. <strong>de</strong>/ wsmaterial/ C-Dur. pdf) (PDF)<br />

[4] Vorwort <strong>de</strong>s Buches C# mit Metho<strong>de</strong>, Christian Bleske (Hrsg.), Alexan<strong>de</strong>r Mayer, Michael Fischer, Michael Starke, Michael Steil ( PDF<br />

(http:/ / www. cul. <strong>de</strong>/ data/ csharppr2. pdf))<br />

[5] http:/ / www. gui<strong>de</strong>tocsharp. <strong>de</strong><br />

[6] http:/ / www. galileocomputing. <strong>de</strong>/ openbook/ visual_csharp/ in<strong>de</strong>x. htm<br />

[7] http:/ / www. dmoz. org/ World/ Deutsch/ Computer/ Programmieren/ Sprachen/ C-Sharp/<br />

COBOL<br />

COBOL<br />

Paradigmen: Zunächst rein imperativ, später erweitert um Elemente <strong>de</strong>r strukturierten, prozeduralen und heutzutage<br />

sogar objektorientierten Programmierung<br />

Erscheinungsjahr: 1959<br />

Entwickler: Grace Hopper, William Sel<strong>de</strong>n, Gertru<strong>de</strong> Tierney, Howard Bromberg, Howard Discount, Vernon Reeves,<br />

Jean E. Sammet<br />

Aktuelle Version: COBOL 2002 (2002)<br />

Typisierung: stark, statisch<br />

wichtige<br />

Implementierungen:<br />

Open COBOL [1] , und viele an<strong>de</strong>re<br />

Dialekte: DEC COBOL, HP COBOL, IBM OS/VS COBOL, IBM COBOL/II, IBM COBOL SAA, IBM Enterprise<br />

COBOL, IBM COBOL/400, IBM ILE COBOL, Unix COBOL X/Open, Micro Focus COBOL, Microsoft<br />

COBOL, Ryan McFarland RM/COBOL, Ryan McFarland RM/COBOL-85, DOSVS COBOL, UNIVAC<br />

COBOL, Realia COBOL, Fujitsu COBOL, ACUCOBOL-GT<br />

Einflüsse: FLOW-MATIC, COMTRAN<br />

Beeinflusste: PL/I, PL/SQL, ABAP<br />

Betriebssystem: z/OS, Windows, Linux, Mac OS X, BS2000, OS/400 uvm.<br />

COBOL ist eine <strong>Programmiersprache</strong>, die wie FORTRAN in <strong>de</strong>r Frühzeit <strong>de</strong>r Computerentwicklung 1960<br />

entstan<strong>de</strong>n ist und bis heute verwen<strong>de</strong>t wird. Der Stil dieser <strong>Programmiersprache</strong> ist wortreich und stark an die<br />

natürliche Sprache angelehnt.<br />

Die Abkürzung COBOL steht für „Common Business Oriented Language“.<br />

Geschichte<br />

COBOL entstand aus <strong>de</strong>m dringen<strong>de</strong>n Wunsch, eine hardware-unabhängige standardisierte problemorientierte<br />

Sprache für die Erstellung von Programmen für <strong>de</strong>n betriebswirtschaftlichen Bereich zu haben. Die Programmierung<br />

kaufmännischer Anwendungen unterschei<strong>de</strong>t sich von technisch-wissenschaftlichen Anwendungen durch die<br />

Handhabung großer Datenmengen statt <strong>de</strong>r Ausführung umfangreicher Berechnungen. Nach<strong>de</strong>m die<br />

Programmierung technisch-wissenschaftlicher Anwendungen durch FORTRAN bereits stark vereinfacht wor<strong>de</strong>n<br />

war, sollte die neue <strong>Programmiersprache</strong> durch verstärkte Berücksichtigung kommerzieller Problemstellungen,


COBOL 37<br />

insbeson<strong>de</strong>re <strong>de</strong>r Handhabung großer Datenmengen und ihrer Ein- und Ausgabe, dies auch für kommerzielle<br />

Anwendungen erreichen, die bis dahin weitgehend in Assemblersprachen programmiert wur<strong>de</strong>n. Eine vom<br />

amerikanischen Verteidigungsministerium eingesetzte Arbeitsgruppe entwickelte einen Standard aus <strong>de</strong>r<br />

Vermählung <strong>de</strong>r damaligen <strong>Programmiersprache</strong>n FLOW-MATIC von Sperry Univac (Remington-Rand),<br />

Commercial Translator (COMTRAN) von IBM und FACT von Minneapolis-Honeywell. Namentlich beteiligt hieran<br />

war Grace M. Hopper.<br />

Das Ergebnis wur<strong>de</strong> 1960 als COBOL-60 von CODASYL verabschie<strong>de</strong>t, in <strong>de</strong>r Folgezeit weiterentwickelt und von<br />

nationalen und internationalen Normierungsinstituten (ANSI, ISO) standardisiert.<br />

COBOL fand schnell <strong>de</strong>n Weg in die zivile Nutzung als eine <strong>de</strong>r ersten kommerziell eingesetzten kompilierbaren<br />

und bis heute am weitesten verbreiteten <strong>Programmiersprache</strong>n, vor allem für kommerzielle Anwendungen.<br />

Sprachsyntax<br />

Ursprünglich wur<strong>de</strong> COBOL nur in Großbuchstaben geschrieben (man hatte nur Lochkarten und Zeilendrucker ohne<br />

Kleinbuchstaben). Auch heute wird nicht zwischen Groß- und Kleinschreibung unterschie<strong>de</strong>n (COBOL ist somit<br />

nicht case sensitive).<br />

Ein COBOL-Programm ist in Teile (DIVISION), Kapitel (SECTION) und Abschnitte (PARAGRAPH) geglie<strong>de</strong>rt.<br />

Die vier DIVISIONs sind in ihrer festgelegten Reihenfolge:<br />

• I<strong>de</strong>ntification Division mit <strong>de</strong>m Programmnamen und einigen weitgehend obsoleten Paragraphen für<br />

Kommentare;<br />

• Environment Division, wo Schnittstellen zum Betriebs- und <strong>de</strong>ssen Dateisystem <strong>de</strong>finiert wer<strong>de</strong>n;<br />

• Data Division mit <strong>de</strong>r Definition <strong>de</strong>r Programmvariablen und Datenstrukturen und<br />

• Procedure Division mit <strong>de</strong>n prozeduralen Anweisungen.<br />

In <strong>de</strong>r IDENTIFICATION DIVISION gibt es keine SECTIONs, und in <strong>de</strong>r PROCEDURE DIVISION können<br />

neuerdings SECTIONs und auch PARAGRAPHs entfallen. ENVIRONMENT und DATA DIVISIONs können unter<br />

Umstän<strong>de</strong>n ganz entfallen.<br />

Hieran sieht man die strikte Trennung von Daten<strong>de</strong>klaration und prozeduralen Anweisungen, durch die sich COBOL<br />

auszeichnet. Im Prozedurteil kann man nur Variablen benutzen, die vorher im Datenteil <strong>de</strong>klariert wor<strong>de</strong>n sind. Auch<br />

das Aussehen von formatierten Ausgaben wird nicht im Prozedurteil, son<strong>de</strong>rn im Datenteil durch die<br />

PICTURE-Klausel festgelegt. Der „REPORT WRITER“ macht es möglich, die Struktur einer Druckliste komplett im<br />

Datenteil als physische Struktur von Seiten und logische Struktur von Postenzeilen mit Gruppensummen etc. zu<br />

beschreiben, ohne dass sich <strong>de</strong>r Prozedurteil darum kümmern muss.<br />

Kodierung<br />

Das traditionelle Kodierschema bei Cobol entspricht <strong>de</strong>r Lochkarte mit ihren 80 Spalten, d. h. Schreibstellen. Dabei<br />

waren die ersten 6 Stellen für die Zeilennummerierungen reserviert. Spalte 7 wur<strong>de</strong> zur Kennzeichnung einer<br />

Kommentar- o<strong>de</strong>r einer Fortsetzungszeile beziehungsweise einer, die nur für das Debugging übersetzt wer<strong>de</strong>n soll,<br />

reserviert. Spalte 8 bis 11 (Area A) beinhaltete die Namen von Divisions, Sections und Paragraphs. Die 12. bis 72.<br />

Spalte (Area B) beherbergten alles übrige, zum Beispiel Anweisungen (statements). Spalte 73 bis 80 waren für<br />

sonstige Markierungen wie z. B. <strong>de</strong>n Namen <strong>de</strong>s Programms o<strong>de</strong>r Quelltext-Elementen vorgesehen.<br />

Der aktuelle Standard (2002) kennt ein fixes Zeilenformat, das die Einteilung in Area A und Area B aufhebt, sowie<br />

ein ganz freies Format, das in <strong>de</strong>n Spalten 1 bis 255 alles erlaubt. Die Son<strong>de</strong>rrolle <strong>de</strong>r Spalte 7 entfällt da<br />

Kommentare mit *> eingeleitet, Fortsetzungszeilen mittels & zusammengesetzt und Debuggingzeilen mittels<br />

bedingter Übersetzung realisiert wer<strong>de</strong>n (>>DEFINE … >>IF …).<br />

Ein fast minimales Cobol-Programm: I<strong>de</strong>ntification Division. Program-ID. HALLOPGM. Procedure Division.<br />

Display "Hallo Wikipedianer!" STOP RUN.


COBOL 38<br />

Daten<strong>de</strong>klarationen<br />

… erfolgen in <strong>de</strong>r Data Division<br />

• Dateien und <strong>de</strong>ren Satzstrukturen wer<strong>de</strong>n in <strong>de</strong>r File Section beschrieben.<br />

• Statische (globale) Variablen wer<strong>de</strong>n in <strong>de</strong>r Working-Storage Section <strong>de</strong>finiert.<br />

• Automatische (lokale bzw. dynamische) Variablen wer<strong>de</strong>n in <strong>de</strong>r Local-Storage Section <strong>de</strong>finiert. (siehe Stack)<br />

• Aufruf-Parameter wer<strong>de</strong>n in <strong>de</strong>r Linkage Section <strong>de</strong>finiert.<br />

• Komplexe Drucklisten wer<strong>de</strong>n in <strong>de</strong>r Report Section <strong>de</strong>finiert.<br />

• Bildschirmein- und ausgabe in <strong>de</strong>r Screen Section.<br />

Zur Deklaration von Variablen bietet COBOL zahlreiche Klauseln, <strong>de</strong>ren wichtigsten die Stufennummer, die<br />

PICTURE-Klausel und die USAGE-Klausel sind.<br />

Die Stufennummer 77 kennzeichnet eine freistehen<strong>de</strong> Variable, 01 kann ebenfalls eine freistehen<strong>de</strong> Variable<br />

bezeichnen, leitet aber normalerweise die Deklaration einer Gruppe ein, was in an<strong>de</strong>ren Sprachen als Record (Pascal<br />

u. ä.) o<strong>de</strong>r struct (C++, C u. ä.) bezeichnet wird. Die Stufennummern 02 bis 49 kennzeichnen dann dieser Gruppe<br />

untergeordnete Daten<strong>de</strong>klarationen, die selber auch wie<strong>de</strong>r Gruppen (Records) sein können. Eine Daten<strong>de</strong>klaration,<br />

die keine weiteren untergeordneten (mit höheren Stufennummern) Daten<strong>de</strong>klarationen hat, wird in COBOL als<br />

elementar (elementary Item) bezeichnet, ansonsten ist es eine Gruppen-Variable (Group Item). Eine solche Gruppe<br />

kann man abstrakt als Baum darstellen mit <strong>de</strong>n Gruppen als Knoten und <strong>de</strong>n elementary Items als Blättern.<br />

Mit <strong>de</strong>r speziellen Stufennummer 66 kann man ganzen Speicherbereichen einen an<strong>de</strong>ren Namen geben, mit 88 einen<br />

Bedingungsnamen <strong>de</strong>finieren, <strong>de</strong>r wie ein boolescher Ausdruck in zum Beispiel einer IF-Anweisung verwandt<br />

wer<strong>de</strong>n kann.<br />

Die Stufennummern wer<strong>de</strong>n üblicherweise zweistellig geschrieben. Aus <strong>de</strong>n Lochkartenzeiten stammt die<br />

Gewohnheit, die Stufennummern in einer Gruppen<strong>de</strong>finition nicht fortlaufend, son<strong>de</strong>rn in Schritten von 5 o<strong>de</strong>r 10 zu<br />

vergeben, weil man dann Zwischenstufen einfügen konnte, ohne gleich einen ganzen Kartenstapel neu lochen zu<br />

müssen.<br />

Das folgen<strong>de</strong> Beispiel beschreibt das Layout <strong>de</strong>r traditionellen 80-stelligen COBOL-Programmzeile:<br />

01 Cobol-Zeile USAGE DISPLAY.<br />

05 Zeilennummer PIC 9(6).<br />

05 Indikator PIC X.<br />

88 Ist-Kommentar VALUES '*' '/'.<br />

88 Ist-Fortsetzungszeile VALUE '-'.<br />

88 Ist-Debuggingzeile VALUE 'D' 'd'.<br />

05 Bereich-A-und-B.<br />

10 Bereich-A PIC X(4).<br />

10 Bereich-B PIC X(61).<br />

05 Zeilen-En<strong>de</strong>kennung PIC X(8).<br />

Die Definition eines Wertebereiches sieht als Beispiel so aus:<br />

01 Wertebereich PIC 99V99 USAGE COMPutational.<br />

88 Einerwerte Value 1 thru 9.<br />

88 Zehnerwerte Value 10 thru 19.<br />

88 Zwanzigerwerte Value 20 thru 29.<br />

Äußere Erscheinung und interne Repräsentation wer<strong>de</strong>n im wesentlichen durch die Klauseln PICTURE und USAGE<br />

bestimmt. USAGE COMP, wenn damit binär gerechnet wer<strong>de</strong>n soll, DISPLAY zur Anzeige. Der Standard ist<br />

hingegen, <strong>de</strong>zimal zu rechnen. Die Symbole hinter PICture legen die Anzahl Stellen o<strong>de</strong>r Zeichen fest, bzw.<br />

Editiersymbole wie Dezimal- o<strong>de</strong>r Tausen<strong>de</strong>rtrennzeichen, Vorzeichen, Währungssymbole, gedachtes


COBOL 39<br />

Dezimaltrennzeichen (V) etc., und bestimmen eine elementare Variable damit als entwe<strong>de</strong>r alphabetisch,<br />

alphanumerisch, numerisch o<strong>de</strong>r numerisch-editiert.<br />

In COBOL wird die Formatierung für sichtbare Ausgabe eben durch die Daten<strong>de</strong>klaration erledigt, nicht durch<br />

prozedurale Anweisungen wie in Sprachen wie Pascal o<strong>de</strong>r C. Den Rest <strong>de</strong>r insgesamt etwa 60 möglichen Klauseln<br />

einer Daten<strong>de</strong>klaration möge man in einem COBOL-Handbuch nachschlagen.<br />

Prozedurale Anweisungen<br />

In <strong>de</strong>r Procedure Division fin<strong>de</strong>t sich <strong>de</strong>r ausführbare Programmco<strong>de</strong>. Die Ausführung beginnt mit <strong>de</strong>r ersten<br />

Anweisung hinter <strong>de</strong>r Überschrift Procedure Division bzw. <strong>de</strong>n DECLARATIVES, <strong>de</strong>ren Ausführung nur durch<br />

bestimmte Ereignisse ausgelöst wird. Danach wer<strong>de</strong>n alle Anweisungen sequentiell ausgeführt, bis ein STOP RUN<br />

das Programm been<strong>de</strong>t, o<strong>de</strong>r ein GO TO zu einer an<strong>de</strong>ren Stelle im Programm verzweigt.<br />

Die Procedure Division besteht aus einer o<strong>de</strong>r mehreren Prozeduren. Eine Prozedur ist entwe<strong>de</strong>r<br />

• eine Section: Ein Name, <strong>de</strong>r in Spalte 8 beginnt gefolgt von <strong>de</strong>m Schlüsselwort SECTION und einem Punkt.<br />

• eine Gruppe von Sections<br />

• ein Paragraph: Ein Name, <strong>de</strong>r in Spalte 8 beginnt und mit Punkt en<strong>de</strong>t.<br />

• eine Gruppe von Paragraphs<br />

Eine solche Prozedur besteht dann aus einem o<strong>de</strong>r mehreren Cobol-Anweisungen (Statements).<br />

Prozeduren können mit <strong>de</strong>r Cobol-Anweisung Perform ausgeführt wer<strong>de</strong>n. Es gibt keine formale<br />

Parameterübergabe, alle Prozeduren haben Zugriff auf alle Fel<strong>de</strong>r in <strong>de</strong>r Data Division.<br />

Mittels CALL können externe Programme (Cobol o<strong>de</strong>r an<strong>de</strong>re <strong>Programmiersprache</strong>n) aufgerufen wer<strong>de</strong>n. Dabei<br />

wer<strong>de</strong>n Parameter By Reference o<strong>de</strong>r By Content übergeben, wodurch unterschie<strong>de</strong>n wird, ob das aufgerufene<br />

Programm übergebene Variablen im aufrufen<strong>de</strong>n Programm än<strong>de</strong>rn kann.<br />

Cobol unterstützt (wenn auch mühselig) die strukturierte Programmierung; die Verwendung <strong>de</strong>s ebenfalls zulässigen<br />

GOTOs ist heute verpönt. In <strong>de</strong>r professionellen Programmierung herrschen hausinterne Programmierstandards,<br />

welche in <strong>de</strong>r Mehrzahl festlegen, dass Prozeduren ausschließlich aus einer Section bestehen.<br />

Ziel <strong>de</strong>r Cobol-Syntax soll sein, dass auch ein nicht an formale Programmiersyntax gewohnter Mensch <strong>de</strong>n Sinn<br />

eines Cobol-Programm erahnen kann (wenn er o<strong>de</strong>r sie etwas Englisch kann). Alle Cobol-Anweisungen beginnen<br />

mit einem Verb, und davon gibt es viele.<br />

Einfache Co<strong>de</strong>schnipsel<br />

Zur Darstellung <strong>de</strong>r Syntax wird einfaches C (o<strong>de</strong>r Java) zu Hilfe genommen.<br />

• Ein a = b; ist in Cobol MOVE b TO a.<br />

• Wenn es zum Beispiel in C heißt a = b + c;, dann schreibt ein Cobol-Programmierer entwe<strong>de</strong>r ADD b TO c<br />

GIVING a o<strong>de</strong>r alternativ COMPUTE a = b + c.<br />

• Ein a++; in C entspricht auf Cobol ADD 1 TO a.


COBOL 40<br />

IF/ELSE und EVALUATE<br />

IF und ELSE funktionieren so, wie man es erwartet. Das End-If wur<strong>de</strong> erst mit <strong>de</strong>m COBOL85-Standard eingeführt.<br />

Im COBOL74-Standard wur<strong>de</strong> die IF-Anweisung noch durch einen Punkt been<strong>de</strong>t, was eine leicht zu übersehen<strong>de</strong><br />

Fehlerquelle darstellen konnte.<br />

COBOL85-Syntax:<br />

If Nenner > 0<br />

Else<br />

End-If<br />

COBOL74-Syntax:<br />

Compute Zahl = Zaehler / Nenner<br />

End-Compute<br />

Display "Ich bin so unglücklich!"<br />

Move 0 To Zahl<br />

If Nenner > 0<br />

Else<br />

Compute Zahl = Zaehler / Nenner<br />

Display "Ich bin so unglücklich!"<br />

Move 0 To Zahl.<br />

EVALUATE macht die mehrfache Fallunterscheidung, womit je<strong>de</strong> Form von CASE o<strong>de</strong>r Switch (wie in C), Folgen<br />

von IF/ELSIF/ELSIF/END-IF bis hin zu vollständigen Entscheidungstabellen dargestellt wer<strong>de</strong>n kann. Die<br />

Anweisung EVALUATE wur<strong>de</strong> erstmals in COBOL85 integriert, COBOL-Versionen vor <strong>de</strong>r 85-Version kennen<br />

kein EVALUATE, so dass dort mehrfache Fallunterscheidungen über – teils schwierig zu lesen<strong>de</strong> – IF-Konstrukte<br />

abgebil<strong>de</strong>t wer<strong>de</strong>n mussten.<br />

Evaluate True<br />

When Nenner > 0<br />

Compute Zahl = Zaehler / Nenner<br />

When Nenner < 0<br />

When Other<br />

End-Evaluate<br />

Compute Zahl = Zaehler / Nenner * -1<br />

Display "Ich bin schon wie<strong>de</strong>r unglücklich!"<br />

Move 0 To Zaehler<br />

Eine Cobol-Spezialität sind die sogenannten Conditional Statements, das sind Cobol-Anweisungen mit einer<br />

Bedingungs-Klausel:<br />

COBOL85-Syntax:<br />

Read Eingabesatz<br />

At End<br />

End-read<br />

Display "Dateien<strong>de</strong> erreicht" Eingabe-Zaehler "gelesen!"<br />

Set En<strong>de</strong>-<strong>de</strong>r-Verarbeitung To True<br />

Not At End<br />

Add 1 to Eingabe-Zaehler


COBOL 41<br />

Schleifen<br />

Eine C-Schleife wie „for (i=0; i= 10<br />

Das Haupteinsatzgebiet <strong>de</strong>r <strong>Programmiersprache</strong> COBOL ist die betriebswirtschaftliche Datenverarbeitung. Wenn<br />

EDV-Programme in eine Benutzerschnittstelle, einen Verarbeitungsteil und einen Datenhaltungsteil strukturiert<br />

wer<strong>de</strong>n, liegt <strong>de</strong>r Einsatzschwerpunkt von COBOL-Programmen im Verarbeitungsteil.<br />

Insbeson<strong>de</strong>re auf PCs, aber auch auf an<strong>de</strong>ren Systemen können als Benutzerschnittstelle eine Vielzahl von<br />

Möglichkeiten zum Einsatz kommen. Neben <strong>de</strong>n Standard-COBOL Anweisungen ACCEPT zur Tastatureingabe und<br />

DISPLAY zur Bildschirmausgabe kommt aus <strong>de</strong>r X/OPEN-Spezifikation die SCREEN SECTION hinzu, außer<strong>de</strong>m<br />

herstellerspezifische Lösungen.<br />

Sofern die Anwendungsarchitektur in mehrere Schichten getrennt ist, kann die Präsentationsschicht auch auf <strong>de</strong>n<br />

Client verlagert wer<strong>de</strong>n. Dies erlaubt <strong>de</strong>n Zugriff auf COBOL-Anwendungen über grafische Frontends. Client und<br />

Server müssen dazu ein Kommunikationsprotokoll unterstützen. Momentan erlebt die Serviceorientierte Architektur<br />

(SOA) einen Hype, die unter an<strong>de</strong>rem dieses Problem durch einen Standard zu lösen sucht.<br />

Der Datenhaltungsteil kann mit COBOL-Mitteln o<strong>de</strong>r mit einem Datenbankanschluss realisiert wer<strong>de</strong>n. Für <strong>de</strong>n<br />

Zugriff auf relationale Datenbanken stellt COBOL embed<strong>de</strong>d SQL (EXEC SQL) zur Verfügung. Auch kann man<br />

Stored Procedures in Cobol programmieren.<br />

COBOL ist in <strong>de</strong>r Wirtschaft und Verwaltung, z. B. bei <strong>de</strong>n Finanzbehör<strong>de</strong>n, weit verbreitet. Aufgrund <strong>de</strong>r historisch<br />

gewachsenen Anzahl an COBOL-Programmen ist es für die Unternehmen sehr schwer und sehr teuer, diese zu<br />

ersetzen. Mangeln<strong>de</strong> Dokumentation ist hier jedoch als Hauptgrund zu nennen (Softwarekrise), nicht jedoch die<br />

Unersetzlichkeit von COBOL.<br />

Neuerungen in COBOL aus <strong>de</strong>r jüngsten Zeit:<br />

• Nested Program erlaubt es, innerhalb eines COBOL-Programms Prozeduren mit lokalen Variablen zu schreiben.<br />

• Intrinsic Functions für mathematische und an<strong>de</strong>re Funktionen.<br />

• Rekursion bei externen Aufrufen (call) ist möglich.<br />

• Das COBOL-Verb XML PARSE bietet einen integrierten XML-Parser.<br />

• OO-Erweiterungen erleichterten die Zusammenarbeit mit objektorientierten <strong>Programmiersprache</strong>n.<br />

• Formatfreie Notation erlaubt eine Zeilenlänge von 255 Zeichen und ein Verzicht auf die alten Margins A und B.<br />

• Bedingte Compilierung und ein preprocessing.<br />

Entwicklung und Standardisierung<br />

Ein Ausschuss <strong>de</strong>s oben erwähnten CODASYL erarbeitete im Jahr 1959 einige Grundsätze, legte <strong>de</strong>n Namen<br />

COBOL fest und veröffentlichte im April 1960 seinen Abschlussbericht mit <strong>de</strong>n ersten Spezifikationen <strong>de</strong>r<br />

<strong>Programmiersprache</strong>, die als COBOL-60 in die Geschichte eingingen.<br />

Im Rahmen von CODASYL gab es dann ständig einen Ausschuss, teilweise mit Unterausschüssen, <strong>de</strong>r bzw. die sich<br />

mit <strong>de</strong>r Weiterentwicklung von COBOL befassten und im Lauf <strong>de</strong>r Jahrzehnte verschie<strong>de</strong>ne Namen und<br />

verschie<strong>de</strong>ne Status innerhalb von CODASYL hatten.


COBOL 42<br />

Entwicklung durch CODASYL<br />

COBOL-60 zeigte die Praktikabilität <strong>de</strong>r angestrebten gemeinsamen <strong>Programmiersprache</strong>.<br />

COBOL-61 war nur teilweise kompatibel mit <strong>de</strong>r Vorgängerversion, wur<strong>de</strong> aber weitgehend in zahlreichen<br />

Compilern implementiert. CODASYL hat sich dann darauf verpflichtet, die Sprache von da aus evolutionär<br />

weiterzuentwickeln, statt revolutionäre Än<strong>de</strong>rungen vorzunehmen.<br />

Mit COBOL-61 EXTENDED kamen u. a. die SORT-Möglichkeiten und <strong>de</strong>r REPORT WRITER hinzu.<br />

COBOL, EDITION 1965 fügte u. a. interne Tabellen und Optionen für Dateibearbeitung hinzu.<br />

Weitere Dokumente zur Entwicklung sind die CODASYL COBOL JOURNAL OF DEVELOPMENT <strong>de</strong>r Jahre<br />

1968, 1969, 1970, 1973, 1976, 1978, 1981 und 1984.<br />

Erweiterungen durch X/Open, die Open Group<br />

Im Rahmen <strong>de</strong>r Bemühungen um einen Standard für das Betriebssystem Unix durch die Industrievereinigung<br />

X/Open wur<strong>de</strong>n dafür auch Spezifikationen für COBOL vereinbart, <strong>de</strong>ren jüngste von 1991 aus <strong>de</strong>n höchsten Stufen<br />

<strong>de</strong>r vorgeschriebenen Module von COBOL-85 besteht, mit <strong>de</strong>r Erweiterung von 1989 durch die „Intrinsic<br />

Functions“, aber ohne Report-Writer, Segmentierung und Debugging, dafür aber mit eigenen Erweiterungen für<br />

Interaktion mit Bildschirmformularen (SCREEN SECTION und ACCEPT/DISPLAY), gemeinsamen Zugriff auf<br />

Dateien mit Sperren auf Dateien und Sätze, sowie Internationalisierung mit z. B. Doppelbyte-Zeichensätzen.<br />

Standardisierung durch ANSI<br />

Im Jahr 1960 wur<strong>de</strong>, angeregt durch <strong>de</strong>n Industrieverband „Computer and Business Equipment Manufacturers<br />

Association“, im Rahmen <strong>de</strong>r US-amerikanischen Standardisierungsorganisation (ASA) ein „Committee on<br />

Computers and Information Processing“ mit <strong>de</strong>r Nummer X3, geschaffen, welches dann einen Unterausschuss X3.4<br />

für <strong>Programmiersprache</strong>n einrichtete, <strong>de</strong>r wie<strong>de</strong>rum einen Unterausschuss X3.4.4 für COBOL einrichtete. Im<br />

Dezember 1962 wur<strong>de</strong>n Hersteller und an<strong>de</strong>re Interessierte zur Mitarbeit an <strong>de</strong>r Standardisierung eingela<strong>de</strong>n, wobei<br />

dann festgelegt wur<strong>de</strong>, dass die Standardisierung auf <strong>de</strong>n Publikationen <strong>de</strong>s CODASYL fußen sollten.<br />

Der erste Standard wur<strong>de</strong> am 23. August 1968 als USA Standard COBOL 1968 verabschie<strong>de</strong>t und als Dokument<br />

X3.23-1968 veröffentlicht.<br />

Der Ausschuss X3.4.4 wur<strong>de</strong> dann zum Technischen Komitee X3J4, wie er auch heute noch heißt, und machte sich<br />

an die Arbeit, <strong>de</strong>n nächsten Standard zu entwickeln, <strong>de</strong>r dann am 10. Mai 1974 als American National Standard<br />

COBOL 1974 verabschie<strong>de</strong>t und dann im Dokument ANS X3.23-1974 veröffentlicht wur<strong>de</strong>.<br />

Der nächste Standard wur<strong>de</strong> im April 1985 von X3J4 verabschie<strong>de</strong>t und im September vom zuständigen<br />

Entscheidungsgremium <strong>de</strong>r inzwischen ANSI heißen<strong>de</strong>n Organisation angenommen und dann als ANS X3.23-1985<br />

veröffentlicht. COBOL-85 führte mit Begrenzern wie END-IF und END-PERFORM erstmals die Möglichkeit ein, in<br />

COBOL beliebig geschachtelte Entscheidungs- (IF, EVALUATE) und Wie<strong>de</strong>rholungsanweisungen (PERFORM) zu<br />

schreiben und damit die sogenannte „Strukturierte Programmierung“ in COBOL zu praktizieren. Zu COBOL-85<br />

wur<strong>de</strong> später ein Zusatz mit eingebauten (intrisic) Funktionen und ein weiterer mit Korrekturen zum Standard<br />

veröffentlicht.<br />

Der aktuelle Standard wur<strong>de</strong> 2002 verabschie<strong>de</strong>t. Wesentliche Än<strong>de</strong>rungen darin sind die Übernahme <strong>de</strong>r<br />

Erweiterungen durch X/Open, die explizite Unterstützung von internationalen Zeichensätzen einschließlich Unico<strong>de</strong>,<br />

die Objektorientierte Programmierung sowie bedingte Compilierung, neben zahlreichen an<strong>de</strong>ren Erweiterungen und<br />

Präzisierungen.<br />

Nach <strong>de</strong>m En<strong>de</strong> von CODASYL hat das Komitee J4 auch die Verantwortung nicht nur für die Standardisierung,<br />

son<strong>de</strong>rn auch für die Entwicklung übernommen.<br />

Der nächste Standard wird für das Jahr 2008 vorbereitet.


COBOL 43<br />

Internationale Standardisierung bei ISO<br />

Das Komitee X3J4 (früher X3.4.4) hat von Anfang an eng mit verschie<strong>de</strong>nen internationalen Gremien<br />

zusammengearbeitet. Dementsprechend stimmte ANS COBOL X3.23-1968 mit <strong>de</strong>r ISO-Empfehlung für COBOL<br />

überein.<br />

In <strong>de</strong>r ISO ist das Technical Committee ISO/TC 97, Computers and Information Processing zuständig, <strong>de</strong>ssen<br />

Sekretariat vom ANSI gestellt wird.<br />

ISO hat zu COBOL eine Empfehlung (Recommendation) R-1989:1972 sowie Standards ISO 1989:1978 und ISO<br />

1989:1985 verabschie<strong>de</strong>t und dabei die Vorgabe <strong>de</strong>s US-Standardisierungsgremiums übernommen.<br />

Der aktuelle Standard 2002 ist umgekehrt zuerst als ISO/IEC 1989:2002 veröffentlicht und dann von <strong>de</strong>n nationalen<br />

Standardorganisationen übernommen wor<strong>de</strong>n.<br />

Module und standardkonforme Implementierungen<br />

COBOL-68, COBOL-74 und COBOL-85 ordneten die verschie<strong>de</strong>nen Features <strong>de</strong>r Sprache einem Modul mit jeweils<br />

einem bis drei „Levels“ zu, woraus dann minimale und volle Implementierungen <strong>de</strong>s Standards als Kombination von<br />

bestimmten Levels <strong>de</strong>r jeweiligen Module <strong>de</strong>finiert wur<strong>de</strong>n. Eine mit COBOL-2002 konforme Implementierung<br />

muss <strong>de</strong>n gesamten Sprachumfang implementieren.<br />

COBOL-Compiler<br />

Für Computer <strong>de</strong>r Klassen „Großrechner“ und „Mittlere Datentechnik“ boten und bieten <strong>de</strong>ren jeweilige Hersteller –<br />

IBM, Unisys, Siemens, Fujitsu-Siemens, HP, Bull u. a. – auf ihre proprietären Betriebssysteme zugeschnittene<br />

COBOL-Compiler an, z. T. verschie<strong>de</strong>ne Compiler, die beispielsweise verschie<strong>de</strong>nen Standards entsprechen.<br />

Für Betriebssysteme, die aus <strong>de</strong>r UNIX- bzw. MS-DOS-Tradition entstan<strong>de</strong>n sind, gibt es COBOL-Compiler von<br />

verschie<strong>de</strong>nen Software-Herstellern. Näheres siehe in <strong>de</strong>r unten verlinkten COBOL-FAQ von William M. Klein.<br />

Siehe auch<br />

• ACUCOBOL<br />

Weblinks<br />

• Website <strong>de</strong>s COBOL-Standards [2]<br />

• COBOL User Groups (COBUG) [3]<br />

• X/Open-COBOL-Spezifikationen [4]<br />

• COBOL-FAQ von William M. Klein [5]<br />

• Ein übersichtliches und gut dokumentiertes COBOL-Programm mit Quellco<strong>de</strong> und ausführbarer EXE für<br />

Windows [6]<br />

• Handbücher zu ILE Cobol [7]


COBOL 44<br />

Referenzen<br />

[1] http:/ / www. opencobol. org/<br />

[2] http:/ / www. cobolstandards. com/<br />

[3] http:/ / www. cobug. com/<br />

[4] http:/ / www. opengroup. org/ bookstore/ catalog/ c192. htm<br />

[5] http:/ / home. comcast. net/ ~wmklein/ FAQ/ COBOLFAQ. htm<br />

[6] http:/ / www. vaeter-aktuell. <strong>de</strong>/ x/ Ziegenproblem<br />

[7] http:/ / publib. boul<strong>de</strong>r. ibm. com/ html/ as400/ v5r1/ ic2929/ info/ rzahgcobol. htm<br />

D (<strong>Programmiersprache</strong>)<br />

Paradigmen: imperativ, objektorientiert, generisch, modular<br />

Erscheinungsjahr: 2007<br />

Entwickler: Walter Bright<br />

Aktuelle Version:<br />

Typisierung: Stark, statisch<br />

wichtige Implementierungen: DMD [3] , GDC [4] , LDC<br />

Einflüsse: C, C++, Java, C#<br />

D<br />

[1] [2]<br />

1.045 (stable), 2.030 (alpha) (11. Mai 2009<br />

)<br />

D ist eine <strong>Programmiersprache</strong>, die sich äußerlich stark an C++ anlehnt. Ebenso wie C++ ist D für die<br />

Systemprogrammierung geeignet. D wird seit 1999 von Walter Bright entwickelt und wur<strong>de</strong> am 3. Januar 2007 in<br />

<strong>de</strong>r stabilen Version 1.0 veröffentlicht. [5]<br />

Seit <strong>de</strong>m 17. Juni 2007 gibt es einen experimentellen 2.0-er-Version-Zweig, in <strong>de</strong>m die Sprache weiter entwickelt<br />

wird.<br />

Sprachmittel<br />

Die Sprache D übernimmt die meisten Sprachmittel <strong>de</strong>r Sprache C. Auch die C-Standardbibliothek ist Bestandteil<br />

von D. Dadurch besteht Kompatibilität zu in C geschriebenen Programmen. Kompatibilität mit C++ gibt es hingegen<br />

nicht.<br />

D ist eine objektorientierte, imperative <strong>Programmiersprache</strong> und verfügt über Templates und überladbare<br />

Operatoren. Gegenüber C++ bietet es außer<strong>de</strong>m Design by contract, Module und eine integrierte automatische<br />

Speicherbereinigung. Letztere kann sowohl global als auch für einzelne Objekte <strong>de</strong>aktiviert und durch eine eigene<br />

Speicherverwaltung ersetzt wer<strong>de</strong>n.


D (<strong>Programmiersprache</strong>) 45<br />

Compiler<br />

Es gibt mehrere Compiler für die Sprache D, <strong>de</strong>n DMD (Digital Mars D) [3] vom Erfin<strong>de</strong>r Walter Bright für Windows<br />

und Linux, sowie GDC [4] , eine Implementierung für GCC für verschie<strong>de</strong>ne Plattformen.<br />

Des Weiteren gibt es inzwischen drei Compiler für D, die selbst in D programmiert wur<strong>de</strong>n. Dies sind <strong>de</strong>r<br />

DIL-Compiler [6] , Dang [7] und <strong>de</strong>r LDC [8] , welche allesamt kompatibel zu LLVM sind.<br />

Entwicklungsumgebungen<br />

D wird zunehmend von verschie<strong>de</strong>nen IDEs unterstützt. Zum Einsatz kommen unter an<strong>de</strong>ren die Editoren Entice<br />

Designer, Emacs, Vim, Scite, Scite4D, Smultron, TextMate, Zeus und Geany. Vim und Scite4D unterstützen<br />

Syntaxhervorhebung und Autovervollständigung. Für TextMate existiert eine Erweiterung und Co<strong>de</strong>::Blocks<br />

unterstützt D teilweise. Allerdings wer<strong>de</strong>n Autovervollständigung und Refactoring momentan von keiner IDE für D<br />

komplett bereitgestellt. Darüber hinaus gibt es noch für Eclipse mit <strong>de</strong>m Plugin Descent [9] Unterstützung für D.<br />

Zu<strong>de</strong>m gibt es in D geschriebene IDEs, wie z. B. Poseidon. Letztere unterstützt Autovervollständigung, Refactoring<br />

und hat einen integrierten Debugger.<br />

D Anwendungen können mit je<strong>de</strong>m beliebigen C/C++ Debugger <strong>de</strong>buggt wer<strong>de</strong>n, wie z.B. GDB o<strong>de</strong>r WinDbg,<br />

wobei die Unterstützung für bestimmte grundlegen<strong>de</strong> Sprachfeatures stark eingeschränkt ist. Ein Debugger speziell<br />

für D ist Ddbg für Windows. Der kommerzielle ZeroBUGS Debugger für Linux unterstützt D experimentell. Ddbg<br />

kann mit <strong>de</strong>n verschie<strong>de</strong>nsten IDEs o<strong>de</strong>r von <strong>de</strong>r Kommandozeile aus benutzt wer<strong>de</strong>n, während ZeroBUGS eine<br />

eigene GUI mitbringt.<br />

Programmbeispiel<br />

// Programm, geschrieben in D, das seine Parameter ausgibt<br />

import std.stdio; // importiert die Funktion writefln()<br />

void main(string[] args)<br />

{<br />

foreach(int i, string a; args) {<br />

writefln("Parameter %d = '%s'", i, a); // Je<strong>de</strong>r Eintrag im Feld<br />

args wird ausgegeben.<br />

}<br />

}<br />

Erläuterung<br />

Der main-Funktion wer<strong>de</strong>n die Parameter als ein Feld von Zeichenketten (Strings) übergeben. Ruft man dieses<br />

Programm unter Windows mit beispiel.exe -win -s auf, dann gibt es diesen Text in einem<br />

Konsolen-Fenster aus:<br />

Parameter 0 = 'beispiel.exe'<br />

Parameter 1 = '-win'<br />

Parameter 2 = '-s'<br />

Siehe auch: Hallo Welt in D


D (<strong>Programmiersprache</strong>) 46<br />

Weblinks<br />

• Die <strong>Programmiersprache</strong> D [10] bei Digital Mars (Downloads, englisch)<br />

• dsource.org [11] D-Projektseite (englisch)<br />

• Manfred Hansen: <strong>Programmiersprache</strong> D. [12] 2010, 167 S. (PDF-Datei, 1,9 MB)<br />

Literatur<br />

• Tobias Wassermann, Christian Speer: Programmieren in D, 1. Auflage (November 2007), 165 Seiten,<br />

entwickler.press, ISBN 978-3939084693.<br />

Referenzen<br />

[1] D 1.0 Change Log, http:/ / www. digitalmars. com/ d/ 1. 0/ changelog. html<br />

[2] D 2.0 Change Log, http:/ / www. digitalmars. com/ d/ 2. 0/ changelog. html<br />

[3] DMD (Digital Mars D): DMD (http:/ / www. digitalmars. com/ d/ dcompiler. html)<br />

[4] GDC (GNU D Compiler): GDC (http:/ / dgcc. sourceforge. net/ )<br />

[5] Heise Online: Eleganter programmieren: D ist da (http:/ / www. heise. <strong>de</strong>/ newsticker/ meldung/ 83145), 3. Januar 2007 – 14:52<br />

[6] DIL-Projektseite (http:/ / co<strong>de</strong>. google. com/ p/ dil/ )<br />

[7] Dang-Projektseite (http:/ / www. dsource. org/ projects/ dang)<br />

[8] LDC-Projektseite (http:/ / dsource. org/ projects/ ldc)<br />

[9] Descent-Projektseite (http:/ / www. dsource. org/ projects/ <strong>de</strong>scent)<br />

[10] http:/ / www. digitalmars. com/ d/<br />

[11] http:/ / www. dsource. org/<br />

[12] http:/ / www. steinmole. <strong>de</strong>/ d/ d_buch. pdf<br />

DarkBASIC<br />

DarkBASIC<br />

Entwickler: The Game Creators Limited<br />

Aktuelle Version: Classic: 1.21 (14.08.2008),<br />

Professional: 1.074 (23.07.2009)<br />

Betriebssystem: Windows<br />

Kategorie: Compiler<br />

Lizenz: proprietär<br />

Deutschsprachig: IDE/Hilfe<br />

darkbasic.thegamecreators.com [1]<br />

DarkBASIC ist <strong>de</strong>r Name einer integrierten Entwicklungsumgebung (IDE) und einer <strong>Programmiersprache</strong>, welche<br />

bei<strong>de</strong> von <strong>de</strong>r britischen Firma „The Game Creators“ entwickelt wur<strong>de</strong>n. Die Sprache ist ein BASIC-Dialekt und<br />

greift auf die DirectX-Bibliotheken von Microsoft zurück. Ein beson<strong>de</strong>res Merkmal ist, dass Befehle auch<br />

Leerzeichen enthalten können.<br />

DarkBASIC ermöglicht einen einfachen Umgang mit 3D-Objekten, Grafiken, Sounds sowie an<strong>de</strong>ren Medien.


DarkBASIC 47<br />

DarkBASIC<br />

Die erste Version von DarkBASIC, auch DarkBASIC Classic genannt(kurz: DB o<strong>de</strong>r DBC), erschien 1999. In dieser<br />

Variante wer<strong>de</strong>n die erstellten Programme BASIC-typisch interpretiert. DarkBASIC benutzt die Funktionen <strong>de</strong>r<br />

DirectX-Versionen 6 bis 8.1.<br />

Durch einen Patch, <strong>de</strong>r im Jahr 2000 erschien, wur<strong>de</strong>n Netzwerk-Funktionen hinzugefügt. Diese Version wird<br />

inzwischen nicht mehr weiter entwickelt.<br />

Der Hersteller betreibt ein Programm, welches diese Software für Schulen kostenlos anbietet.<br />

DarkBASIC Professional<br />

Die Professional-Version von DarkBASIC (kurz: DBP), welche in Deutschland unter <strong>de</strong>m Namen „3D Games<br />

Creator“ vertrieben wird, erschien im Jahr 2002.<br />

Sie beinhaltet eine komplett neue, benutzerfreundlichere IDE und zahlreiche Verbesserungen, welche die Sprache<br />

und die Technik <strong>de</strong>r mitgelieferten Befehle betrifft. Beispielsweise unterstützt DarkBASIC Professional viele neue<br />

Formate, die es in <strong>de</strong>r Classic-Version nicht gab. Unter an<strong>de</strong>rem gehören dazu Half-Life- o<strong>de</strong>r Quake III<br />

Arena-Karten, außer<strong>de</strong>m wer<strong>de</strong>n die Programme in echten Maschinenco<strong>de</strong> übersetzt.<br />

Diese Variante von DarkBASIC nutzt außer<strong>de</strong>m die DirectX-Versionen 8 und 9 (aktuell 10.0 Februar 2008).<br />

Für diese Version existieren zahlreiche Erweiterungen <strong>de</strong>s Herstellers selbst, sowie von <strong>de</strong>r Community<br />

bereitgestellte.<br />

Sprachumfang<br />

Kategorie Beispiele neu in DBP<br />

Core If [2]<br />

System Call Dll [5]<br />

Mathematik Sin [8]<br />

Input/Output Print [11]<br />

Netzwerk Ftp Connect [14]<br />

Audio Play Sound [17]<br />

2Dimensional Circle [20]<br />

Dim [3]<br />

Fog Available [6]<br />

Inc [9]<br />

Mouseclick [12]<br />

Create Net Game<br />

[15]<br />

Load 3DSound [18]<br />

Blur Bitmap [21]<br />

3Dimensional Make Object Sphere [23] Point Light [24]<br />

And [4]<br />

Make Memory [7]<br />

Make Vector3 [10]<br />

Make Memblock From File [13]<br />

Http Connect [16]<br />

Set Music Volume [19]<br />

Load DVD Animation [22]<br />

Load BSP [25]<br />

Kategorie Beispiele neu in DBP


DarkBASIC 48<br />

Quelltextbeispiele<br />

Hello World<br />

PRINT "Hello World"<br />

WAIT KEY `<strong>de</strong>r Befehl ist nötig damit das Programm nicht sofort<br />

been<strong>de</strong>t wird<br />

3D-Beispiel<br />

Bewege einen Würfel über <strong>de</strong>n Bildschirm mit <strong>de</strong>n Pfeiltasten<br />

sync on ` aktiviere die manuelle Bildschirmsyncronisation<br />

sync rate 60 ` setze die Bildschirmwie<strong>de</strong>rholungsrate auf 60Hz<br />

rem <strong>de</strong>aktiviere die automatische Programmbeendung durch die<br />

[Esc]-Taste<br />

neu<br />

disable escapekey<br />

make object cube 1, 100 ` erstelle einen Würfel mit <strong>de</strong>r größe 100<br />

posz = 10<br />

posx = 10<br />

posy = 10<br />

repeat ` start Hauptschleife<br />

` Steuere die Position <strong>de</strong>s Würfels<br />

if upkey() = 1 then inc posy<br />

if downkey() = 1 then <strong>de</strong>c posy<br />

if leftkey() = 1 then <strong>de</strong>c posx<br />

if rightkey() = 1 then inc posx<br />

position object 1, posx, posy, posz ` positioniere das Objekt<br />

sync ` aktualisiere das Bild<br />

until escapekey() = 1 ` been<strong>de</strong> die Hauptschleife, wenn [Esc]-Taste<br />

gedrückt<br />

<strong>de</strong>lete object 1 ` lösche das am Anfang erstelle Objekt<br />

end ` been<strong>de</strong> das Programm<br />

Sync On<br />

Die Sync On ist ein seit 2002 jährliches stattfin<strong>de</strong>n<strong>de</strong>s Treffen <strong>de</strong>r <strong>de</strong>utschen DarkBASIC Community, hier wer<strong>de</strong>n<br />

Vorträge zur Spieleentwicklung gehalten, Spiele sowie Programme vorgestellt. Bei diesen Treffen war auch bereits<br />

<strong>de</strong>r Hauptentwickler Lee Bamber aus <strong>de</strong>m Vereinigten Königreich zu Gast. Folgen<strong>de</strong> Veranstaltungsorte sowie<br />

Gastgeber traten in <strong>de</strong>r Vergangenheit auf.<br />

• 2002 in Bamberg von Thomas Görtler und Michael Karg<br />

• 2003 in Bamberg von Thomas Görtler und Michael Karg<br />

• 2004 in Bamberg von Thomas Görtler<br />

• 2005 in Berlin von D-Man<br />

• 2006 in Altenstadt von Stephan Geist


DarkBASIC 49<br />

mit DarkBASIC erstellte Programme<br />

• FPS Creator – Ein Programm, welches ein einfaches Zusammenstellen eines Ego-Shooters ermöglicht.<br />

• Tom Yum Goong – Spielumsetzung <strong>de</strong>s gleichnamigen Films, mehr als 30.000 Einheiten wur<strong>de</strong>n verkauft.<br />

Literatur<br />

• Jonathan S. Harbour: DarkBASIC Pro Game Programming, Second Edition, Course Technology, ISBN<br />

1598632876 (englisch)<br />

• Alistair Stewart: Hands On DarkBASIC Pro - Volume 1, Digital Skills, ISBN 1-874107-08-4 (englisch)<br />

Weblinks<br />

• Homepage <strong>de</strong>s Herstellers [26] (englisch)<br />

• Offizielle Homepage [27] (<strong>de</strong>utsch)<br />

• <strong>de</strong>.dbLounge.org [28] – Wiki für Befehle, Anleitungen, Co<strong>de</strong>s und Begriffe (<strong>de</strong>utsch)<br />

Referenzen<br />

[1] http:/ / darkbasic. thegamecreators. com/<br />

[2] http:/ / dblounge. org/ command. php?name=IF<br />

[3] http:/ / dblounge. org/ command. php?name=DIM<br />

[4] http:/ / dblounge. org/ command. php?name=AND<br />

[5] http:/ / dblounge. org/ command. php?name=CALL%20DLL<br />

[6] http:/ / dblounge. org/ command. php?name=FOG%20AVAILABLE<br />

[7] http:/ / dblounge. org/ command. php?name=MAKE%20MEMORY<br />

[8] http:/ / dblounge. org/ command. php?name=SIN<br />

[9] http:/ / dblounge. org/ command. php?name=INC<br />

[10] http:/ / dblounge. org/ command. php?name=MAKE%20VECTOR3<br />

[11] http:/ / dblounge. org/ command. php?name=PRINT<br />

[12] http:/ / dblounge. org/ command. php?name=MOUSECLICK<br />

[13] http:/ / dblounge. org/ command. php?name=MAKE%20MEMBLOCK%20FROM%20FILE<br />

[14] http:/ / dblounge. org/ command. php?name=FTP%20CONNECT<br />

[15] http:/ / dblounge. org/ command. php?name=CREATE%20NET%20GAME<br />

[16] http:/ / dblounge. org/ command. php?name=HTTP%20CONNECT<br />

[17] http:/ / dblounge. org/ command. php?name=PLAY%20SOUND<br />

[18] http:/ / dblounge. org/ command. php?name=LOAD%203DSOUND<br />

[19] http:/ / dblounge. org/ command. php?name=SET%20MUSIC%20VOLUME<br />

[20] http:/ / dblounge. org/ command. php?name=CIRCLE<br />

[21] http:/ / dblounge. org/ command. php?name=BLUR%20BITMAP<br />

[22] http:/ / dblounge. org/ command. php?name=LOAD%20DVD%20ANIMATION<br />

[23] http:/ / dblounge. org/ command. php?name=MAKE%20OBJECT%20SPHERE<br />

[24] http:/ / dblounge. org/ command. php?name=POINT%20LIGHT<br />

[25] http:/ / dblounge. org/ command. php?name=LOAD%20BSP<br />

[26] http:/ / www. thegamecreators. com/<br />

[27] http:/ / www. darkbasic. <strong>de</strong>/<br />

[28] http:/ / <strong>de</strong>. dblounge. org/


FORTRAN 50<br />

FORTRAN<br />

Fortran<br />

Paradigmen: prozedural, imperativ, strukturiert, objektorientiert<br />

Erscheinungsjahr: 1957<br />

Entwickler: John W. Backus, IBM<br />

Typisierung: statisch, stark<br />

wichtige Implementierungen: gfortran, g95, Open Watcom, XL Fortran, Intel und an<strong>de</strong>re<br />

Beeinflusste: Algol 58, PL/I, BASIC<br />

Fortran ist eine prozedurale und in ihrer neuesten Version zusätzlich eine objektorientierte <strong>Programmiersprache</strong>, die<br />

insbeson<strong>de</strong>re für numerische Berechnungen eingesetzt wird. Der Name entstand aus FORmula TRANslation und<br />

wur<strong>de</strong> bis zur Version FORTRAN 77 mit Großbuchstaben geschrieben.<br />

Geschichte<br />

Fortran gilt als die erste jemals tatsächlich realisierte höhere <strong>Programmiersprache</strong>. Sie geht zurück auf einen<br />

Vorschlag, <strong>de</strong>n John W. Backus, Programmierer bei IBM, 1953 seinen Vorgesetzten unterbreitete.<br />

Dem Entwurf <strong>de</strong>r Sprache folgte die Entwicklung eines Compilers durch ein IBM-Team unter Leitung von John W.<br />

Backus. Das Projekt begann 1954 und war ursprünglich auf sechs Monate ausgelegt. Tatsächlich konnte Harlan<br />

Herrick, <strong>de</strong>r Erfin<strong>de</strong>r <strong>de</strong>r später heftig kritisierten Goto-Anweisung, am 20. September 1954 das erste<br />

Fortran-Programm ausführen. Doch erst 1957 wur<strong>de</strong> <strong>de</strong>r Compiler für marktreif befun<strong>de</strong>n und mit je<strong>de</strong>m<br />

IBM-704-System ausgeliefert. Backus hatte darauf bestan<strong>de</strong>n, <strong>de</strong>n Compiler von Anfang an mit <strong>de</strong>r Fähigkeit zu<br />

Optimierungen auszustatten: Er sah voraus, dass sich Fortran nur dann durchsetzen wür<strong>de</strong>, wenn ähnliche<br />

Ausführungsgeschwindigkeiten wie mit bisherigen Assembler-Programmen erzielt wür<strong>de</strong>n.<br />

Versionen<br />

Fortran wur<strong>de</strong> mehrmals erweitert. Viele neue Sprachelemente wur<strong>de</strong>n zunächst von einem einzelnen Hersteller<br />

eingeführt und später in <strong>de</strong>n internationalen Standard übernommen. Als Versionen folgten aufeinan<strong>de</strong>r FORTRAN I,<br />

FORTRAN II, FORTRAN IV, FORTRAN-66, FORTRAN-77, Fortran 90, Fortran 95, Fortran 2000, Fortran 2003<br />

und zuletzt Fortran 2008. Ab FORTRAN-66 ist Fortran von einer internationalen Organisation standardisiert. Die<br />

Fortschreibung <strong>de</strong>r Standards ist ein komplizierter Prozess, <strong>de</strong>r oft wesentlich länger dauert als zunächst angestrebt:<br />

Der Nachfolger <strong>de</strong>s 1978 erschienenen Standards FORTRAN-77, <strong>de</strong>r als Fortran 8x bezeichnet wur<strong>de</strong>, war<br />

ursprünglich für das Jahr 1982 geplant, später dann für das Jahr 1985, und wur<strong>de</strong> schließlich unter <strong>de</strong>r Bezeichnung<br />

Fortran90 erst am 11. April 1991 als neuer Standard und Nachfolger von FORTRAN-77 angenommen. [1]<br />

Im Laufe dieser Erweiterungen wur<strong>de</strong>n zahlreiche Sprachelemente aus später entstan<strong>de</strong>nen <strong>Programmiersprache</strong>n<br />

übernommen. Beruhte früher Fortran-Stil noch ganz auf Goto-Anweisungen, kann man seit FORTRAN 77<br />

uneingeschränkt strukturiert programmieren. Mit Fortran 90 wur<strong>de</strong> neben <strong>de</strong>m aus <strong>de</strong>r Lochkartenzeit stammen<strong>de</strong>n<br />

festen Zeilenformat ein von späteren <strong>Programmiersprache</strong>n verwen<strong>de</strong>tes freieres Format erlaubt. Ab Fortran 90<br />

wer<strong>de</strong>n interessante Elemente eingeführt, die auch z. B. in Ada vorhan<strong>de</strong>n sind, beispielsweise optionale Parameter<br />

und die Möglichkeit, Prozedurparameter nicht nur über die Position in <strong>de</strong>r Parameterliste zu i<strong>de</strong>ntifizieren, son<strong>de</strong>rn<br />

auch über ihren Namen.<br />

Beispiel:


FORTRAN 51<br />

SUBROUTINE test( Argument1, Argument2, Argument3 )<br />

REAL, INTENT(IN) :: Argument1<br />

CHARACTER(LEN= *), INTENT(IN) :: Argument2<br />

INTEGER, INTENT(IN), OPTIONAL :: Argument3<br />

! Hier was sinnvolles.<br />

END SUBROUTINE<br />

Mögliche Aufrufe sind dann z. B.:<br />

CALL test( 1.0, 'Tach' )<br />

CALL test( Argument1= 1.0, Argument2= 'Tach auch' )<br />

CALL test( Argument2= 'Tach Auch', Argument1= 1.0 )<br />

CALL test( Argument3= 3, Argument1= 1.0, Argument2= 'Tach auch' )<br />

Während beim ersten Aufruf die Parameterassoziation über die Reihenfolge <strong>de</strong>r Parameter erfolgt, so wer<strong>de</strong>n bei <strong>de</strong>n<br />

an<strong>de</strong>ren Beispielen die Parameter mittels <strong>de</strong>r Namen i<strong>de</strong>ntifiziert. Bei letzteren spielt die Reihenfolge dann keine<br />

Rolle mehr.<br />

Varianten<br />

Einige von Fortran abgeleitete <strong>Programmiersprache</strong>n sind Ratfor, F und HPF (High Performance Fortran).<br />

Eigenschaften<br />

Fortran war und ist für numerische Berechnungen vorgesehen und optimiert. Von Anfang an hatte Fortran <strong>de</strong>n<br />

Potenz-Operator ** – <strong>de</strong>r in vielen an<strong>de</strong>ren Hochsprachen nicht vorhan<strong>de</strong>n ist – und einen Datentyp für komplexe<br />

Zahlen. Mit Fortran90 wur<strong>de</strong>n Vektor- und Matrix-Operationen standardisiert.<br />

Ein Fortran-Programm kann leichter optimiert wer<strong>de</strong>n als z. B. ein C-Programm, da Fortran restriktiver ist.<br />

Beispielsweise ist es nicht erlaubt, innerhalb einer Iterationsschleife die Iterationsvariable zu verän<strong>de</strong>rn. Unter<br />

an<strong>de</strong>rem ist <strong>de</strong>shalb beim Eintritt in die Schleife die Maximalzahl <strong>de</strong>r Durchläufe bekannt.<br />

! iFunc() sei eine Funktion, die einen INTEGER-Wert berechnet.<br />

! Der Compiler muss nur einen Aufruf von iFunc erzeugen.<br />

DO i = 1, iFunc(4711)<br />

ENDDO<br />

!.. sinnvolles hier.<br />

! Innerhalb dieser Schleife darf i nicht verän<strong>de</strong>rt wer<strong>de</strong>n.<br />

In C sieht eine solche Iteration so aus:<br />

for (i = 1; i


FORTRAN 52<br />

C++ portiert wur<strong>de</strong>.<br />

Implizite Variablen<strong>de</strong>klaration<br />

In Anlehnung an mathematischen Notationsgebrauch sind Variablen in Fortran standardmäßig über ihren<br />

Anfangsbuchstaben <strong>de</strong>klariert: Bezeichner, die mit einem <strong>de</strong>r Buchstaben i, j, k, l, m, n beginnen, stehen für eine<br />

INTEGER-Variable o<strong>de</strong>r einen INTEGER-Funktionswert, alle übrigen Bezeichner stehen für REAL-Werte. Diese<br />

impliziten Typenvereinbarung von Variablen kann durch die Deklaration einzelner Variablen überschrieben wer<strong>de</strong>n,<br />

sie kann durch eine Zeile wie<br />

! Alle nicht<strong>de</strong>klarierten Bezeichner, <strong>de</strong>ren erster Buchstabe c o<strong>de</strong>r z<br />

ist, bezeichnen komplexe Zahlen.<br />

IMPLICIT COMPLEX (c, z)<br />

verän<strong>de</strong>rt wer<strong>de</strong>n, und die implizite Vereinbarung kann durch <strong>de</strong>n Befehl<br />

IMPLICIT NONE<br />

ganz aufgehoben wer<strong>de</strong>n. In diesem Fall löst die Verwendung eines nicht<strong>de</strong>klarierten Bezeichners einen Fehler<br />

während <strong>de</strong>r Übersetzung aus. Dadurch vereinfacht sich die Fehlersuche erheblich.<br />

Übergabe von Parametern<br />

In alten Versionen von Fortran (FORTRAN 77 und früher) brauchten Unterprogramme vor ihrer Verwendung nicht<br />

<strong>de</strong>klariert zu wer<strong>de</strong>n. Es konnte durch eine Deklaration allenfalls <strong>de</strong>r Typ <strong>de</strong>s Rückgabewerts festgelegt wer<strong>de</strong>n. Der<br />

Compiler überprüfte normalerweise nicht, ob ein Unterprogrammaufruf mit typrichtigen Parametern erfolgt. Die<br />

Übergabe von Parametern an Unterprogramme (SUBROUTINE o<strong>de</strong>r FUNCTION) erfolgt üblicherweise per<br />

Adresse. Vor Fortran-90 konnten grundsätzlich alle Aktualparameter von einer SUBROUTINE o<strong>de</strong>r FUNCTION<br />

verän<strong>de</strong>rt wer<strong>de</strong>n. Deshalb müssen alle Parameter z. B. durch Adressübergabe übergeben wer<strong>de</strong>n. Eine automatische<br />

Typumwandlung kann <strong>de</strong>shalb auch nicht stattfin<strong>de</strong>n.<br />

Die meisten Fortran-Systeme führen auch keine Typüberprüfung zur Laufzeit durch.<br />

Das ist eine häufige Fehlerquelle. Programmbeispiel 1:<br />

...<br />

CALL DruckeZahl(3.14)<br />

...<br />

SUBROUTINE DruckeZahl(meineZahl)<br />

...<br />

Im Unterprogramm DruckeZahl ist meineZahl, weil mit m beginnend, implizit als INTEGER <strong>de</strong>klariert. Zur Laufzeit<br />

erfolgt ein Aufruf mit <strong>de</strong>m REAL Argument 3.14. Dann wird die INTEGER-Variable meineZahl mit <strong>de</strong>n Bits <strong>de</strong>r<br />

Gleitkommadarstellung von 3.14 aufgefüllt – was auf beliebig abwegige numerische Ergebnisse führt.<br />

Viele Fortran-Compiler arbeiten mit Zeigern zur Übergabe von Parametern. Das führt zu teilweise amüsanten<br />

Ergebnissen, z. B. folgen<strong>de</strong>s Programmbeispiel 2:<br />

call bar(3)<br />

print *,3<br />

end<br />

subroutine bar(i)<br />

i = 42<br />

end


FORTRAN 53<br />

Dieses wür<strong>de</strong> bei manchen Compilern die Zahl 42 ausgeben. Das Programm ist allerdings so nicht korrekt.<br />

Programmierwerkzeuge wie ftnchek [2] ermöglichen allerdings eine separate Prüfung <strong>de</strong>r Übereinstimmung von<br />

Argumentlisten und wür<strong>de</strong>n in diesen Fällen warnen.<br />

In Fortran 90 und nachfolgen<strong>de</strong>n Versionen besteht die Möglichkeit, die Parametertypen <strong>de</strong>r Unterprogramme<br />

anhand von Schnittstellen (INTERFACE) und Modulen (MODULE) zu <strong>de</strong>finieren. Der Compiler kann somit<br />

überprüfen, ob <strong>de</strong>r übergebene Parametertyp und <strong>de</strong>r erwartete Typ übereinstimmen. Diese Bekanntgabe ist<br />

allerdings nicht zwingend, so wie es in an<strong>de</strong>ren <strong>Programmiersprache</strong>n, beispielsweise Ada <strong>de</strong>r Fall ist. Die von<br />

Fortran-95 abgeleitete <strong>Programmiersprache</strong> F erzwingt dieses, in F sind nur Aufrufe von Unterprogrammen erlaubt,<br />

<strong>de</strong>ren Parameterliste z. B. durch USE-Anweisungen bekannt gemacht sind. In einem Unterprogramm kann auch<br />

festgelegt wer<strong>de</strong>n, ob ein Parameter Eingabeparameter (INTENT(IN)), Ausgabeparameter (INTENT(OUT)) o<strong>de</strong>r<br />

bei<strong>de</strong>s (INTENT(INOUT)) ist. In Fortran 90 <strong>de</strong>klariert man das Unterprogramm bar folgen<strong>de</strong>rmaßen:<br />

subroutine bar(i)<br />

integer, intent(in):: i<br />

[...]<br />

end subroutine<br />

Falls das Unterprogramm versuchen sollte, <strong>de</strong>n Wert <strong>de</strong>s Aktualparameter i zu verän<strong>de</strong>rn, wür<strong>de</strong> <strong>de</strong>r Compiler einen<br />

Fehler anzeigen.<br />

Dynamische Speicherallokation<br />

Unter dynamischer Speicherallokation versteht man die Möglichkeit, Speicher (insbeson<strong>de</strong>re für Fel<strong>de</strong>r wie z. B. für<br />

Matrizen) erst zur Laufzeit <strong>de</strong>s Programms anzufor<strong>de</strong>rn, das heißt, dass die Größe von Arrays nicht bereits zum<br />

Zeitpunkt <strong>de</strong>s Übersetzen <strong>de</strong>s Programms festgelegt zu sein braucht. Bis Fortran 77 ist eine dynamische<br />

Speicherallokation nicht o<strong>de</strong>r nur über nicht standardisierte Erweiterungen <strong>de</strong>r Compilerhersteller möglich. Ab<br />

Fortran 90 ist die dynamische Speicherverwaltung im Sprachstandard enthalten.<br />

Ein Beispiel für dynamische Speicherreservierung: Anlegen und Bearbeiten einer verketteten Liste:<br />

TYPE tElement<br />

TYPE (tElement), POINTER :: Naechstes<br />

REAL :: Datum<br />

END TYPE tElement<br />

TYPE (tElement), POINTER, SAVE :: Liste=> NULL() ! -- NULL():<br />

Fortran-95<br />

TYPE (tElement), POINTER :: Element<br />

! Anlegen eines Elements und Eintragen am Anfang <strong>de</strong>r Liste<br />

ALLOCATE( Element )<br />

Element% Datum = 4711.0<br />

Element% Naechstes=> Liste<br />

Liste=> Element<br />

! Durchlaufen <strong>de</strong>r Liste:<br />

Element=> Liste<br />

DO WHILE (ASSOCIATED(Element))<br />

CALL Bearbeiten( Element% Datum )


FORTRAN 54<br />

ENDDO<br />

Element=> Element% Naechstes<br />

Compiler<br />

Bisher (Januar 2007) gibt es keinen Compiler, <strong>de</strong>r <strong>de</strong>n aktuellen Fortran-Standard von 2003 voll unterstützt. Die<br />

meisten Compiler unterstützen jedoch Teile <strong>de</strong>s Standards Fortran 2003 [3] .<br />

Proprietäre Software<br />

F95-Compiler gibt es für praktisch alle Computer, von Arbeitsplatzrechnern bis zu Supercomputern. Hersteller<br />

hierfür sind entwe<strong>de</strong>r die Computerhersteller wie z. B. IBM, SUN, HP, Intel o<strong>de</strong>r aber spezialisierte<br />

Softwarehersteller wie z. B. Absoft, PGI, NAG, Lahey, Salford. Reine F77-Compiler wer<strong>de</strong>n heute zumeist nicht<br />

mehr hergestellt, da Fortran77 fast vollständig im Sprachstandard Fortran95 enthalten ist (nur DO-Schleifen mit<br />

REAL-Iterationsvariablen und Hollerith-Edit-Deskriptoren sind in Fortran95 und später verschwun<strong>de</strong>n).<br />

Einige <strong>de</strong>r oben genannten Compiler sind für Privatanwen<strong>de</strong>r bzw. nichtkommerzielle Nutzung unentgeltlich, zum<br />

Beispiel die Linux-Variante <strong>de</strong>s Intel-Fortran-Compilers (aktuelle Version 11), Sun Studio Express [4] (mit Fortran,<br />

C und C++ Compilern für Linux und Solaris), für Microsoft Windows <strong>de</strong>r Compiler von Salford o<strong>de</strong>r DEC Fortran<br />

für OpenVMS.<br />

Freie Software<br />

Seit Version 4.0 enthält die praktisch für alle Plattformen verfügbare GNU Compiler Collection (gcc) einen<br />

Compiler für Fortran 95 (GNU Fortran). Ältere Versionen von GCC enthalten noch <strong>de</strong>n FORTRAN-77-Compiler<br />

g77. Außer<strong>de</strong>m existiert mit G95 [5] ein weiterer freier Compiler für Fortran 95. Aus diesem ging 2003 gfortran<br />

hervor.<br />

Auch die OpenWatcom [6] -Entwicklersuite verfügt über einen FORTRAN-77-Compiler.<br />

Transcompiler<br />

Es gibt Transcompiler, wie z. B. f2c [7] , zur automatischen Übersetzung von Fortran-77 in (allerdings kaum lesbares)<br />

C. Auch <strong>de</strong>r NAG-Compiler verwen<strong>de</strong>t als Zwischensprache C; allerdings ist die nötige Laufzeitbibliothek nicht im<br />

Quelltext zu bekommen.<br />

Literatur zur Geschichte von Fortran<br />

• Annals of History of Computing, 6, 1, Jan. 1984.<br />

• S. Rosen (Hrsg.): Programming Systems and Languages, McGraw Hill, 1967.<br />

• R. L. Wexelblat (Hrsg.): History of Programmining Languages., Aca<strong>de</strong>mic Press, 1981, S. 25–74.<br />

Literatur zu Fortran<br />

• Michael Metcalf, John Reid, Malcolm Cohen: Fortran 95/2003 Explained, Oxford University Press, 2004, ISBN<br />

0-19-852693-8<br />

• Stephen J. Chapman: Fortran 90/95 for Scientists and Engineers - 2nd edition, McGraw Hill, 2004, ISBN<br />

0-07-123233-8 (International Edition)<br />

• Thomas Kühme, Peter Witschital: Die FORTRAN-Fibel: Strukturierte Programmierung mit FORTRAN 77, Lehr-<br />

und Arbeitsbuch für Anfänger, Ol<strong>de</strong>nbourg, 1991, ISBN 978-3-486-22016-2<br />

• Günter Schmitt: Fortran-90-Kurs - technisch orientiert: Einführung in die Programmierung mit Fortran 90,<br />

Ol<strong>de</strong>nbourg Verlag, 1996, ISBN 978-3-486-23896-9


FORTRAN 55<br />

• William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery: Numerical Recipes in FORTRAN<br />

77: The Art of Scientific Computing - Volume 1 of Fortran Numerical Recipes - 2nd Edition, Cambridge<br />

University Press, 1992 (zweite Edition), 2003 (Reprint mit Korrekturen), ISBN 0-521-43064-X<br />

• William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery: Numerical Recipes in Fortran 90:<br />

The Art of Parallel Scientific Computing - Volume 2 of Fortran Numerical Recipes - 2nd Edition, Cambridge<br />

University Press, 1996 (erste Auflage), 1999 (Reprint mit Korrekturen), ISBN 0-521-57439-0<br />

Weblinks<br />

• Fortran.<strong>de</strong> [8] Links und Informationen<br />

• Fortran Store [9] Umfangreiche Informationen inkl. Historischem und Standards (engl.)<br />

• Einführung in Fortran90/95 [10]<br />

• Einführung in Fortran90/95 [11]<br />

Referenzen<br />

[1] Vorwort von Michael Metcalf in: W. H. Press, S. A. Teukolsky, W. T. Vetterling, B. P. Flannery: Numerical Recipes in Fortran 90.<br />

Cambridge University Press, 1999, ISBN 0-521-57439-0.<br />

[2] http:/ / www. dsm. fordham. edu/ ~ftnchek/<br />

[3] Ian D. Chivers, Jane Sleightholme, Compiler support for the Fortran 2003 standard, ACM SIGPLAN Fortran Forum 28, 26 (2009). (http:/ /<br />

doi. acm. org/ 10. 1145/ 1520752. 1520755) ( PDF (http:/ / www. fortranplus. co. uk/ resources/ fortran_2003_compiler_support. pdf))<br />

[4] http:/ / <strong>de</strong>velopers. sun. com/ prodtech/ cc/ downloads/ express. jsp<br />

[5] http:/ / g95. org/<br />

[6] http:/ / www. openwatcom. org<br />

[7] http:/ / www. netlib. org/ f2c/<br />

[8] http:/ / www. fortran. <strong>de</strong>/<br />

[9] http:/ / www. fortran. com/<br />

[10] http:/ / www. rz. uni-bayreuth. <strong>de</strong>/ lehre/ fortran90/ vorlesung/ in<strong>de</strong>x. html<br />

[11] http:/ / www. kfa-juelich. <strong>de</strong>/ zam/ docs/ bhb/ bhb_html/ d0124/ d0124. html


FreeBASIC 56<br />

FreeBASIC<br />

FreeBASIC<br />

Basisdaten<br />

Entwickler: Quelloffen (Open Source)<br />

Aktuelle Version: 0.20.0 Beta (10.08.2008)<br />

Betriebssystem: Windows, Linux, FreeBSD und DOS<br />

Kategorie: Compiler<br />

Lizenz: GPL/LGPL<br />

Deutschsprachig: nur IDE<br />

www.freebasic.net [1]<br />

FreeBASIC (kurz FB) ist ein kostenloser Open-Source-Compiler, <strong>de</strong>ssen Syntax auf Microsoft QuickBASIC<br />

aufbaut. Er ermöglicht das Erzeugen von 32-Bit-Anwendungsprogrammen, Spielen etc. für Microsoft Windows,<br />

Linux, FreeBSD und DOS, teilweise auch für die Xbox. Versionen für weitere Betriebssysteme sind geplant.<br />

Zurzeit können Bibliotheken wie GTK+, GSL, SDL, Allegro, Lua o<strong>de</strong>r OpenGL direkt genutzt wer<strong>de</strong>n, mit je<strong>de</strong>r<br />

neuen Version steigert sich jedoch die Anzahl <strong>de</strong>r unterstützten Bibliotheken.<br />

Die erste Version wur<strong>de</strong> im November 2004 veröffentlicht, die neueste Version ist Version 0.20.0 (Beta) vom 10.<br />

August 2008.<br />

Merkmale<br />

• Der FreeBASIC-Compiler ("FBC", unter Windows und DOS fbc.exe, unter Linux heißt die Binary lediglich fbc)<br />

erzeugt lediglich Assembler-Co<strong>de</strong>, welcher mithilfe <strong>de</strong>r GCC-Suite compiliert und gelinkt wird. Durch dieses<br />

Verfahren können Importbibliotheken von <strong>de</strong>r GCC-Suite direkt übernommen wer<strong>de</strong>n. Durch dieses Backend<br />

können kleine ausführbare Binarys für Windows, DOS und Linux erzeugt wer<strong>de</strong>n.<br />

• Der Compiler ist in verschie<strong>de</strong>nen Tests schneller als BlitzBasic, Visual Basic und Co.<br />

• Er beinhaltet einen Inline-Assembler.<br />

• Er beherrscht Pointer auf Variablen und Funktionen.<br />

• Er beherrscht das Überla<strong>de</strong>n von Funktionen und Subroutinen (Funktionen ohne Rückgabe), wie beispielsweise<br />

auch C++ o<strong>de</strong>r Java, und Funktionen und Subroutinen können mit optionalen Parametern (wie zum Beispiel auch<br />

in PHP) erstellt wer<strong>de</strong>n.<br />

• Er kann im Gegensatz zum DOS-basierten QuickBasic auf fast alle Funktionen zurückgreifen, die heutige<br />

Programmierer nutzen, wie zum Beispiel die WinAPI und an<strong>de</strong>re Bibliotheken.<br />

• Alle Funktionen <strong>de</strong>r FBRTL sind plattformunabhängig, d. h. können auf Windows, Linux und DOS<br />

gleichermaßen verwen<strong>de</strong>t wer<strong>de</strong>n. Das ermöglicht das einfache Schreiben plattformunabhängiger Anwendungen.<br />

• Der Compiler ermöglicht das Schreiben hardwarebeschleunigter Anwendungen durch Verwendung von openGL.<br />

• Er beinhaltet einige sehr komfortable Sprachkonstrukte wie etwa Shorthands, Makros u. ä., die <strong>de</strong>m<br />

Programmierer einige Tipparbeit abnehmen.


FreeBASIC 57<br />

• Inzwischen ist es zwar möglich, Objekte zu erstellen, jedoch sind einige Elemente <strong>de</strong>r Objektorientierung (z. B.<br />

Vererbung) noch nicht implementiert.<br />

Syntax<br />

Es existieren <strong>de</strong>rzeit über 400 Schlüsselwörter, die z. T. auf mehrerlei Art und Weise verwen<strong>de</strong>t wer<strong>de</strong>n können.<br />

Generell wer<strong>de</strong>n drei Arten von Schlüsselwörtern unterschie<strong>de</strong>n: [2]<br />

• Anweisungen: Anweisungen erfüllen eine bestimmte Aufgabe, etwa die Ausgabe von Text auf <strong>de</strong>m Bildschirm.<br />

• Funktionen: Sie zeichnen sich dadurch aus, dass nach ihrem Aufruf ein Wert zur Verfügung gestellt wird, <strong>de</strong>r das<br />

Ergebnis <strong>de</strong>s Funktionsaufrufs darstellt. Dabei kann <strong>de</strong>r Wert <strong>de</strong>n einzigen Sinn <strong>de</strong>r Funktion darstellen (etwa bei<br />

mathematischen Funktionen wie LOG), o<strong>de</strong>r nur über <strong>de</strong>n Status <strong>de</strong>s Funktionsaufrufs informieren (Funktionen<br />

mit Anweisungscharakter, wie GETMOUSE; diese Funktion fragt <strong>de</strong>n Status <strong>de</strong>r Maus ab, und gibt eine Zahl<br />

zurück, die bestätigt, dass die Abfrage erfolgreich war, o<strong>de</strong>r ob dabei ein Fehler aufgetreten ist.)<br />

• Klauseln: Sie beeinflussen das Verhalten von Anweisungen und Funktionen, und können losgelöst von diesen<br />

nicht verwen<strong>de</strong>t wer<strong>de</strong>n.<br />

Die Groß/Kleinschreibung ist dabei, wie bei BASIC üblich, ohne Be<strong>de</strong>utung. „GetMouse“ und „GETMOUSE“<br />

wer<strong>de</strong>n vom Compiler gleich behan<strong>de</strong>lt.<br />

Beim Umgang mit Werten (Zahlen, Zeichenketten, o<strong>de</strong>r sonstige Arten von Informationen) wer<strong>de</strong>n Variablen und<br />

Konstanten verwen<strong>de</strong>t, STRING-Variablen (Zeichenketten) wer<strong>de</strong>n in doppelte Anführungszeichen «"» gesetzt.<br />

Wird <strong>de</strong>m String ein «!» vorangestellt, können auch Escape-Sequenzen benutzt wer<strong>de</strong>n (z. B. Print !"Hello\nWorld"<br />

– erzeugt einen Zeilenumbruch zwischen «Hello» und «World»). Mit diesen Variablen und Konstanten kann über<br />

verschie<strong>de</strong>ne Operatoren gearbeitet wer<strong>de</strong>n. Bei Zahlen-Variablen stehen etwa verschie<strong>de</strong>ne mathematische<br />

Operatoren zur Verfügung (+, −, *, /, LOG, EXP, SIN, ASIN, …). Bei STRINGs hingegen ist die Auswahl <strong>de</strong>r<br />

Operatoren logischerweise eingeschränkt, möglich ist nur die Verkettung (+ o<strong>de</strong>r &) sowie die Indizierung (mittels<br />

eckiger Klammern).<br />

Ein einfaches Hallo-Welt-Programm in FreeBASIC sieht so aus:<br />

PRINT "Hallo Welt!"<br />

SLEEP<br />

• "Hallo Welt!" ist hierbei ein Parameter; in diesem Fall wird also Hallo Welt! auf <strong>de</strong>m Bildschirm ausgegeben.<br />

• PRINT ist hierbei eine Anweisung, die bewirkt, dass ein Text auf <strong>de</strong>m Bildschirm ausgegeben wird.<br />

• Der SLEEP-Befehl [3] wird nicht benötigt. Er wird nur benutzt, um zu verhin<strong>de</strong>rn, dass sich das Ausgabefenster<br />

<strong>de</strong>r Anwendung automatisch schließt, wenn diese nicht aus <strong>de</strong>r Konsole gestartet wur<strong>de</strong>.<br />

Ebenso ist es möglich, innerhalb eines Programmes eigene Befehle zu erstellen, die aus einer Aneinan<strong>de</strong>rreihung<br />

bestehen<strong>de</strong>r Befehle bestehen. Ein solcher eigener Befehl kann eine SUB (Abkürzung für Subroutine) sein, die sich<br />

wie eine Anweisung verhält, o<strong>de</strong>r eine FUNCTION, die ebenso wie freeBASICs eigene Funktionen einen Wert<br />

zurückgeben kann. Bei<strong>de</strong> können mit Parametern arbeiten, die auch optional sein dürfen.<br />

Im Gegensatz zu vielen an<strong>de</strong>ren Sprachen wer<strong>de</strong>n Programmbefehle nicht mit einem Semikolon abgeschlossen,<br />

son<strong>de</strong>rn mit einem Zeilenumbruch wie auch in QBasic. Möchte man einen Befehl über mehrere Zeilen aus<strong>de</strong>hnen,<br />

muss am En<strong>de</strong> je<strong>de</strong>r Zeile, die <strong>de</strong>n Befehl nicht been<strong>de</strong>t, ein Fußstrich geschrieben wer<strong>de</strong>n:<br />

PRINT "Hallo, dieser String"+_<br />

" ist ein einzelner String."<br />

Mehrere Befehle können ohne Zeilenumbruch durch einen Doppelpunkt aneinan<strong>de</strong>r gereiht wer<strong>de</strong>n.<br />

Ein weiterer Unterschied zu an<strong>de</strong>ren Sprachen ist, dass bei Subaufrufen die Klammersetzung optional ist: Man kann<br />

eine Subroutine sowohl mit ProcName(parameter) o<strong>de</strong>r ProcName (parameter) als auch mit ProcName parameter


FreeBASIC 58<br />

aufrufen, ebenfalls von QBasic abgeleitet. Jedoch ist das nicht bei Funktionen möglich, dort müssen immer<br />

Klammern gesetzt wer<strong>de</strong>n.<br />

IDE<br />

Mit FBI<strong>de</strong> gibt es eine eigene IDE für FreeBasic. Die aktuelle Version<br />

ist 0.4.6.<br />

Mehr Möglichkeiten bietet <strong>de</strong>r FreeBASIC-Editor, kurz FBEdit. Es<br />

gibt ein eigenes Interface zur Gestaltung von Dialogen.<br />

Weblinks<br />

• http:/ / www. FreeBASIC. net – englische Webseite <strong>de</strong>s Compilers<br />

• http:/ / www. freebasic-portal. <strong>de</strong> – <strong>de</strong>utschsprachiges Portal über<br />

FreeBASIC mit Tutorials und Co<strong>de</strong>-Beispielen (komplett<br />

aktualisiert).<br />

• http:/ / referenz. FreeBasic-Portal. <strong>de</strong> – <strong>de</strong>utschsprachige FreeBASIC-Befehlsreferenz<br />

• http:/ / www. qb-wettbewerb. <strong>de</strong> – Programmierwettbewerb zu FreeBASIC und QBasic<br />

Referenzen<br />

[1] http:/ / www. freebasic. net<br />

[2] Weblinks: Online-Befehlsreferenz<br />

[3] http:/ / www. freebasic-portal. <strong>de</strong>/ befehlsreferenz/ sleep-400. html<br />

Hallo Welt<br />

#inclu<strong>de</strong> <br />

int main(void)<br />

{<br />

printf("Hallo Welt!\n");<br />

return 0;<br />

}<br />

Hallo-Welt in C<br />

FBI<strong>de</strong> in <strong>de</strong>r Version 0.4.6


Hallo Welt 59<br />

Ein Hallo-Welt-Programm ist ein kleines Computerprogramm und soll auf<br />

möglichst einfache Weise zeigen, welche Anweisungen o<strong>de</strong>r Bestandteile für<br />

ein vollständiges Programm in einer <strong>Programmiersprache</strong> benötigt wer<strong>de</strong>n<br />

und somit einen ersten Einblick in die Syntax geben. Aufgabe <strong>de</strong>s<br />

Programms ist, <strong>de</strong>n Text Hallo Welt! o<strong>de</strong>r auf Englisch Hello, world!<br />

auszugeben. Ein solches Programm ist auch geeignet, die erfolgreiche<br />

Installation eines Compilers für die entsprechen<strong>de</strong> <strong>Programmiersprache</strong> zu<br />

überprüfen. Aufgrund <strong>de</strong>r einfachen Aufgabenstellung kann ein<br />

Hallo-Welt-Programm für die ersten Schritte in <strong>de</strong>r Sprache dienen, <strong>de</strong>nn es<br />

folgt zumeist nur <strong>de</strong>m Programmierparadigma <strong>de</strong>r imperativen<br />

Programmierung und <strong>de</strong>monstriert somit zwar nur einen Bruchteil <strong>de</strong>r<br />

Möglichkeiten, aber durchaus die grundlegen<strong>de</strong>n Elemente <strong>de</strong>r meisten<br />

Sprachen.<br />

Hallo-Welt-Programm in <strong>de</strong>r esoterischen<br />

<strong>Programmiersprache</strong> Piet. Die Pixel<br />

stehen für Befehle.<br />

Die Verwendung <strong>de</strong>s Textes „Hello, world!“, <strong>de</strong>r auch durch einen beliebigen Text ersetzt wer<strong>de</strong>n kann, aber<br />

<strong>de</strong>nnoch gerne unverän<strong>de</strong>rt benutzt wird, ist eine Tradition und geht auf ein internes Programmierhandbuch <strong>de</strong>r Bell<br />

Laboratories über die <strong>Programmiersprache</strong> C zurück, das Brian Kernighan 1974 verfasste, nach<strong>de</strong>m er dort schon ein<br />

Jahr zuvor die Worte „hello“ und „world“ in einer Einführung in die <strong>Programmiersprache</strong> B verwen<strong>de</strong>t hatte [1] .<br />

Bekanntheit erlangte <strong>de</strong>r Text jedoch erst durch die Veröffentlichung in <strong>de</strong>m Buch The C Programming Language<br />

(<strong>de</strong>utsch: Programmieren in C) von Brian Kernighan und Dennis Ritchie, auch wenn in <strong>de</strong>m dortigen Beispiel die<br />

Schreibung „hello, world“ verwen<strong>de</strong>t wur<strong>de</strong>.<br />

Siehe auch<br />

• Liste von Hallo-Welt-Programmen<br />

Referenzen<br />

[1] A Tutorial Introduction to the Language B (http:/ / cm. bell-labs. com/ cm/ cs/ who/ dmr/ btut. pdf) als PDF


Java (<strong>Programmiersprache</strong>) 60<br />

Java (<strong>Programmiersprache</strong>)<br />

Java<br />

Basisdaten<br />

Paradigmen: Objektorientierte <strong>Programmiersprache</strong><br />

Erscheinungsjahr:<br />

1995 [1]<br />

Entwickler: Sun Microsystems<br />

Aktuelle Version: 6.18 (17. Dezember 2009)<br />

Aktuelle Vorabversion: 7.0 M5 (12. November 2009)<br />

Typisierung: stark, statisch<br />

Einflüsse:<br />

C++, Smalltalk, Objective C, C# [2]<br />

Beeinflusste: Groovy, Clojure, C#, Scala<br />

Betriebssystem: plattformunabhängig<br />

Lizenz: GNU General Public License/Java Community Process<br />

java.sun.com [3]<br />

Java ist eine objektorientierte <strong>Programmiersprache</strong> und eingetragenes Warenzeichen <strong>de</strong>r Firma Sun Microsystems.<br />

Sie ist ein Bestandteil <strong>de</strong>r Java-Technologie.<br />

Java-Programme wer<strong>de</strong>n in Byteco<strong>de</strong> übersetzt und dann in einer speziellen Umgebung ausgeführt, die als<br />

Java-Laufzeitumgebung o<strong>de</strong>r Java-Plattform bezeichnet wird. Deren wichtigster Bestandteil ist die Java Virtual<br />

Machine (Java-VM), die die Programme ausführt, in<strong>de</strong>m sie <strong>de</strong>n Byteco<strong>de</strong> interpretiert und bei Bedarf kompiliert<br />

(Hotspot-Optimierung).<br />

Java-Programme sind plattformunabhängig, das heißt sie laufen in aller Regel ohne weitere Anpassungen auf<br />

verschie<strong>de</strong>nen Computern und Betriebssystemen, für die eine Java-VM existiert. Sun selbst bietet Java-VMs für die<br />

Betriebssysteme Linux, Solaris und Windows an. An<strong>de</strong>re Hersteller lassen ihre Java-VM für ihre Plattform<br />

zertifizieren, zum Beispiel die Firma Apple für Mac OS X.<br />

Von Portierung spricht man bei Java in <strong>de</strong>r Regel, wenn Quelltext o<strong>de</strong>r Byteco<strong>de</strong> auf <strong>de</strong>n Stand einer an<strong>de</strong>ren<br />

Java-Version angepasst wer<strong>de</strong>n soll. Meistens sind Java-Programme nur für bestimmte Java-Versionen getestet o<strong>de</strong>r<br />

zertifiziert.


Java (<strong>Programmiersprache</strong>) 61<br />

Grundkonzepte <strong>de</strong>r Sprache<br />

[4] [5]<br />

Der Entwurf <strong>de</strong>r <strong>Programmiersprache</strong> Java strebte im Wesentlichen fünf Ziele an:<br />

• Sie soll eine einfache objektorientierte, verteilte und vertraute <strong>Programmiersprache</strong> sein.<br />

• Sie soll robust und sicher sein.<br />

• Sie soll architekturneutral und portabel sein.<br />

• Sie soll sehr leistungsfähig sein.<br />

• Sie soll interpretierbar, parallelisierbar und dynamisch sein.<br />

Einfachheit<br />

Java ist im Vergleich zu an<strong>de</strong>ren objektorientierten <strong>Programmiersprache</strong>n wie C++ o<strong>de</strong>r C# einfach, da es<br />

einen reduzierten Sprachumfang besitzt und beispielsweise Operator Overloading, Pointer,<br />

Mehrfachvererbung nicht unterstützt.<br />

Objektorientierung<br />

Verteilt<br />

Vertrautheit<br />

Robustheit<br />

Sicherheit<br />

Java gehört zu <strong>de</strong>n objektorientierten <strong>Programmiersprache</strong>n.<br />

Javas Klassenbibliothek bietet eine Reihe einfacher Möglichkeiten für Netzwerkkommunikation, von<br />

TCP/IP-Protokollen über Remote Method Invocation zu Webservices.<br />

Wegen <strong>de</strong>r syntaktischen Nähe zu C++, <strong>de</strong>r ursprünglichen Ähnlichkeit <strong>de</strong>r Klassenbibliothek zu<br />

Smalltalk-Klassenbibliotheken und <strong>de</strong>r Verwendung von Entwurfsmustern in <strong>de</strong>r Klassenbibliothek zeigt Java<br />

für <strong>de</strong>n erfahrenen Programmierer keine unerwarteten Effekte.<br />

Viele <strong>de</strong>r Designentscheidungen bei <strong>de</strong>r Definition von Java reduzieren die Wahrscheinlichkeit ungewollter<br />

Systemfehler: Zu nennen sind die starke Typisierung, Garbage Collection, Referenzen statt Pointer, Exception<br />

Handling.<br />

Dafür stehen Konzepte wie <strong>de</strong>r Co<strong>de</strong>-Verifier, <strong>de</strong>r sicherstellt, dass die JVM keinen ungültigen Byteco<strong>de</strong><br />

ausführen kann, <strong>de</strong>r Class-Loa<strong>de</strong>r, <strong>de</strong>r die sichere Zuführung von Klasseninformationen zur JVM steuert und<br />

Security-Manager, die sicherstellen, dass nur Zugriff auf Programmobjekte erlaubt wird, für die entsprechen<strong>de</strong><br />

Rechte vorhan<strong>de</strong>n sind.<br />

Architekturneutralität<br />

Portabilität<br />

Java wur<strong>de</strong> so entwickelt, dass dieselbe Version eines Programms prinzipiell auf je<strong>de</strong>r beliebigen<br />

Computerhardware läuft, unabhängig von ihrem Prozessor o<strong>de</strong>r an<strong>de</strong>ren Hardwarebestandteilen.<br />

Zusätzlich zur Architekturneutralität ist Java auch portabel. Das heißt, dass primitive Datentypen sowohl in<br />

ihrer Größe und internen Darstellung als auch in ihrem arithmetischen Verhalten standardisiert sind.<br />

Beispielsweise ist ein float immer ein IEEE 754 Float von 32 Bit. Dasselbe gilt auch für die Klassenbibliothek,<br />

die beispielsweise unabhängig vom Betriebssystem dasselbe GUI erzeugen kann.<br />

Leistungsfähigkeit<br />

Java ist insbeson<strong>de</strong>re auf Grund <strong>de</strong>r dynamischen Optimierungen <strong>de</strong>r Virtual Machine eine <strong>de</strong>r effizientesten<br />

<strong>Programmiersprache</strong>n und liefert ähnliche Geschwindigkeiten wie C++ o<strong>de</strong>r C# Programme.<br />

Interpretierbarkeit<br />

Java ist eine interpretierbare Sprache. Die Java Virtual Machine interpretiert auch Java-Byteco<strong>de</strong>, bevor sie ihn<br />

aus Performancegrün<strong>de</strong>n compiliert und optimiert.


Java (<strong>Programmiersprache</strong>) 62<br />

Parallelisierbarkeit<br />

Dynamisch<br />

Java unterstützt Multithreading, also <strong>de</strong>n parallelen Ablauf von eigenständigen Programmmabschnitten. Dazu<br />

bietet die Sprache selbst die Keywords synchronized und volatile – Konstrukte, die das „Monitor & Condition<br />

Variable Paradigma“ von C.A.R. Hoare [6] unterstützen. Die Klassenbibliothek enthält weitere Unterstützungen<br />

für parallele Programmierung mit Threads.<br />

Java ist so aufgebaut, dass es sich an dynamisch än<strong>de</strong>rn<strong>de</strong> Rahmenbedingungen anpassen lässt. Da die Module<br />

erst zur Laufzeit gelinkt wer<strong>de</strong>n, können beispielsweise Teile <strong>de</strong>r Software (etwa Bibliotheken) neu<br />

ausgeliefert wer<strong>de</strong>n, ohne die restlichen Programmteile anpassen zu müssen. Interfaces können als Basis für<br />

die Kommunikation zwischen zwei Modulen eingesetzt wer<strong>de</strong>n, die eigentliche Implementierung kann aber<br />

dynamisch und beispielsweise auch während <strong>de</strong>r Laufzeit geän<strong>de</strong>rt wer<strong>de</strong>n.<br />

Objektorientierung<br />

Die Grundi<strong>de</strong>e <strong>de</strong>r objektorientierten Programmierung ist die softwaretechnische Abbildung in einer Art und Weise,<br />

wie wir Menschen auch Dinge <strong>de</strong>r realen Welt erfahren. Die Absicht dahinter ist, große Softwareprojekte einfacher<br />

zu verwalten und die Qualität <strong>de</strong>r Software zu erhöhen. Ein weiteres Ziel <strong>de</strong>r Objektorientierung ist ein hoher Grad<br />

<strong>de</strong>r Wie<strong>de</strong>rverwendbarkeit von Softwaremodulen.<br />

Ein neuer Aspekt von Java gegenüber <strong>de</strong>n objektorientierten <strong>Programmiersprache</strong>n C++ und Smalltalk ist die<br />

explizite Unterscheidung zwischen Schnittstellen und Klassen, die durch entsprechen<strong>de</strong> Schlüsselwörter interface<br />

und class ausgedrückt wird. Java unterstützt kein Erben von mehreren unabhängigen Basisklassen (sogenannte<br />

„Mehrfachvererbung“ wie in C++ o<strong>de</strong>r Eiffel), wohl aber das Implementieren einer beliebigen Zahl von<br />

Schnittstellen, womit sich viele <strong>de</strong>r entsprechen<strong>de</strong>n Probleme ebenfalls lösen lassen. Dabei wer<strong>de</strong>n nur die<br />

Metho<strong>de</strong>nsignaturen an die abgeleiteten Klassen weitergegeben, jedoch keine Attribute und keine<br />

Implementierungen <strong>de</strong>r Metho<strong>de</strong>n.<br />

Java ist nicht vollständig objektorientiert, da die Grunddatentypen (int, boolean usw.) keine Objekte (siehe auch<br />

unter Java-Syntax) sind. Sie wer<strong>de</strong>n allerdings ab Java 1.5 bei Bedarf automatisch und für <strong>de</strong>n Programmierer<br />

transparent, mittels Autoboxing in die entsprechen<strong>de</strong>n Objekttypen und umgekehrt umgewan<strong>de</strong>lt. [7]<br />

Reflection<br />

Java bietet eine Reflection-API als Bestandteil <strong>de</strong>r Laufzeitumgebung. Damit ist es möglich, zur Laufzeit auf<br />

Klassen und Metho<strong>de</strong>n zuzugreifen, <strong>de</strong>ren Existenz o<strong>de</strong>r genaue Ausprägung zur Zeit <strong>de</strong>r Programmerstellung nicht<br />

bekannt war. Häufig wird diese Technik im Zusammenhang mit <strong>de</strong>m Entwurfsmuster Fabrikmetho<strong>de</strong> (Factory<br />

Method) angewandt.<br />

Annotationen<br />

Mit Java 5 hat Sun die <strong>Programmiersprache</strong> um Annotationen erweitert. Annotationen erlauben die Notation von<br />

Metadaten und ermöglichen bis zu einem gewissen Grad benutzer<strong>de</strong>finierte Spracherweiterungen. Sinn <strong>de</strong>r<br />

Annotationen ist unter an<strong>de</strong>rem die automatische Erzeugung von Co<strong>de</strong> und an<strong>de</strong>ren in <strong>de</strong>r Software-Entwicklung<br />

wichtigen Dokumenten für wie<strong>de</strong>rkehren<strong>de</strong> Muster anhand möglichst kurzer Hinweise im Quelltext. Bislang wur<strong>de</strong>n<br />

in Java dafür ausschließlich Javadoc-Kommentare mit speziellen JavaDoc-Tags verwen<strong>de</strong>t, die von Doclets wie zum<br />

Beispiel <strong>de</strong>m XDoclet ausgewertet wur<strong>de</strong>n.<br />

Annotationen können auch in <strong>de</strong>n kompilierten Class-Dateien enthalten sein. Der Quelltext wird also für ihre<br />

Verwendung nicht benötigt. Insbeson<strong>de</strong>re sind die Annotationen auch über die Reflection-API zugänglich. So<br />

können sie zum Beispiel zur Erweiterung <strong>de</strong>s Bean-Konzeptes verwen<strong>de</strong>t wer<strong>de</strong>n.


Java (<strong>Programmiersprache</strong>) 63<br />

Modulare Ausführung auf fernen Computern<br />

Java bietet die Möglichkeit, Klassen zu schreiben, die in unterschiedlichen Ausführungsumgebungen ablaufen.<br />

Beispielsweise lassen sich Applets in Webbrowsern, die Java unterstützen, ausführen. Das Sicherheitskonzept von<br />

Java kann dazu eingesetzt wer<strong>de</strong>n, dass unbekannte Klassen dabei keinen Scha<strong>de</strong>n anrichten können, was vor allem<br />

bei Applets wichtig ist (siehe auch Sandbox). Beispiele für in entsprechen<strong>de</strong>n Ausführungsumgebungen ausführbare<br />

Java-Module sind Applets, Servlets, Portlets, Midlets, Xlets, Translets, und Enterprise Java Beans.<br />

Merkmale <strong>de</strong>r Sprache<br />

Der Objektzugriff in Java ist über Referenzen implementiert. Aus Sicherheitsgrün<strong>de</strong>n ist es nicht möglich, <strong>de</strong>ren<br />

Speicheradresse zu modifizieren. So genannte Zeigerarithmetik ist mit <strong>de</strong>r Sprache also ausgeschlossen. Per Design<br />

kann so ein häufiger Typ von Fehlern, die in an<strong>de</strong>ren <strong>Programmiersprache</strong>n auftreten, von vornherein<br />

ausgeschlossen wer<strong>de</strong>n.<br />

Zusammengehörige Klassen wer<strong>de</strong>n in Paketen (englisch packages) zusammengefasst. Diese Pakete ermöglichen die<br />

Einschränkung <strong>de</strong>r Sichtbarkeit von Klassen, eine Strukturierung von größeren Projekten sowie eine Trennung <strong>de</strong>s<br />

Namensraums für verschie<strong>de</strong>ne Entwickler. Die Paketnamen sind hierarchisch aufgebaut und beginnen meist mit<br />

<strong>de</strong>m (umgekehrten) Internet-Domainnamen <strong>de</strong>s Entwicklers. (Pakete, die von Sun erstellt wer<strong>de</strong>n, beginnen z. B. mit<br />

„com.sun.“) Klassennamen müssen nur innerhalb eines Paketes ein<strong>de</strong>utig sein. Hierdurch ist es möglich, Klassen von<br />

verschie<strong>de</strong>nen Entwicklern zu kombinieren, ohne dass es zu Namenskonflikten kommt. Die Hierarchie <strong>de</strong>r<br />

Paketnamen hat allerdings keine semantische Be<strong>de</strong>utung. Bei <strong>de</strong>r Sichtbarkeit zwischen <strong>de</strong>n Klassen zweier Pakete<br />

spielt es keine Rolle, wo sich die Pakete in <strong>de</strong>r Namenshierarchie befin<strong>de</strong>n. Klassen sind entwe<strong>de</strong>r nur für Klassen<br />

<strong>de</strong>s eigenen Paketes sichtbar o<strong>de</strong>r für alle Pakete.<br />

Weiter unterstützt die Sprache Threads (nebenläufig ablaufen<strong>de</strong> Programmteile) und Ausnahmen (englisch<br />

exception). Java beinhaltet auch eine automatische Speicherbereinigung (englisch garbage collector), die nicht<br />

(mehr) referenzierte Objekte aus <strong>de</strong>m Speicher entfernt.<br />

Java unterschei<strong>de</strong>t explizit zwischen Schnittstellen und Klassen. Eine Klasse kann beliebig viele Schnittstellen<br />

implementieren, hat aber stets genau eine Basisklasse. Java unterstützt kein direktes Erben von mehreren Klassen<br />

(sogenannte „Mehrfachvererbung“), jedoch die Vererbung über mehrere Hierarchie-Ebenen (Klasse Kind erbt von<br />

Klasse Vater, die ihrerseits von Klasse Großvater erbt usw.). Je nach Sichtbarkeit (public, protected,<br />

<strong>de</strong>fault/package-private, private) erbt die Klasse Metho<strong>de</strong>n und Attribute (auch Fel<strong>de</strong>r genannt) von ihren<br />

Klassenvorfahren. Alle Klassen sind – direkt o<strong>de</strong>r indirekt – von <strong>de</strong>r Wurzelklasse Object abgeleitet.<br />

Zu Java gehört eine umfangreiche Klassenbibliothek. Dem Programmierer wird damit eine einheitliche, vom<br />

zugrun<strong>de</strong> liegen<strong>de</strong>n Betriebssystem unabhängige Schnittstelle (Application programming interface, API) angeboten.<br />

Mit Java 1.2 wur<strong>de</strong>n die Java Foundation Classes (JFC) eingeführt, die unter an<strong>de</strong>rem Swing bereitstellen, das zur<br />

Erzeugung plattformunabhängiger grafischer Benutzerschnittstellen (GUI) dient und auf AWT basiert.<br />

Syntax<br />

Hauptartikel: Java-Syntax<br />

Syntax/Grammatik und Semantik von Java sind in <strong>de</strong>r Java Language Specification (Java-Sprachspezifikation) von<br />

Sun Microsystems dokumentiert. Das folgen<strong>de</strong> Beispielprogramm gibt die unter Programmierern klassische<br />

Meldung „Hallo Welt!“ auf <strong>de</strong>m Ausgabemedium aus.<br />

public class HalloWelt {<br />

public static void main(String[] args) {<br />

}<br />

System.out.println("Hallo Welt!");


Java (<strong>Programmiersprache</strong>) 64<br />

}<br />

Entstehung und Weiterentwicklung <strong>de</strong>r Sprache<br />

Entstehung<br />

Herkunft und Entwicklung <strong>de</strong>r <strong>Programmiersprache</strong> Java sowie mit ihr verwandter Technik sind im Artikel Java<br />

(Technik) beschrieben.<br />

Sun und JCP<br />

Neben Sun kümmert sich eine Vielzahl von Einzelpersonen, kleiner und großer Unternehmen, wie Apple, IBM,<br />

Hewlett-Packard und Siemens beim Java Community Process (JCP) unter an<strong>de</strong>rem um die Weiterentwicklung <strong>de</strong>r<br />

Java-Sprachspezifikation. Der JCP wur<strong>de</strong> 1998 von Sun Microsystems ins Leben gerufen.<br />

Java als freie Software<br />

Sun hat zugesichert, sein JDK unter <strong>de</strong>r GNU General Public License zu veröffentlichen. Am 13. November 2006<br />

wur<strong>de</strong>n bereits mit <strong>de</strong>m Compiler javac und <strong>de</strong>r Hotspot Virtual Machine erste Teile als Open Source veröffentlicht.<br />

Zu<strong>de</strong>m wur<strong>de</strong> mit OpenJDK eine Community-Seite eröffnet, mit <strong>de</strong>ren Hilfe die Entwicklung koordiniert wer<strong>de</strong>n<br />

soll. [8] Am 8. Mai 2007 folgten dann große Teile <strong>de</strong>s „Java SE“-Quellco<strong>de</strong>s zum Erstellen eines JDK. Eine<br />

Ausnahme stellt solcher Co<strong>de</strong> dar, für <strong>de</strong>n Sun nicht die nötigen Rechte besitzt, um ihn freizugeben. Dieser liegt<br />

somit nur in kompilierter Form vor. [9] Ebenfalls kündigte Sun an, dass Entwicklungen auf Grundlage <strong>de</strong>s OpenJDK<br />

das „Java Compatible“-Logo führen dürfen, wenn sie nach <strong>de</strong>m „Technical Compatibility Kit“ (JCK) zertifiziert sind.<br />

Zuvor wur<strong>de</strong> <strong>de</strong>r Quelltext von Java unter an<strong>de</strong>rem bei je<strong>de</strong>m JDK mitgeliefert und ermöglichte so zwar Einsicht, er<br />

durfte aber nicht beliebig modifiziert wer<strong>de</strong>n. Deswegen gibt es neben <strong>de</strong>n offiziellen JCP auch diverse unabhängige<br />

Vereinigungen, die es sich zum Ziel gesetzt haben, ein unter eine freie Open-Source-Lizenz gestelltes Java<br />

bereitzustellen. Die bekanntesten dieser Projekte sind Apache Harmony, Kaffe und das GNU-Classpath-Projekt.<br />

Unterschie<strong>de</strong> zu ähnlichen Sprachen<br />

JavaScript<br />

Java ist nicht mit <strong>de</strong>r Skriptsprache JavaScript zu verwechseln, die vornehmlich in HTML-Seiten zur eingebetteten<br />

Programmierung verwen<strong>de</strong>t wird, um interaktive Webapplikationen zu ermöglichen. Sie ist eine dynamisch<br />

typisierte, objektorientierte, aber klassenlose Skriptsprache mit einer ähnlichen Syntax wie Java, unterschei<strong>de</strong>t sich<br />

jedoch in vielerlei Hinsicht von Java.<br />

Smalltalk<br />

Smalltalk ist eine <strong>de</strong>r ältesten objektorientierten <strong>Programmiersprache</strong>n überhaupt. Java erbt von Smalltalk die<br />

grundsätzliche Konzeption eines Klassenbaumes, in <strong>de</strong>n alle Klassen eingehängt wer<strong>de</strong>n. Dabei stammen alle<br />

Klassen entwe<strong>de</strong>r direkt o<strong>de</strong>r indirekt von <strong>de</strong>r Klasse java.lang.Object ab. Außer<strong>de</strong>m wur<strong>de</strong>n die Konzepte <strong>de</strong>r<br />

automatischen Speicherbereinigung (garbage collector) und <strong>de</strong>r virtuellen Maschine übernommen sowie eine<br />

Vielzahl weiterer Merkmale <strong>de</strong>r Sprache Smalltalk.<br />

Smalltalk kennt jedoch keine primitiven Datentypen wie zum Beispiel int – selbst eine einfache Zahl ist ein Objekt.<br />

Dieses Konzept wur<strong>de</strong> nicht nach Java übernommen, primitive Datentypen wer<strong>de</strong>n aber ab Java 1.5 mittels<br />

Autoboxing bei Bedarf in die entsprechen<strong>de</strong>n Objekttypen und umgekehrt umgewan<strong>de</strong>lt. [7]


Java (<strong>Programmiersprache</strong>) 65<br />

C++<br />

Java lehnt seine Syntax an die <strong>de</strong>r <strong>Programmiersprache</strong> C++ an. Im Gegensatz zu C++ fan<strong>de</strong>n jedoch komplexe<br />

Konstrukte wie Mehrfachvererbung o<strong>de</strong>r die fehleranfällige Zeigerarithmetik keinen Einzug. Klassen können nur<br />

eine Superklasse haben (Einfachvererbung), aber eine beliebige Anzahl von Interfaces implementieren. Interfaces<br />

entsprechen abstrakten Klassen in C++, welche keine Attribute o<strong>de</strong>r konkrete Metho<strong>de</strong>n besitzen, wer<strong>de</strong>n allerdings<br />

konzeptionell an<strong>de</strong>rs als die auch in Java möglichen abstrakten Klassen verwen<strong>de</strong>t. Die interne Speicherverwaltung<br />

wird <strong>de</strong>m Java-Entwickler weitgehend abgenommen; dies erledigt die automatische Speicherbereinigung. Deshalb<br />

ist Java in vielen Fällen leichter zu handhaben als C++. Allerdings garantiert auch dieser Mechanismus nicht <strong>de</strong>n<br />

vollständigen Ausschluss von Speicherlecks. Letztlich muss <strong>de</strong>r Programmierer dafür sorgen, dass nicht mehr<br />

verwen<strong>de</strong>te Objekte nirgends mehr referenziert wer<strong>de</strong>n.<br />

Neben Mehrfachvererbung und Speicherarithmetik wur<strong>de</strong>n bei <strong>de</strong>r Entwicklung von Java noch weitere Konstrukte<br />

<strong>de</strong>r Sprache C++ bewusst weggelassen:<br />

Im Gegensatz zu C++ ist es in Java nicht möglich, Operatoren (zum Beispiel arithmetische Operatoren wie + und -,<br />

logische Operatoren wie && und ||, o<strong>de</strong>r <strong>de</strong>n In<strong>de</strong>x-Operator []) zu überla<strong>de</strong>n, das heißt in einem bestimmten<br />

Kontext mit neuer Be<strong>de</strong>utung zu versehen. Dies sorgt einerseits für eine Vereinfachung <strong>de</strong>r Sprache an sich und<br />

verhin<strong>de</strong>rt, dass Quellco<strong>de</strong>s mit Operatoren, die mit schwer nachvollziehbarer Semantik überla<strong>de</strong>n wer<strong>de</strong>n,<br />

unleserlich gemacht wer<strong>de</strong>n. An<strong>de</strong>rerseits wür<strong>de</strong>n benutzer<strong>de</strong>finierte Typen mit überla<strong>de</strong>nen Operatoren in C++ eher<br />

wie eingebaute Typen erscheinen können – vor allem numerischer Co<strong>de</strong> wäre so mitunter einfacher<br />

nachzuvollziehen. Die Sprach<strong>de</strong>finition von Java <strong>de</strong>finiert jedoch typabhängiges Verhalten <strong>de</strong>r Operatoren +<br />

(Addition bei arithmetischen Operan<strong>de</strong>n, an<strong>de</strong>rnfalls zur Verkettung von Zeichenketten sog. „string concatenation“)<br />

sowie &, | und ^ (logisch für boolean und bitweise für arithmetische Operan<strong>de</strong>n). Das lässt diese Operatoren<br />

zumin<strong>de</strong>st wie teilweise überla<strong>de</strong>ne Operatoren erscheinen.<br />

Das C++-Konstrukt <strong>de</strong>r „Templates“, die es erlauben, Algorithmen o<strong>de</strong>r sogar ganze Klassen unabhängig von <strong>de</strong>n<br />

darin verwen<strong>de</strong>ten Datentypen zu <strong>de</strong>finieren, wur<strong>de</strong> in Java nicht übernommen. Seit Version 1.5 unterstützt Java<br />

aber sogenannte „Generics“, die zwar keinerlei Metaprogrammierung erlauben, aber ähnlich wie C++-Templates<br />

typsichere Container und ähnliches ermöglichen.<br />

In Java wur<strong>de</strong> das Schlüsselwort const reserviert, hat aber keine Funktion. Die Alternative zu const (und<br />

Präprozessor-Direktiven) ist final. Im Gegensatz zu const wird final in einer Metho<strong>de</strong>nsignatur nicht vererbt und hat<br />

somit nur im aktuellen Scope Gültigkeit. Den final-Modifikator kann eine Klasse (die dadurch nicht mehr abgeleitet<br />

wer<strong>de</strong>n kann), ein Attribut (<strong>de</strong>ssen Wert so nur einmal gesetzt wer<strong>de</strong>n kann) o<strong>de</strong>r eine Metho<strong>de</strong> (die dadurch<br />

unüberschreibbar wird) besitzen.<br />

C#<br />

Die von Microsoft entwickelte <strong>Programmiersprache</strong> C# kann als Konkurrenzprodukt zu Java gesehen wer<strong>de</strong>n. Mit<br />

<strong>de</strong>r Spezifikation von C# hat Microsoft im Rahmen seiner .NET-Strategie versucht, <strong>de</strong>n Spagat zwischen <strong>de</strong>r<br />

Schaffung einer neuen Sprache und <strong>de</strong>r leichten Integration bestehen<strong>de</strong>r Komponenten zu schaffen.<br />

Konzeptionelle Unterschie<strong>de</strong> zu Java bestehen insbeson<strong>de</strong>re in <strong>de</strong>r Umsetzung von Callback-Mechanismen. C#<br />

implementiert hierzu die Unterstützung von Delegaten (engl. <strong>de</strong>legates), einem Konzept, das mit Funktionszeigern<br />

vergleichbar ist. In Java kommt hingegen das Beobachter-Entwurfsmuster zum Einsatz.<br />

Des Weiteren unterstützt C# sogenannte Attribute (attributes), die es erlauben, die Funktionalität <strong>de</strong>r Sprache über<br />

Metadaten im Co<strong>de</strong> zu erweitern (eine ähnliche Funktionalität wur<strong>de</strong> in Form <strong>de</strong>r oben beschriebenen Annotations in<br />

Java 5.0 übernommen). C# enthält auch Bestandteile <strong>de</strong>r Sprachen VisualBasic, zum Beispiel Eigenschaften<br />

(„properties“), sowie Konzepte aus C++.<br />

In C# ist es ebenso wie in Java möglich, Ausnahmen (exceptions) zu einer Metho<strong>de</strong> zu <strong>de</strong>klarieren. In Java können<br />

Ausnahmen so <strong>de</strong>klariert wer<strong>de</strong>n, dass sie auch verarbeitet wer<strong>de</strong>n müssen (checked Exception).


Java (<strong>Programmiersprache</strong>) 66<br />

Systembefehle können in .NET über platform invoke aufgerufen wer<strong>de</strong>n. Dies ist in Java von <strong>de</strong>r Syntax her nicht<br />

möglich, kann aber über die Klassenbibliothek mittels Runtime.exec() und java.lang.ProcessBuil<strong>de</strong>r<br />

beziehungsweise Jakarta Commons Exec bewerkstelligt wer<strong>de</strong>n.<br />

Geschwindigkeitskritische Programmteile können in C# in sogenanntem unsicheren unsafe co<strong>de</strong> geschrieben<br />

wer<strong>de</strong>n, was ähnlich zu Inline-Assembler in C-Programmen zu sehen ist. Java kennt hierfür in <strong>de</strong>r Sprache aus<br />

Sicherheits-, Stabilitäts- und Pattformunabhängigkeitsgrün<strong>de</strong>n keine Entsprechung. Java bietet allerdings mittels<br />

Java Native Interface die Möglichkeit, C und C++ Co<strong>de</strong> in Javapakete einzubetten und außerhalb <strong>de</strong>r Java Virtual<br />

Machine laufen zu lassen. Darüberhinaus bietet Java die Möglichkeit aus Java Co<strong>de</strong> heraus verschie<strong>de</strong>ne<br />

Skriptsprachen auszuführen. Ebenfalls gibt es eine Reihe an <strong>Programmiersprache</strong>n, welche nach Java Byteco<strong>de</strong><br />

kompiliert wer<strong>de</strong>n. Damit lassen sich Programmteile auch in an<strong>de</strong>ren <strong>Programmiersprache</strong>n umsetzen. Im JDK<br />

Version 7, das etwa im September 2010 erwartet wird, [10] ist auch eine Unterstützung für dynamische<br />

„Fremdsprachen“ durch die Virtual Machine vorgesehen. [11]<br />

Entwicklungsumgebungen<br />

Es gibt eine große Vielfalt von Entwicklungsumgebungen für Java, sowohl kommerzielle als auch freie (Open<br />

Source). Die meisten Entwicklungsumgebungen für Java sind selbst ebenfalls in Java geschrieben.<br />

Die bekanntesten Open-Source-Umgebungen sind das von <strong>de</strong>r Eclipse Foundation bereitgestellte Eclipse und das<br />

von Sun entwickelte NetBeans.<br />

Unter <strong>de</strong>n kommerziellen Entwicklungsumgebungen sind das auf NetBeans basieren<strong>de</strong> Sun ONE Studio von Sun,<br />

IntelliJ IDEA von JetBrains, JBuil<strong>de</strong>r von Borland sowie JCreator am verbreitetsten. Außer<strong>de</strong>m gibt es noch eine,<br />

um einige hun<strong>de</strong>rt Plugins erweiterte Version von Eclipse, die von IBM unter <strong>de</strong>m Namen WebSphere Studio<br />

Application Developer („WSAD“) vertrieben wur<strong>de</strong> und seit Version 6.0 Rational Application Developer („RAD“)<br />

heißt.<br />

Apple liefert mit Mac OS X ab Version 10.3 die Entwicklungsumgebung Xco<strong>de</strong> aus, die verschie<strong>de</strong>ne<br />

<strong>Programmiersprache</strong>n unterstützt und einen Schwerpunkt auf Java setzt. Xco<strong>de</strong> wird mit je<strong>de</strong>m Apple<br />

(-Betriebssystem) mitgeliefert, Aktualisierungen sind darüber hinaus nach Registrierung für je<strong>de</strong>rmann kostenlos<br />

erhältlich.<br />

Wer lieber einen Texteditor verwen<strong>de</strong>t, fin<strong>de</strong>t in Emacs zusammen mit <strong>de</strong>r JDEE (Java Development Environment<br />

for Emacs) ein mächtiges Werkzeug. Ein vielseitiger und erweiterbarer in Java geschriebener Editor ist jEdit. Für<br />

an<strong>de</strong>re Editoren wie Vim, Jed o<strong>de</strong>r Textpad gibt es ebenfalls entsprechen<strong>de</strong> Modi.<br />

Compiler<br />

Ein Java-Compiler übersetzt Java-Quellco<strong>de</strong> (Dateiendung .java) in einen ausführbaren Co<strong>de</strong>. Grundsätzlich<br />

unterschei<strong>de</strong>t man zwischen Byteco<strong>de</strong>- und Nativeco<strong>de</strong>-Compilern. Einige Java-Laufzeitumgebungen verwen<strong>de</strong>n<br />

einen JIT-Compiler, um zur Laufzeit <strong>de</strong>n Byteco<strong>de</strong> häufig genutzter Programmteile in nativen Maschinenco<strong>de</strong> zu<br />

übersetzen.<br />

Byteco<strong>de</strong>-Compiler<br />

Im Normalfall übersetzt <strong>de</strong>r Java-Compiler die Programme in einen nicht direkt ausführbaren Byteco<strong>de</strong><br />

(Dateiendung .class), <strong>de</strong>n die Java Runtime Environment (JRE) später ausführt. Die aktuelle HotSpot-Technologie<br />

kompiliert <strong>de</strong>n Byteco<strong>de</strong> zur Laufzeit in nativen Prozessorco<strong>de</strong> und optimiert diesen abhängig von <strong>de</strong>r verwen<strong>de</strong>ten<br />

Plattform. Diese Optimierung fin<strong>de</strong>t dabei nach und nach statt, so dass <strong>de</strong>r Effekt auftritt, dass Programmteile nach<br />

mehrmaliger Abarbeitung schneller wer<strong>de</strong>n. An<strong>de</strong>rerseits führt diese Technik, die ein Nachfolger <strong>de</strong>r<br />

Just-In-Time-Compilierung ist, dazu, dass Java-Byteco<strong>de</strong> theoretisch genau so schnell wie native, kompilierte<br />

Programme ausgeführt wer<strong>de</strong>n könnte.


Java (<strong>Programmiersprache</strong>) 67<br />

Die HotSpot-Technik ist seit <strong>de</strong>r JRE Version 1.3 verfügbar und wur<strong>de</strong> seit<strong>de</strong>m stetig weiter verbessert.<br />

Beispiele für Byteco<strong>de</strong>-Compiler sind javac (Teil <strong>de</strong>s JDKs) und Jikes von IBM.<br />

Native Compiler<br />

Es existieren auch Compiler für Java, die Java-Quelltexte o<strong>de</strong>r Java-Byteco<strong>de</strong> in normalen Maschinenco<strong>de</strong><br />

übersetzen können, sogenannte Ahead-of-time-Compiler. Nativ kompilierte Programme haben <strong>de</strong>n Vorteil, keine<br />

JavaVM mehr zu benötigen, aber auch <strong>de</strong>n Nachteil, nicht mehr plattformunabhängig zu sein.<br />

Beispiele für native Java Compiler sind Excelsior JET sowie GNU Compiler for Java (GCJ) wie MinGW, Cygwin<br />

o<strong>de</strong>r JavaNativeCompiler (JNC).<br />

Wrapper<br />

Als weitere Möglichkeit kann das Java-Programm in ein an<strong>de</strong>res Programm „eingepackt“ (englisch to wrap) wer<strong>de</strong>n;<br />

diese äußere Hülle dient dann als Ersatz für ein Java Archive. Sie sucht selbständig nach einer installierten<br />

Java-Laufzeitumgebung, um das eigentliche Programm zu starten, und informiert <strong>de</strong>n Benutzer darüber, wo er eine<br />

Laufzeitumgebung herunterla<strong>de</strong>n kann, sofern noch keine installiert ist. Es ist also immer noch eine<br />

Laufzeitumgebung nötig, um das Programm starten zu können, aber <strong>de</strong>r Anwen<strong>de</strong>r erhält eine verständliche<br />

Fehlermeldung, die ihm weiterhilft.<br />

Java Web Start ist ein etwas eleganterer und standardisierter Ansatz für diese Lösung – er ermöglicht die einfache<br />

Aktivierung von Anwendungen mit einem einzigen Mausklick und garantiert, dass immer die neueste Version <strong>de</strong>r<br />

Anwendung ausgeführt wird. Dadurch wer<strong>de</strong>n komplizierte Installations- o<strong>de</strong>r Aktualisierungsprozeduren<br />

automatisiert.<br />

Beispiele für Java Wrapper sind JSmooth o<strong>de</strong>r Launch4J. JBuil<strong>de</strong>r von Borland und NSIS sind ebenfalls in <strong>de</strong>r Lage,<br />

einen Wrapper für Windows zu erstellen.<br />

Literatur<br />

• Guido Krüger: Handbuch <strong>de</strong>r Java-Programmierung. [12] 6. Auflage. Addison Wesley, 2009, ISBN<br />

978-3-8273-2874-8<br />

• James Gosling, Bill Joy, Guy Steele, Gilad Bracha: The Java Language Specification. Third Edition.<br />

Addison-Wesley 2005, ISBN 0-321-24678-0 (online [13] )<br />

• Christian Ullenboom: Java ist auch eine Insel. [14] 8. Auflage. Galileo Computing, 2009, ISBN<br />

978-3-8362-1371-4<br />

• Gottfried Wolmeringer: Java 6 lernen mit Eclipse, Galileo Computing, ISBN 3-89842-872-9<br />

• Dirk Louis, Peter Müller: Java 5 Kompendium – Praxis <strong>de</strong>r objektorientierten Programmierung. Markt &<br />

Technik, 2005, ISBN 3-8272-6844-3<br />

• Hubert Partl, Uni Wien: Programmieren mit Java (Onlineversion [15] )


Java (<strong>Programmiersprache</strong>) 68<br />

Weblinks<br />

• Java-Abteilung von Sun Microsystems [3] (englisch)<br />

• Java-Download [16]<br />

• java.net Java-community [17] Projekte-Blogs etc. (englisch)<br />

• Programmierrichtlinien für Java [18] von Sun Microsystems (englisch)<br />

• Kenndaten JDK 7 (englisch) [19]<br />

Referenzen<br />

[1] Jon Byous: Java Technology: The Early Years. (http:/ / java. sun. com/ features/ 1998/ 05/ birthday. html) Sun Microsystems, 2003, „On May<br />

23, 1995, John Gage, director of the Science Office for Sun Microsystems, and Marc Andreessen, cofoun<strong>de</strong>r and executive vice presi<strong>de</strong>nt at<br />

Netscape, stepped onto a stage and announced to the SunWorldTM audience that JavaTM technology was real, it was official, and it was<br />

going to be incorporated into Netscape NavigatorTM, the world's portal to the Internet.“, abgerufen am 22. Dezember 2009 (Englisch).<br />

[2] Java 5 catches up with C# (http:/ / www. barrycornelius. com/ papers/ java5/ onefile/ )<br />

[3] http:/ / java. sun. com/<br />

[4] The Java Language Environment – 1.2 Design Goals of the JavaTM Programming Language (http:/ / java. sun. com/ docs/ white/ langenv/<br />

Intro. doc2. html), James Gosling und Henry McGilton, Mai 1996<br />

[5] Java Language Overview (http:/ / java. sun. com/ docs/ overviews/ java/ java-overview-1. html), 1995 Sun Whitepaper<br />

[6] C.A.R. Hoare: Monitors: An Operating System Structuring Concept, Comm. ACM 17, 10:549–557 (Oktober 1974)<br />

[7] Autoboxing in Java (http:/ / java. sun. com/ j2se/ 1. 5. 0/ docs/ gui<strong>de</strong>/ language/ autoboxing. html)<br />

[8] Community-Seite zur Entwicklung <strong>de</strong>s Open-Source-JDKs von Sun (https:/ / openjdk. <strong>de</strong>v. java. net/ )<br />

[9] Sun Microsystems Presseankündigung vom 8. Mai 2007 (http:/ / www. sun. com/ aboutsun/ pr/ 2007-05/ sunflash. 20070508. 3. xml)<br />

[10] http:/ / openjdk. java. net/ projects/ jdk7/ Roadmap JDK 7<br />

[11] JDK 7 Features – JSR 292: VM support for non-Java languages (InvokeDynamic) (http:/ / openjdk. java. net/ projects/ jdk7/ features/ #f353)<br />

[12] http:/ / www. javabuch. <strong>de</strong><br />

[13] http:/ / java. sun. com/ docs/ books/ jls/ third_edition/ html/ j3TOC. html<br />

[14] http:/ / openbook. galileocomputing. <strong>de</strong>/ javainsel8/<br />

[15] http:/ / www. boku. ac. at/ javaeinf/ EinfProgJava. pdf<br />

[16] http:/ / java. com/ <strong>de</strong>/ download/ in<strong>de</strong>x. jsp<br />

[17] http:/ / java. net<br />

[18] http:/ / java. sun. com/ docs/ co<strong>de</strong>conv/ html/ Co<strong>de</strong>ConvTOC. doc. html<br />

[19] http:/ / openjdk. java. net/ projects/ jdk7/ features/


JavaScript 69<br />

JavaScript<br />

JavaScript<br />

Paradigmen: multiparadigmatisch<br />

Erscheinungsjahr: 1995<br />

Entwickler: Brendan Eich<br />

Aktuelle Version: 1.8 (2008)<br />

Typisierung: schwach, dynamisch, duck<br />

wichtige Implementierungen: Spi<strong>de</strong>rMonkey, Rhino, SquirrelFish,<br />

V8<br />

Einflüsse: Self, C, Scheme, Perl, Python, Java<br />

JavaScript ist eine Skriptsprache, die hauptsächlich für das DOM-Scripting in Web-Browsern eingesetzt wird.<br />

Der als ECMAScript (ECMA 262) standardisierte Sprachkern von JavaScript beschreibt eine mo<strong>de</strong>rne, schlanke,<br />

dynamisch typisierte, objektorientierte, aber klassenlose Skriptsprache, die <strong>de</strong>nnoch allen objektorientierten<br />

Programmierparadigmen unter an<strong>de</strong>rem auch – aber eben nicht ausschließlich – auf <strong>de</strong>r Basis von Prototypen<br />

gerecht wird. In JavaScript lässt sich objektorientiert und sowohl prozedural als auch funktional programmieren.<br />

Während HTML/CSS nur rudimentäre Möglichkeiten zur Nutzerinteraktion bietet, können mit JavaScript Inhalte<br />

generiert und nachgela<strong>de</strong>n wer<strong>de</strong>n.<br />

Entwicklung<br />

Die Syntax von JavaScript ähnelt jener <strong>de</strong>r C-Abkömmlinge, wozu auch Java gehört. Trotz <strong>de</strong>r Namens- und<br />

syntaktischen Ähnlichkeit hat JavaScript nur geringe Gemeinsamkeiten mit Java, beispielsweise wird<br />

Objektorientierung in JavaScript an<strong>de</strong>rs als in Java nicht durch Klassen, son<strong>de</strong>rn durch Prototypen unterstützt.<br />

Von Brendan Eich zuerst Mocha genannt, wur<strong>de</strong> die Sprache aus Marketinggrün<strong>de</strong>n erst in LiveScript und<br />

letztendlich in JavaScript umbenannt: Um <strong>de</strong>m damals aktuellen Java-Trend zu entsprechen, entstand mit<br />

LiveConnect eine Schnittstelle zwischen Java und LiveScript, was sich im neuen Namen JavaScript ausdrücken<br />

sollte. [1] JavaScript ist eine Marke <strong>de</strong>s Unternehmens Sun Microsystems. [2]<br />

Ursprünglich für <strong>de</strong>n Netscape Navigator entwickelt, fin<strong>de</strong>n sich heute nach <strong>de</strong>m sogenannten Browserkrieg<br />

mittlerweile in praktisch allen grafischen Browsern weitgehend kompatible JavaScript-Interpreter wie z. B.<br />

Spi<strong>de</strong>rMonkey für Mozilla/Gecko o<strong>de</strong>r JScript von Microsoft. Der Sprachkern von JavaScript ist unter <strong>de</strong>m Namen<br />

ECMAScript durch Ecma International standardisiert. Der in Java implementierte JavaScript-Interpreter Rhino wird<br />

ab Version 6.0 als Teil <strong>de</strong>r Java-Laufzeitumgebung standardmäßig mitgeliefert. [3]<br />

Inzwischen hat sich die Sprache auch neue Anwendungsgebiete erschlossen. Zum Beispiel wird sie gerne als<br />

Skriptsprache für Spiele und Anwendungsprogramme eingesetzt, da <strong>de</strong>r Sprachkern nur wenige Objekte enthält und<br />

dadurch <strong>de</strong>r zur Ausführung von in JavaScript formulierten Skripten erfor<strong>de</strong>rliche Interpreter relativ klein gehalten<br />

wer<strong>de</strong>n kann.


JavaScript 70<br />

Überblick<br />

JavaScript wird hauptsächlich clientseitig eingesetzt, im Unterschied zu an<strong>de</strong>ren im Web verwen<strong>de</strong>ten Sprachen, wie<br />

Perl o<strong>de</strong>r PHP, die ausschließlich serverseitig eingesetzt wer<strong>de</strong>n. JavaScript bzw. die<br />

ECMAScript-Implementationen fin<strong>de</strong>n jedoch beispielsweise auf Netscape Enterprise Servern (NES), und als<br />

JScript bzw. JScript.NET in einer ASP- bzw. ASP.NET-Umgebung auf Microsoft Internet Information Services auch<br />

serverseitig Anwendung (Stichwort Server-Si<strong>de</strong> JavaScript). Weitere Beispiele für serverseitige<br />

Javascript-Programmierung sind POW und Jaxer, die auf <strong>de</strong>r Mozilla-Javascript-Engine Spi<strong>de</strong>rmonkey aufsetzen.<br />

JavaScript wur<strong>de</strong> ursprünglich von Sun Microsystems und Netscape in Kooperation entwickelt. Trotz <strong>de</strong>s ähnlichen<br />

Namens und einer ähnlichen Syntax ist JavaScript grundlegend verschie<strong>de</strong>n von <strong>de</strong>r <strong>Programmiersprache</strong> Java, die<br />

von Sun Microsystems stammt. Die Namensgleichheit erklärt sich wohl vor allem aus <strong>de</strong>r Absicht, aus<br />

Marketinggrün<strong>de</strong>n eine Verbindung mit <strong>de</strong>n damals sehr populären Java-Applets herzustellen. Die Syntax wur<strong>de</strong><br />

auch aus diesem Grund weitgehend <strong>de</strong>r von Java angeglichen.<br />

Die ursprüngliche Grundfunktionalität von JavaScript ist heute als ECMAScript o<strong>de</strong>r ECMA-262 standardisiert und<br />

wird von <strong>de</strong>n meisten Browsern weitgehend unterstützt (JavaScript in <strong>de</strong>r Version 1.5 entspricht ECMA-262 Version<br />

3).<br />

Typische Anwendungsgebiete<br />

Typische Anwendungsgebiete von JavaScript sind:<br />

• Plausibilitätsprüfung (Validierung) von Formulareingaben beim Absen<strong>de</strong>r<br />

• Mehrere Frames auf einmal wechseln o<strong>de</strong>r die Seite aus <strong>de</strong>m Frameset „befreien“<br />

• Banner o<strong>de</strong>r Laufschriften<br />

• Dynamische Manipulation von Webseiten über das Document Object Mo<strong>de</strong>l<br />

• Sen<strong>de</strong>n und Empfangen von Daten, ohne dass <strong>de</strong>r Browser die Seite neu la<strong>de</strong>n muss (Ajax)<br />

• sofortiges Vorschlagen von Suchbegriffen<br />

• Verschleierung von E-Mail-Adressen zur Bekämpfung von Spam (siehe <strong>de</strong>n betreffen<strong>de</strong>n Artikel).<br />

Missbrauch<br />

Einige Anwendungen, die mit JavaScript möglich sind, verärgern meistens <strong>de</strong>n Benutzer und wer<strong>de</strong>n als „schlechter<br />

Stil“ angesehen:<br />

• Quelltext „verschleiern“, um diesen vor <strong>de</strong>m Besucher zu verstecken<br />

• Verschleiern von Internetadressen, auf die ein Link verweist<br />

• Deaktivieren <strong>de</strong>s Kontextmenüs, um zu erschweren, dass Bil<strong>de</strong>r o<strong>de</strong>r die gesamte Seite abgespeichert wer<strong>de</strong>n<br />

können<br />

• Deaktivieren <strong>de</strong>r Kopierfunktion, um zu erschweren, dass Texte o<strong>de</strong>r Bil<strong>de</strong>r kopiert wer<strong>de</strong>n können<br />

• Unaufgefor<strong>de</strong>rte (Werbe-)Pop-ups o<strong>de</strong>r Pop-un<strong>de</strong>rs<br />

• Ungewolltes Öffnen von Fenstern, teilweise auch Öffnen beliebig vieler Fenster<br />

• Ungewolltes Schließen <strong>de</strong>s Browserfensters<br />

• Ungewollte Größenän<strong>de</strong>rung <strong>de</strong>s Browserfensters<br />

• Blockieren <strong>de</strong>r Anwen<strong>de</strong>r mit zahllosen aufeinan<strong>de</strong>rfolgen<strong>de</strong>n Dialogfenstern<br />

• Bei anfälligen Webanwendungen kann JavaScript auch von Dritten missbraucht wer<strong>de</strong>n, etwa per XSS<br />

(Co<strong>de</strong>einschleusung).<br />

• JavaScript-Navigation: Barrierearme Webseiten zeichnen sich dadurch aus, dass sie auch bei abgeschaltetem<br />

JavaScript möglichst uneingeschränkt navigierbar bleiben. Oft schränkt das nicht aktivierte JavaScript die<br />

Benutzbarkeit einer Webseite ein.


JavaScript 71<br />

Geschichte<br />

Am 18. September 1995 veröffentlicht Netscape mit <strong>de</strong>r Vorversion <strong>de</strong>s Navigator 2.0 einen Browser mit einer<br />

eingebetteten Skriptsprache, die zu diesem Zeitpunkt LiveScript heißt und von Brendan Eich entwickelt wur<strong>de</strong>. Die<br />

Sprache kann u. a. Formulareingaben <strong>de</strong>s Benutzers vor <strong>de</strong>m Absen<strong>de</strong>n überprüfen. Am 4. Dezember 1995<br />

verkün<strong>de</strong>n Netscape und Sun Microsystems eine Kooperation die die Interaktion von LiveScript direkt mit<br />

Java-Applets zum Ziel hat. Sun entwickelte die nötigen Java-Klassen, Netscape die Schnittstelle LiveConnect und<br />

benennt die Sprache in JavaScript um (JavaScript 1.0).<br />

Mit <strong>de</strong>r ersten Beta-Version <strong>de</strong>s Navigator 3.0 führt am 29. April 1996 Netscape JavaScript 1.1 ein. Neu ist die<br />

Möglichkeit, auf Bil<strong>de</strong>r zuzugreifen und so genannte Rollover-Grafiken zu erstellen. LiveConnect ist jetzt<br />

Bestandteil <strong>de</strong>s Browsers. Mit <strong>de</strong>r Beta-Version <strong>de</strong>s Internet Explorer 3 stellt im Mai 1996 Microsoft seinen ersten<br />

JScript-fähigen Browser vor. Beginn <strong>de</strong>s Browserkriegs. Mit <strong>de</strong>r Ankündigung <strong>de</strong>s Netscape Communicators wird<br />

JavaScript 1.2 am 15. Oktober 1996 veröffentlicht, <strong>de</strong>r Netscape Communicator 4.0 mit JavaScript 1.2 erscheint<br />

jedoch erst am 4. Juni 1997. Ebenfalls im Juni 1997 veröffentlicht die European Computer Manufacturers<br />

Association ihren Standard ECMA-262 (ECMAScript), <strong>de</strong>r zusammen mit Netscape entwickelt wur<strong>de</strong> und die<br />

Grun<strong>de</strong>lemente einer Skriptsprache standardisieren soll. Diese wird im April 1998 zur ISO-Norm ISO/IEC<br />

16262:1998 Information technology – ECMAScript language specification. Am 1. Oktober 1997 kommt <strong>de</strong>r Internet<br />

Explorer 4 heraus, <strong>de</strong>r <strong>de</strong>n Sprachumfang von JavaScript 1.1 ab<strong>de</strong>ckt. Darüber hinaus wer<strong>de</strong>n eigene Erweiterungen<br />

veröffentlicht, die zu Kompatibilitätsunterschie<strong>de</strong>n zwischen Navigator und Internet Explorer führen und eine<br />

DOM-ähnliche Syntax zur Verfügung stellen, die es ermöglicht, auf alle Elemente <strong>de</strong>r Webseite zuzugreifen und<br />

diese beliebig zu verän<strong>de</strong>rn.<br />

Im Juli 1998 kommt mit <strong>de</strong>r Beta-Version <strong>de</strong>s Netscape Communicators 4.5 JavaScript 1.3. Erstmals zu fin<strong>de</strong>n war<br />

diese JavaScript-Version schon in <strong>de</strong>r Version 4.06 <strong>de</strong>s Netscape Communicators.<br />

Im Oktober 1998 stellt Netscape JavaScript 1.4 vor. Diese Version ist vollständig kompatibel mit ECMA-262. Ein<br />

Browser mit <strong>de</strong>r Unterstützung dieser Version erscheint jedoch nicht.<br />

Im April 2000 kommt mit <strong>de</strong>r Preview Release 1 <strong>de</strong>s Navigator 6 JavaScript 1.5 und DOM Level 1. Am 5. Juni 2002<br />

erscheint Mozilla 1.0 mit JavaScript 1.5, am 29. November 2005 Mozilla Firefox 1.5 mit JavaScript 1.6, am 12. Juli<br />

2006 Mozilla Firefox 2.0b1 mit JavaScript 1.7. und am 18. Dezember 2007 Mozilla Firefox 3.0b2 mit JavaScript 1.8.<br />

Versionsgeschichte<br />

Versionsgeschichte von JavaScript [4]<br />

Version Release Entsprechung Netscape<br />

Navigator<br />

Mozilla<br />

Firefox<br />

1.0 März 1996 2.0 3.0<br />

1.1 August 1996 3.0<br />

1.2 Juni 1997 4.0-4.05<br />

1.3 Oktober 1998 ECMA-262 1 st edition / ECMA-262<br />

2 nd edition<br />

1.4 Netscape Server<br />

4.06-4.7x 4.0<br />

Internet<br />

Explorer<br />

Opera Safari Google<br />

Chrome


JavaScript 72<br />

1.5 November<br />

2000<br />

1.6 November<br />

2005<br />

ECMA-262 3 rd edition<br />

1.5 + Array extras + Array & String<br />

generics + E4X<br />

1.7 Oktober 2006 1.6 + Pythonic generators + Iterators<br />

+ let<br />

1.8 Juni 2008 1.7 + Generator expressions +<br />

Expression closures<br />

1.8.1 1.8 + geringfügige Updates 3.5<br />

1.9 1.8.1 + ECMAScript 5 Compliance 4<br />

Sicherheit<br />

Das Sandbox-Prinzip<br />

6.0 1.0 • 5.5 (JScript<br />

5.5)<br />

• 6 (JScript<br />

5.6)<br />

• 7 (JScript<br />

5.7)<br />

• 8 (JScript 6)<br />

• 6.0<br />

• 7.0<br />

• 8.0<br />

• 9.0<br />

1.5 • 3.0<br />

• 3.1<br />

2.0 • 3.2<br />

JavaScript wird im Browser in einer so genannten Sandbox ausgeführt. Dieses bewirkt, dass man in JavaScript im<br />

Allgemeinen nur Zugriff auf die Objekte <strong>de</strong>s Browsers hat und somit nicht auf das Dateisystem zugreifen und damit<br />

Dateien lesen o<strong>de</strong>r schreiben kann. Es ist jedoch zumin<strong>de</strong>st in JScript möglich, bei entsprechen<strong>de</strong>n<br />

Sicherheitseinstellungen durch die Nutzung von ActiveX diese Beschränkungen zu umgehen.<br />

Zusätzlich wird je<strong>de</strong>r Webauftritt o<strong>de</strong>r Webapplikation isoliert behan<strong>de</strong>lt und ein Datenaustausch wird unterbun<strong>de</strong>n.<br />

Das ist wichtig, um Sicherheitsprobleme zu verhin<strong>de</strong>rn. Ohne diese Isolierung wäre es beispielsweise möglich, dass<br />

eine böswillige Seite Bankdaten abgreifen könnte, wenn bei<strong>de</strong> Webpräsenzen zur selben Zeit betrachtet wer<strong>de</strong>n.<br />

Es bewirkt ferner, dass Aktionen wie das Schließen <strong>de</strong>s Browserfensters, das Aus- und Einblen<strong>de</strong>n von<br />

Symbolleisten, das Än<strong>de</strong>rn <strong>de</strong>r im Browser eingestellten Startseite o<strong>de</strong>r das Auslesen <strong>de</strong>r zuletzt besuchten<br />

Webseiten <strong>de</strong>s Anwen<strong>de</strong>rs die explizite Erlaubnis <strong>de</strong>s Benutzers erfor<strong>de</strong>rn.<br />

Deaktivieren von JavaScript<br />

In fast allen JavaScript-fähigen Browsern lässt sich JavaScript abschalten o<strong>de</strong>r lassen sich einzelne Aktionen, wie die<br />

Än<strong>de</strong>rung <strong>de</strong>s Textes in <strong>de</strong>r Statusleiste o<strong>de</strong>r die Manipulation von Browserfenstern, <strong>de</strong>aktivieren. Da diese<br />

Einstellungen jedoch bei einigen Browsern sehr umständlich o<strong>de</strong>r versteckt sind, wur<strong>de</strong>n dafür auch<br />

Zusatzprogramme, wie z.B. NoScript, entwickelt, mit <strong>de</strong>nen sich solche Browser nachrüsten lassen.<br />

Sprachelemente<br />

Datentypen<br />

Der Datentyp einer Variablen v lässt sich mit typeof v ermitteln.<br />

Zeichenketten haben <strong>de</strong>n Typ string, numerische Werte <strong>de</strong>n Typ number und boolesche Werte <strong>de</strong>n Typ boolean. Ein<br />

Son<strong>de</strong>rfall ist <strong>de</strong>r Typ un<strong>de</strong>fined mit un<strong>de</strong>fined als einzigem Wert. Funktionen sind Objekte, <strong>de</strong>r typeof-Operator<br />

gibt als Typ aber function zurück. Alle an<strong>de</strong>ren Werte - reguläre Ausdrücke, Arrays und <strong>de</strong>r Wert null inbegriffen -<br />

sind vom Typ object.<br />

Mit <strong>de</strong>n vor<strong>de</strong>finierten Konstruktorfunktionen String, Number, Boolean erstellte Variablen verhalten sich wie Werte<br />

<strong>de</strong>r entsprechen<strong>de</strong>n Datentypen - <strong>de</strong>r typeof-Operator gibt jedoch "object" zurück:<br />

3.0<br />

• 4.0<br />

1.0


JavaScript 73<br />

var variable = "Beispieltext";<br />

alert(typeof variable); // ergibt "string"<br />

variable = new String("Beispieltext");<br />

alert(typeof variable); // ergibt "object"<br />

Umgekehrt wer<strong>de</strong>n Variablen <strong>de</strong>r primitiven Typen number, boolean und string bei Bedarf automatisch in Objekte<br />

<strong>de</strong>r entsprechen<strong>de</strong>n Konstruktorfunktion umgewan<strong>de</strong>lt:<br />

var variable = "Beispieltext";<br />

alert(variable.length); // ergibt 12<br />

JavaScript ist dynamisch typisiert, d. h. <strong>de</strong>r Datentyp einer Variablen kann sich während <strong>de</strong>r Ausführung eines<br />

Scripts än<strong>de</strong>rn, was manchmal zu Fehlern bzw. unerwünschten Effekten führt.<br />

Kontrollstrukturen<br />

If … else (Bedingte Anweisung)<br />

if (bedingung) {<br />

} else {<br />

}<br />

anweisungen;<br />

anweisungen;<br />

Switch-Kontrollstruktur<br />

switch (variable) {<br />

}<br />

While-Schleife<br />

case wert1 :<br />

anweisungen;<br />

break;<br />

case wert2 :<br />

<strong>de</strong>fault :<br />

anweisungen;<br />

break;<br />

anweisungen;<br />

while (bedingung) {<br />

}<br />

anweisungen;<br />

Do-while-Schleife<br />

do {<br />

anweisungen;<br />

} while (bedingung);


JavaScript 74<br />

For-Schleife<br />

for (startausdruck; bedingung; iterationsausdruck) {<br />

}<br />

anweisungen;<br />

For … in-Schleife<br />

Mit dieser Anweisung wer<strong>de</strong>n alle eigenen und ererbten Eigenschaften eines Objektes durchlaufen, die nicht die<br />

interne Eigenschaft DontEnum aufweisen. DontEnum gilt für bestimmte eingebaute Eigenschaften und kann nicht<br />

vom Benutzer gesetzt wer<strong>de</strong>n. [5] Bei je<strong>de</strong>m Schleifendurchgang wird einer angegebenen Variable <strong>de</strong>r<br />

Eigenschaftsname zugewiesen.<br />

for (var eigenschaftsname in objekt) {<br />

}<br />

anweisungen;<br />

For Each … in-Schleife<br />

Die For Each … in-Schleife gleicht <strong>de</strong>r For … in-Schleife, mit <strong>de</strong>m Unterschied, dass die Eigenschaftswerte <strong>de</strong>s<br />

Objekts durchlaufen wer<strong>de</strong>n und nicht <strong>de</strong>ren Namen. Sie ist erst ab JavaScript 1.6 verfügbar. [6]<br />

for each (var eigenschaftswert in objekt) {<br />

}<br />

anweisungen;<br />

Geltungsbereich von Variablen<br />

Variablen sind in JavaScript innerhalb <strong>de</strong>r Funktion sichtbar, in <strong>de</strong>r sie <strong>de</strong>klariert wur<strong>de</strong>n.<br />

Außerhalb von Funktionen <strong>de</strong>klarierte Variablen sind Eigenschaften <strong>de</strong>s globalen Objekts (window).<br />

Funktionen<br />

Funktionen sind in JavaScript vollwertige Objekte. Sie haben Metho<strong>de</strong>n und Eigenschaften, können erstellt und<br />

überschrieben, als Argumente an Funktionen übergeben und von ihnen erzeugt und zurückgegeben wer<strong>de</strong>n.<br />

Im letzteren Fall entsteht eine Closure (auch Funktionsabschluss genannt), mit <strong>de</strong>r beispielsweise Datenkapselung<br />

umgesetzt wer<strong>de</strong>n kann:<br />

var temp = function () {<br />

}<br />

var geheimnis = 42;<br />

return function () {<br />

};<br />

return geheimnis;<br />

var geheimnisträger = temp(); //geheimnisträger ist die von temp()<br />

zurückgegebene Funktion<br />

alert(typeof geheimnis ); // un<strong>de</strong>fined<br />

alert(geheimnisträger()); // 42<br />

Nicht je<strong>de</strong>s Argument einer Funktion muss beim Aufruf angegeben wer<strong>de</strong>n, für fehlen<strong>de</strong> Argumente wird <strong>de</strong>r Wert<br />

un<strong>de</strong>fined gesetzt. Außer<strong>de</strong>m kann innerhalb <strong>de</strong>r Funktion auch über das arguments-Objekt auf die Argumente<br />

zugegriffen wer<strong>de</strong>n.


JavaScript 75<br />

Erzeugung<br />

Es gibt mehrere Möglichkeiten, in JavaScript Funktionen zu erzeugen [7] :<br />

// 1: Funktions<strong>de</strong>klaration, a ist eine Funktion mit <strong>de</strong>m Namen a.<br />

function a (Parameter1, Parameter2, Parameter3) {<br />

}<br />

anweisungen;<br />

return ausdruck;<br />

// 2: Funktionsausdruck ('function expression')<br />

// 2.1: Normalfall, b ist eine anonyme Funktion<br />

var b = function (...) {...}<br />

// 2.2: benannter Funktionsausdruck ('named function expression')<br />

// c ist hier eine Funktion mit <strong>de</strong>m Namen d. Außerhalb <strong>de</strong>r<br />

// Funktion ist sie mit c ansprechbar, innerhalb mit c und d.<br />

var c = function d (...) {...}<br />

// 3: Function-Konstruktor<br />

var e = new Function('arg1', 'arg2', 'return arg1 + arg2');<br />

// 4: 'expression closure' aus JavaScript 1.8, ähnlich <strong>de</strong>m<br />

Lambda-Kalkül<br />

// kommt ohne geschweifte Klammern und return aus, gibt das Ergebnis<br />

von Ausdruck zurück<br />

function f (...) ausdruck;<br />

Eine funktionale Implementation <strong>de</strong>s Euklidischen Algorithmus in <strong>de</strong>r rekursiven Variante sähe so aus (JavaScript<br />

1.8):<br />

// einfache Version<br />

function euklid (a, b)<br />

b ? euklid(b, a%b) : a<br />

// Version, die beliebig viele Argumente annimmt,<br />

// rekursiv, funktional<br />

// Ablauf:<br />

// (1) Erzeuge ein Array aus <strong>de</strong>n Argumenten von ggT<br />

// (2) Wenn ggT nur (noch) ein Argument hat, gib dieses zurück, wenn es<br />

keines hat, 0<br />

// (3) sonst rufe euklid mit <strong>de</strong>m ersten Argument<br />

// (4) und <strong>de</strong>m Ergebnis <strong>de</strong>s Ergebnisses von ggT mit <strong>de</strong>n Argumenten 2<br />

bis n auf<br />

function ggT ()<br />

(function (args)<br />

!args[1]<br />

? (function () args[0] || 0) // (2)<br />

: (function () euklid( // (3)<br />

args[0],


JavaScript 76<br />

))<br />

ggT.apply(null, args.slice(1))() // (4)<br />

)(Array.prototype.slice.apply(arguments)) // (1)<br />

ggT(4,6); // ergibt eine Funktion, die 2 zurückgibt<br />

// die zurückgegebene Funktion kann auch direkt ausgeführt wer<strong>de</strong>n:<br />

ggT()(); // 0<br />

ggT(4)(); // 4<br />

ggT(4,6,8,102,244)(); // 2<br />

Objekte<br />

Je<strong>de</strong>s Objekt - auch durch Literale erzeugte Objekte - erbt vom Prototyp <strong>de</strong>s globalen Object-Konstruktors.<br />

Vor<strong>de</strong>finierte Objekte<br />

JavaScript kennt mehrere eingebaute Objekte, die von ECMAScript <strong>de</strong>finiert wer<strong>de</strong>n.<br />

• Das namenlose globale Objekt, das alle Variablen und Objekte enthält.<br />

• Object als allgemeiner Prototyp, von <strong>de</strong>m alle Objekte abgeleitet sind<br />

• Function als Prototyp für Funktionen<br />

• Array als Prototyp für Arrays<br />

• String als Prototyp für Zeichenketten<br />

• Boolean als Prototyp für Boolesche Variablen<br />

• Number als Prototyp für Zahlen (64-Bit-Gleitkommazahlen gemäß IEEE 754)<br />

• Math stellt Konstanten und Metho<strong>de</strong>n für mathematische Operationen bereit. Math kann nicht als Konstruktor<br />

dienen.<br />

• Date für Operationen mit Daten bzw. Zeitpunkten und Datumsformaten<br />

• RegExp für reguläre Ausdrücke<br />

Die restlichen Objekte, die beim clientseitigen JavaScript verwen<strong>de</strong>t wer<strong>de</strong>n, entstan<strong>de</strong>n historisch vor allem durch<br />

die Netscape-Spezifikationen (window, document usw.). Das window-Objekt selbst ist dabei <strong>de</strong> facto das globale<br />

Objekt, in<strong>de</strong>m einfach einer Variablen window das globale Objekt zugewiesen wur<strong>de</strong>. Zahlreiche Unterobjekte von<br />

document wur<strong>de</strong>n mittlerweile durch DOM HTML standardisiert (title, images, links, forms usw.). Aktuelle Browser<br />

unterstützen zu<strong>de</strong>m DOM Core und an<strong>de</strong>re W3C-DOM-Standards sowie Erweiterungen von Microsoft JScript.<br />

Zugriff auf Objekteigenschaften und -metho<strong>de</strong>n<br />

Eigenschaften von Objekten (auch Metho<strong>de</strong>n sind Eigenschaften) wer<strong>de</strong>n wie folgt angesprochen:<br />

Punkt-Notation:<br />

objekt.eigenschaft;<br />

objekt.metho<strong>de</strong>([Parameter]);<br />

Klammer-Notation:<br />

objekt["eigenschaft"];<br />

objekt["metho<strong>de</strong>"]();<br />

// Eigenschaftsname, <strong>de</strong>r in Punkt-Notation illegal wäre:


JavaScript 77<br />

objekt["metho<strong>de</strong> 1"]();<br />

Durch die Klammer-Notation lassen sich die Eigenschaften eines Objekts beispielsweise mit <strong>de</strong>r "For … in"-Schleife<br />

durchlaufen.<br />

Allen Objekten können zur Laufzeit neue Eigenschaften hinzugefügt wer<strong>de</strong>n:<br />

objekt["eigenschaft-2"] = 1;<br />

objekt.metho<strong>de</strong>B = function (x) {<br />

};<br />

return typeof objekt["eigenschaft-" + x];<br />

Entfernen lassen sich Eigenschaften mit <strong>de</strong>m Operator <strong>de</strong>lete:<br />

<strong>de</strong>lete objekt.eigenschaftA;<br />

Objektliterale<br />

Objekte können in JavaScript direkt anhand ihrer Eigenschaften <strong>de</strong>finiert wer<strong>de</strong>n:<br />

var meinObjekt = {<br />

};<br />

zahl: 42,<br />

gibZahl: function () {<br />

}<br />

return meinObjekt.zahl;<br />

alert(meinObjekt.gibZahl()); // 42<br />

Eine spezielle Notation gibt es für reguläre Ausdrücke:<br />

// mit Konstruktorfunktion<br />

(new RegExp("a")).test("ab"); // true<br />

// als Literal<br />

/a/.test("ab"); // true<br />

Konstruktor-Funktionen<br />

Eine Funktion kann dazu genutzt wer<strong>de</strong>n, um ein mit new erstelltes Objekt zu initialisieren. In diesem Fall spricht<br />

man von einem Konstruktor o<strong>de</strong>r einer Konstruktor-Funktion. Innerhalb dieser Funktion kann das neue Objekt über<br />

die Variable this angesprochen wer<strong>de</strong>n.<br />

function MeinObjekt(x) { // Konstruktor<br />

}<br />

this.zahl = x;<br />

var objekt = new MeinObjekt(3); // Instanz erzeugen<br />

alert(objekt.zahl); // per Mel<strong>de</strong>fenster ausgeben (3)


JavaScript 78<br />

"private" Eigenschaften<br />

Private Eigenschaften und Metho<strong>de</strong>n sind nicht explizit Teil <strong>de</strong>r Sprache.<br />

Mit Hilfe von Closures (siehe Funktionen) lassen sich <strong>de</strong>nnoch private Eigenschaften von Objekten realisieren:<br />

var neue_katze = function () {<br />

};<br />

var lebensZahl = 7;<br />

var maunz = function () {<br />

};<br />

return (lebensZahl > 0) ? "miau" : "örks";<br />

// gib neues objekt zurück<br />

return {<br />

};<br />

toeten: function () {<br />

}<br />

var otto = neue_katze();<br />

otto.toeten(); // miau<br />

lebensZahl -= 1;<br />

alert(maunz());<br />

Lediglich die "toeten"-Metho<strong>de</strong> von otto kennt die Variable "lebensZahl". Der Effekt gleicht <strong>de</strong>m einer privaten<br />

Eigenschaft, wenn alle Metho<strong>de</strong>n <strong>de</strong>r Katze in <strong>de</strong>r erzeugen<strong>de</strong>n Funktion neue_katze <strong>de</strong>finiert wer<strong>de</strong>n. "lebensZahl"<br />

ist dann für alle Metho<strong>de</strong>n ("privilegierte" Metho<strong>de</strong>n, im Beispiel toeten) und inneren Funktionen <strong>de</strong>r erzeugen<strong>de</strong>n<br />

Funktion ("private Metho<strong>de</strong>n", im Beispiel maunz) sichtbar, nicht jedoch von außen o<strong>de</strong>r von nachträglich an das<br />

Objekt gehängten Metho<strong>de</strong>n.<br />

Vererbung über Prototypen<br />

Vererbung kann in JavaScript durch Prototypen realisiert wer<strong>de</strong>n. Dies erfor<strong>de</strong>rt, dass <strong>de</strong>r prototype-Eigenschaft<br />

einer Konstruktor-Funktion ein als Prototyp dienen<strong>de</strong>s Objekt zugewiesen wird. Wenn mit <strong>de</strong>r Konstruktor-Funktion<br />

nun ein Objekt erzeugt wird, wird beim Zugriff auf eine nicht-existieren<strong>de</strong> Eigenschaft <strong>de</strong>s neuen Objekts die<br />

entsprechen<strong>de</strong> Eigenschaft <strong>de</strong>s Prototypen (wenn vorhan<strong>de</strong>n) zurückgegeben. Beispiel:<br />

var fisch = {<br />

};<br />

augen: 2<br />

var Mutantenfisch = function () {<br />

};<br />

this.augen = 3;<br />

Mutantenfisch.prototype = fisch;<br />

var blinky = new Mutantenfisch();<br />

alert(blinky.augen); // 3 - eigene Eigenschaft von blinky<br />

<strong>de</strong>lete blinky.augen; // blinkys eigene Eigenschaft wird gelöscht<br />

alert(blinky.augen); // 2 - blinky hat die Eigenschaft selbst nicht<br />

mehr, es schimmert die Eigenschaft <strong>de</strong>s Prototypen durch


JavaScript 79<br />

Um festzustellen, ob ein Objekt eine Eigenschaft selbst besitzt, o<strong>de</strong>r vom Prototypen geerbt hat, hat je<strong>de</strong>s Objekt<br />

(automatisch durch Vererbung von Object) die hasOwnProperty-Metho<strong>de</strong>:<br />

blinky.hasOwnProperty('augen'); // false<br />

Dialogmetho<strong>de</strong>n / Benutzereingaben<br />

Meistens erfolgt die Interaktion mit <strong>de</strong>m Benutzer über Än<strong>de</strong>rungen an Inhalten <strong>de</strong>s HTML-Dokuments,<br />

insbeson<strong>de</strong>re über Formulare im Dokument, dabei greift JavaScript über das DOM (Document Object Mo<strong>de</strong>l) auf<br />

die Elemente <strong>de</strong>s HTML-Dokuments zu. Außer<strong>de</strong>m stehen drei Metho<strong>de</strong>n <strong>de</strong>s Window-Objektes bereit: alert(),<br />

confirm() und prompt(); mit je<strong>de</strong>r einzelnen dieser Metho<strong>de</strong>n kann man <strong>de</strong>n Benutzer auffällig ansprechen bzw. zu<br />

einer Eingabe auffor<strong>de</strong>rn. Dafür zeigt eine solche Metho<strong>de</strong> ein modales Fenster an; modal be<strong>de</strong>utet, <strong>de</strong>r Benutzer<br />

muss dieses Fenster zunächst schließen, bevor er zum aufrufen<strong>de</strong>n Dokument zurückkehren kann.<br />

Alarmfenster:<br />

Zeigt einen Text in einem eigenen Meldungsfenster an. Beispiel:<br />

window.alert("Hello World");<br />

Bestätigungsfrage:<br />

Zeigt einen Dialog mit <strong>de</strong>n Schaltflächen „OK“ und „Abbrechen“ an. Zurückgegeben wird einer <strong>de</strong>r booleschen<br />

Werte true o<strong>de</strong>r false, je nach<strong>de</strong>m welche Schaltfläche <strong>de</strong>r Benutzer auswählt.<br />

var bestaetigt = window.confirm("Bitte bestätigen");<br />

Eingabeauffor<strong>de</strong>rung:<br />

Es wird ein Dialog zur Texteingabe angezeigt. Beispiel:<br />

var eingabe = window.prompt("Bitte geben Sie einen Text ein:", "");<br />

In einem fertigen Script sind diese Metho<strong>de</strong>n eher selten anzutreffen, während <strong>de</strong>r Script-Entwicklung hingegen<br />

wer<strong>de</strong>n sie gerne benutzt, um Fehler auszumachen, um mit geringem Aufwand einen Variablenwert zu prüfen o<strong>de</strong>r<br />

um festzustellen, ob eine bestimmte Stelle im Script überhaupt erreicht wird.<br />

Fehlerbehandlung<br />

Die neueren Versionen von ECMAScript, wie sie im Internet Explorer 5 und Netscape Navigator 6 eingebaut sind,<br />

verfügen über eine von Java übernommene Anweisung try … catch zur Fehlerbehandlung.<br />

Die Anweisung try … catch … finally fängt Ausnahmen (exceptions), die aufgrund eines Fehlers o<strong>de</strong>r einer<br />

throw-Anweisung auftreten, ab. Die Syntax ist wie folgt:<br />

try {<br />

// Anweisungen, in <strong>de</strong>nen Ausnahmen auftreten o<strong>de</strong>r ausgelöst<br />

wer<strong>de</strong>n können<br />

} catch (exception) {<br />

} finally {<br />

wird.<br />

}<br />

…<br />

// Anweisungsfolge, die im Ausnahmefall ausgeführt wird.<br />

// In diesem Teil kann die Fehlerbehandlung erfolgen.<br />

// Anweisungsfolge, die anschließend in je<strong>de</strong>m Fall ausgeführt<br />

throw("sample exception");


JavaScript 80<br />

Zu Beginn wer<strong>de</strong>n die Anweisungen im try-Block ausgeführt. Falls eine Ausnahme auftritt, wird <strong>de</strong>r Kontrollfluss<br />

sofort zum catch-Block mit <strong>de</strong>m Ausnahmeobjekt als Parameter umgeleitet.<br />

Im Normalfall wird <strong>de</strong>r Ausnahmeblock übersprungen. Nach <strong>de</strong>r Ausführung <strong>de</strong>s try-Blocks (auch teilweise) und<br />

gegebenenfalls <strong>de</strong>s catch-Blocks wer<strong>de</strong>n in je<strong>de</strong>m Fall die Anweisungen im finally-Block ausgeführt. Der<br />

finally-Teil kann weggelassen wer<strong>de</strong>n, alternativ <strong>de</strong>r catch-Teil.<br />

JavaScript-Bibliotheken<br />

Für die Erstellung von browserübergreifen<strong>de</strong>n Webanwendungen mit Hilfe von JavaScript stehen<br />

JavaScript-Bibliotheken, sogenannte Toolkits bereit. Es han<strong>de</strong>lt sich dabei um eine Sammlung von<br />

JavaScript-Funktionen, die <strong>de</strong>n JavaScript-Programmierer in seiner Arbeit unterstützen sollen. Toolkits, die nicht nur<br />

häufig benutzte Standardfunktionen zur Verfügung stellen, son<strong>de</strong>rn durch ein beson<strong>de</strong>res Maß an Abstraktion eine<br />

grundlegend an<strong>de</strong>re Programmierung nach sich ziehen, wer<strong>de</strong>n auch Frameworks genannt.<br />

Ausgelöst von neuen Konzepten wie Ajax entstand seit 2004 ein neues Interesse für JavaScript. JavaScript wird<br />

zunehmend für Rich-Client-Anwendungen benutzt, die das Aussehen und die Bedienung von herkömmlichen<br />

Desktop-Programmen auf Web-gestützte Anwendungen übertragen. JavaScript spielt dabei eine Schlüsselrolle. Im<br />

Zuge dieser neuen Anfor<strong>de</strong>rungen entstan<strong>de</strong>n verschie<strong>de</strong>ne Bibliotheken, die die Entwicklung solcher Anwendungen<br />

vereinfachen wollen. Neben Ajax-Funktionalitäten bieten die meisten dieser Bibliotheken eine eigene Basis für<br />

objektorientierte Programmierung, eine Abstraktionsschicht für das komfortable Arbeiten mit <strong>de</strong>m DOM sowie<br />

grafische Effekte wie Animationen. Aber auch schon vor <strong>de</strong>m breiten Einsatz von Ajax existierten<br />

Funktionssammlungen zur Unterstützung <strong>de</strong>r browserübergreifen<strong>de</strong>n Programmierung.<br />

Zu <strong>de</strong>n bekannten JavaScript-Bibliotheken und Frameworks zählen Dojo Toolkit, Ext JS, jQuery, MooTools,<br />

Prototype, Qooxdoo und die Yahoo! UI Library. Speziell mit grafischen Effekten beschäftigen sich Moo.fx und<br />

Script.aculo.us.<br />

Einige JavaScript-Projekte implementieren eigene o<strong>de</strong>r bereits existente an<strong>de</strong>re Sprachen, um die<br />

Ausdrucksmöglichkeiten von Javascript zu erweitern, in an<strong>de</strong>ren Sprachen geschriebene Skripte im Browser<br />

ausführen zu können, o<strong>de</strong>r einfach zur Unterhaltung o<strong>de</strong>r als Demonstration. Auch für JavaScript selbst existiert ein<br />

in JS geschriebener Interpreter, Narcissus.<br />

Mit CommonJS existiert ein Projekt, dass sich <strong>de</strong>m Ziel widmet eine Standardbibliothek für<br />

Anwendungsentwicklung mit Javascript zu spezifizieren. [8] Es gibt bereits eine erste Version <strong>de</strong>r Spezifikation und<br />

mehrere Implementierungen [9] .<br />

Literatur<br />

• Mark Lubkowitz: Webseiten programmieren und gestalten – HTML, CSS, JavaScript, PHP, Perl, MySQL, SVG.<br />

2. Auflage, Galileo Press, Bonn 2005, ISBN 3-89842-557-6<br />

• Ralph Steyer: JavaScript. Einstieg für Anspruchsvolle. Addison-Wesley, München 2006, ISBN 3-8273-2466-1<br />

• David Flanagan: JavaScript – das umfassen<strong>de</strong> Referenzwerk. 3. Auflage. O’Reilly, Köln 2007, ISBN<br />

3-89721-491-1<br />

• Michael Seeboerger-Weichselbaum: Das Einsteigerseminar JavaScript. 4. Auflage. bhv, Bonn 2007, ISBN<br />

3-8266-7472-3<br />

• Ralph Steyer: Das JavaScript Co<strong>de</strong>book. Addison-Wesley, München 2008, ISBN 3-8273-2717-2<br />

• Douglas Crockford: Das Beste an JavaScript. O’Reilly, Köln 2008, ISBN 3-8972-1876-3<br />

• Christian Wenz: JavaScript und AJAX. Das umfassen<strong>de</strong> Handbuch. 9. Auflage. Galileo Press, Bonn 2009, ISBN<br />

3-89842-859-1<br />

• Stefan Koch: JavaScript – Einführung, Programmierung, Referenz. 5. Auflage. dpunkt.verlag, Hei<strong>de</strong>lberg 2009,<br />

ISBN 3-89864-395-6


JavaScript 81<br />

Siehe auch<br />

• ActionScript – Bezeichnung für eine JavaScript-ähnliche Skriptsprache in Flash und Macromedia Director, wo es<br />

alternativ zu Lingo verwen<strong>de</strong>t wer<strong>de</strong>n kann<br />

• Aktive Inhalte<br />

• Bookmarklet – kleine JavaScript-Programme im Browser<br />

• JavaScript Object Notation (JSON)<br />

Weblinks<br />

• Links zum Thema JavaScript [10] im Open Directory Project<br />

• JavaScript - Geschichte, Struktur, Eigenschaften und die Zukunft <strong>de</strong>r wichtigsten <strong>Programmiersprache</strong> <strong>de</strong>s Webs.<br />

[11] In: Chaosradio Express. 13. Februar 2010, abgerufen am 27. Februar 2010 (MP3, 97,5 MB).<br />

Spezifikationen<br />

• ISO-genormte ECMAScript-Spezifikation (ISO/IEC 16262:2002) [12] (Englisch/Französisch)<br />

• ECMAScript-Spezifikation [6] (Englisch, PDF) (HTML-Version [13] )<br />

• Netscape JavaScript 1.3: Spezifikation von Mozilla [14] (Englisch)<br />

• JavaScript 1.5: Spezifikation/Referenz von Mozilla [15] (Englisch)<br />

• Übersicht über die Neuerungen in JavaScript 1.6 von Mozilla [16] (Englisch)<br />

• Übersicht über die Neuerungen in JavaScript 1.7 von Mozilla [17] (Englisch)<br />

• Übersicht über die Neuerungen in JavaScript 1.8 von Mozilla [18] (Englisch)<br />

Dokumentationen<br />

• JavaScript-Kapitel bei SELFHTML [19]<br />

• JavaScript und AJAX [20] (Online-Fassung von Christian Wenz: JavaScript und AJAX. Das umfassen<strong>de</strong><br />

Handbuch. Galileo Press, Bonn 2006, ISBN 3-89842-859-1)<br />

• Eloquent JavaScript [21] (Freiverfügbares E-Book)<br />

Referenzen<br />

[1] Brendan Eich: JavaScript at Ten Years (http:/ / www. mozilla. org/ js/ language/ ICFP-Keynote. ppt), 2005.<br />

[2] Sun Tra<strong>de</strong>marks (http:/ / www. sun. com/ suntra<strong>de</strong>marks/ )<br />

[3] Pressemitteilung von Sun zum Erscheinen <strong>de</strong>r JRE 6.0 (http:/ / <strong>de</strong>. sun. com/ company/ press-releases/ 2006/ pm_20061211. html), 11.<br />

Dezember 2006.<br />

[4] John Resig. Versions of JavaScript (http:/ / ejohn. org/ blog/ versions-of-javascript). Ejohn.org. Abgerufen am 19. Mai 2009.<br />

[5] MDC: ECMAScript DontEnum attribute (https:/ / <strong>de</strong>veloper. mozilla. org/ En/ ECMAScript_DontEnum_attribute)<br />

[6] MDC: for each...in (https:/ / <strong>de</strong>veloper. mozilla. org/ en/ docs/ Core_JavaScript_1. 5_Reference:Statements:for_each. . . in)<br />

[7] siehe auch: named function expressions <strong>de</strong>mystified (http:/ / yura. thinkweb2. com/ named-function-expressions/ )<br />

[8] http:/ / www. commonjs. org<br />

[9] http:/ / wiki. commonjs. org/ wiki/ CommonJS#Implementations<br />

[10] http:/ / www. dmoz. org/ World/ Deutsch/ Computer/ Programmieren/ Internet/ JavaScript/<br />

[11] http:/ / chaosradio. ccc. <strong>de</strong>/ cre146. html<br />

[12] http:/ / standards. iso. org/ ittf/ PubliclyAvailableStandards/ c033835_ISO_IEC_16262_2002(E). zip<br />

[13] http:/ / bclary. com/ 2004/ 11/ 07/ ecma-262. html<br />

[14] http:/ / <strong>de</strong>vedge-temp. mozilla. org/ library/ manuals/ 2000/ javascript/ 1. 3/ reference/<br />

[15] https:/ / <strong>de</strong>veloper. mozilla. org/ en/ docs/ Core_JavaScript_1. 5_Reference<br />

[16] https:/ / <strong>de</strong>veloper. mozilla. org/ en/ docs/ New_in_JavaScript_1. 6<br />

[17] https:/ / <strong>de</strong>veloper. mozilla. org/ en/ docs/ New_in_JavaScript_1. 7<br />

[18] https:/ / <strong>de</strong>veloper. mozilla. org/ en/ docs/ New_in_JavaScript_1. 8<br />

[19] http:/ / <strong>de</strong>. selfhtml. org/ javascript/<br />

[20] http:/ / www. galileocomputing. <strong>de</strong>/ openbook/ javascript_ajax/


JavaScript 82<br />

[21] http:/ / eloquentjavascript. net/<br />

Lua<br />

Lua (portugiesisch für Mond) ist eine imperative und erweiterbare Skriptsprache zum Einbin<strong>de</strong>n in Programme, um<br />

diese leichter weiterentwickeln und warten zu können. Eine <strong>de</strong>r beson<strong>de</strong>ren Eigenschaften von Lua ist die geringe<br />

Größe <strong>de</strong>s kompilierten Skript-Interpreters.<br />

Lua wur<strong>de</strong> 1993 von <strong>de</strong>r Computer Graphics Technology Group <strong>de</strong>r Päpstlichen Katholischen Universität von Rio<br />

<strong>de</strong> Janeiro in Brasilien entwickelt. Lua ist freie Software, und wur<strong>de</strong> bis zur Version 4 unter einer eigenen<br />

BSD-Lizenz, ab Version 5 unter <strong>de</strong>r MIT-Lizenz veröffentlicht.<br />

Lua-Programme sind meist plattformunabhängig und wer<strong>de</strong>n vor <strong>de</strong>r Ausführung in Byteco<strong>de</strong> übersetzt. Obwohl<br />

man mit Lua auch eigenständige Programme schreiben kann, ist sie vorrangig als Skriptsprache für an<strong>de</strong>re<br />

Programme, wie z. B. für C-Programme, konzipiert. In dieser Hinsicht ist sie mit Tcl vergleichbar. Insbeson<strong>de</strong>re die<br />

geringe Größe von 120 KB, die Erweiterbarkeit und die hohe Geschwindigkeit verglichen mit an<strong>de</strong>ren<br />

Skriptsprachen überzeugen viele Entwickler davon, Lua einzusetzen.<br />

Der Lua-Interpreter kann über eine C-Bibliothek angesprochen wer<strong>de</strong>n, die auch ein API für die Laufzeitumgebung<br />

<strong>de</strong>s Interpreters für Aufrufe vom C-Programm aus beinhaltet. Mittels <strong>de</strong>s API können verschie<strong>de</strong>ne Teile <strong>de</strong>s<br />

Programmes in C und Lua geschrieben wer<strong>de</strong>n, während Variablen und Funktionen in bei<strong>de</strong>n Richtungen erreichbar<br />

bleiben (d. h. eine Funktion in Lua kann eine Funktion in C aufrufen, und umgekehrt).<br />

Es gibt auch einen freien JIT-Compiler für die neueste Version (5.1) von Lua namens LuaJIT.<br />

Lua ist in ANSI-C implementiert und unterstützt imperative und funktionale Programmierung. Implementiert [1] man<br />

jedoch selbst Objekte mittels Metatables, wird auch objektorientierte Programmierung ermöglicht.<br />

Beispielprogramme in Lua<br />

Hallo Welt:<br />

print "Hello World"<br />

Beispiel für eine Rekursion:<br />

function factorial(n)<br />

end<br />

if n == 0 then<br />

else<br />

end<br />

return 1<br />

return n * factorial(n - 1)<br />

Befehle in Lua können – müssen aber nicht – am En<strong>de</strong> einer Zeile mit einem Semikolon abgeschlossen wer<strong>de</strong>n.<br />

Die Syntax lehnt sich an die von Pascal an, was beson<strong>de</strong>rs Anfängern <strong>de</strong>n Einstieg in Lua erleichtert. Im Gegensatz<br />

zu von Pascal abgeleiteten Sprachen nutzt Lua jedoch „==“ und nicht „=“ als Vergleichsoperator.


Lua 83<br />

Verwendung<br />

Lua kann sowohl zur Erstellung eigenständiger Programme verwen<strong>de</strong>t wer<strong>de</strong>n als auch als eingebettete Sprache<br />

dienen.<br />

Es erfreut sich beson<strong>de</strong>rer Beliebtheit bei Computerspielprogrammierern: Um einzelne Komponenten eines<br />

Computerspiels, wie z. B. Konfigurationsdateien o<strong>de</strong>r die KI von computergesteuerten Charaktern o<strong>de</strong>r Gegnern,<br />

von <strong>de</strong>r Spiel-Engine zu trennen, kommt Lua in dieser Branche oft zum Einsatz. Dies macht die meist teuer<br />

entwickelte Spiel-Engine flexibler und ermöglicht eine mit geringerem Aufwand verbun<strong>de</strong>ne Wie<strong>de</strong>rverwendbarkeit.<br />

Daher wird Lua im Bereich proprietärer Spiele verwen<strong>de</strong>t, beispielsweise in:<br />

• Far Cry, Far Cry 2, Crysis, Crysis Warhead,<br />

• World of Warcraft,<br />

• Empire: Total War,<br />

• Dawn of War<br />

• Freelancer<br />

• Garrys Mod<br />

• Blitzkrieg<br />

Anwendung fin<strong>de</strong>t Lua ebenfalls in Desktopanwendungen, wie etwa Adobe Photoshop Lightroom [2] o<strong>de</strong>r Anime<br />

Studio. Auch das freie Textsatzprogramm TeX integriert im neuen Ableger LuaTeX Lua als Skriptsprache. Der<br />

Boot-Manager GRUB2 bietet Lua als Ergänzung zu <strong>de</strong>ssen Shell-ähnlicher Skriptsprache. Die<br />

Apache-Application-Firewall unterstützt mit <strong>de</strong>m Modul Mod Security ebenfalls Lua. Wireshark Packet Sniffer<br />

erlaubt dissector plugins in Lua zu schreiben. Die Firmware-Erweiterung CHDK erlaubt <strong>de</strong>n Einsatz von<br />

Lua-Skripten auf Canon Digitalkameras. Außer<strong>de</strong>m fin<strong>de</strong>t Lua Verwendung als Konfigurationssprache für die<br />

Windowmanager Awesome und Ion.<br />

Literatur<br />

• Roberto Ierusalimschy: Programmieren mit Lua, September 2006, ISBN 3-937514-22-8<br />

• Roberto Ierusalimschy: Lua 5.1 Reference Manual, August 2006, ISBN 85-903798-3-3<br />

• Kurt Jung, Aaron Brown: Beginning Lua Programming, 2007, ISBN 0-470-06917-1<br />

• Paul Schuytema, Mark Manyen: Game Development with Lua, 2005, ISBN 1-58450-404-8<br />

Weblinks<br />

• http:/ / www. lua. org - Offizielle Homepage (auf Englisch und Portugiesisch)<br />

• Links zum Thema Lua [3] im Open Directory Project<br />

Referenzen<br />

[1] Ein Beispiel für die Definition einer Klasse und die Ableitung von Objekten daraus ist inequality-1.4.0 (http:/ / luaforge. net/ frs/<br />

?group_id=49& release_id=767) (Anwendung: Berechnung von Ungleichverteilungsmaßen für die Wirtschafts- und Sozialwissenschaften).<br />

Das Programm ist sowohl in Lua wie auch in Python implementiert und ermöglicht dadurch einen Vergleich.<br />

[2] Einsatz von Lua in Lightroom: (http:/ / www. sauria. com/ blog/ 2008/ 10/ 09/ lua-in-lightroom/ )<br />

[3] http:/ / www. dmoz. org/ World/ Deutsch/ Computer/ Programmieren/ Sprachen/ Lua/


Objective-C 84<br />

Objective- C<br />

Objective-C, auch kurz ObjC genannt, erweitert die <strong>Programmiersprache</strong> C um Sprachmittel zur objektorientierten<br />

Programmierung. Objective-C++ erlaubt teilweise die Mischung von Objective-C mit C++-Co<strong>de</strong> mit <strong>de</strong>m Ziel,<br />

älteren Co<strong>de</strong> verwen<strong>de</strong>n zu können. Objective-C ist die primäre Sprache von Cocoa (Mac OS X) und GNUstep.<br />

Die Syntax und Konzeption <strong>de</strong>r objektorientierten Erweiterungen ist an Smalltalk angelehnt und von <strong>de</strong>r<br />

gewöhnlichen prozeduralen C-Syntax strikt getrennt. Diese Trennung erlaubt es, das gleiche Konzept zur<br />

Erweiterung auf an<strong>de</strong>re imperative Sprachen anzuwen<strong>de</strong>n; so gibt es z. B. ebenfalls Objective Pascal und<br />

Objective-J.<br />

Geschichte<br />

Objective-C wur<strong>de</strong> hauptsächlich von Brad Cox und Tom Love in <strong>de</strong>n 80er Jahren bei PPI, später Stepstone,<br />

entwickelt, später dann von NeXT in die GNU Compiler Collection integriert, um als Basis für NextStep zu dienen.<br />

Wesentliche Eigenschaften<br />

Einer <strong>de</strong>r Design-Gedanken von Objective-C war es, die Flexibilität von Smalltalk anzunähern, jedoch auf das zu<br />

verzichten, was das Laufzeitverhalten verschlechtern könnte. Der offensichtlichste Verzicht gegenüber Smalltalk ist<br />

das Fehlen von Blöcken. Daher ist ein Objective-C-Programm bereits zur Übersetzungszeit vollständig compilierbar.<br />

Viele Konzepte sind gar nicht in <strong>de</strong>r Sprach<strong>de</strong>finition selbst festgelegt, son<strong>de</strong>rn wer<strong>de</strong>n erst durch das Framework,<br />

also etwa Cocoa o<strong>de</strong>r GNUStep ermöglicht. Insbeson<strong>de</strong>re ist das gesamte Laufzeitsystem nicht im Compiler<br />

implementiert, son<strong>de</strong>rn besteht aus C-Funktionen. Bei Aufruf einer Member-Funktion in C++ etwa, fügt<br />

grundsätzlich <strong>de</strong>r Compiler <strong>de</strong>n entsprechen<strong>de</strong>n Co<strong>de</strong> ein, während in Objective-C (bei Versen<strong>de</strong>n einer Nachricht<br />

an ein Objekt, dazu später mehr) die C-Funktion objc_msg_send() aufgerufen wird. Daher ist eine Darstellung ohne<br />

das entsprechen<strong>de</strong> Laufzeitsystem kaum <strong>de</strong>nkbar und nicht sinnvoll. Originäre Objective-C-Schlüsselwörter erkennt<br />

man in<strong>de</strong>ssen an <strong>de</strong>m vorangestellten @.<br />

Spätes Bin<strong>de</strong>n<br />

Die wohl gera<strong>de</strong> gegenüber C++-Programmen bemerkenswerteste Eigenschaft ist das späte Bin<strong>de</strong>n von Metho<strong>de</strong>n.<br />

Polymorphie ist im Gegensatz zu Sprachen, die auf Simula-67 basieren, nicht nur innerhalb einer Klassenhierarchie<br />

möglich, son<strong>de</strong>rn auch darüber hinaus. Eine Metho<strong>de</strong> mit einem bestimmten Namen (Selector) kann von Objekten<br />

je<strong>de</strong>r Klasse ausgeführt wer<strong>de</strong>n, die sie implementieren. Es ist nicht erfor<strong>de</strong>rlich, dass <strong>de</strong>r Aufrufer die Klasse kennt<br />

o<strong>de</strong>r die Metho<strong>de</strong>n bereits in einer Basisklasse – wenn auch nur virtuell – <strong>de</strong>finiert wor<strong>de</strong>n sind.<br />

@interface KlasseA : NSObject {<br />

}<br />

// Instanzvariablen<br />

…<br />

- (void) doSomething; // Eine neue Metho<strong>de</strong> in <strong>de</strong>r Subklasse<br />

- (void) dumpToLog; // Noch eine<br />

@end<br />

@interface KlasseB : NSObject {<br />

}<br />

// Instanzvariablen<br />


Objective-C 85<br />

- (void) dumpToLog; // Es wird nur die zweite Metho<strong>de</strong> implementiert.<br />

@end<br />

id anObject = … // irgen<strong>de</strong>ine Instanz <strong>de</strong>r Klasse A o<strong>de</strong>r B.<br />

[anObject dumpToLog];<br />

// Obwohl bei<strong>de</strong> Implementierungen unabhängig sind und<br />

// keine entsprechen<strong>de</strong> Metho<strong>de</strong> in <strong>de</strong>r Basisklasse NSObject<br />

// existiert, wird die Metho<strong>de</strong> jeweils sicher gefun<strong>de</strong>n.<br />

Nachrichten, die an super (Hier: NSObject) geschickt wer<strong>de</strong>n, unterliegen allerdings nicht <strong>de</strong>m Dispatching, so dass<br />

sie bereits zur Übersetzungszeit vom Compiler <strong>de</strong>r Superklasse zugeordnet wer<strong>de</strong>n:<br />

- (id)init {<br />

}<br />

self = [super init]; // Ruft stets die Metho<strong>de</strong> <strong>de</strong>r Superklasse auf<br />

…<br />

Dynamische Typisierung und typloses id<br />

Es ist daher für <strong>de</strong>n Absen<strong>de</strong>r nicht notwendig, die Klasse <strong>de</strong>s Empfängers zu kennen. Vielmehr existiert wie im<br />

obigen Co<strong>de</strong> erkennbar ein Typ id, <strong>de</strong>r für je<strong>de</strong>s Objekt je<strong>de</strong>r Klasse stehen kann. Dabei sei aber erwähnt, dass zwar<br />

<strong>de</strong>r Zeiger auf ein Instanzobjekt nicht typisiert ist, um spätes Bin<strong>de</strong>n zu ermöglichen. Die einzelnen Instanzen sind<br />

stets typisiert, gehören also genau einer Klasse an. Objective-C typisiert also streng, jedoch dynamisch.<br />

Nachrichten<br />

Dies bedingt in Objective-C die strikte Trennung von Nachrichten und Metho<strong>de</strong>n. Man spricht daher eigentlich in<br />

Objective-C gar nicht von Metho<strong>de</strong>naufrufen. Vielmehr gibt es einen Nachrichtensen<strong>de</strong>r (Sen<strong>de</strong>r) und einen<br />

Nachrichtenempfänger (Receiver). Alleine <strong>de</strong>r Receiver entschei<strong>de</strong>t anhand <strong>de</strong>r Nachricht, welche Metho<strong>de</strong><br />

ausgeführt wird. Dabei wird zunächst versucht, eine gleichnamige Metho<strong>de</strong> zu fin<strong>de</strong>n. Es existiert dazu<br />

korrespondierend ein Datentyp SEL (Selector), <strong>de</strong>r einen Nachrichtennamen abbil<strong>de</strong>t. Zur vollständigen Nachricht<br />

fehlen dann noch die Parameter und <strong>de</strong>r Empfänger.<br />

SEL nachricht = @selector( dumpToLog );<br />

id anObject = …<br />

[anObject performSelector: nachricht];<br />

Es ist darüber hinaus möglich, Nachrichtennamen erst zur Laufzeit zu erstellen.<br />

// Ein Text, <strong>de</strong>r <strong>de</strong>n Namen einer 1:n-Beziehung enthält.<br />

NSString *relationship = @"Children";<br />

// Mittels String-Verarbeitung bauen wir uns zur Laufzeit daraus einen<br />

Nachrichtentext<br />

NSString *messageText = [NSString stringWithFormat: @"countOf%@",<br />

relationship];<br />

// Das wird jetzt in eine Nachricht umgewan<strong>de</strong>lt<br />

SEL message = NSSelectorFromString( messageText );


Objective-C 86<br />

// Der Empfänger führt die entsprechen<strong>de</strong> Metho<strong>de</strong> aus:<br />

int countOfInstancesInRelationship = [receiver performSelector:<br />

message];<br />

Kompliziertere Nachrichten, insbeson<strong>de</strong>re mit zahlreichen Argumenten, wer<strong>de</strong>n als Instanzen <strong>de</strong>r Klasse<br />

NSInvocation abgebil<strong>de</strong>t.<br />

Hieraus ergibt sich die Möglichkeit, in einer IDE ganze Objektgraphen und Bedienungsoberflächen zu gestalten und<br />

zu verbin<strong>de</strong>n, ohne dass die Eingabe von Sourceco<strong>de</strong> durch <strong>de</strong>n Programmierer o<strong>de</strong>r durch die IDE selbst<br />

erfor<strong>de</strong>rlich ist. Umgekehrt han<strong>de</strong>lt es sich aber um das „normale“ Vorgehen <strong>de</strong>s Dispatchers, sodass kein Aufsatz<br />

hierfür erfor<strong>de</strong>rlich ist und <strong>de</strong>r Programmierer je<strong>de</strong>rzeit die Kontrolle über die Ausführung je<strong>de</strong>r Metho<strong>de</strong> behält<br />

(Beispielvi<strong>de</strong>o von Apple) [1] . In <strong>de</strong>r Realität entfällt damit ein Großteil <strong>de</strong>r Programmierarbeit.<br />

Kategorien<br />

Kategorien sind Erweiterungen bereits bestehen<strong>de</strong>r Klassen um weitere Metho<strong>de</strong>n. Hervorzuheben ist hierbei, dass<br />

die in <strong>de</strong>n Kategorien enthaltenen Metho<strong>de</strong>n auch Instanzen erweitern, die von frem<strong>de</strong>n Co<strong>de</strong> erzeugt wer<strong>de</strong>n. Dies<br />

gilt auch dann, wenn <strong>de</strong>r frem<strong>de</strong> Co<strong>de</strong> die Kategorie gar nicht kennt.<br />

Wir haben etwa eine Klasse NSNumber, die Zahlen darstellt. Dieser Klasse wollen wir eine Metho<strong>de</strong> hinzufügen, die<br />

eine neue Instanz nach Addition einer an<strong>de</strong>ren Instanz von NSNumber liefert. Also schreiben wir hierzu eine<br />

Kategorie:<br />

@interface NSNumber( CalculationAddition )<br />

- (NSNumber*)numberByAddingNumber:(NSNumber*)summand;<br />

…<br />

@end<br />

@implementation( CalculationAddition )<br />

- (NSNumber*)numberByAddingNumber:(NSNumber*)summand<br />

{<br />

}<br />

// Additionskram<br />

…<br />

@end<br />

return sum;<br />

Die in dieser Kategorie enthaltenen Metho<strong>de</strong>n können verwen<strong>de</strong>t wer<strong>de</strong>n, wenn die Kategorie im Sourceco<strong>de</strong><br />

bekannt ist in <strong>de</strong>m die Instanz erzeugt wird. Allerdings fällt hierbei bereits das Fehlen <strong>de</strong>r Subklasse auf:<br />

# import "NSNumberCalculationAddition.h"<br />

…<br />

// Wir erzeugen eine Instanz <strong>de</strong>r Basisklasse NSNumber!<br />

NSNumber* summand1 = [NSNumber numberWithInt:98];<br />

NSNumber* summand2 = [NSNumber numberWithInt:11];<br />

NSNumber* summe = [summand1 numberByAddingNumber:summand2];<br />

Dies liegt darin begrün<strong>de</strong>t, dass bereits die Basisklasse selbst um die neuen Metho<strong>de</strong> erweitert wird, Ableitung also<br />

nicht notwendig ist.<br />

Darüber hinaus verhält es sich jedoch so, dass diese Kategorie auch Instanzen hinzugefügt wird, die aus<br />

bestehen<strong>de</strong>m Co<strong>de</strong> stammen und daher unsere nachträglich hinzugefügte Kategorie gar nicht kennt! Wird also etwa<br />

in einem Framework, welches vor Jahren entwickelt wur<strong>de</strong> und <strong>de</strong>ssen Sourceco<strong>de</strong> uns gar nicht vorliegt, eine


Objective-C 87<br />

Instanz von NSNumber erzeugt, so hat diese ebenfalls die vorgenannte Metho<strong>de</strong>. Damit ist es möglich, vollständig<br />

frem<strong>de</strong>n Klassen Metho<strong>de</strong>n hinzuzufügen.<br />

Protokolle<br />

Ähnlich wie in Java mit Interfaces lassen sich in Objective-C Sätze von Metho<strong>de</strong>n in Protokollen zusammenfassen:<br />

@protocol MyDelegateProtocol<br />

// Instanzen <strong>de</strong>r Klasse FileSystemGuard verschicken diese Nachricht<br />

an Delegates<br />

- (void) fileSystemGuard: (FileSystemGuard *) guard <strong>de</strong>tectedMount:<br />

(NSString *) mountPath;<br />

@end<br />

RTTI/Reflexion<br />

Zur Laufzeit wird zu je<strong>de</strong>m Objekt ein Verweis auf seinen Typen, also die Klasse mitgeführt. Die Klasse enthält<br />

darüber hinaus eine Beschreibung aller Instanzvariablen und implementierten Metho<strong>de</strong>n. Hieran entschei<strong>de</strong>t <strong>de</strong>r<br />

Dispatcher im Receiver, welche Metho<strong>de</strong> er <strong>de</strong>r Nachricht zuordnet. Umgekehrt kann <strong>de</strong>r Absen<strong>de</strong>r erfragen, welche<br />

Metho<strong>de</strong>n implementiert sind.<br />

// Eine Metho<strong>de</strong>, welche Nachrichten <strong>de</strong>s GUI implementiert<br />

- (IBAction) doSomething: (id) sen<strong>de</strong>r {<br />

}<br />

// Klassenabfrage: RTTI<br />

if ([sen<strong>de</strong>r isKindOfClass: [NSButton class]]) {<br />

}<br />

// Es han<strong>de</strong>lte sich um eine Instanz <strong>de</strong>r Klasse NSButton<br />

[self doSomethingElseWithInt: [sen<strong>de</strong>r tag]];<br />

// Metho<strong>de</strong>nabfrage: Reflexion<br />

if ([sen<strong>de</strong>r respondsToSelector: @selector( tag )]) {<br />

}<br />

…<br />

- (void) setDelegate: (id) <strong>de</strong>legate {<br />

// Nur Delegates akzeptieren, die ein Min<strong>de</strong>stmaß an Metho<strong>de</strong>n<br />

implementieren. Der Metho<strong>de</strong>nsatz ist<br />

)]) {<br />

}<br />

// im Protokoll MyDelegateProtocol angegeben.<br />

if (![<strong>de</strong>legate conformsToProtocol: @protocol( MyDelegateProtocol<br />

}<br />


Objective-C 88<br />

Klassenobjekte<br />

In Objective-C existieren nicht nur Instanzobjekte (kurz: Instanzen), son<strong>de</strong>rn auch Klassenobjekte. Die Bezeichnung<br />

„Exemplar einer Klasse“ ist daher in Objective-C mehr<strong>de</strong>utig. Klassenobjekte können jedoch keine<br />

Member-Variablen enthalten und sind stets Singletons. Klassenmetho<strong>de</strong>n wer<strong>de</strong>n durch ein vorangestelltes +<br />

gekennzeichnet. Da es sich um Objekte han<strong>de</strong>lt, können diese zugewiesen wer<strong>de</strong>n. Sie haben selbst <strong>de</strong>n Typen Class.<br />

Es existiert eine Instanzmetho<strong>de</strong> -class und eine Klassenmetho<strong>de</strong> +class, um das Klassenobjekt zu erhalten.<br />

// Eine Variable, die eine Klasse speichert<br />

Class aShapeClass;<br />

…<br />

// Es können Klassenobjekte zugewiesen wer<strong>de</strong>n:<br />

- (void) setShapeClass: (Class) newShapeClass {<br />

}<br />

aShapeClass = newShapeClass;<br />

- (void) addNewShape {<br />

id shape = [[aShapeClass alloc] init]; // Erzeugung einer Instanz<br />

<strong>de</strong>r Klasse Shape<br />

}<br />

[shape markForRedraw];<br />

[arrayWithAllShapes addObject: shape];<br />

…<br />

Bemerkenswert ist in diesem Zusammenhang die Eigenschaft, dass es für diese Klassenobjekte einen self-Zeiger<br />

gibt, <strong>de</strong>r <strong>de</strong>r Polymorphie zugänglich ist:<br />

@interface Shape : NSObject {<br />

}<br />

+ (NSRect) boundingRectForShapeRect: (NSRect) shapeRect<br />

@end<br />

@interface Circle : Shape {<br />

}<br />

@end<br />

@implementation Circle;<br />

// Überschreiben einer Klassenmetho<strong>de</strong> <strong>de</strong>r Basisklasse<br />

+ (NSRect) boundingRectForShapeRect: (NSRect) shapeRect {<br />

}<br />

// Subklassenmetho<strong>de</strong><br />

// Es existiert ein self-Zeiger, <strong>de</strong>r auf Circle o<strong>de</strong>r eine Subklasse<br />

von Circle zeigt.<br />

@end<br />

[self doSomething];<br />


Objective-C 89<br />

…<br />

NSRect boundingRect;<br />

// Nicht polymorpher Aufruf: Entspricht in etwa<br />

Shape::boundingRectForShapeRect() in C++<br />

boundingRect = [Shape boundingRectForShapeRect: aRect];<br />

Shape *aShape = … // Eine Instanz <strong>de</strong>r Klasse Shape o<strong>de</strong>r einer Subklasse<br />

wie Circle<br />

// Polymorpher Aufruf einer Klassenmetho<strong>de</strong><br />

[[aShape class] boundingRectForShapeRect: aRect]:<br />

…<br />

Syntax<br />

Die Syntax von Objective-C erweitert die C-Syntax um objektorientierte Elemente. Diese Syntaxerweiterungen<br />

lehnen sich jedoch nicht an die C-Syntax an, wie es etwa viele verbreitete objektorientierte <strong>Programmiersprache</strong>n<br />

tun, son<strong>de</strong>rn an die <strong>de</strong>r <strong>Programmiersprache</strong> Smalltalk. Der Hintergrund ist, dass <strong>de</strong>r objektorientierte Aufsatz sich<br />

grundsätzlich auch mit an<strong>de</strong>ren <strong>Programmiersprache</strong>n kombinieren lässt, etwa mit Pascal zu Objective-Pascal.<br />

Sämtliche neuen Schlüsselwörter sind mit einem voranstehen<strong>de</strong>m @ gekennzeichnet.<br />

Klassen<strong>de</strong>finition<br />

Um seine eigene Art von Objekten zu erstellen, muss man sie in einer Klasse beschreiben. Dazu wer<strong>de</strong>n im<br />

@interface-Teil – gewöhnlich in einer Hea<strong>de</strong>r-Datei – die Klasse. Hier im Beispiel eine Bruch-Klasse.<br />

// Klassenbezeichnung und Ableitung<br />

@interface Bruch : NSObject < Protokoll ><br />

// Instanzvariablen, für je<strong>de</strong> Instanz angelegt.<br />

{<br />

}<br />

NSInteger zaehler;<br />

NSInteger nenner;<br />

// Eigenschaften <strong>de</strong>r Instanzen<br />

@property( assign ) NSInteger zaehler;<br />

@property( assign ) NSInteger nenner;<br />

// Metho<strong>de</strong>n:<br />

- (void) printLn;<br />

- (float) floatValue;<br />

@end<br />

Im Einzelnen:


Objective-C 90<br />

Klassenbezeichnung und Vererbung<br />

@interface Bruch : NSObject < Protokoll ><br />

Je<strong>de</strong> Klasse hat einen Namen, <strong>de</strong>r konventionsgemäß mit einem Großbuchstaben beginnt und im Camel-Case<br />

(neueWoerterErhaltenWie<strong>de</strong>rEinenGroßbuchstaben) fortgeführt wird. Die Bezeichner folgen <strong>de</strong>n C-Regeln, dürfen<br />

also insbeson<strong>de</strong>re keine Umlaute enthalten. Durch einen Doppelpunkt getrennt wird sodann die Basisklasse<br />

angegeben. Schließlich können in spitzen Klammern Protokolle angegeben wer<strong>de</strong>n, <strong>de</strong>ren Implementierung<br />

versprochen wird. Han<strong>de</strong>lt es sich um mehrere Protokolle, so sind <strong>de</strong>ren Namen in <strong>de</strong>n Klammern mit Kommata<br />

getrennt aufzulisten.<br />

Instanzvariablen<br />

Es folgt in geschweiften Klammern die Liste <strong>de</strong>r Instanzvariablen.<br />

{<br />

}<br />

NSInteger zaehler;<br />

NSInteger nenner;<br />

Diese wer<strong>de</strong>n für je<strong>de</strong> Instanz angelegt. Die Sichtbarkeit lässt sich über Abschnitte mit @public, @private,<br />

@protected und @package (nur bei 64-Bit-Laufzeitsystem) steuern. @public be<strong>de</strong>utet hierbei, dass je<strong>de</strong>r auf diese<br />

Instanzvariable zugreifen darf, @protected, dass dies nur im Co<strong>de</strong> <strong>de</strong>rselben Klasse o<strong>de</strong>r abgeleiteten Klassen<br />

erfolgen darf, @private dass dies nur in <strong>de</strong>rselben Klasse erfolgen darf und @package, dass dies nur in Klassen <strong>de</strong>s<br />

Frameworks erfolgen darf. Standard ist @protected, welches wegen an<strong>de</strong>rer Technologien tatsächlich fast immer<br />

verwen<strong>de</strong>t wird. Daher enthalten die allermeisten Klassen<strong>de</strong>finitionen keines <strong>de</strong>r Schlüsselwörter zur Sichtbarkeit.<br />

Properties (Eigenschaften)<br />

Nach <strong>de</strong>n Instanzvariablen ist es seit Objective-C 2 möglich, Eigenschaften (Attribute o<strong>de</strong>r Beziehungen)<br />

aufzulisten. Die Definition einer Property hat die Form<br />

@property( Attributliste ) Typ name;<br />

Die Attribute lassen sich hinsichtlich <strong>de</strong>s Schreibschutzes, <strong>de</strong>s Referenzmo<strong>de</strong>lles und <strong>de</strong>r Atomarität unterschei<strong>de</strong>n.<br />

• Für <strong>de</strong>n Schreibschutz existieren die Attribute readonly und readwrite (Default)<br />

• Atomarität: mit nonatomic lässt sich zusätzlich erreichen, dass bei Übersetzung im Speichermo<strong>de</strong>ll<br />

Reference-Counting zusätzliche retain- und autorelease-Nachrichten an eine zurückgegebene Instanz gesen<strong>de</strong>t<br />

wer<strong>de</strong>n.<br />

• Die Referenzierung wird über die Wörter assign (Default) als reine Zuweisung im Setter auch dann, wenn <strong>de</strong>r Typ<br />

<strong>de</strong>r Property ein Instanzzeiger ist, retain als Referenz im Sinne <strong>de</strong>s Reference-Countings (<strong>de</strong>r Parameter erhält die<br />

Nachricht retain) und copy, wenn <strong>de</strong>r Setter eine Kopie anfertigen soll (<strong>de</strong>r Parameter erhält die Nachricht copy),<br />

beschreiben.<br />

Wer<strong>de</strong>n nur Default-Eigenschaften verwen<strong>de</strong>t, so kann die Attributliste samt Klammer weggelassen wer<strong>de</strong>n:<br />

@property NSInteger zaehler;<br />

Wird jedoch <strong>de</strong>r Co<strong>de</strong> mit Referenz-Counting als Speichermo<strong>de</strong>ll übersetzt und soll eine Eigenschaft mittels assign<br />

nur zugewiesen wer<strong>de</strong>n, so muss dies obwohl Default-Einstellung, explizit angegeben wer<strong>de</strong>n. Ansonsten erteilt <strong>de</strong>r<br />

Compiler eine Warnung. Es bietet sich generell an, bei Instanzenzeigern explizit das Referenzmo<strong>de</strong>ll anzugeben,<br />

während es bei C-Typen überflüssig ist, da nur assign sinnvoll ist.


Objective-C 91<br />

@property NSInteger zaehler; // NSInteger ist ein C-Typ<br />

@property( copy ) NSString* name; // NSString* ist ein Instanzzeiger.<br />

Metho<strong>de</strong>n<strong>de</strong>klarationen<br />

Als nächstes folgt eine Liste von Metho<strong>de</strong>n:<br />

- (void) printLn;<br />

- (float) floatValue;<br />

Je<strong>de</strong> einzelne Metho<strong>de</strong>n<strong>de</strong>klaration beginnt zunächst mit einem + (Klassenmetho<strong>de</strong>) o<strong>de</strong>r - (Instanzmetho<strong>de</strong>).<br />

Hiernach folgt in Klammern <strong>de</strong>r Typ <strong>de</strong>s Rückgabewertes, wobei wie in C void als Schlüsselwort für keinen<br />

Rückgabewert steht. Anschließend folgt <strong>de</strong>r Metho<strong>de</strong>nname, wobei wie<strong>de</strong>r die Regeln für C-Bezeichner gelten. Soll<br />

die Metho<strong>de</strong> einen Parameter enthalten, so folgt als Teil <strong>de</strong>s Bezeichners die äußere Beschreibung <strong>de</strong>s ersten<br />

Parameters, ein Doppelpunkt, in Klammern <strong>de</strong>r Typ und sodann ein Bezeichner. Folgen noch Parameter, so wer<strong>de</strong>n<br />

diese nach einem Leerzeichen wie<strong>de</strong>r mit einem beschreiben<strong>de</strong>n Namen versehen (<strong>de</strong>r auch 0 Zeichen haben kann),<br />

einem Doppelpunkt, in Klammern <strong>de</strong>r Typ und sodann ein Bezeichner:<br />

- (id)initWIthZaehler:(NSInteger)zaehler andNenner:(NSInteger)nenner;<br />

Abgeschlossen wird die Deklaration mit einem Semikolon.<br />

Die Klassen<strong>de</strong>finition wid mit @end abgeschlossen.<br />

Implementierung<br />

Die Implementierung erfolgt in einer weiteren Datei, die Standardmäßig auf .m en<strong>de</strong>t (Eselsbrücke: iMplementation<br />

o<strong>de</strong>r Module). Sie en<strong>de</strong>t mit einem @end. Dazwischen erfolgt die Implementierung <strong>de</strong>r Metho<strong>de</strong>n – gleichgültig, ob<br />

im Interface bekannt gemacht o<strong>de</strong>r nicht. Dabei sind Standardmetho<strong>de</strong>n und synthetisierte Metho<strong>de</strong>n (nur<br />

Objective-C 2) für Eigenschaften (siehe oben) zu unterschei<strong>de</strong>n, Einfache Metho<strong>de</strong>n entsprechen in ihrem Kopf <strong>de</strong>r<br />

Metho<strong>de</strong>n<strong>de</strong>klaration. Jedoch tritt an die Stelle <strong>de</strong>s Semikolons (<strong>de</strong>r jedoch optional bleibt, unüblich!) die<br />

Anweisungsliste in geschweiften Klammern:<br />

- (id)initWithZaehler:(NSInteger)zaehler andNenner:(NSInteger)nenner<br />

{<br />

}<br />

// Co<strong>de</strong> hier<br />

Es sei darauf hingewiesen, dass die Bezeichner <strong>de</strong>r formalen Parameter nicht <strong>de</strong>nen aus <strong>de</strong>r Metho<strong>de</strong>n<strong>de</strong>klaration<br />

entsprechen muss. Synthetisierte Metho<strong>de</strong>n sind die Accessoren für die Eigenschaften:<br />

@synthesize zaehler, nenner;<br />

Es wer<strong>de</strong>n dann Metho<strong>de</strong>n erzeugt, die die im Interface angegebenen Attribute befolgen. Standardmäßig verwen<strong>de</strong>t<br />

<strong>de</strong>r Compiler dabei gleichnamige Instanzvariablen. Dem Programmierer bleibt es aber vorbehalten, selbst diese<br />

Metho<strong>de</strong>n auszuformulieren, wobei diese <strong>de</strong>n Namen eigenschaft und setEigenschaft (nur bei readwrite) tragen<br />

müssen:<br />

- (NSInteger)zaehler { return zaehler; }<br />

- (void)setZaehler:(NSInteger)value { zaehler = value; )<br />

Eine weitere Möglichkeit besteht darin, dass man eine Eigenschaft mittels @dynamic bezeichnet. In diesem Falle<br />

überprüft <strong>de</strong>r Compiler nicht mehr das Vorhan<strong>de</strong>nsein in <strong>de</strong>r Implementierung. Man kann also die entsprechen<strong>de</strong>n<br />

Metho<strong>de</strong>n zur Laufzeit simulieren o<strong>de</strong>r selbst <strong>de</strong>r Klasse hinzufügen:<br />

@dynamic zaehler; // Accessormetho<strong>de</strong>n wer<strong>de</strong>n zur Laufzeit gehandhabt.


Objective-C 92<br />

Nachrichten<br />

Da Objective-C zwischen Nachricht und Metho<strong>de</strong> unterschei<strong>de</strong>t, wird für das Versen<strong>de</strong>n von Nachrichten keine an<br />

<strong>de</strong>n C-Funktionsaufruf angelehnte Syntax verwen<strong>de</strong>t. Vielmehr erfolgt <strong>de</strong>r Versand in <strong>de</strong>r Form:<br />

[Objekt Nachricht]<br />

Soll eine Nachricht an ein Klassenobjekt verschickt wer<strong>de</strong>n, damit eine Klassenmetho<strong>de</strong> ausgeführt wird, so schreibt<br />

man einfach die Klasse als Empfänger hin:<br />

Bruch* bruch = [Bruch alloc]; // +alloc ist Klassenmetho<strong>de</strong><br />

Bei Nachrichten an die Instanzmetho<strong>de</strong> wird <strong>de</strong>ren Zeiger verwen<strong>de</strong>t: [bruch initWithZaehler:3 andNenner:4]; Wie<br />

ersichtlich, wer<strong>de</strong>n dabei die Parameter eingesetzt und mittels Leerzeichen, nicht Komma, getrennt. Nachrichten<br />

können auch verschachtelt wer<strong>de</strong>n. Z. B.<br />

NSString *string = @"Hallo Welt";<br />

NSData *data = [NSData dataWithBytes:[string cString] length:[string<br />

cStringLength]];<br />

Hiermit wird ein neues Objekt <strong>de</strong>r Klasse NSData erstellt. Die Bytes, die in das neue Objekt kopiert wer<strong>de</strong>n, wer<strong>de</strong>n<br />

mit [string cString] erfragt, die Länge <strong>de</strong>s Blocks mit [string cStringLength].<br />

Es wer<strong>de</strong>n also die Rückgabewerte <strong>de</strong>r Metho<strong>de</strong>n verwen<strong>de</strong>t. Dies geht auch beim Empfänger, zum Beispiel :<br />

Bruch* bruch = [[Bruch alloc] init]<br />

Das Objekt, das mit [Klasse alloc] erzeugt wur<strong>de</strong>, bekommt die Botschaft init.<br />

Locking<br />

Objective-C bietet eine Syntax für Locks bei Threading an. Hierzu wird ein Co<strong>de</strong>-Abschnitt mit <strong>de</strong>m Schlüsselwort<br />

@synchronized eingeleitet, welches als Parameter ein Objekt als Lock erhält:<br />

@synchronized( anInstance ) {<br />

}<br />

// Exklusiver Co<strong>de</strong> für <strong>de</strong>n Lock anInstance<br />

Exceptions<br />

Exceptionhandling erfolgt in Objective-C mittels @try, @catch, @finally und @throw;<br />

@try {<br />

}<br />

// Co<strong>de</strong>, <strong>de</strong>r eine Exception auslösen könnte<br />

@catch( NSException* exception ) { // Klasse von Exceptions, die<br />

gefangen wer<strong>de</strong>n sollen<br />

}<br />

// Co<strong>de</strong>, wenn eine Exception auftrat<br />

@finally {<br />

}<br />

// Co<strong>de</strong>, <strong>de</strong>r in je<strong>de</strong>m Falle ausgeführt wird<br />

Geworfen wird eine Exception – unmittelbar mit Sprachmitteln – mittels <strong>de</strong>s Schlüsselwortes @throw; Durch<br />

Angaben verschie<strong>de</strong>ner Klassen kann man sowohl auf <strong>de</strong>rselben Ebene wie auch in Hierachien bestimmt wer<strong>de</strong>n,


Objective-C 93<br />

welcher Klasse eine Exception sein soll, die gefangen wird. Im @catch-Block kann die Exception erneut geworfen<br />

wer<strong>de</strong>n und wird dann von einem äußeren Exceptionhandler behan<strong>de</strong>lt.<br />

Klassenobjekte<br />

Objective-C besitzt so genannte Klassenobjekte. Dies be<strong>de</strong>utet: Nicht nur die Instanzen, son<strong>de</strong>rn auch die Klassen<br />

sind Objekte und können Nachrichten empfangen, wie oben [Klasse alloc]. – Zum Instanzieren sind damit keine<br />

zusätzlichen Sprachelemente wie Konstruktoren und Schlüsselwörter nötig.<br />

In <strong>de</strong>r Klassen<strong>de</strong>finition wer<strong>de</strong>n Klassenmetho<strong>de</strong>n mit ‚+‘, Instanzmetho<strong>de</strong>n mit ‚-‘ gekennzeichnet.<br />

+alloc ist kein Bestandteil <strong>de</strong>r Sprachbeschreibung, son<strong>de</strong>rn eine – beliebige – Metho<strong>de</strong> <strong>de</strong>s Frameworks und daher<br />

<strong>de</strong>r eigenen Implementierung zugänglich. Die Metho<strong>de</strong> zu überschreiben ist jedoch nur für Experten eine gute I<strong>de</strong>e.<br />

Ganz im Gegensatz ist die Metho<strong>de</strong> +initialize, die vor Verwendung einer Klasse aufgerufen wird, standardmäßig<br />

leer und kann für klassenbezogene Vorauseinstellungen überschrieben wer<strong>de</strong>n.<br />

Typkonzept<br />

Objective-C fügt zu <strong>de</strong>n Standard-C-Datentypen <strong>de</strong>n Datentyp id hinzu. Ein Objekt <strong>de</strong>s Types id ist irgen<strong>de</strong>in<br />

Objekt. Was mit diesem Objekt angefangen wer<strong>de</strong>n kann, wird erst zur Laufzeit bestimmt. Hierzu existieren<br />

Metho<strong>de</strong>n, etwas über das Objekt zu erfahren. Wichtig sind:<br />

• [obj class] // bestimmt die Klasse<br />

• [obj respondsToSelector:] // bestimmt, ob eine Metho<strong>de</strong> vorhan<strong>de</strong>n ist<br />

• [obj conformsToProtocol:] // bestimmt, ob ein Protokoll implementiert ist<br />

Das Typkonzept erlaubt zu<strong>de</strong>m die Typisierung <strong>de</strong>s allgemeinen Objektes o<strong>de</strong>r an<strong>de</strong>rer Objekte durch (formale)<br />

Protokolle. Diese legen einen Satz von Metho<strong>de</strong>n fest. Auch diese Protokolle müssen nicht in einem Hierarchiebaum<br />

einheitlich sein, wer<strong>de</strong>n aber vererbt.<br />

Die Typfreiheit erlaubt die Erstellung allgemeiner Container, die an<strong>de</strong>rs als templates auch typgemischt (heterogen)<br />

sein können.<br />

NSMutableDictionary *meineWelt = [[NSMutableDictionary alloc] init];<br />

// Eine Map mit einem String, einer URL und einem Wert<br />

[meineWelt setObject: @"Ein Text" forKey: @"Text"];<br />

[meineWelt setObject: [NSURL URLWithString: @"www.example.com"] forKey:<br />

@"URL"];<br />

[meineWelt setObject: [NSNumber numberWithInt: 3] forKey: @"Zahl"];<br />

// Alle Objekte implementiern die Metho<strong>de</strong> <strong>de</strong>scription<br />

NSLog( @"%@", [[meineWelt objectForKey: @"Text"] <strong>de</strong>scription] );<br />

NSLog( @"%@", [[meineWelt objectForKey: @"URL"] <strong>de</strong>scription] );<br />

NSLog( @"%@", [[meineWelt objectForKey: @"Zahl"] <strong>de</strong>scription] );<br />

[meineWelt release];<br />

Ausgabe: Ein Text www.example.com 3


Objective-C 94<br />

Spätes Bin<strong>de</strong>n<br />

Objective-C bin<strong>de</strong>t einen Metho<strong>de</strong>naufruf erst zur Laufzeit an eine Metho<strong>de</strong>. Grundsätzlich ist dies auch in C++ so.<br />

Jedoch muss in C++ bereits zur Übersetzungszeit sichergestellt sein, dass eine Metho<strong>de</strong> existiert, weil sie zu <strong>de</strong>r<br />

Klassenhierarchie gehört. C++ ist also nur bereit, innerhalb eines Zweiges einer Hierarchie spät zu bin<strong>de</strong>n, während<br />

Objective-C dies unabhängig von <strong>de</strong>r Stellung einer Klasse in einem Hierarchiebaum macht. Dies soll an einem<br />

Syntax-neutralen Beispiel ver<strong>de</strong>utlicht wer<strong>de</strong>n:<br />

Klasse A<br />

metho<strong>de</strong>()<br />

Klasse B von Klasse A<br />

metho<strong>de</strong>()<br />

Klasse C<br />

...<br />

metho<strong>de</strong>()<br />

// Spätes Bin<strong>de</strong>n in C++<br />

A* objekt = new B;<br />

objekt->metho<strong>de</strong>(); // Ruft in Wahrheit B::metho<strong>de</strong> auf<br />

<strong>de</strong>lete objekt;<br />

objekt = new C; // Führt zu Fehlern, da typfremd.<br />

objekt->metho<strong>de</strong>(); // Auch mit casting geht dies nicht, weil<br />

metho<strong>de</strong>()<br />

// Spätes Bin<strong>de</strong>n in oC<br />

// in einem an<strong>de</strong>ren Zweig <strong>de</strong>s Baumes auftaucht,<br />

// obwohl C::metho<strong>de</strong>() sehr wohl existiert<br />

id objekt = [[B alloc] init]; // id be<strong>de</strong>utet „Irgend ein Objekt“<br />

[objekt metho<strong>de</strong>]; // Funktioniert, weil B metho<strong>de</strong>() kennt<br />

[objekt release];<br />

objekt = [[C alloc] init];<br />

[objekt metho<strong>de</strong>]; // Funktioniert auch, weil C die metho<strong>de</strong>() kennt<br />

// Wo sie in <strong>de</strong>r Klassenhierarchie bekannt ist,<br />

// spielt keinerlei Rolle<br />

Zu diesem Zweck führt Objective-C zur Laufzeit umfangreiche Informationen über ein Objekt mit, was über RTTI<br />

hinausgeht.<br />

Aus <strong>de</strong>m letztlich gleichen Grun<strong>de</strong> ist es auch ohne weiteres möglich, zur Laufzeit erst eine Metho<strong>de</strong> zu bestimmen.<br />

Die Metho<strong>de</strong> kann sich ähnlich wie bei einem Metho<strong>de</strong>nzeiger in einer Variablen befin<strong>de</strong>n, die erst zur Laufzeit mit<br />

einem Wert besetzt wird:<br />

metho<strong>de</strong> = @selector( eineMetho<strong>de</strong> );<br />

[objekt performSelector: metho<strong>de</strong>]; // Ruft die Metho<strong>de</strong> eineMetho<strong>de</strong> auf<br />

metho<strong>de</strong> = @selector( an<strong>de</strong>reMetho<strong>de</strong> );<br />

[objekt performSelector: metho<strong>de</strong>]; // Ruft an<strong>de</strong>reMetho<strong>de</strong> auf<br />

Von dieser Technik macht etwa Cocoa bei <strong>de</strong>r Bindung von Interface-Elementen an Metho<strong>de</strong>n regen Gebrauch. Die<br />

Bestimmung <strong>de</strong>r Metho<strong>de</strong> kann auch durch ihren Klarnamen erfolgen.


Objective-C 95<br />

Programmbeispiel<br />

NSMutableDictionary *aDictionary = [[NSMutableDictionary alloc] init];<br />

[aDictionary setObject: @"Ei" forKey: @"egg"];<br />

[aDictionary setObject: @"Auto" forKey: @"car"];<br />

[aDictionary setObject: @"Hallo Welt!" forKey: @"Hello, world!"];<br />

NSLog([aDictionary objectForKey: @"Hello, world!"]);<br />

[aDictionary release];<br />

Objective-C++<br />

Objective-C++ ist ein Frontend <strong>de</strong>r GNU Compiler Collection das Quellen übersetzen kann, die sowohl C++- als<br />

auch Objective-C-Syntax verwen<strong>de</strong>n. Objective-C++ versucht nicht, die unterschiedlichen Konzepte <strong>de</strong>r bei<strong>de</strong>n<br />

Sprachen zu vereinheitlichen. Vielmehr erweitert es lediglich C++ um die Erweiterungen, die Objective-C zu C<br />

hinzufügt. Dies führt zu gewissen Einschränkungen:<br />

• C++-Klassen können nicht von Objective-C-Klassen erben.<br />

• Umgekehrt können Objective-C-Klassen auch nicht von C++-Klassen erben.<br />

• Innerhalb einer Objective-C-Deklaration kann man keine C++-Namensräume <strong>de</strong>klarieren.<br />

• C++-Klassen, die keinen Defaultkonstruktor haben, o<strong>de</strong>r die virtuelle Funktionen haben, können nicht als<br />

Instanzvariablen einer Objective-C-Klasse verwen<strong>de</strong>t wer<strong>de</strong>n. Wohl aber kann man Zeiger auf solche Klassen<br />

verwen<strong>de</strong>n.<br />

• Objective-C-Objekte können nicht als Wertparameter verwen<strong>de</strong>t wer<strong>de</strong>n, da sie nur über Zeiger ansprechbar sind.<br />

• Objective-C-Deklarationen können nicht in C++-Template-Deklarationen benutzt wer<strong>de</strong>n, und umgekehrt. Jedoch<br />

können Objetive-C-Typen (wie z. B. Klassenname *) als C++-Template-Parameter benutzt wer<strong>de</strong>n.<br />

• Die Ausnahmebehandlungsmechanismen von Objective-C und C++ sind voneinan<strong>de</strong>r unabhängig; Ein<br />

Objective-C-Exception-Handler kann keine C++-Exceptions auffangen und umgekehrt. Dies gilt allerdings nicht<br />

mehr für das 64-Bit-Runtime von Objective-C 2.0, da hier das Exceptionkonzept von C++ übernommen wur<strong>de</strong>.<br />

• Beson<strong>de</strong>re Vorsicht erfor<strong>de</strong>rt die Tatsache, dass die Konventionen zum Aufruf von Destruktoren nicht kompatibel<br />

sind. So wird etwa ein C++-Destruktor nicht aufgerufen, wenn <strong>de</strong>r Gültigkeitsbereich <strong>de</strong>s C++-Objekts mittels<br />

einer Objective-C-Ausnahme verlassen wird.<br />

Ein typischer Anwendungsbereich von Objective-C++ ist zum Beispiel die Verwendung einer C++-Bibliothek in<br />

einer Objective-C-Anwendung.<br />

Objective-C 2.0<br />

Im Oktober 2007 hat Apple mit Mac OS X 10.5 Objective-C 2.0 ausgeliefert, eine Erweiterung von Objective-C, die<br />

„mo<strong>de</strong>rne Garbage Collection, Syntaxerweiterungen, Verbesserungen <strong>de</strong>r Laufzeitleistung und 64-Bit-Unterstützung<br />

umfasst“. [2]<br />

Die GNU Laufzeitumgebung für Objective-C unterstützt diese Erweiterungen <strong>de</strong>rzeit (Mai 2009, GCC 4.4) jedoch<br />

nur teilweise.


Objective-C 96<br />

Garbage Collection<br />

Objective-C 2.0 enthält einen optionalen konservativen Garbage Collector.<br />

Properties<br />

Objective-C 2.0 führt eine neue Syntax ein, mit <strong>de</strong>r man Instanzvariablen als Properties <strong>de</strong>klarieren kann. Die<br />

Syntax unterstützt optionale Attribute, welche die Zugriffsmetho<strong>de</strong>n näher <strong>de</strong>finieren: Eine Property kann als<br />

readonly <strong>de</strong>klariert wer<strong>de</strong>n, und kann mit verschie<strong>de</strong>nen Verhaltensregeln zur Speicherverwaltung wie „assign“,<br />

„copy“, „retain“ versehen wer<strong>de</strong>n.<br />

@interface Person : NSObject {<br />

}<br />

@public NSString *name;<br />

@private int age;<br />

@property(copy) NSString *name;<br />

@property(readonly) int age;<br />

-(id)initWithAge:(int)age;<br />

@end<br />

Properties wer<strong>de</strong>n mit <strong>de</strong>m Schlüsselwort @synthesize implementiert, welches Getter und Setter-Method gemäß <strong>de</strong>r<br />

Property-Deklaration erzeugt. Alternativ kann man auch das Schlüsselwort @dynamic verwen<strong>de</strong>n, um anzuzeigen,<br />

dass man diese Metho<strong>de</strong>n selber implementiert. In diesem Falle ist es jedoch optional, da <strong>de</strong>r Compiler die<br />

Implementierung <strong>de</strong>r Accessoren bemerken kann und bemerkt. Wichtiger ist das Schlüsselwort @dynamic, wenn die<br />

Accessoren erst zur Laufzeit erzeugt wer<strong>de</strong>n. Denn hier wür<strong>de</strong> <strong>de</strong>r Compiler eine entsprechen<strong>de</strong> Definition<br />

vermissen und eine Warning ausgeben. Dies ist etwa bei Managed Objects <strong>de</strong>r Fall, die zur Laufzeit Accessoren aus<br />

<strong>de</strong>r gela<strong>de</strong>nen Beschreibungsstruktur <strong>de</strong>r Entität erzeugen.<br />

@implementation Person<br />

@synthesize name;<br />

@dynamic age;<br />

-(id)initWithAge:(int)initAge<br />

{<br />

age = initAge; // Dies ist ein direkter Zugriff auf die<br />

Instanzvariable, <strong>de</strong>r Property-Setter wird hier nicht verwen<strong>de</strong>t<br />

}<br />

return self;<br />

-(int)age<br />

{<br />

}<br />

@end<br />

return 29; // Beispiel: lügt bezüglich <strong>de</strong>s Alters


Objective-C 97<br />

Dot-Notation<br />

Auf Accessoren, gleichgültig ob explizit <strong>de</strong>finiert o<strong>de</strong>r als Property angelegt, kann mit <strong>de</strong>r aus an<strong>de</strong>ren Sprachen<br />

bekannten Punkt-Notation zugegriffen wer<strong>de</strong>n. Hierbei erfolgt allerdings kein unkontrollierter Zugriff auf die<br />

Instanzvariable, son<strong>de</strong>rn es wer<strong>de</strong>n die Accessoren -eigenschaft und -setEigenschaft: verwen<strong>de</strong>t.<br />

Person *aPerson = [[Person alloc] initWithAge: 53];<br />

aPerson.name = @"Steve"; // Punkt-Notation, verwen<strong>de</strong>t <strong>de</strong>n Setter<br />

NSLog(@"Zugriff per Getter (%@), Property-Name (%@) und Direktzugriff<br />

auf die Instanzvariable (%@)",<br />

aPerson.name, [aPerson valueForKey:@"name"], aPerson->name);<br />

Um die Punktnotation innerhalb einer Instanzmetho<strong>de</strong> zu verwen<strong>de</strong>n, benutzt man das Schlüsselwort self:<br />

-(void) introduceMyselfWithDotNotation<br />

{<br />

NSLog(@"Hallo, mein Name ist %@.", self.name); // verwen<strong>de</strong>t Getter<br />

NSLog(@"Hallo, mein Name ist %@.", name); // Direktzugriff auf die<br />

Instanzvariable<br />

}<br />

Auf die Eigenschaften einer Instanz kann auch dynamisch per Reflexion zugegriffen wer<strong>de</strong>n:<br />

int i, propertyCount = 0;<br />

objc_property_t *propertyList = class_copyPropertyList([aPerson class],<br />

&propertyCount);<br />

for (i=0; i


Objective-C 98<br />

Folgen für die Cocoa-Entwicklung<br />

In Objective-C geschriebene Mac-OS-X-Anwendungen, die diese Objective-C-2.0-Verbesserungen benutzen, sind<br />

mit Versionen von Mac OS X vor 10.5 (Leopard) inkompatibel.<br />

Vergleich zu an<strong>de</strong>ren <strong>Programmiersprache</strong>n<br />

C++<br />

Obwohl bei<strong>de</strong> Sprachen in C einen gemeinsamen Vorfahren haben, ergeben sich insbeson<strong>de</strong>re aus <strong>de</strong>m späten<br />

Bin<strong>de</strong>n und <strong>de</strong>r Möglichkeit, Klassen und Nachrichten zur Laufzeit zu erstellen, erhebliche Konzeptunterschie<strong>de</strong>.<br />

Funktionalitätsspezialisierung<br />

Ein häufiges Grundproblem <strong>de</strong>r klassenbasierten Programmierung ist die Spezialisierung einer<br />

Standardfunktionalität. Das Mittel <strong>de</strong>r Wahl ist in C++ meist die Ableitung. Hiergegen wird eingewen<strong>de</strong>t, dass bei<br />

<strong>de</strong>r Ableitung "Innereien" <strong>de</strong>r Basisklasse bekannt wer<strong>de</strong>n (White-Boxing). Demgegenüber lässt sich in Objective-C<br />

leicht das Delegating implementieren, welches eine Funktionsspezialisierung durch Nachfrage bei einem Objekt<br />

einer an<strong>de</strong>ren Klasse zulässt. Die zu spezialisieren<strong>de</strong> Klasse bleibt also gekapselt (Black-Boxing).<br />

Dies sei an einem Beispiel ver<strong>de</strong>utlicht: Es sei ein Tableview (eine Darstellung einer Tabelle mit Zeilen und Spalten<br />

im UI), welches Selektion zulässt. Man nehme ferner an, dass bei <strong>de</strong>r Selektion eine zentrale Metho<strong>de</strong> -selectRow:<br />

aufgerufen wird. Diese ist berechtigt, die Selektion abzulehnen.<br />

Bei einer Lösung mittels Ableitung wür<strong>de</strong> man die Metho<strong>de</strong> -selectRow: in einer Subklasse MyTableView :<br />

NSTableView spezialisieren:<br />

- (BOOL)selectRow:(NSInteger)rowIn<strong>de</strong>x<br />

{<br />

}<br />

// Die erste Zeile gruppiert nur und darf nicht selektiert wer<strong>de</strong>n.<br />

if( rowIn<strong>de</strong>x == 0 ) {<br />

return NO;<br />

} else {<br />

}<br />

return YES;<br />

Bei einem Delegate befragt in<strong>de</strong>ssen das Tableview sein Delegate. Dieses ist von irgen<strong>de</strong>iner Klasse:<br />

- (BOOL)tableview:(NSTableView*)tableView<br />

shouldSelectRow:(NSInteger)rowIn<strong>de</strong>x<br />

{<br />

}<br />

// Die erste Zeile gruppiert nur und darf nicht selektiert wer<strong>de</strong>n.<br />

if( rowIn<strong>de</strong>x == 0 ) {<br />

return NO;<br />

} else {<br />

}<br />

return YES;<br />

Der gleiche Co<strong>de</strong> wird also aus <strong>de</strong>r Klasse ausgelagert. Ähnlich wie bei <strong>de</strong>r Ableitung ist dabei die Implementierung<br />

einer Delegate-Metho<strong>de</strong> in <strong>de</strong>r Regel ein Angebot, keine Pflicht. In diesem Falle wür<strong>de</strong> also das Tableview<br />

nachfragen, ob sein Delegate die Metho<strong>de</strong> -tableView:shouldSelectRow: implementiert:


Objective-C 99<br />

// Pseudoco<strong>de</strong> NSTableView.m<br />

- (BOOL)selectRow:(NSInteger)rowIn<strong>de</strong>x {<br />

}<br />

SEL method = @selector( tableView:shouldSelectRow: );<br />

// Nur bei Implementierung<br />

if( [<strong>de</strong>legate respondsToSelector:method ) {<br />

return [<strong>de</strong>legate tableView:self shouldSelectRow:rowIn<strong>de</strong>x];<br />

// Standardverhalten<br />

} else {<br />

}<br />

return YES;<br />

Diese Fähigkeit von Objective-C wird in weiten Teilen von Cocoa ausgenutzt.<br />

Funktionalitätserweiterung<br />

Auch die Erweiterung einer bestehen<strong>de</strong>n Klassenfunktionalität wird in C++ häufig über Subklassen implementiert.<br />

Objective-C bietet <strong>de</strong>mgegenüber Kategorien als Lösungsmöglichkeit an. Hierbei wird nachträglich <strong>de</strong>r<br />

Metho<strong>de</strong>nsatz einer Klasse erweitert.<br />

Literatur<br />

• Amin Negm-Awad und Christian Kienle: Xco<strong>de</strong>, Objective-C und Cocoa. 1. Auflage. 2009. in: Horst-Dieter<br />

Radke (Hrsg.): Automatisierung und Anwendungsentwicklung auf <strong>de</strong>m Mac – Einführungen. 1 Auflage.<br />

SmartBooks Publishing AG, 2009, ISBN 978-3-9084-9798-1.<br />

• Amin Negm-Awad: Objective-C und Cocoa Band 1: Grundlagen. 2./4. Auflage. SmartBooks Verlag, 2009, ISBN<br />

978-3-9084-9782-0.<br />

• Cocoa: Progammierung für Mac OS X, 3. Ausgabe, Aaron Hillegass, Mitp-Verlag, 2008, Deutsch, ISBN<br />

3-8266-5960-0<br />

• Programming in Objective-C, Stephen Kochan, Sams, 2003, Englisch, ISBN 0-672-32586-1<br />

• Object-Oriented Programming and the Objective C Language, NeXTSTEP Developers Library Release 3,<br />

Addison-Wesley, 1993, ISBN 0-201-63251-9, 240 Seiten<br />

• Object-Oriented Programming: an evolutionary approach, Brad J. Cox and Andrew J. Novobilski,<br />

Addison-Wesley, 1986, 1991 (2nd Edition), ISBN 0-201-54834-8, 270 Seiten. Einführung vom Autor dieser<br />

Sprache.<br />

Weblinks<br />

• Einstieg in Objective-C im Mac OS X Entwicklerforum Wiki [3]<br />

• Introduction to The Objective-C Programming Language (Apple Developer Connection) [4]<br />

• Object-Oriented Programming and The Objective-C Language [5]<br />

• Object Oriented Programming in Objective-C [6]<br />

• Objective-C FAQ [7]<br />

• Objective-C: Links, Resources, Stuff [8]


Objective-C 100<br />

Tutorials<br />

• Objective-C, Xco<strong>de</strong> und Cocoa Tutorial [9]<br />

• Properties für Accessoren (Das Wichtigste für Umsteiger) [10]<br />

• Absolute Beginner – Einführung in Objective-C, Cocoa und Xco<strong>de</strong> [11]<br />

Referenzen<br />

[1] http:/ / <strong>de</strong>veloper. apple. com/ cocoa/ coredatatutorial/<br />

[2] http:/ / <strong>de</strong>veloper. apple. com/ leopard/ overview/ objectivec2. html Apple - Objective-C 2.0 Overview<br />

[3] http:/ / wiki. osxentwicklerforum. <strong>de</strong>/ doku. php?id=wiki:einstieg_objective-c<br />

[4] http:/ / <strong>de</strong>veloper. apple. com/ documentation/ Cocoa/ Conceptual/ ObjectiveC/<br />

[5] http:/ / www. toodarkpark. org/ computers/ objc/<br />

[6] http:/ / www. cs. indiana. edu/ classes/ c304/ oop-intro. html<br />

[7] http:/ / www. faqs. org/ faqs/ computer-lang/ Objective-C/ faq/<br />

[8] http:/ / www. foldr. org/ ~michaelw/ objective-c/<br />

[9] http:/ / www. infobliss. at/ objc/ obc001_in<strong>de</strong>x. htm<br />

[10] http:/ / www. daubit-blog. org/ 2009/ 06/ propertys-for-accessors/ langswitch_lang/ <strong>de</strong>/<br />

[11] http:/ / www. cocoading. <strong>de</strong>/ Common/ Article. php?Area=2& Article=3<br />

Pascal (<strong>Programmiersprache</strong>)<br />

Pascal<br />

Paradigmen: imperativ, strukturiert<br />

Erscheinungsjahr: 1972<br />

Entwickler: Niklaus Wirth<br />

Dialekte: UCSD-Pascal, Borland Turbo Pascal<br />

Einflüsse: ALGOL<br />

Beeinflusste: Modula-2, Ada, Delphi, Oxygene, WEB<br />

Die <strong>Programmiersprache</strong> Pascal (benannt nach Blaise Pascal) wur<strong>de</strong> von Niklaus Wirth an <strong>de</strong>r ETH Zürich 1972 als<br />

Lehrsprache eingeführt, um die strukturierte Programmierung zu etablieren.<br />

Allgemeines zur Sprache<br />

Pascal ist eine Weiterentwicklung von Algol 60.<br />

Die Sprache wur<strong>de</strong> von Niklaus Wirth als Lehrsprache entwickelt. Sie wur<strong>de</strong> <strong>de</strong>shalb so einfach und strukturiert wie<br />

möglich gestaltet. Ihre große Verbreitung in <strong>de</strong>r professionellen Programmierung fand sie als Borland/Turbo Pascal<br />

(Delphi) – gegenüber <strong>de</strong>m Ur-Pascal wesentlich erweiterte und verbesserte Versionen.<br />

Pascal zeichnet sich durch eine strikte und einfach verständliche Syntax sowie durch <strong>de</strong>n Verzicht auf<br />

kontextabhängige Interpretationen <strong>de</strong>s Co<strong>de</strong>s aus. Somit erlaubt Pascal im Vergleich zu Sprachen wie C und Fortran<br />

eine gute Lesbarkeit und, verglichen mit Fortran, auch eine bessere Unterstützung von strukturierter<br />

Programmierung.<br />

Ein wichtiges Konzept, das Wirth zur Anwendung brachte, ist die starke Typisierung (engl. "strong typing"):<br />

Variablen sind bereits zur Übersetzungszeit einem bestimmten Datentyp zugeordnet, und dieser kann nicht<br />

nachträglich verän<strong>de</strong>rt wer<strong>de</strong>n. Typenstrenge be<strong>de</strong>utet, dass Wertzuweisungen ausschließlich unter Variablen<br />

gleichen Typs erlaubt sind. In Pascal gibt es von diesem strikten Zwang lediglich wenige Ausnahmen:<br />

• Wertzuweisungen <strong>de</strong>r Form [Variable vom Typ real] := [Wert vom Typ integer].


Pascal (<strong>Programmiersprache</strong>) 101<br />

• In Exten<strong>de</strong>d-Pascal Wertzuweisungen von ganzzahligen o<strong>de</strong>r reellen Zahlen an Variablen vom Type Complex.<br />

• Wertzuweisungen von eingeschränkten Wertebereichen eines ordinalen Typs. Beispiel: type int10 = 1 .. 10; Werte<br />

dieses Typs können dann Integervariablen zugewiesen wer<strong>de</strong>n.<br />

• Wertzuweisungen von Mengen eines eingeschränkten Wertebereichen eines ordinalen Typs. Beispiel: type set10<br />

= set of 1 .. 10; set20 = set of 1 .. 20; Werte <strong>de</strong>s Typs set10 können dann Variablen <strong>de</strong>s Typs set20 zugewiesen<br />

wer<strong>de</strong>n.<br />

• Wertzuweisungen auf eingeschränkte Wertebereichen eines ordinalen Typs o<strong>de</strong>r einer Menge. In diesem Fall<br />

rufen Werte bzw. Mengen-Elemente außerhalb <strong>de</strong>s Zielbereichs einen Laufzeitfehler hervor.<br />

• Wertzuweisungen zwischen unterschiedlichen String-Typen, inkl. Char, Zeichen-Arrays gemäß Standard-Pascal<br />

und <strong>de</strong>n verschie<strong>de</strong>nen String-Typen in Exten<strong>de</strong>d-Pascal, Borland Pascal usw. Sofern die Länge <strong>de</strong>s Wertes nicht<br />

innerhalb <strong>de</strong>r Kapazität <strong>de</strong>s Ziels liegt, ergibt sich auch hier ein Laufzeitfehler.<br />

Heute fin<strong>de</strong>t Pascal im universitären Bereich (Entwicklung/Ausbildung) und in sicherheitskritischen Bereichen (z. B.<br />

Verkehrstechnik, Energieversorgung, Medizintechnik, Raumfahrt, Militär, teilweise im Banken- und<br />

Versicherungswesen) Anwendung. Dies beruht hauptsächlich auf <strong>de</strong>r guten Prüfbarkeit und Wartbarkeit <strong>de</strong>s Co<strong>de</strong>s<br />

und <strong>de</strong>r klaren Zuordnung <strong>de</strong>r Variablen. So ist die 2005 eingeführte Betriebsleittechnik IV <strong>de</strong>r<br />

Transrapid-Versuchsanlage Emsland in Pascal programmiert.<br />

Eine pascalähnliche Notation wird von jeher in <strong>de</strong>r Informatik und Mathematik zur Darstellung von Algorithmen<br />

benutzt. Aus didaktischen Grün<strong>de</strong>n, es seien hier die Typstrenge, hohe Fehlersicherheit und frei verfügbare<br />

portierbare Pascalcompiler (Free Pascal, GNU Pascal) genannt, wird im aktuellen Informatikunterricht Pascal<br />

ebenfalls häufig eingesetzt. Im Hobby-Bereich erlangte Pascal zeitweilig eine sehr weite Verbreitung, die jedoch mit<br />

neueren Microsoft-Windows-Versionen wie<strong>de</strong>r zurückging.<br />

Datentypen<br />

Pascal kennt als einfache Datentypen char, boolean, integer, real und ordinale Datentypen. In einigen Dialekten<br />

wur<strong>de</strong>n die einfachen numerischen Datentypen erweitert, um passen<strong>de</strong> Wortlängen abzu<strong>de</strong>cken. Strukturierte<br />

Datentypen sind array, record, set (Mengen) und file. Der Datentyp text entspricht <strong>de</strong>r Definition file text = file of<br />

char;<br />

Programmstrukturen<br />

Charakteristisch für Pascal ist das Konzept <strong>de</strong>r Verschachtelung von Prozeduren und Funktionen. Im<br />

Deklarationsteil einer Prozedur o<strong>de</strong>r Funktion können an<strong>de</strong>re Prozeduren und Funktionen auftauchen. Dabei gibt es<br />

klar verständliche Prinzipien über die Sichtbarkeit von Deklarationen in übergeordneten Funktionen und Prozeduren.<br />

Kontrollstrukturen<br />

Kontrollstrukturen sind if then else, case (in Dialekten mit einem else o<strong>de</strong>r otherwise versehen), for, repeat, while<br />

und goto. Da Pascal <strong>de</strong>r strukturierten Programmierung dient, soll das goto lediglich strukturerhöhend eingesetzt<br />

wer<strong>de</strong>n. Pascal unterstützt in seiner Urform keine Anweisungen, mit <strong>de</strong>nen Prozeduren o<strong>de</strong>r Schleifen hart verlassen<br />

wer<strong>de</strong>n können. Als strukturerhöhen<strong>de</strong>s goto wer<strong>de</strong>n Sprünge ans En<strong>de</strong> von Prozeduren o<strong>de</strong>r unmittelbar hinter<br />

Schleifenen<strong>de</strong>n akzeptiert, sofern sich dadurch umfangreiche Konstruktionen schlecht lesbarer if-Anweisungen o<strong>de</strong>r<br />

undurchschaubarer boolescher Ausdrucke vermei<strong>de</strong>n lassen. Viele Pascal-Compiler erlauben keine goto, die zu<br />

instabilen Systemzustän<strong>de</strong>n führen, z. B. <strong>de</strong>r Sprung in <strong>de</strong>n Anweisungsblock einer Schleife o<strong>de</strong>r eines if.


Pascal (<strong>Programmiersprache</strong>) 102<br />

Nachteile<br />

Da die Sprache als Lehrsprache konzipiert war, wies das Standard-Pascal einige Merkmale auf, die <strong>de</strong>n<br />

kommerziellen Einsatz erschwerten: Das Konzept für Dateizugriffe („file I/O“) war nicht mächtig, die<br />

Laufzeitbibliothek wenig umfangreich, und Zeichenketten konnten nur über Umwege (packed array) direkt im Co<strong>de</strong><br />

verwen<strong>de</strong>t wer<strong>de</strong>n. Das führte dazu, dass praktisch je<strong>de</strong> kommerzielle Implementierung hierzu eigene Lösungen<br />

anbot, was zunächst (ähnlich wie die Diversifizierung bei C) zu eigenen Pascal-Dialekten und damit zu<br />

Kompatibilitätsproblemen führte. Mit <strong>de</strong>r monopolartigen Dominanz <strong>de</strong>r Borland Turbo-Pascal-Produkte<br />

verschwan<strong>de</strong>n diese Unterschie<strong>de</strong> fast vollständig.<br />

Ein an<strong>de</strong>rer wesentlicher Nachteil war, dass eine Modularisierung im Sinne getrennter Compilierung nicht<br />

vorgesehen war – was mit <strong>de</strong>r Weiterentwicklung Modula-2 geän<strong>de</strong>rt wur<strong>de</strong>. Plattformspezifische<br />

Implementierungen sahen dafür eigene Lösungen vor (z. B. die Units von Turbo-Pascal, o<strong>de</strong>r später die Module in<br />

ANSI/ISO Exten<strong>de</strong>d Pascal).<br />

Compiler<br />

Der erste Pascal-Compiler selbst entstand auf <strong>de</strong>r CDC Cyber 6000 <strong>de</strong>r ETH Zürich. Daraus entstand dann Pascal<br />

6000, das als erste operative Version eines Compilers <strong>de</strong>r Sprache gesehen wer<strong>de</strong>n kann.<br />

Ein zweiter Pascal-Compiler – <strong>de</strong>r P4 „Portable Pascal Compiler“ von Urs Ammann, Kesav Nori und Christian<br />

Jacobi – stammte ebenfalls von <strong>de</strong>r ETH Zürich. Der P4 erzeugte eine plattformunabhängige, als Assemblersprache<br />

ausgelegte Zwischensprache, <strong>de</strong>n P-Co<strong>de</strong>, <strong>de</strong>r durch eine sogenannte virtuelle Maschine (ein Programm)<br />

interpretiert wird. Später entstan<strong>de</strong>n dann Compiler, die auf <strong>de</strong>m P4 basierten. Die verbreitetste Version wur<strong>de</strong> unter<br />

<strong>de</strong>m Namen UCSD Pascal bekannt, das auf vielen Systemen implementiert wur<strong>de</strong>, u. a. auf Apple II und Texas<br />

Instruments TI-99/4A und wesentlich zur Verbreitung <strong>de</strong>r Sprache sowohl (zuerst) in <strong>de</strong>n Vereinigten Staaten, später<br />

auch in Europa beitrug. Im Mai 2006 wur<strong>de</strong>n die Quelltexte von UCSD Pascal freigegeben.<br />

Bei <strong>de</strong>n meisten Pascal-Compilern han<strong>de</strong>lte es sich um einen One-Pass-Compiler, d. h. <strong>de</strong>r Compiler muss die<br />

Quelle nur ein einziges Mal lesen und analysieren. Das Design <strong>de</strong>r Sprache war so gehalten, um genau das zu<br />

ermöglichen. Bei <strong>de</strong>r damaligen geringen Geschwindigkeit <strong>de</strong>r Rechner war dies ein großer Vorteil.<br />

Unterschie<strong>de</strong> zu C<br />

• Sehr hohe Prozesssicherheit – Da Pascal sowie <strong>de</strong>r Quasi-Standard Borland/Turbo-Pascal eine strikte Trennung<br />

unterschiedlicher Typen vorsehen, kommen „versteckte/automatische“ Typumwandlungen, an<strong>de</strong>rs als in C,<br />

praktisch nicht vor. Insbeson<strong>de</strong>re bei <strong>de</strong>r Übergabe von Daten (z. B. aus externen Dateien, aber auch innerhalb<br />

<strong>de</strong>s Programms) an Funktionen o<strong>de</strong>r Prozeduren kann <strong>de</strong>r Compiler schon beim Compilieren die Korrektheit <strong>de</strong>r<br />

Typen kontrollieren (gleiches gilt für Array-Grenzen, Integer-Überlauf, Wrap-Around-Fehler, Stack-Überlauf u.<br />

ä., die in an<strong>de</strong>ren <strong>Programmiersprache</strong>n wie z. B. C/C++ häufig subtile und schwer zu lokalisieren<strong>de</strong><br />

(Laufzeit-)Fehler erzeugen).<br />

• keine nullterminierten Zeichenketten – Standard Pascal hatte zwar Zeichenketten-Literale, aber keinen Typ<br />

string (s. oben). In einigen späteren Versionen wer<strong>de</strong>n Zeichenketten nicht durch ein Null-Byte terminiert,<br />

son<strong>de</strong>rn es wird die Länge im ersten Byte String[0]) gespeichert und über die Funktion length()<br />

abgefragt. Somit beginnt das erste Nutzzeichen bei String[1]. Dies hatte eine sehr schnelle Verarbeitung zur<br />

Folge, aber auch <strong>de</strong>n Nachteil, dass Zeichenketten nicht beliebig lang sein konnten. In vielen Implementierungen<br />

(z. B. Turbo Pascal) war für die Speicherung <strong>de</strong>r Zeichenkettenlänge ein Byte vorgesehen, so dass die Länge auf<br />

255 Zeichen begrenzt ist. Größere Zeichenketten mussten selbst <strong>de</strong>finiert wer<strong>de</strong>n (z. B. als Array of char), sofern<br />

sie nicht (wie z. B. in Borland Pascal 7) durch die Compilerhersteller bereits implementiert wur<strong>de</strong>n. Im Exten<strong>de</strong>d<br />

Pascal-Standard wur<strong>de</strong>n Zeichenketten als Scheme-Typ <strong>de</strong>finiert. Auch hier muss die Kapazität angegeben<br />

wer<strong>de</strong>n, sie wird aber in run<strong>de</strong> Klammern geschrieben, und es gibt keine formale Längenbeschränkung:<br />

String(10240).


Pascal (<strong>Programmiersprache</strong>) 103<br />

• strikte Trennung zwischen Funktionen und Prozeduren – Pascal trennt strikt zwischen einer Funktion<br />

(Rückgabewert) und einer Prozedur (kein Rückgabewert, Typ void in C). Eine Funktion darf nicht als Prozedur<br />

aufgerufen wer<strong>de</strong>n – d. h. <strong>de</strong>r Rückgabewert muss stets entgegengenommen wer<strong>de</strong>n. Seit Turbo Pascal 4.0 (1991)<br />

ist dies jedoch möglich: Funktionen können auch ohne Entgegennahme <strong>de</strong>s Funktionsergebnisses aufgerufen<br />

wer<strong>de</strong>n.<br />

• Deklarationen – Variablen und Typ<strong>de</strong>finitionen dürfen nicht innerhalb <strong>de</strong>r Implementierung einer<br />

Funktion/Prozedur (zwischen BEGIN und END) <strong>de</strong>klariert wer<strong>de</strong>n – dies muss in einem speziellen Block im<br />

Definitionsteil geschehen. An<strong>de</strong>rs als C erlaubt Pascal die Deklarationen lokaler Funktionen bzw. Prozeduren,<br />

was die Erweiterung <strong>de</strong>s Sprachumfanges durch <strong>de</strong>n Benutzer erheblich vereinfacht.<br />

• Bezeichner – In Pascal ist die Groß-/Kleinschreibung bei Bezeichnern (Typen, Konstanten, Variablen,<br />

Funktionen/Prozeduren) irrelevant. Programmfehler durch Tippfehler z. B. Max statt MAX wer<strong>de</strong>n dadurch<br />

vermie<strong>de</strong>n.<br />

• Semikolon – Das Semikolon wird nicht wie in C als Befehlsabschluss interpretiert, son<strong>de</strong>rn als Trennzeichen<br />

zwischen Anweisungen. Vor einem END o<strong>de</strong>r UNTIL kann es somit weggelassen wer<strong>de</strong>n. Vor einem ELSE darf<br />

es in <strong>de</strong>r Regel gar nicht stehen, da sonst <strong>de</strong>r IF-Zweig als abgeschlossen angesehen wer<strong>de</strong>n wür<strong>de</strong>. Ein Fall, bei<br />

<strong>de</strong>m es vor <strong>de</strong>m ELSE steht (und stehen muss), ist am En<strong>de</strong> einer CASE-Auflistung.<br />

• Delimiter – Für Zeichenketten-Literale und Zeichen-Literale wird dasselbe Begrenzungszeichen (Delimiter),<br />

nämlich <strong>de</strong>r Apostroph, verwen<strong>de</strong>t.<br />

• Zuweisungen – Zuweisungen an Variablen wer<strong>de</strong>n durch die Sequenz := <strong>de</strong>finiert, das Gleichheitszeichen allein<br />

dient <strong>de</strong>m Vergleich. Damit wer<strong>de</strong>n „mathematisch falsche“ Ausdrücke z. B. i = i + 1 vermie<strong>de</strong>n.<br />

• Operatoren – Pascal verwen<strong>de</strong>t die Operatoren and, or, not, div (nur für Integer, bei Real ist es /), mod und <br />

anstatt <strong>de</strong>r C-Operatoren &&, ||, !, /, % und !=. Die „Short Circuit“-Funktionalität von && und || in C (sobald das<br />

Ergebnis feststeht, nämlich wenn <strong>de</strong>r linke Teil beim and FALSE beziehungsweise beim or TRUE ist, wird <strong>de</strong>r<br />

rechte nicht mehr ausgewertet) schloss N. Wirth explizit aus, da compilerinterne Optimierungsvorgänge die<br />

Reihenfolge <strong>de</strong>r Auswertung verän<strong>de</strong>rn können. Spätere Pascalversionen implementierten eine lokal o<strong>de</strong>r global<br />

zuschaltbare „Short Circuit“-Funktionalität, so dass <strong>de</strong>r Programmierer im Einzelfall entschei<strong>de</strong>n kann, welche Art<br />

<strong>de</strong>r Auswertung er wünscht. In Standard-Pascal gibt es keine Bitoperationen für Integer (wie &, |, ^ und ~ von C),<br />

aber statt<strong>de</strong>ssen <strong>de</strong>n Typ set of (mit <strong>de</strong>n Operatoren *, + und - für Durchschnitt, Vereinigung und<br />

Mengendifferenz).<br />

• strenge Typentrennung – u. a. ist Char nicht austauschbar mit Integer, die Umwandlung muss mit <strong>de</strong>n<br />

Funktionen ord() und chr() durchgeführt wer<strong>de</strong>n. Dadurch wer<strong>de</strong>n ver<strong>de</strong>ckte (o<strong>de</strong>r ungewollte) Umwandlungen<br />

vermie<strong>de</strong>n z. B. führt die Anweisung i = 7/2 zu einer Fehlermeldung, wenn i vom Typ Integer = Ganzzahl ist da<br />

7/2 = 3.5 keine Ganzzahl ist. Spätere Pascalversionen (z. B. Turbo Pascal) führten zusätzlich „explizite“<br />

Typumwandlungen, sog. „type casts“, ein, so dass z. B. mit longint(i) <strong>de</strong>r Wertebereich <strong>de</strong>r Ganzzahlvariablen i<br />

erweitert o<strong>de</strong>r eingeschränkt wer<strong>de</strong>n konnte. In Standard-Pascal musste dafür ein Umweg über (<strong>de</strong>n Missbrauch<br />

von) Variantenrecords (union in C) genommen wer<strong>de</strong>n.<br />

Standards<br />

Es gibt drei Standards, die sich auf Pascal beziehen:<br />

1. Standard Pascal: ANSI/IEEE770X3.97-1993 o<strong>de</strong>r ISO 7185:1990;<br />

2. Exten<strong>de</strong>d Pascal: ANSI/IEEE770X3.160-1989 o<strong>de</strong>r ISO/IEC 10206:1991;<br />

3. sowie einen Entwurf zu „Object-Oriented Extensions to Pascal“.<br />

Allerdings sind nur die wenigsten Compiler zu diesen Standards vollständig kompatibel. Diese Tatsache verleitete<br />

Scott A. Moore zu <strong>de</strong>r bissigen Bemerkung „Pascal is, unfortunately, very much a great improvement on its<br />

successors“ („Pascal ist lei<strong>de</strong>r so ziemlich eine große Verbesserung seiner Nachfolger“ – damals bereits ein<br />

geflügelter Satz, <strong>de</strong>r schon früher über ALGOL, welches auch C und C++ wesentlich beeinflusst hat, oft gesagt


Pascal (<strong>Programmiersprache</strong>) 104<br />

wor<strong>de</strong>n war).<br />

Selbst großen Compilern wie Delphi o<strong>de</strong>r FreePascal fehlen bis heute einige Elemente aus Standard Pascal, während<br />

Exten<strong>de</strong>d Pascal von kaum einem unterstützt wird. Lediglich Prospero Pascal ist vollständig kompatibel zu Exten<strong>de</strong>d<br />

Pascal, während auch GNU Pascal vollständige Kompatibilität anstrebt.<br />

Implementierungen (Compiler, Interpreter und IDEs)<br />

Pascal hatte von Anfang an im universitären Bereich sehr großen Erfolg, was sich u. a. auch in <strong>de</strong>r<br />

<strong>Programmiersprache</strong> Ada nie<strong>de</strong>rschlug, die sehr stark an <strong>de</strong>r Syntax von Pascal angelehnt ist. Ebenfalls fand es weite<br />

Verbreitung, auch im kommerziellen Bereich, mit <strong>de</strong>n Produkten <strong>de</strong>r Firma Borland Turbo Pascal, Borland Pascal<br />

und Delphi. Diese Versionen sind durch starke Erweiterungen <strong>de</strong>s ursprünglichen Sprachstandards gekennzeichnet.<br />

Die Objektorientierung wur<strong>de</strong> dabei mit Version 5.5 eingeführt.<br />

Heute gibt es einige freie Implementationen:<br />

• Free Pascal – Ein unter <strong>de</strong>r GNU Lesser General Public License stehen<strong>de</strong>s Open-Source-Projekt, das sich zum<br />

Ziel gesetzt hat, einen freien 32/64-Bit-Compiler zu erzeugen, <strong>de</strong>r 100-prozentig kompatibel zu Turbo Pascal und<br />

Delphi sein soll und mittlerweile eine leichte Portierung von Pascal-Programmen auf fast alle gängigen<br />

Betriebssysteme und Hardwareplattformen ermöglicht.<br />

• GNU Pascal – Ein Pascal-Compiler, <strong>de</strong>r als Frontend zur GNU Compiler Collection konzipiert ist. Es ist kein<br />

Bestandteil <strong>de</strong>r GCC selbst, ist aber durch die Verwendung <strong>de</strong>r GCC plattformunabhängig. Die Entwicklung von<br />

GPC hat sich zuletzt verzögert.<br />

• Virtual Pascal – Diese inzwischen freie Implementierung eines Borland-kompatiblen Pascal-Compilers für OS/2<br />

wur<strong>de</strong> auch auf an<strong>de</strong>re Plattformen portiert, wird aber seit 2005 nicht mehr weiterentwickelt.<br />

Integrierte Entwicklungsumgebungen:<br />

• Lazarus – Eine Entwicklungsumgebung für Free Pascal, die auch verschie<strong>de</strong>ne Komponenten zur Verfügung<br />

stellt. Die IDE ist sehr Delphi-ähnlich gestaltet und verwen<strong>de</strong>t unter Unix das GTK+ als Grafik-Toolkit, unter<br />

Windows (win32/win64/wince) setzt es auf <strong>de</strong>r nativen API auf, und auf Apple Betriebssystemen kann wahlweise<br />

die native Carbon-API o<strong>de</strong>r das X-Window-System verwen<strong>de</strong>t wer<strong>de</strong>n. Darüber hinaus unterstützt Lazarus Cross<br />

Compiling, so dass auch Software für weitere Plattformen wie Windows CE, OS/2, Palm OS o<strong>de</strong>r Nintendo DS<br />

entwickelt wer<strong>de</strong>n kann. Lazarus ist noch nicht fertiggestellt, in kurzen Abstän<strong>de</strong>n wer<strong>de</strong>n aber neue<br />

Betaversionen veröffentlicht, die – je nach Plattform in unterschiedlichem Maße – einen wachsen<strong>de</strong>n Teil <strong>de</strong>r<br />

geplanten Funktionalität implementieren.<br />

• Dev-Pascal – Eine unter Windows laufen<strong>de</strong> IDE, die auf Free-Pascal o<strong>de</strong>r GNU-Pascal als Compiler aufsetzen<br />

kann. Wird nicht mehr weiterentwickelt.<br />

Hallo Welt<br />

Das Beispielprogramm Hallo Welt sieht in Pascal folgen<strong>de</strong>rmaßen aus:<br />

program Hallo (output);<br />

begin<br />

end.<br />

writeln('Hallo Welt');<br />

o<strong>de</strong>r in neueren Pascal-Versionen sieht das Programm so aus:<br />

program Hallo;<br />

begin<br />

end.<br />

writeln('Hallo Welt');


Pascal (<strong>Programmiersprache</strong>) 105<br />

Ein Detail am Ran<strong>de</strong>: In manchen alten Beispielen fin<strong>de</strong>t man ein READLN nach <strong>de</strong>m WRITELN-Befehl. Das war<br />

nur notwendig, weil die I/O-Architektur <strong>de</strong>r CDC-Cyber 6000, auf <strong>de</strong>r Wirth <strong>de</strong>n ersten Pascal-Compiler<br />

entwickelte, das benötigte, um die internen Puffer zu leeren – sonst wäre im interaktiven Betrieb keine Ausgabe zu<br />

sehen gewesen. IDEs konnte man mit diesem READLN zwingen, am En<strong>de</strong> <strong>de</strong>r Programmausführung nicht sofort<br />

wie<strong>de</strong>r in <strong>de</strong>n Editor-Modus umzuschalten, was die Ausgabe bei manchen IDEs (z. B. Turbo-Pascal) sonst hätte<br />

verschwin<strong>de</strong>n lassen. Im Batch-Betrieb war das ohnehin nie notwendig.<br />

Weiterentwicklungen<br />

• Oberon, Oberon-2<br />

• POW! - basiert auf Oberon und Pascal<br />

• Component Pascal – basiert auf Oberon<br />

• Borland Delphi und Kylix – Objektorientiertes Pascal als Weiterentwicklung von Borland Pascal, nun Co<strong>de</strong>Gear.<br />

• RemObjects Chrome, Oxygene, nun lizenziert als Delphi Prism von Co<strong>de</strong>Gear<br />

• PocketStudio<br />

Literatur<br />

• Kathleen Jensen, Nicolaus Wirth: Pascal User Manual and Report. ISO Pascal Standard. Broschiert, 266 Seiten,<br />

Springer-Verlag, 4th ed. 1991, ISBN 3-540-97649-3.<br />

• Steven Pemberton und Martin Daniels, Ellis Horwood: Pascal Implementation: The P4 Compiler and Interpreter<br />

[1] , ISBN 0-13-653031-1.<br />

Weblinks<br />

• ISO-Pascal Übersichtseite. Sprachreferenz, Pascal-Grammatik, Geschichte, etc. (engl.) [2]<br />

• UCSD-Pascal Source-Co<strong>de</strong> (engl.) [3]<br />

Referenzen<br />

[1] http:/ / homepages. cwi. nl/ ~steven/ pascal/<br />

[2] http:/ / www. moorecad. com/ standardpascal/<br />

[3] http:/ / www. bitsavers. org/ bits/ UCSD_Pascal/


PEARL 106<br />

PEARL<br />

Bereich Informationstechnik<br />

Regelt <strong>Programmiersprache</strong> PEARL<br />

Kurzbeschreibung<br />

DIN 66253<br />

PEARL 90 (DIN 66253-2), Mehrrechner-PEARL (DIN 66253-3)<br />

Letzte Ausgabe 04.1998 (Teil 2), 01.1989 (Teil 3)<br />

ISO<br />

PEARL [pɜːɹl] ist eine Echtzeit- und Multitasking-<strong>Programmiersprache</strong> nach DIN 66253. Sie fin<strong>de</strong>t beson<strong>de</strong>rs unter<br />

RTOS-UH Anwendung. PEARL steht für Process and Experiment Automation Realtime Language und hat nichts<br />

mit <strong>de</strong>r Scriptsprache Perl zu tun.<br />

Anwendung<br />

PEARL wird unter an<strong>de</strong>rem verwen<strong>de</strong>t in <strong>de</strong>r Programmierung von Prozessrechnern bei Energieversorgern, so zum<br />

Beispiel bei <strong>de</strong>n Stadtwerken Hannover. [1]<br />

Weiterhin wird PEARL an vielen Hochschulen zur Ausbildung in Programmierung von Echtzeitsystemen genutzt. [2]<br />

Literatur<br />

• Peter Holleczek (Hrsg), Birgit Vogel-Heuser (Hrsg): Echtzeitaspekte bei <strong>de</strong>r Koordinierung Autonomer Systeme,<br />

Springer Berlin 2005, ISBN 3-540-29594-1<br />

• B. Reißenweber: Programmieren mit PEARL, R. Ol<strong>de</strong>nbourg Verlag München Wien 1988, ISBN 3-486-20512-9<br />

• L. Frevert: Echtzeit-Praxis mit PEARL, B.G. Teubner, Stuttgart, 1985 - ISBN 3-519-02475-6 PDF [3]<br />

• J. Bran<strong>de</strong>s, S. Eichentopf, P. Elzer, L. Frevert, V. Haase , H. Mittendorf, G. Müller, P. Rie<strong>de</strong>r: PEARL, The<br />

Concept of a Process and Experiment Oriented Programming Language; elektronische datenverarbeitung, 10<br />

(1970), S.429-442<br />

• K. H. Timmesfeld, B. Schürlein, P. Rie<strong>de</strong>r, K. Pfeiffer, G. Müller, K. Kreuter, P. Holleczek, V. Haase, L. Frevert,<br />

P. Elzer, S. Eichentopf, B. Eichenauer, J. Bran<strong>de</strong>s: PEARL - Vorschlag für eine Prozess- und<br />

Experimentautomatisierungssprache. Gesellschaft für Kernforschung mbH, Karlsruhe, PDV-Bericht KfK-PDV 1,<br />

April 1973<br />

Weblinks<br />

• Beschreibung von PEARL [4]<br />

• [news://hannover.uni.comp.rtos-uh Newsgroup hannover.uni.comp.rtos-uh]<br />

• Literatur über PEARL (<strong>Programmiersprache</strong>) [5] im Katalog <strong>de</strong>s Bibliotheksservice-Zentrums<br />

Ba<strong>de</strong>n-Württemberg (BSZ)<br />

• Fachgruppe Echtzeitsysteme <strong>de</strong>r GI [6]


PEARL 107<br />

Referenzen<br />

[1] iX - Magazin für professionelle Informationstechnik, Ausgabe 4/1999, S. 120<br />

[2] http:/ / www. irt. uni-hannover. <strong>de</strong>/ pearl/ prllehre. html<br />

[3] http:/ / www. irt. uni-hannover. <strong>de</strong>/ pub/ pearl/ PEARLFrev. pdf<br />

[4] http:/ / www. irt. uni-hannover. <strong>de</strong>/ pearl/<br />

[5] http:/ / pollux. bsz-bw. <strong>de</strong>/ REL?PPN=209200421<br />

[6] http:/ / www. real-time. <strong>de</strong><br />

Perl (<strong>Programmiersprache</strong>)<br />

Perl<br />

Paradigmen: prozedural, modular, teilweise objektorientiert<br />

Erscheinungsjahr: 1987<br />

Entwickler: Larry Wall, Perl Porter<br />

Aktuelle Version: 5.10.1 (23. August 2009)<br />

Typisierung: schwach, dynamisch, implizit<br />

Einflüsse: Awk, BASIC-PLUS, C, C++, LISP, Pascal, Python, Sed, Unix-Shell<br />

Beeinflusste: PHP, Ruby, Python, JavaScript<br />

Betriebssystem: plattformunabhängig<br />

Lizenz: GPL und Artistic License<br />

www.perl.org [1]<br />

Perl [pɜɹl] ist eine freie, plattformunabhängige und interpretierte <strong>Programmiersprache</strong> (Skriptsprache), die mehrere<br />

Programmierparadigmen unterstützt.<br />

Der Linguist Larry Wall entwarf sie 1987 als Synthese aus C, awk, <strong>de</strong>n Unix-Befehlen und an<strong>de</strong>ren Einflüssen.<br />

Ursprünglich als Werkzeug zur Verarbeitung und Manipulation von Textdateien insbeson<strong>de</strong>re bei System- und<br />

Netzwerkadministration vorgesehen (zum Beispiel Auswertung von Logdateien), hat Perl auch bei <strong>de</strong>r Entwicklung<br />

von Webanwendungen und in <strong>de</strong>r Bioinformatik weite Verbreitung gefun<strong>de</strong>n. Traditionell stark ist Perl auch in <strong>de</strong>r<br />

Finanzwelt, bei <strong>de</strong>r Verarbeitung von Datenströmen verschie<strong>de</strong>nartiger Nachrichtenquellen. Hauptziele sind eine<br />

schnelle Problemlösung und größtmögliche Freiheit für Programmierer. Die Bearbeitung von Texten mit Hilfe<br />

regulärer Ausdrücke sowie viele frei verfügbare Module, die an einem zentralen Ort (CPAN) gesammelt wer<strong>de</strong>n,<br />

sind Stärken <strong>de</strong>r Sprache.


Perl (<strong>Programmiersprache</strong>) 108<br />

Geschichte<br />

Entstehung<br />

Larry Wall war als Administrator und Programmierer bei <strong>de</strong>m<br />

Unternehmen Unisys angestellt, wo er seit März 1987 daran beteiligt<br />

war, unter <strong>de</strong>m Namen blacker ein sicheres Netzwerk für die NSA zu<br />

entwickeln. Er erhielt mehrere Aufträge, Werkzeuge zur Überwachung<br />

und Fernwartung <strong>de</strong>r entstehen<strong>de</strong>n Software zu schaffen. Eine<br />

Hauptaufgabe war dabei, übersichtliche Berichte aus verstreuten<br />

Logdateien zu erzeugen. Da ihm die vorhan<strong>de</strong>nen Sprachen und<br />

Werkzeuge dafür zu umständlich erschienen, entwickelte er mit Hilfe<br />

seines damaligen Teamkollegen Daniel Faigin und seines Schwagers<br />

Mark Biggar schrittweise eine eigene Sprache, um seine Aufgaben zu<br />

lösen.<br />

Dabei griff er auch auf sein Wissen und seine Erfahrung als Linguist<br />

zurück und entwarf Perl nahe an <strong>de</strong>n menschlichen<br />

Sprachgewohnheiten. Dies drückt sich in minimalen Voraussetzungen<br />

für Einsteiger, einer starken Kombinierbarkeit <strong>de</strong>r Sprachelemente und<br />

einem reichen Wortschatz aus, <strong>de</strong>r auch Befehle zulässt, <strong>de</strong>ren<br />

Be<strong>de</strong>utungen sich überschnei<strong>de</strong>n. Wall sieht darin die Bedürfnisse<br />

eines Praktikers nach Freiheit und intuitivem Ausdruck verwirklicht.<br />

Larry Wall entwarf Perl<br />

Gemäß diesem praktischen Ansatz borgte sich Perl seinen Wortschatz und seine logischen Strukturen von <strong>de</strong>n in <strong>de</strong>n<br />

1980er Jahren unter Unix verbreiteten Sprachen und Werkzeugen, was das Erlernen vereinfachte, aber auch die<br />

Unix-Philosophie umkehrte. Unix und seine Systembefehle waren kompiliert und meist in C geschrieben. Diese<br />

Befehle waren logische Einheiten und sollten genau eine Aufgabe beherrschen: „Do one thing and do it well“ („Mach<br />

eine Sache und mach’ sie gut“). Interpretierte Shell-Skripte kombinierten schnell und einfach die Befehle, die<br />

untereinan<strong>de</strong>r ihre Ergebnisse durch Pipes weiterreichen konnten. Perl verletzt diese Philosophie, in<strong>de</strong>m es diese<br />

Befehle zum Bestandteil <strong>de</strong>r <strong>Programmiersprache</strong> macht, also C und Shell vereint und die vorhan<strong>de</strong>nen Befehle und<br />

Werkzeuge übergeht.<br />

Dies wur<strong>de</strong> notwendig, weil Shell-Skripte für komplexe Aufgaben ungeeignet waren. Ihr Ablauf ist sehr einfach, sie<br />

können Daten nur eingeschränkt zwischenspeichern und die Pipes sind Na<strong>de</strong>löhre für <strong>de</strong>n Datenaustausch.<br />

An<strong>de</strong>rerseits erlauben sie einen wesentlich kompakteren Programmierstil, da die Benutzung eines UNIX-Werkzeugs<br />

viele Zeilen C-Quelltext ersetzen kann.<br />

Um die Vorteile bei<strong>de</strong>r Programmierarten nutzen zu können, schuf Wall eine Kombination aus C und Werkzeugen<br />

wie sed, awk, grep und sort. Er fügte Eigenschaften <strong>de</strong>r Bourne Shell, in geringem Maße auch Elemente aus Pascal<br />

und BASIC, sowie eigene I<strong>de</strong>en dazu [2] . Diese Fusion ermöglichte kurze, mächtige Programme, die man schnell<br />

schreiben und je<strong>de</strong>rzeit auch testen konnte, ohne sie kompilieren zu müssen, was die Entwicklung ebenfalls<br />

beschleunigte. Später wur<strong>de</strong>n weitere Fähigkeiten von Sprachen wie LISP, Smalltalk, Python o<strong>de</strong>r Ruby „importiert“.<br />

Name<br />

Der Name Perl bezieht sich auf ein Zitat aus <strong>de</strong>m Matthäus-Evangelium (Mt 13,46 [3]), in <strong>de</strong>m Jesus das<br />

Himmelreich mit <strong>de</strong>m Bild eines Händlers beschreibt, <strong>de</strong>r seinen gesamten Besitz verkaufen will, um eine kostbare<br />

Perle zu erwerben. Noch vor <strong>de</strong>r Veröffentlichung wur<strong>de</strong> <strong>de</strong>r Name von „Pearl“ in „Perl“ geän<strong>de</strong>rt, da es bereits eine<br />

<strong>Programmiersprache</strong> namens PEARL gab. Allgemein verbreitet und von Larry Wall akzeptiert sind auch die<br />

Backronyme Practical Extraction and Report Language (zweckmäßige Extraktions- und Berichtssprache) und


Perl (<strong>Programmiersprache</strong>) 109<br />

Pathologically Eclectic Rubbish Lister (krankhaft stilmischen<strong>de</strong>r Blödsinnsauflister). Die Schreibweise „Perl“<br />

bezeichnet die Sprache, „perl“ dagegen das Programm, das diese Sprache interpretiert. Ferner legt die Perl-Gemein<strong>de</strong><br />

Wert darauf, dass nicht die Schreibweise „PERL“ verwen<strong>de</strong>t wird. [4]<br />

Perl 1 bis 4<br />

Am 18. Dezember 1987 publizierte Larry Wall sein Programm im<br />

Usenet als Perl 1.0, das damals noch eine mächtigere Shell war, die gut<br />

mit Texten und Dateien umgehen, an<strong>de</strong>re Programme steuern und gut<br />

lesbare Berichte ausgeben konnte. Bereits am 5. Juni im Jahr darauf<br />

erschien die Version 2.0 mit grun<strong>de</strong>rneuerter und erweiterter<br />

Regex-Engine und einigen weiteren Verbesserungen. Am 18. Oktober<br />

1989 folgte Perl 3, das mit binären Daten umgehen konnte und auch<br />

Netzwerkprogrammierung ermöglichte. Als neue Lizenz wur<strong>de</strong> die<br />

GPL gewählt.<br />

Larry Wall war zu dieser Zeit Angestellter <strong>de</strong>r<br />

Fast unverän<strong>de</strong>rt war es ab <strong>de</strong>m 21. März 1991 als Perl 4 erhältlich, jedoch nun wahlweise unter <strong>de</strong>r GPL o<strong>de</strong>r <strong>de</strong>r<br />

von Larry Wall entwickelten Artistic License. Der eigentliche Grund für die neue Version war aber das gleichzeitig<br />

erschienene Kamelbuch, das als Referenz für <strong>de</strong>n aktuellen, als Version 4 markierten Stand, veröffentlicht wur<strong>de</strong>.<br />

Bis dahin waren die seit Perl 1 verfügbaren UNIX-man-pages die einzige verfügbare Perl-Dokumentation. Diese<br />

bieten zu je<strong>de</strong>m Thema eine fundierte und umfangreiche Abhandlung, aber keinen einfachen Einstieg für<br />

Perl-Anfänger.<br />

Diese Lücke sollte das von Randal L. Schwartz, Larry Wall und Tom Christiansen verfasste Buch schließen. Es<br />

erschien im O’Reilly Verlag, <strong>de</strong>r mit diesem und weiteren Titeln als renommierter Fachverlag für Programmierer<br />

bekannt wur<strong>de</strong>. Perl-Bücher von O’Reilly wur<strong>de</strong>n die maßgeblichen Perl-Publikationen, was sich erst im neuen<br />

Jahrtausend etwas relativierte. Der Verlag betreibt auch unter <strong>de</strong>r Internetadresse perl.com das meistbesuchte<br />

Online-Magazin für Perl-Programmierung und veranstaltet mit <strong>de</strong>r TPC (The Perl Conference – heute OSCON) die<br />

größte Perl-Konferenz. O’Reilly profitierte von Perls wachsen<strong>de</strong>r Popularität, und im Gegenzug bezahlte Tim<br />

O’Reilly seinem Freund Larry Wall in <strong>de</strong>n folgen<strong>de</strong>n Jahren ein festes Gehalt, <strong>de</strong>r sich so, ohne weitere Pflichten<br />

o<strong>de</strong>r Vorgaben, <strong>de</strong>r Weiterentwicklung <strong>de</strong>r Sprache widmen konnte.<br />

1993, als Perl die Version 4.036 erreichte, brach Larry Wall die Weiterentwicklung ab, um mit Perl 5 eine<br />

vollständige Neuentwicklung zu beginnen.<br />

Perl 5<br />

Perl 5.0 wur<strong>de</strong> am 18. Oktober 1994 veröffentlicht und war <strong>de</strong>r bisher<br />

größte Fortschritt für die Sprache. Mit Plain Old Documentation<br />

konnte man nun formatierte Dokumentation in <strong>de</strong>n Quelltext einfügen.<br />

Auch ließ sich die Sprache ab jetzt durch separate Module erweitern,<br />

was im folgen<strong>de</strong>n Jahr zur Entstehung <strong>de</strong>s CPAN führte. Dieses große<br />

Archiv frei erhältlicher Module ist heute selbst ein wichtiger Grund,<br />

Perl einzusetzen. Eine weitere wichtige Neuerung war die Einführung<br />

JPL<br />

CPAN – eines <strong>de</strong>r größten Archive freier<br />

Software<br />

von Referenzen, die erstmals eine einfache Erstellung zusammengesetzter Datenstrukturen erlaubte.<br />

Mit Version 5 wur<strong>de</strong> es auch möglich, objektorientiert in Perl zu programmieren. Dabei wählte Larry Wall einen<br />

ungewöhnlichen Weg und leitete die dafür verwen<strong>de</strong>te Syntax fast ausschließlich aus vorhan<strong>de</strong>nen Sprachelementen<br />

ab (Packages, Package-Funktionen und Package-Variablen sowie <strong>de</strong>n neuen Referenzen). Lediglich die Funktion<br />

bless() zum Anlegen eines Objektes und <strong>de</strong>r Pfeil-Operator (->) zum Aufruf von Metho<strong>de</strong>n kamen hinzu. Es entstand<br />

auch XS, eine Schnittstellenbeschreibungssprache, die es ermöglicht, Perl-Programme mit an<strong>de</strong>ren Sprachen zu


Perl (<strong>Programmiersprache</strong>) 110<br />

erweitern o<strong>de</strong>r mit Perl-Programmen beliebige Software o<strong>de</strong>r Hardware anzusprechen.<br />

Seit <strong>de</strong>r Veröffentlichung von Perl 5 beteiligte sich Larry Wall kaum noch an <strong>de</strong>r Entwicklung <strong>de</strong>r Sprache. Dies<br />

übernahmen freiwillig Perl-begeisterte Programmierer, die sogenannten Perl 5 Porter, die über die im Mai 1994<br />

gegrün<strong>de</strong>te p5p-Mailingliste kommunizieren, aber auch zunehmend über einen eigenen Bug- und Request-Tracker<br />

(RT) über Fehlerbehebungen und neue Funktionen <strong>de</strong>r Sprache entschei<strong>de</strong>n. Dabei übernimmt je Version ein<br />

sogenannter Pumpking die Leitung. Der Begriff Perl Porter entstammt <strong>de</strong>r ursprünglichen Aufgabe <strong>de</strong>r p5p-Liste,<br />

die Portierung von Perl auf an<strong>de</strong>re Betriebssysteme zu koordinieren.<br />

In <strong>de</strong>n Jahren nach Version 5.0 wur<strong>de</strong> nicht nur Perl auf Macintosh und Windows portiert, son<strong>de</strong>rn es verschob sich<br />

auch die Nummerierung <strong>de</strong>r Versionen. Da sich an <strong>de</strong>r Syntax nichts Wesentliches än<strong>de</strong>rte, beließ man die 5 und<br />

erhöhte bei größeren Meilensteinen die erste Nachkommastelle, verwen<strong>de</strong>te aber zusätzliche Nummern um die<br />

Zwischenschritte zu zählen. Da Perl erst ab 5.6 mit Versionsnummern, die mehrere Kommata enthalten, umgehen<br />

konnte, wur<strong>de</strong>n sie bis dahin z. B. Perl 5.001 o<strong>de</strong>r Perl 5.001012 geschrieben. Ab 5.6 wur<strong>de</strong> auch das<br />

Versionsschema von Linux übernommen, bei <strong>de</strong>m gera<strong>de</strong> Nummern auf Fehlerfreiheit gepflegte Benutzerversionen<br />

hin<strong>de</strong>uten und ungera<strong>de</strong> auf Entwicklerversionen, in die neue Funktionen einfließen. Serien von Benutzerversionen<br />

(z. B. 5.8.x) wer<strong>de</strong>n untereinan<strong>de</strong>r binär kompatibel gehalten, was be<strong>de</strong>utet, dass ein für Perl 5.8.7 kompiliertes<br />

Binärmodul auch mit 5.8.8, nicht jedoch mit 5.10 o<strong>de</strong>r 5.6.1 funktioniert.<br />

Perl 5.6<br />

Diese Version brachte einige neue experimentelle Fähigkeiten, die erst später ausreiften, wie Unico<strong>de</strong> und UTF-8,<br />

Threads und cloning. Auch 64-Bit-Prozessoren konnten nun genutzt wer<strong>de</strong>n. Sprachlich fügte diese von Gurusamy<br />

Sarathy geleitete Reihe vor allem lexikalisch globale Variablen (mit our) und eine Vektorschreibweise, die <strong>de</strong>n<br />

Vergleich mehrstelliger Versionsnummern erlaubt, sowie die Spezialvariablen @- und @+, ein.<br />

Perl 5.8<br />

Mit <strong>de</strong>r von Nicholas Clark betreuten Reihe 5.8.x wur<strong>de</strong>n vor allem die Probleme mit Unico<strong>de</strong> und <strong>de</strong>n Threads<br />

behoben, aber auch die Ein-/Ausgabe (IO), Signale und die numerische Genauigkeit wur<strong>de</strong>n entschei<strong>de</strong>nd verbessert.<br />

Perl 5.10<br />

Neben verringertem Speicherverbrauch und einer erneuerten und nun auch austauschbaren Regex-Maschine brachte<br />

diese Version unter <strong>de</strong>r Führung von Rafaël Garcia-Suarez vor allem Neuerungen, die <strong>de</strong>m Entwurf von Perl 6<br />

entstammen und <strong>de</strong>ren Gebrauch entwe<strong>de</strong>r einzeln o<strong>de</strong>r kollektiv mit use feature ':5.10'; angemel<strong>de</strong>t wer<strong>de</strong>n muss.<br />

Hierzu zählen say, given und when (analog zur switch-Anweisung in C), <strong>de</strong>r smartmatch-Operator (~~), <strong>de</strong>r <strong>de</strong>fined<br />

or-Operator (//) und state-Variablen, welche die Erzeugung von Closures vereinfachen. Weitere nennenswerte<br />

Neuheiten umfassen <strong>de</strong>n verlagerbaren Installationspfad, stapelbare Dateitestoperatoren, <strong>de</strong>finierbare lexikalische<br />

Pragmas, optionale C3-Serialisierung <strong>de</strong>r Objektvererbung und field hashes (für „insi<strong>de</strong> out“-Objekte). Die<br />

Regex-Engine arbeitet nun iterativ statt rekursiv, was nun rekursive Ausdrücke ermöglicht. Komplexe Suchanfragen<br />

können nun auch verständlicher und weniger fehleranfällig durch named captures formuliert wer<strong>de</strong>n. Die<br />

Spezialvariablen $# und $* sowie die Interpreterschnittstellen perlcc und JPL wur<strong>de</strong>n entfernt.<br />

Aktuelle Versionen<br />

Auch wenn die neueste Benutzerversion 5.10.1 lautet, wer<strong>de</strong>n <strong>de</strong>rzeit die Versionsreihen 5.8.x und 5.6.x weiterhin<br />

gepflegt, da sie von <strong>de</strong>n meisten Programmen und Webservern verwen<strong>de</strong>t wer<strong>de</strong>n. Deswegen gelten sowohl 5.8.9<br />

und geringer auch 5.6.2 als aktuelle Versionen. 5.005 und 5.004 sind veraltet, wichtige Module funktionieren mit<br />

ihnen aber weiterhin, wobei 5.005 noch minimal weitergepflegt wird. Derzeitige Än<strong>de</strong>rungen fin<strong>de</strong>n im<br />

Entwicklerzweig 5.11 statt, <strong>de</strong>r nicht für allgemeine Benutzung bestimmt ist. Die nächste Perlversion wird 5.12 und<br />

nicht Perl 6 sein, welches ein Langzeitprojekt ist. Die Sprache, <strong>de</strong>r Interpreter und die umgeben<strong>de</strong> Infrastruktur<br />

sollen vollständig neu gestaltet wer<strong>de</strong>n.


Perl (<strong>Programmiersprache</strong>) 111<br />

Perl 6<br />

Am 19. Juli 2000 auf <strong>de</strong>r TPC 4 [5] wur<strong>de</strong> Perl 6 als die Version <strong>de</strong>r<br />

Perl-Gemeinschaft angekündigt. Nach<strong>de</strong>m Larry Wall mehrere hun<strong>de</strong>rt<br />

Vorschläge auswertete und thematisch sortierte, schrieb er je Thema<br />

einen Überblick seiner Vorstellungen (Apocalypse genannt), <strong>de</strong>r nach<br />

Diskussionen in <strong>de</strong>n Mailinglisten von Damian Conway zu einer<br />

<strong>de</strong>taillierten Exegese formuliert wird. In <strong>de</strong>n folgen<strong>de</strong>n Jahren wur<strong>de</strong><br />

die Sprache in kleinerem Kreis (meist über die p6l Mailingliste)<br />

weiterentwickelt und dabei <strong>de</strong>r aktuelle Stand in wesentlich knapperen<br />

Synopsen festgehalten.<br />

Dabei wird die Sprache entrümpelt und mit neuen Fähigkeiten<br />

ausgestattet [6] . Unter an<strong>de</strong>rem wur<strong>de</strong> die Objektorientierung komplett<br />

neu gestaltet und funktionale Programmierelemente wie<br />

Hyperoperatoren und Junctions eingeführt. Makros wer<strong>de</strong>n Sourcefilter<br />

ablösen und die neu systematisierten und erweiterten regulären<br />

Ausdrücke lassen sich zu ableitbaren Grammatiken zusammenfassen,<br />

was eine lex-ähnliche Programmierweise erlaubt. Sie wer<strong>de</strong>n mit <strong>de</strong>m<br />

smart match-Operator ~~ angewen<strong>de</strong>t <strong>de</strong>r je nach Kontext<br />

verschie<strong>de</strong>ne Arten von Daten, Datenstrukturen und auch Inhalte von<br />

Symboltabellen vergleichen kann. Die Neugestaltung <strong>de</strong>r Syntax ist in<br />

Auch Damian Conway ist an <strong>de</strong>r Neugestaltung<br />

<strong>de</strong>r Sprache beteiligt.<br />

großen Teilen abgeschlossen, lediglich Feinheiten wer<strong>de</strong>n noch geän<strong>de</strong>rt. Nur einzelne Bereiche wie z. B. Threads<br />

wur<strong>de</strong>n aber noch gar nicht abge<strong>de</strong>ckt.<br />

Als Interpreter für Perl 6 ist eine neue registerbasierte virtuelle Maschine namens Parrot in Entwicklung, die neben<br />

Perl 6 noch viele an<strong>de</strong>re Sprachen kompilieren (in Byteco<strong>de</strong> übersetzen) und ausführen können soll. Sie wur<strong>de</strong> von<br />

Dan Sugalski und Chip Salzenberg entworfen und wird <strong>de</strong>rzeit von Allison Randal und Patrick Michaud betreut,<br />

wobei letzterer für die Parrot Compiler Tools (PCT) zuständig ist, einem Satz für Parrot geschriebener Werkzeuge,<br />

<strong>de</strong>r die Erstellung von Parsern beschleunigt. Der auf Parrot und PCT basieren<strong>de</strong> Perl 6-Interpreter nennt sich<br />

Rakudo.<br />

Audrey Tang leitet seit Anfang Februar 2005 die Entwicklung <strong>de</strong>s alternativen Perl-6-Compilers namens Pugs in <strong>de</strong>r<br />

Sprache Haskell. Lange Zeit war Pugs <strong>de</strong>r langsamste aber vollständigste Perl-6-Interpreter und ermöglichte es,<br />

zahlreiche Details <strong>de</strong>r Sprache vorzuführen, zu testen und nachzubearbeiten. Auch die umfangreiche und in Perl 6<br />

geschriebene Perl-6-Testsuite entstammt <strong>de</strong>m Pugs-Quellco<strong>de</strong>.<br />

Mittlerweile gibt es neben Rakudo und Pugs weitere Interpreter, Compiler- und Parser-Projekte, mit<br />

unterschiedlichen Schwerpunkten wie SMOP (Meta-OOP-runloop), elf und gimme5. Die Sprachsyntax ist in <strong>de</strong>r<br />

STD.pm vollständig mit Hilfe <strong>de</strong>r Perl 6-Regex <strong>de</strong>finiert, die von einigen Interpretern auch zum Parsen eingesetzt<br />

wird.


Perl (<strong>Programmiersprache</strong>) 112<br />

Merkmale<br />

Prinzipien<br />

Perl wur<strong>de</strong> für <strong>de</strong>n praktischen Einsatz entwickelt und konzentriert sich daher auf schnelle und einfache<br />

Programmierbarkeit, Vollständigkeit und Anpassbarkeit. Diese Philosophie drückt sich in <strong>de</strong>n folgen<strong>de</strong>n<br />

Schlagworten o<strong>de</strong>r Phrasen aus, die meist von Larry Wall stammen.<br />

Mehrere Wege<br />

Das bekannteste und grundlegendste Perl-Motto ist „There is more than one way to do it“, kurz TIMTOWTDI o<strong>de</strong>r<br />

(mit englischer Kontraktion) gesprochen „Tim Toady“. Zu Deutsch: „Es gibt mehr als einen Weg, etwas zu tun“. Perl<br />

macht im Gegensatz zu Sprachen wie Python weniger Vorgaben und bietet absichtlich für je<strong>de</strong>s Problem mehrere<br />

Formulierungs- und Lösungsmöglichkeiten (Syntaktischer Zucker). Zum Beispiel kann man logische Operatoren als<br />

|| und && (wie in C) o<strong>de</strong>r (mit Be<strong>de</strong>utungsnuancen) als or und and (wie in Pascal) schreiben; aber auch zahlreiche<br />

Befehle mit einem sich überschnei<strong>de</strong>n<strong>de</strong>n Funktionsumfang wie map und for erlauben verschie<strong>de</strong>ne Formulierungen<br />

für <strong>de</strong>n gleichen Sachverhalt. Einige Befehle wie <strong>de</strong>r Diamant-Operator () bieten verkürzte Schreibweisen für<br />

bereits vorhan<strong>de</strong>ne Funktionalität. Diese Vielfalt wird auch im CPAN sichtbar, wo oft mehrere Module einen sehr<br />

ähnlichen Zweck erfüllen.<br />

Ein weiteres Schlagwort, das man auch als Erweiterung von TIMTOWTDI sehen kann, bezeichnet Perl als die erste<br />

postmo<strong>de</strong>rne <strong>Programmiersprache</strong>. Damit ist gemeint, dass Perl verschie<strong>de</strong>ne Paradigmen vereint und es <strong>de</strong>m<br />

Benutzer frei steht, strukturierte, objektorientierte, funktionale und imperative Sprachmerkmale zu kombinieren.<br />

Einfach und möglich<br />

Der an<strong>de</strong>re wichtige Merksatz ist Perl makes easy jobs easy and hard jobs possible, was zu <strong>de</strong>utsch be<strong>de</strong>utet Perl<br />

hält die einfachen Aufgaben einfach und macht (die Lösung) schwierige(r) Aufgaben möglich. Dies beinhaltet zum<br />

ersten das Ziel, gängige Aufgaben möglichst mit kurzen „fertigen Lösungen“ zu vereinfachen. Zum Beispiel prüft -e<br />

dateiname die Existenz einer Datei. Einfache Aufgaben einfach zu belassen be<strong>de</strong>utet für Perl aber auch, möglichst<br />

keine vorbereiten<strong>de</strong>n Programmieranweisungen zu verlangen, wie das Anmel<strong>de</strong>n von Variablen o<strong>de</strong>r das Schreiben<br />

einer Klasse. Zweitens versucht Perl vollständig zu sein und für je<strong>de</strong>s Problem min<strong>de</strong>stens die Grundlagen<br />

bereitzustellen, die eine Lösung möglich machen. Das dritte Ziel, die bei<strong>de</strong>n ersten Ziele nicht kollidieren zu lassen,<br />

gewinnt mit <strong>de</strong>m wachsen<strong>de</strong>m Sprachumfang von Perl 6 immer mehr an Be<strong>de</strong>utung, wo in Anlehnung an <strong>de</strong>n<br />

Huffman-Co<strong>de</strong> die Schreibweisen <strong>de</strong>r am häufigsten verwen<strong>de</strong>ten Befehle möglichst kurz gehalten sind, ohne mit<br />

<strong>de</strong>r Logik <strong>de</strong>r Schreibweise ähnlicher Befehle zu brechen.<br />

Kontextsensitiv<br />

In Perl gibt es Befehle, die verschie<strong>de</strong>ne Be<strong>de</strong>utungen haben, je nach<strong>de</strong>m in welchem Zusammenhang sie benutzt<br />

wer<strong>de</strong>n. Derart kontextsensitiv sind Datenstrukturen wie das Array. Wird es einem an<strong>de</strong>ren Array zugewiesen, wird<br />

<strong>de</strong>ssen Inhalt übergeben; ist <strong>de</strong>r Empfänger ein einzelner Wert (Skalar), erhält dieser die Länge <strong>de</strong>s Arrays.<br />

Technische Merkmale<br />

Der Perl-Interpreter selbst ist ein in C geschriebenes Programm, das auf annähernd je<strong>de</strong>m Betriebssystem<br />

kompilierbar ist. Vorkompilierte Versionen auf selten verwen<strong>de</strong>ten Systemen wie zum Beispiel BeOS o<strong>de</strong>r OS/2<br />

sind jedoch nicht immer auf <strong>de</strong>m neuesten Stand. Der Quellco<strong>de</strong> umfasst circa 50 MB und enthält auch Perl-Skripte,<br />

die die Funktion von Makefiles, und <strong>de</strong>r Test-Suite übernehmen. Aktuell ist das kompilierte Programm circa 850 KB<br />

groß, was aber je nach Betriebssystem, verwen<strong>de</strong>tem Compiler und Bibliotheken variieren kann.<br />

Perl-Skripte wer<strong>de</strong>n in Textdateien mit beliebigem Zeilentrennzeichen gespeichert. Beim Start eines Skripts wird es<br />

vom Perl-Interpreter eingelesen, in einen Parse Tree umgewan<strong>de</strong>lt, dieser zu Byteco<strong>de</strong>, welcher dann ausgeführt


Perl (<strong>Programmiersprache</strong>) 113<br />

wird. Der im Interpreter integrierte Parser ist eine angepasste Version von GNU Bison.<br />

Strenggenommen ist Perl daher keine interpretierte Sprache, da ein Perl-Programm vor je<strong>de</strong>r Ausführung kompiliert<br />

wird. Das führt etwa dazu, dass – an<strong>de</strong>rs als bei rein interpretierten Sprachen – ein Programm mit Syntaxfehlern<br />

nicht startet.<br />

Verbreitung<br />

Zu Beginn war Perl ein UNIX-Werkzeug, das beson<strong>de</strong>rs auf die Verarbeitung von Textdateien, Steuerung an<strong>de</strong>rer<br />

Programme sowie zur Ausgabe von Berichten ausgelegt war. Dafür wird es bis heute, nicht nur von<br />

Systemadministratoren, auf allen verbreiteten Betriebssystemen eingesetzt. Dabei bekam Perl auch <strong>de</strong>n Ruf einer<br />

glue language („Klebstoff-Sprache“), weil mit Hilfe von relativ schnell geschriebenen Perl-Skripten inkompatible<br />

Software verbun<strong>de</strong>n wer<strong>de</strong>n kann. Bis heute gehört Perl auf allen POSIX-kompatiblen und Unix-ähnlichen Systemen<br />

zur Grundausstattung.<br />

Mit <strong>de</strong>r Verbreitung <strong>de</strong>s World Wi<strong>de</strong> Web wur<strong>de</strong> Perl zunehmend benutzt, um Webserver, Datenbanken und weitere<br />

Programme und Daten zu verbin<strong>de</strong>n und die Ergebnisse in Form von HTML-Seiten auszugeben. Der Perl-Interpreter<br />

wird dabei über CGI o<strong>de</strong>r FastCGI vom Webserver angesprochen o<strong>de</strong>r ist direkt im Server eingebettet. (mod_perl im<br />

Apache, ActiveState PerlEx im Microsoft IIS). Auch wenn für diese serverseitige Skript-Programmierung PHP<br />

mittlerweile populärer wur<strong>de</strong>, wird Perl weiterhin von vielen großen und kleinen Seiten und Internetdiensten wie<br />

Amazon.com, IMDB.com, slashdot.org, MovableType und LiveJournal verwen<strong>de</strong>t. Da Perl-Skripte oft kaum<br />

erkennbar an vielen wichtigen Stellen arbeiten, wur<strong>de</strong> Perl auch scherzhaft als das Klebeband bezeichnet, welches<br />

das Internet zusammenhält. In Perl entstan<strong>de</strong>n auch Frameworks wie Mason, Embperl, Maypole, Catalyst und Jifty,<br />

die eine sehr schnelle Entwicklung komplexer und leicht verän<strong>de</strong>rbarer Internetseiten erlauben. Auch Wiki-Software<br />

ist häufig in Perl geschrieben wie z. B. Socialtext das auf Mason basiert, Kwiki, TWiki, ProWiki o<strong>de</strong>r UseMod.<br />

Auch verbreitete Ticket-Systeme mit Webschnittstelle wie Bugzilla o<strong>de</strong>r RT sind in Perl geschrieben.<br />

Jedoch sind WWW-Anwendungen weiterhin nur eines <strong>de</strong>r vielen Einsatzgebiete von Perl. Wichtige Perl-Programme<br />

im E-Mail-Bereich sind SpamAssassin (Spam-Filter), PopFile und open webmail. Zur Systemverwaltung wird Perl<br />

zum Beispiel in Debconf, einem Teil <strong>de</strong>r Paketverwaltung <strong>de</strong>s Betriebssystems Debian, benutzt. Auch automake, ein<br />

Teil <strong>de</strong>s GNU Build System, ist in Perl geschrieben.<br />

Weitere Hauptanwendungsfel<strong>de</strong>r sind das Data-Munging und die Bioinformatik, wo Perl seit etwa 1995 die am<br />

häufigsten verwen<strong>de</strong>te Sprache war und immer noch be<strong>de</strong>utend ist. Grün<strong>de</strong> hierfür sind wie<strong>de</strong>r die Fähigkeit,<br />

Informationen in Textform zu verarbeiten, und die Flexibilität und Offenheit <strong>de</strong>r Sprache, die es <strong>de</strong>r internationalen<br />

Forschergemein<strong>de</strong> erlauben, trotz unterschiedlicher Standards <strong>de</strong>r Institute zusammenzuarbeiten. BioPerl ist hier die<br />

wichtigste Sammlung frei erhältlicher Werkzeuge, die sich vor allem auf das Gebiet <strong>de</strong>r Genomsequenzenanalyse<br />

konzentriert. Beim Human Genome Project spielte Perl eine wichtige Rolle.<br />

Auch Desktop-Anwendungen und Spiele wie Frozen Bubble können in Perl geschrieben wer<strong>de</strong>n. Programme in Perl<br />

sind schneller zu entwickeln als mithilfe kompilierter Sprachen. Die heutigen Computer sind schnell genug, diese<br />

Programme flüssig auszuführen.<br />

Bereiche, in <strong>de</strong>nen Skriptsprachen wie Perl nicht sinnvoll eingesetzt wer<strong>de</strong>n können, sind zum einen Anwendungen<br />

mit hohen Anfor<strong>de</strong>rungen an Hardware-Nähe o<strong>de</strong>r Geschwindigkeit wie zum Beispiel Treiber o<strong>de</strong>r Co<strong>de</strong>cs. Zum<br />

an<strong>de</strong>ren sollten sie nicht in stark sicherheitskritischen Bereichen (z. B. Flugzeugsteuerung) Verwendung fin<strong>de</strong>n, da<br />

aufgrund <strong>de</strong>r laxen Syntaxprüfung (z. B. fehlen<strong>de</strong>s/sehr schwaches Typsystem) viele Fehler erst zur Laufzeit<br />

auftreten und eine Verifizierung im allgemeinen nicht möglich ist.


Perl (<strong>Programmiersprache</strong>) 114<br />

Perl und an<strong>de</strong>re <strong>Programmiersprache</strong>n<br />

Für Aufgaben, die mit Perl nur schwierig o<strong>de</strong>r langsam lösbar sind, bietet Perl mit <strong>de</strong>m Modul Inline [7] eine<br />

Schnittstelle an, über die Programmteile in an<strong>de</strong>ren Sprachen in ein Perl-Programm eingebun<strong>de</strong>n wer<strong>de</strong>n können.<br />

Unterstützte Sprachen sind u. a. C, C++, Assembler, Java, Python, Ruby, Fortran und Octave[8].<br />

Anwendungsgebiete sind z. B.:<br />

• Rechenintensive Formeln (C, Assembler),<br />

• Lösung komplexer Probleme mit existieren<strong>de</strong>n Systemen (Octave, Fortran-Bibliotheken) und<br />

• Zusammenführen von Anwendungen in unterschiedlichen Sprachen („Glue-Funktion“ von Perl).<br />

Die Anwendung von Inline ist relativ einfach und gut dokumentiert. Bei compilierten Programmteilen führt Inline<br />

mittels MD5-Kennung Buch über <strong>de</strong>n Versionsstand, wodurch Mehrfachcompilierung <strong>de</strong>s gleichen Co<strong>de</strong>s<br />

vermie<strong>de</strong>n wird.<br />

Bei Inline erfor<strong>de</strong>rt die Übergabe <strong>de</strong>r Parameter und Rückgabe <strong>de</strong>r Ergebnisse einigen Aufwand. Bei kurzen<br />

Berechnungen überwiegt dieser Aufwand <strong>de</strong>n Gewinn an Geschwindigkeit. Wird zum Beispiel die<br />

Man<strong>de</strong>lbrot-Menge berechnet, in<strong>de</strong>m die Formel über Inline als C-Funktion berechnet, die Iteration<br />

aber in Perl belassen wird, verlangsamt sich die Programmausführung gegenüber einer reinen Perl Implementierung.<br />

Wird hingegen auch die Iterationsschleife in C ausgelagert, steigert sich die Performance signifikant.<br />

Logos<br />

Als Maskottchen von Perl dient ein Dromedar. Es zierte erstmals <strong>de</strong>n<br />

Umschlag <strong>de</strong>s auch als Kamelbuch bekannten Referenzwerkes<br />

Programming Perl. Sein Verleger (Tim O’Reilly) sagte in einem<br />

Interview scherzhaft als Begründung: Perl ist hässlich und kommt über<br />

lange Strecken ohne Wasser aus. Das Dromedar ist auf <strong>de</strong>m<br />

Programming Republic of Perl Emblem zu sehen, das oft als offizielles<br />

Perl-Logo angesehen wird und <strong>de</strong>ssen nichtkommerziellen Gebrauch<br />

O’Reilly gestattet. An<strong>de</strong>re im Zusammenhang mit Perl benutzte Logos<br />

sind neben Perlen die aufgeschnittene Zwiebel (Erkennungszeichen <strong>de</strong>r<br />

Perl Foundation) und <strong>de</strong>r Komodowaran, <strong>de</strong>r die weit verbreitete<br />

Perl-Distribution ActivePerl von ActiveState schmückt.<br />

Kritikpunkte<br />

Tim O’Reilly zählte viele Jahre zu Perls<br />

wichtigsten Unterstützern<br />

Häufigster Kritikpunkt an Perl ist seine mangeln<strong>de</strong> Lesbarkeit. Tatsächlich bietet Perl überdurchschnittlich viele<br />

Freiheiten, die zu unleserlichem Co<strong>de</strong> führen können (siehe Disziplinen). An<strong>de</strong>rerseits ermöglicht es die gleiche<br />

Freiheit auch, nahe an <strong>de</strong>r logischen Struktur <strong>de</strong>s Problems o<strong>de</strong>r <strong>de</strong>m menschlichen Verständnis zu programmieren.<br />

Die von Perl-Programmierern geschätzte Freiheit, persönlichen Vorlieben nachzugehen, muss bei Projekten, die von<br />

mehreren Programmierern o<strong>de</strong>r über längere Zeiträume entwickelt wer<strong>de</strong>n, durch selbst auferlegte Regeln<br />

eingeschränkt wer<strong>de</strong>n, um spätere Probleme zu vermei<strong>de</strong>n. Dies erfor<strong>de</strong>rt zusätzlichen Kommunikationsaufwand<br />

o<strong>de</strong>r die Verwendung von Software wie Perl::Critic.<br />

Einige Teile <strong>de</strong>r Syntax, wie die Objektorientierung und Signaturen, sind zwar einfach und sehr mächtig, wer<strong>de</strong>n<br />

aber häufig gegenüber vergleichbaren Sprachen wie Python o<strong>de</strong>r Ruby als veraltet wahrgenommen und for<strong>de</strong>rn bei<br />

standardisierten Herangehensweisen, beson<strong>de</strong>rs von Perl-Anfängern, zusätzliche Tipp- und Denkarbeit. Diese<br />

Probleme sollen mit Perl 6 behoben wer<strong>de</strong>n o<strong>de</strong>r können mit zusätzlichen, für Perl 5 erhältlichen Modulen<br />

umgangen wer<strong>de</strong>n.<br />

Weiterhin wird Perl vorgeworfen, es verletze die UNIX-Philosophie (siehe dazu <strong>de</strong>n Abschnitt Entstehung).


Perl (<strong>Programmiersprache</strong>) 115<br />

Starke Kritik wird auch gegen Perl 6 erhoben, das zu hoch gesteckte Ziele habe und nach 7 Jahren angeblich immer<br />

noch keine sichtbaren Ergebnisse bringe und statt <strong>de</strong>ssen die Zukunft von Perl (5) lähme. Perl 6 war von Anfang an<br />

als Langzeitprojekt ausgerufen, das ausschließlich auf nicht immer planbarer Freiwilligenarbeit und kaum auf<br />

finanzieller Unterstützung beruht. Seine konkreten Ziele zeichneten sich erst im Verlauf <strong>de</strong>r Entwicklung ab, und es<br />

gab ein<strong>de</strong>utige Probleme bei <strong>de</strong>r Kommunikation und <strong>de</strong>r Außendarstellung. Allerdings enthält die aktuelle<br />

Perl-Version 5.10 bereits vielsprechen<strong>de</strong> Neuerungen aus Perl 6, Pugs und Rakudo können große Teile von Perl 6<br />

ausführen und <strong>de</strong>r Perl 6-rules-Compiler PGE beeindruckte auf Fachkonferenzen als Werkzeug für <strong>de</strong>n Parserbau.<br />

Syntax<br />

Freies Format<br />

Perl erlaubt bedingt formatfreien Quellco<strong>de</strong>. Das be<strong>de</strong>utet, dass Einrückungen und zusätzliche Leerzeichen<br />

syntaktisch unerheblich sind und auch Zeilenumbrüche nach Belieben eingefügt wer<strong>de</strong>n können. Dafür müssen<br />

Befehle eines Blocks mit Semikolon getrennt wer<strong>de</strong>n. Einige Sprachelemente wie Formate, heredocs und<br />

gewöhnliche reguläre Ausdrücke sind nicht formatfrei.<br />

Variablen<br />

Charakteristisch für Perl ist, dass Variablen durch ein Präfix (auch Sigil genannt) gekennzeichnet wer<strong>de</strong>n, das ihren<br />

Datentyp anzeigt. Hier einige Beispiele:<br />

• $ für Skalare: $scalar<br />

• @ für Arrays: @array<br />

• % für Hashes/assoziative Arrays: %hash<br />

• & für Funktionen (oft optional): &function<br />

• * für Typeglobs: *all<br />

Datei-Handles, Verzeichnis-Handles und Formate besitzen kein Präfix, sind aber ebenfalls eigenständige<br />

Datentypen. Je<strong>de</strong>r Datentyp hat in Perl seinen eigenen Namensraum.<br />

Basisdatentypen in Perl sind skalare Variablen, Arrays und Hashes (assoziative Arrays).<br />

• Skalare sind typlose Variablen für einzelne Werte; es können Strings, Zahlen o<strong>de</strong>r Referenzen auf an<strong>de</strong>re Daten<br />

o<strong>de</strong>r Funktionen in ihnen gespeichert sein.<br />

• Arrays fassen mehrere Skalare unter einem Variablennamen zusammen. Arrayeinträge haben einen In<strong>de</strong>x. Die<br />

Zählung beginnt bei 0, wenn nichts an<strong>de</strong>res <strong>de</strong>finiert wur<strong>de</strong>.<br />

• Hashes fassen ebenfalls Skalare zusammen, allerdings wer<strong>de</strong>n hier Einzelwerte (Values) nicht über numerische<br />

Indizes, son<strong>de</strong>rn mit Hilfe zugehöriger Keys (Schlüssel) ein<strong>de</strong>utig i<strong>de</strong>ntifiziert und angesprochen. Als Schlüssel<br />

kann man eine beliebige Zeichenkette benutzen, o<strong>de</strong>r auch alles, was sich in eine Zeichenkette umwan<strong>de</strong>ln lässt.<br />

Hashes und Arrays lassen sich einan<strong>de</strong>r zuweisen, wobei Hashes als Listen von Key/Value-Paaren betrachtet<br />

wer<strong>de</strong>n. Daten verschie<strong>de</strong>nen Typs lassen sich mittels Referenzen beliebig zu neuen Datenstrukturen kombinieren,<br />

beispielsweise sind Hashes <strong>de</strong>nkbar, die neben (Referenzen auf) Arrays auch einzelne Skalare enthalten.<br />

Package-Variablen wer<strong>de</strong>n automatisch erstellt, sobald sie das erste Mal verwen<strong>de</strong>t wer<strong>de</strong>n. Weitaus häufiger im<br />

mo<strong>de</strong>rnen Sprachgebrauch kommen gültigkeitsbeschränkte Variablen zum Einsatz. Diese müssen mittels my<br />

<strong>de</strong>klariert wer<strong>de</strong>n. un<strong>de</strong>f variable gibt die angegebene Variable wie<strong>de</strong>r frei.


Perl (<strong>Programmiersprache</strong>) 116<br />

Kontrollstrukturen<br />

Die grundlegen<strong>de</strong>n Kontrollstrukturen unterschei<strong>de</strong>n sich kaum von <strong>de</strong>nen in C, Java und JavaScript.<br />

Bedingte Ausführung<br />

if funktioniert wie aus C bekannt; unless (), eine Beson<strong>de</strong>rheit von Perl, ist eine Schreibweise für if<br />

(!()). Eine Case- o<strong>de</strong>r Switch-Anweisung (given when) gibt es erst ab Perl 5.10, vorher musste man<br />

diese Struktur mit if … elsif … else nachbil<strong>de</strong>n. Jedoch setzt given die Kontextvariable ($_) wie for und when<br />

wen<strong>de</strong>t smartmatch (~~) darauf an, was dieses Konstrukt ungleich vielfältiger einsetzbar macht als traditionelle<br />

Case-Befehle. Das optionale <strong>de</strong>fault entspricht hier einem else. Die optimierten logischen Operatoren erlauben auch<br />

eine bedingte Ausführung. Bei or (bzw. ||) wird <strong>de</strong>r zweite Ausdruck ausgeführt, wenn das Ergebnis <strong>de</strong>s ersten kein<br />

wahrer Wert ist, and (bzw. &&) funktioniert analog. if () {} [elsif ()<br />

{}] [else {}] unless () {} [else {}]<br />

given () { [when () {}] [<strong>de</strong>fault {}] }<br />

? : ;<br />

|| ;<br />

&& ;<br />

Schleifen<br />

Wie in C iterieren while und for (in <strong>de</strong>r an C angelehnten Variante), solange die Bedingung wahr ist, until, bis sie<br />

wahr ist, und foreach iteriert über eine Liste. In Perl 5 sind for und foreach austauschbar.<br />

[label:] while ()<br />

{} [continue {}]<br />

[label:] until ()<br />

{} [continue {}]<br />

[label:] for ([]; [];<br />

[])<br />

{} [continue {}]<br />

[label:] for[each] [[my] $element] ()<br />

{} [continue {}]<br />

last verlässt sofort die Schleife, redo wie<strong>de</strong>rholt die <strong>de</strong>rzeitige Iteration, und next springt zum continue-Block, bevor<br />

es dann mit <strong>de</strong>r nächsten Iteration fortfährt. Diese Befehle können von einem Label-Bezeichner gefolgt sein, <strong>de</strong>r bei<br />

geschachtelten Strukturen bestimmt, auf welche Schleife sich <strong>de</strong>r Befehl bezieht.<br />

do {} while ; # Spezialfall: in<br />

dieser Form<br />

do {} until ; # min<strong>de</strong>stens eine<br />

Ausführung


Perl (<strong>Programmiersprache</strong>) 117<br />

Nachgestellte Kontrollstrukturen<br />

Die oberhalb aufgezählten Kontrollstrukturen beziehen sich auf einen Block mit mehreren Anweisungen. Bei<br />

einzelnen Anweisungen kann man auch die verkürzte, nachgestellte Schreibweise wählen, die auch <strong>de</strong>n<br />

(englischsprachigen) Lesern das Verständnis durch natürlichsprachige Formulierung erleichtert.<br />

if ;<br />

unless ;<br />

for ;<br />

while ;<br />

until ;<br />

Reguläre Ausdrücke<br />

Seit seinen Anfängen waren Reguläre Ausdrücke (Regex) ein beson<strong>de</strong>res Merkmal von Perl, da ähnliche Fähigkeiten<br />

bis dahin meist nur spezialisierte Sprachen wie Snobol und awk hatten. Durch die große Verbreitung setzte Perl<br />

einen inoffiziellen Standard, <strong>de</strong>r durch die von Perl unabhängige und auch teilweise abweichen<strong>de</strong> Bibliothek PCRE<br />

aufgegriffen wur<strong>de</strong>, die heute von mehreren be<strong>de</strong>uten<strong>de</strong>n Sprachen und Projekten verwen<strong>de</strong>t wird.<br />

Seit Version 5.0 hat Perl seine Regex-Fähigkeiten um viele Funktionen, wie z. B. Rückwärtsreferenzen, erweitert.<br />

Auch lassen sich Reguläre Ausdrücke in Perl wesentlich direkter – als z. B. in Java – mit <strong>de</strong>m =~-Operator<br />

verwen<strong>de</strong>n, da sie Kernbestandteil <strong>de</strong>r Sprache sind und nicht eine zuschaltbare Bibliothek. Der eigentliche Reguläre<br />

Ausdruck wird mit Schrägstrichen als Begrenzungszeichen notiert. Weil Schrägstriche häufig auch innerhalb<br />

Regulärer Ausdrücke vorkommen können, dürfen auch viele an<strong>de</strong>re Zeichen zur Begrenzung verwen<strong>de</strong>t wer<strong>de</strong>n. Das<br />

verbessert die Lesbarkeit, weil man so Zeichen wählen kann, die sich vom Inhalt <strong>de</strong>s Regulären Ausdrucks abheben.<br />

Perl kennt zwei Befehle für Reguläre Ausdrücke, <strong>de</strong>ren Verhalten mit vielen nachgestellten Optionen verän<strong>de</strong>rt<br />

wer<strong>de</strong>n kann.<br />

• Der m-Befehl steht für match, was Übereinstimmung be<strong>de</strong>utet. Das m kann weggelassen wer<strong>de</strong>n, wenn man die<br />

Standardbegrenzungszeichen für Reguläre Ausdrücke, nämlich Schrägstriche, verwen<strong>de</strong>t. Der folgen<strong>de</strong> Ausdruck<br />

durchsucht <strong>de</strong>n Inhalt <strong>de</strong>r Variable $var und liefert einen Array von Zeichenketten, auf die <strong>de</strong>r Suchausdruck<br />

passt. Mit aktivierter g-Option liefert die Suche im Listenkontext alle Fun<strong>de</strong>, <strong>de</strong>aktiviert alle erkannten<br />

Subausdrücke. Im Skalarkontext liefert <strong>de</strong>r Ausdruck einen positiven Wert wenn <strong>de</strong>r Suchausdruck gefun<strong>de</strong>n<br />

wur<strong>de</strong>, mit c-Option die Anzahl <strong>de</strong>r Fun<strong>de</strong>. i lässt Groß- und Kleinschreibung ignorieren, o Variablen nur einmal<br />

interpolieren, m <strong>de</strong>n String als mehrzeilig und s als einzeilig betrachten. Die x-Option ermöglicht es, <strong>de</strong>n<br />

Suchausdruck <strong>de</strong>r besseren Lesbarkeit wegen über mehrere Zeilen zu verteilen und ihn mit Kommentaren zu<br />

versehen.<br />

$var =~ [m]//[g[c]][i][m][o][s][x];<br />

• Der s-Befehl steht für substitute, was ersetzen be<strong>de</strong>utet. Er ersetzt <strong>de</strong>n Teil <strong>de</strong>s gegebenen Textes, auf <strong>de</strong>n <strong>de</strong>r<br />

Suchausdruck passt mit <strong>de</strong>m Ersatzausdruck.<br />

$var =~<br />

s///[e][g][i][m][o][s][x];<br />

Nach erfolgreicher Verwendung eines Regulären Ausdruckes stehen folgen<strong>de</strong> Son<strong>de</strong>rvariablen zur Verfügung:<br />

• $& – <strong>de</strong>r erkannte String<br />

• $’ – String vor <strong>de</strong>m erkannten String<br />

• $' – String nach <strong>de</strong>m erkannten String<br />

• $1..$n – Ergebnisse <strong>de</strong>r geklammerten Subausdrücke<br />

• $+ – <strong>de</strong>r letzte erkannte Subausdruck


Perl (<strong>Programmiersprache</strong>) 118<br />

• @- – Start-Offsets <strong>de</strong>r Treffer und Subtreffer<br />

• @+ – dazugehörige End-Offsets<br />

Der oft in einem Atemzug mit m// und s/// beschriebene Operator tr/// hat mit ihnen nur die Schreibweise gemein. Er<br />

lehnt sich an <strong>de</strong>n UNIX-Befehl tr an, <strong>de</strong>r <strong>de</strong>m Ersetzen einzelner Zeichen dient. Synonym kann statt tr auch y<br />

geschrieben wer<strong>de</strong>n.<br />

$var =~ tr///[c][d][s];<br />

Neben diesen bei<strong>de</strong>n kann auch <strong>de</strong>r Befehl split erwähnt wer<strong>de</strong>n, <strong>de</strong>r eine Zeichenfolge aufteilt anhand eines<br />

Trennzeichens, das auch ein Regulärer Ausdruck sein darf.<br />

Quoting und Interpolation<br />

Quoting-Operatoren:<br />

• q – quote nicht interpretierter String<br />

• qq – quote interpretierter String<br />

• qw – quote words, eine Liste von mit Whitespace (Leerraum) getrennten Strings<br />

• qr – quote regex<br />

• qx – quote auszuführen<strong>de</strong> externe Anwendung<br />

Alternatives Quoting und Variableninterpolation führen zu beson<strong>de</strong>rs gut lesbarem Co<strong>de</strong>. Ein Beispiel zur<br />

Ver<strong>de</strong>utlichung:<br />

• Stringverkettung und Quotingzeichen im Text machen <strong>de</strong>n Co<strong>de</strong> schlecht lesbar.<br />

$text = 'He\'s my friend ' . $name . ' from ' . $town . '.'<br />

. ' ' . $name . ' has worked in company "' . $company . '" for '<br />

. $years . ' years.';<br />

• Interpolation von Variablen im String machen das Ergebnis jetzt erkennbar. Escapes \ stören noch <strong>de</strong>n Textfluss.<br />

$text = "He's my friend $name from $town. $name has worked in company<br />

\"$company\" for $years years.";<br />

• Austausch <strong>de</strong>s Quotingzeichens macht Escapes überflüssig. Der Co<strong>de</strong> ist nun optimal. qq leitet das Quoting von<br />

Variablen im String ein. Das beliebige Zeichen danach ist das Quotingzeichen für diesen String.<br />

$text = qq{He's my friend $name from $town. $name has worked in company<br />

"$company" for $years years.};<br />

Perl-Kultur und Spaß<br />

Gemeinschaft<br />

Wie auch bei an<strong>de</strong>ren Projekten freier Software gibt es zwischen vielen<br />

Entwicklern und Benutzern <strong>de</strong>r Sprache beson<strong>de</strong>re soziale Bindungen, und<br />

es bil<strong>de</strong>te sich eine eigene Kultur daraus. Die Perl-Kultur ist von Offenheit,<br />

Gastlichkeit und Hilfsbereitschaft, aber auch von Individualismus,<br />

Spieltrieb und Humor geprägt. Anfangs war sicher Larry Wall hierfür ein<br />

Vorbild, da er durch an<strong>de</strong>re Projekte wie rn o<strong>de</strong>r patch bereits bei <strong>de</strong>r<br />

Veröffentlichung von Perl eine prominente Position in<br />

Logo <strong>de</strong>r Perl Foundation


Perl (<strong>Programmiersprache</strong>) 119<br />

UNIX-Entwicklerkreisen hatte, doch mittlerweile zählen auch Randal L. Schwartz, Damian Conway, Audrey Tang,<br />

Brian Ingerson und Adam Kennedy zu <strong>de</strong>n Leitfiguren, die durch ihre Arbeiten innerhalb <strong>de</strong>r „Szene“ große<br />

Beachtung fin<strong>de</strong>n. Im Gegensatz zu kommerziellen <strong>Programmiersprache</strong>n lassen sich fast alle Aktivitäten auf<br />

persönliche Motivationen zurückführen. Dementsprechend ist die Perl Foundation eine reine<br />

Freiwilligen-Organisation, die sich als Angelpunkt einer sich selbst verwalten<strong>de</strong>n Gemeinschaft versteht und die<br />

gespen<strong>de</strong>ten Gel<strong>de</strong>r für einflussreiche Projekte und Personen, Organisation von Entwicklerkonferenzen und <strong>de</strong>n<br />

Betrieb <strong>de</strong>r wichtigsten Perl betreffen<strong>de</strong>n Webseiten verwen<strong>de</strong>t.<br />

Treffen, Workshops und Konferenzen<br />

Lokale Benutzergruppen, die meist ein o<strong>de</strong>r zweimal im Monat zu zwanglosen Treffen einla<strong>de</strong>n, bei <strong>de</strong>nen auch<br />

Vorträge gehalten wer<strong>de</strong>n können, nennen sich Perl Mongers und sind in über 200 größeren Städten auf <strong>de</strong>r ganzen<br />

Welt zu fin<strong>de</strong>n. Größer, wesentlich straffer organisiert und meist lan<strong>de</strong>sbezogen sind die jährlichen Workshops, von<br />

<strong>de</strong>nen <strong>de</strong>r gut etablierte Deutsche Perl-Workshop [9] einer <strong>de</strong>r ersten war. Workshops wollen ambitionierte<br />

Entwickler in einem möglichst erschwinglichen Rahmen lokal zusammenführen. Ein ähnliches Ziel haben die<br />

größeren Yet Another Perl Conferences (YAPC), die für die Regionen Nordamerika, Europa, Asien und Israel<br />

abgehalten wer<strong>de</strong>n. Am größten, allerdings auch am teuersten ist die von O’Reilly in <strong>de</strong>n USA ausgerichtete The<br />

Perl Conference (TPF), die mittlerweile Teil <strong>de</strong>r OSCON ist.<br />

Disziplinen<br />

Viele Spracheigenschaften von Perl la<strong>de</strong>n dazu ein, Programmco<strong>de</strong> kreativ zu gestalten. Dies hat zu verschie<strong>de</strong>nen<br />

intellektuellen, teils humorvollen, teils skurrilen Wettbewerben und Traditionen um die <strong>Programmiersprache</strong> Perl<br />

geführt.<br />

Golf<br />

Poesie<br />

Obfuscation<br />

Golf ist eine Sportart für Programmierer, bei <strong>de</strong>r das kürzeste Programm (in ASCII-Zeichen), das eine<br />

gestellte Aufgabe vollständig erfüllt, gewinnt. Da Perl viele, teils trickreiche Kürzel und Abkürzungen<br />

gängiger Techniken kennt, ist dies eine beson<strong>de</strong>rs populäre Disziplin unter Perl-Programmierern.<br />

Da Perl viele Elemente <strong>de</strong>r englischen Sprache beinhaltet, gibt es regelrechte Wettbewerbe, in welchen die<br />

besten Beispiele in Perl-Poesie prämiert wer<strong>de</strong>n. Neben <strong>de</strong>r freien Form, die lediglich Perl zum Inhalt hat,<br />

wird hier versucht, Gedichte zu schreiben, die vom Interpreter ohne Warnungen und Fehlermeldungen<br />

ausgeführt wer<strong>de</strong>n [10] . Daneben gibt es auch noch einen Perl-Haiku-Wettbewerb, <strong>de</strong>r dieser japanischen<br />

Gedichtform gewidmet ist.<br />

Sehr berühmt und berüchtigt ist auch die Disziplin obfuscation (Verschleierung), für die es auch einen<br />

jährlichen Wettbewerb (<strong>de</strong>n „Obfuscated Perl Contest“) gibt, <strong>de</strong>r am ehesten mit <strong>de</strong>m International Obfuscated<br />

C Co<strong>de</strong> Contest vergleichbar ist, <strong>de</strong>n Larry Wall selbst zweimal gewann. Hier wird danach gestrebt, auf<br />

ungewöhnliche und kreative Art und Weise die Funktion eines Programms zu verschleiern. Dies ist in Perl<br />

beson<strong>de</strong>rs leicht, da es für fast alles Kürzel gibt, die Sprache selbst sehr dynamisch ist und viele Dinge<br />

abhängig vom Kontext automatisch geschehen, was auch oft als „Perl-Magie“ bezeichnet wird. Ein Beispiel<br />

von Mark Jason Dominus, das 2000 beim 5. Annual Obfuscated Perl Contest <strong>de</strong>n zweiten Preis gewann<br />

(dieses Programm gibt <strong>de</strong>n Text „Just another Perl / Unix hacker“ aus):<br />

@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona<br />

tsuJ";sub p{<br />

@p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord<br />

($p{$_})&6];$p{$_}=/


Perl (<strong>Programmiersprache</strong>) 120<br />

^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&&<br />

close$_}%p;wait until$?;map{/^r/&&}%p;$_=$d[$q];sleep<br />

rand(2)if/\S/;print<br />

JAPH<br />

Perligata<br />

Eine Art Unterkategorie von obfuscation ist die von Randal L.<br />

Schwartz öffentlich begonnene Disziplin JAPH. Das sind<br />

Signaturen, die kleine Perl-Programme enthalten, welche meist<br />

nur <strong>de</strong>n Namen <strong>de</strong>s Autors o<strong>de</strong>r eine Botschaft auf eine<br />

möglichst nicht nachvollziehbare Art ausgeben. Die Buchstaben<br />

JAPH sind die Anfangsbuchstaben von Schwartz’ Signatur Just<br />

Another Perl Hacker.<br />

Das Perl-Modul Lingua::Romana::Perligata von Damian<br />

Conway ist wohl eines <strong>de</strong>r skurrilsten Module schlechthin: Es<br />

ermöglicht <strong>de</strong>m Benutzer, Perl komplett in Latein zu schreiben.<br />

Wie in <strong>de</strong>r lateinischen Sprache ist die Satzstellung (weitgehend)<br />

irrelevant für die Be<strong>de</strong>utung eines Ausdrucks, statt<strong>de</strong>ssen<br />

wer<strong>de</strong>n die Bezüge zwischen einzelnen Wörtern durch ihre<br />

Flexion hergestellt. Von Variablen bis Referenzen und<br />

Randal L. Schwartz<br />

mehrdimensionalen Arrays ist alles in dieser neuen Sprach<strong>de</strong>finition vorhan<strong>de</strong>n. Nahezu alle Son<strong>de</strong>rzeichen<br />

wur<strong>de</strong>n aus <strong>de</strong>r Sprache entfernt, Variablen gleichen Namens, aber unterschiedlicher Struktur (Beispielsweise<br />

$next und @next) wer<strong>de</strong>n <strong>de</strong>kliniert, um die entsprechen<strong>de</strong> Variable zu adressieren. Etwas Beispielco<strong>de</strong>:<br />

insertum stringo unum tum duo excerpemento da.<br />

# Entspricht: substr($string,1,2) = $insert;<br />

clavis hashus nominamentum da.<br />

Acme<br />

# Entspricht: @keys = keys %hash;<br />

Aus ähnlichem Antrieb entstan<strong>de</strong>n „Sprach-Module“ für Klingonisch, Borg o<strong>de</strong>r Leetspeak. Solche Module<br />

sind ein gutes Beispiel für <strong>de</strong>n Zeitaufwand, <strong>de</strong>n viele Leute Perl widmen; Perl kann man in diesem Sinne<br />

durchaus als Hobby bezeichnen.<br />

Brian Ingerson legte mit seinem bekannten Modul namens Acme, das unmittelbar nichts weiter tut, als <strong>de</strong>m<br />

Benutzer zu bescheinigen, sein Programm habe <strong>de</strong>n Höchstgrad an Perfektion erreicht, einen Grundstein für<br />

eine CPAN-Kategorie von Modulen, die keinen produktiven Nutzen haben, sogar oft bewusst kontraproduktiv<br />

sind o<strong>de</strong>r eine Funktion vorgeben, die unmöglich so erreicht wer<strong>de</strong>n kann und eher als Witz zu verstehen ist.<br />

Dieses Spiel mit skurrilen I<strong>de</strong>en umfasst beeindrucken<strong>de</strong> ASCII-Art, Module, die <strong>de</strong>n Quellco<strong>de</strong> unsichtbar<br />

machen (Acme::Bleach) o<strong>de</strong>r sonstig humorvoll manipulieren, in<strong>de</strong>m sie ihn zum Beispiel mit typischen<br />

Sprachfehlern <strong>de</strong>s Präsi<strong>de</strong>nten Bush versehen o<strong>de</strong>r Metho<strong>de</strong>n zufällig löschen, was die Anwesenheit einer<br />

diebischen Elster simulieren soll.


Perl (<strong>Programmiersprache</strong>) 121<br />

Mottos und Zitate<br />

Es gibt viele bekannte Mottos und Zitate, die sich mit Perl selbst o<strong>de</strong>r<br />

<strong>de</strong>n Möglichkeiten <strong>de</strong>r Sprache beschäftigen; hier einige Kostproben:<br />

• “Perl: the Swiss Army Chainsaw of Programming Languages.”<br />

(Perl: Die Schweizer Offiziers-Kettensäge <strong>de</strong>r<br />

<strong>Programmiersprache</strong>n. Anspielung auf die Vielseitigkeit von<br />

Schweizer Offiziersmessern.)<br />

• “Perl is the only language that looks the same before and after RSA<br />

encryption.” (Keith Bostic)<br />

(Perl ist die einzige Sprache, die vor und nach einer<br />

RSA-Verschlüsselung gleich aussieht.)<br />

• “Only perl can parse Perl.” (Larry Wall)<br />

(Nur perl kann Perl parsen.)<br />

Perl-Programmierer sehen Kamele je<strong>de</strong>r Art als<br />

Maskottchen. Die London Perl Mongers haben<br />

sogar eines aus <strong>de</strong>m Londoner Zoo adoptiert.<br />

• “… we often joke that a camel is a horse <strong>de</strong>signed by a committee, but if you think about it, the camel is pretty<br />

well adapted for life in the <strong>de</strong>sert. The camel has evolved to be relatively self-sufficient. On the other hand, the<br />

camel has not evolved to smell good. Neither has Perl.” (Larry Wall: über das Kamel als Perl-Maskottchen)<br />

(… wir witzeln oft, dass ein Kamel ein Pferd ist, das von einem Komitee entworfen wur<strong>de</strong>. Aber wenn man<br />

darüber nach<strong>de</strong>nkt, ist das Kamel ziemlich gut an das Leben in <strong>de</strong>r Wüste angepasst. Das Kamel hat sich dahin<br />

entwickelt, autark zu sein. An<strong>de</strong>rerseits hat es sich nicht dazu entwickelt, gut zu riechen. Perl auch nicht.)<br />

• “The very fact that it’s possible to write messy programs in Perl is also what makes it possible to write programs<br />

that are cleaner in Perl than they could ever be in a language that attempts to enforce cleanliness” (Larry Wall:<br />

Linux World, 1999)<br />

(Genau die Tatsache, dass es möglich ist, unsaubere Programme in Perl zu schreiben, ermöglicht es, Programme<br />

zu schreiben, die sauberer sind, als in Sprachen, die versuchen, Sauberkeit zu erzwingen.)<br />

• “Perl: Write once – never un<strong>de</strong>rstand again”<br />

(Perl: Einmal schreiben – nie wie<strong>de</strong>r verstehen. Eine Anspielung auf das “Write once – run everywhere”-Mantra<br />

z. B. von Java)<br />

Weitere Informationen<br />

Wettbewerbe<br />

Im Jahr 2004 erreichte Perl beim 7. Wettbewerb <strong>de</strong>s International Conference on Functional Programming Contest<br />

eine Platzierung in <strong>de</strong>r Lightning Division.<br />

Literatur<br />

Für Programmier-Anfänger<br />

• Brigitte Jellinek, Jutta Hämmerle-Uhl: Easy Perl. Markt und Technik, München 2001, ISBN 3-8272-6153-8<br />

(Zielrichtung Web/CGI)<br />

• Jürgen Schröter: "Grundwissen Perl" Ol<strong>de</strong>nbourg Verlag, München 2007, ISBN 978-3-486-58074-7<br />

(Alltags-Programmieraufgaben)<br />

Für Perl-Einsteiger<br />

• Randal L. Schwartz, Tom Phoenix: Einführung in Perl. O’Reilly Verlag, ISBN 3-89721-434-2 (das Lamabuch,<br />

basiert auf Einsteigerkurs)<br />

• Larry Wall u. a.: Programmieren mit Perl. O’Reilly Verlag, ISBN 3-89721-144-0 (das Kamelbuch, Handbuch,<br />

das die ganze Sprache umfasst)


Perl (<strong>Programmiersprache</strong>) 122<br />

• Johan Vromans: Perl – kurz und gut. O’Reilly Verlag, ISBN 3-89721-247-1 (Kurzreferenz)<br />

Für Fortgeschrittene<br />

• Randal L. Schwartz, Tom Phoenix: Einführung in Perl-Objekte, Referenzen & Module. O’Reilly Verlag 2003,<br />

ISBN 3-89721-149-1 (das Alpaka-Buch, Fortsetzung <strong>de</strong>s Lamabuches)<br />

• Joseph N. Hall, Randal L. Schwartz: Effective Perl Programming. Addison-Wesley Professional 1997, ISBN<br />

0-201-41975-0 (Stärken von Perl effektiv nutzen)<br />

• Christiansen, Torkington: Perl Kochbuch. O’Reilly Verlag 2004, ISBN 3-89721-366-4 (Problemlösungen mit<br />

Co<strong>de</strong>beispielen)<br />

• Mark Jason Dominus: Higher-Or<strong>de</strong>r Perl. Morgan Kaufmann, 2005, ISBN 1-55860-701-3 (Funktionale<br />

Programmierung in Perl)<br />

Weblinks<br />

• Links zum Thema Perl [11] im Open Directory Project (<strong>de</strong>utsch)<br />

• perl.org/ – Offizielle, sehr umfangreiche Website von Perl [12] (allgemeine Informationen; englisch)<br />

• Deutsches Perl-Tutorial für Einsteiger [13]<br />

• Downloadmöglichkeit: ActivePerl, Perl-Distribution für Windows mit eigenem Paketformat bei <strong>de</strong>r Binärmodule<br />

vorkompiliert sind und aus einem vom CPAN getrennten Archiv entstammen [14]<br />

• Strawberry Perl 5.10 [15] – Perl-Distribution mit Compilersuite für Windows. Soll die problemlose Installation<br />

von binären CPAN-Modulen erlauben, für MS Windows 2000 bis MS Windows Vista<br />

• $foo – Perl-Magazin [16] , <strong>de</strong>utschsprachig<br />

Referenzen<br />

[1] http:/ / www. perl. org/<br />

[2] manpage von Perl 1.0 in <strong>de</strong>r Perl-Timeline (http:/ / history. perl. org/ PerlTimeline. html#1980s) (englisch) auf perl.org<br />

[3] http:/ / www. bibleserver. com/ go. php?lang=<strong>de</strong>& bible=EU& ref=Mt13%2C46<br />

[4] Der erste Teil <strong>de</strong>r offiziellen Perl-FAQ (englisch) (http:/ / perldoc. perl. org/ perlfaq1.<br />

html#What's-the-difference-between-"perl"-and-"Perl"?)<br />

[5] Larry Walls Re<strong>de</strong> auf <strong>de</strong>r OSCON 2000 als perl.com-Artikel (http:/ / www. perl. com/ pub/ a/ 2000/ 10/ 23/ soto2000. html) (englisch)<br />

[6] Perl6 Community Development Server: Perl6::Perl5::Differences -- Differences between Perl 5 and Perl 6 (http:/ / feather. perl6. nl/ syn/<br />

Differences. html) (englisch), Stand: 5. September 2006<br />

[7] http:/ / search. cpan. org/ ~sisyphus/ Inline-0. 45/ Inline. pod<br />

[8] http:/ / www. gnu. org/ software/ octave/<br />

[9] Deutscher Perl-Workshop (http:/ / www. perl-workshop. <strong>de</strong>)<br />

[10] zum Beispiel perlmonks.org – Perl-Poetry-Kategorie (engl.) (http:/ / www. perlmonks. org/ in<strong>de</strong>x. pl?no<strong>de</strong>=Perl Poetry)<br />

[11] http:/ / www. dmoz. org/ World/ Deutsch/ Computer/ Programmieren/ Sprachen/ Perl/<br />

[12] http:/ / www. perl. org<br />

[13] http:/ / perl-seiten. privat. t-online. <strong>de</strong>/<br />

[14] http:/ / www. activestate. com/ Products/ activeperl/<br />

[15] http:/ / strawberryperl. com/<br />

[16] http:/ / www. foo-magazin. <strong>de</strong>/


PHP 123<br />

PHP<br />

PHP<br />

serverseitig interpretierte Skriptsprache<br />

Basisdaten<br />

Paradigmen: imperativ,<br />

objektorientiert<br />

Erscheinungsjahr: 1995<br />

Designer: Rasmus Lerdorf<br />

Entwickler: The PHP Group<br />

Aktuelle Version:<br />

5.3.2 [1] (4. März 2010)<br />

Typisierung: schwach, dynamisch<br />

Einflüsse: Perl, C, C++, Java<br />

Betriebssystem: plattformunabhängig<br />

Lizenz: PHP-Lizenz<br />

www.php.net [2]<br />

PHP (rekursives Akronym für „PHP: Hypertext Preprocessor“, Backronym aus „Personal Home Page Tools“) ist<br />

eine Skriptsprache mit einer an C angelehnten Syntax, die hauptsächlich zur Erstellung dynamischer Webseiten o<strong>de</strong>r<br />

Webanwendungen verwen<strong>de</strong>t wird. [3] PHP wird als freie Software unter <strong>de</strong>r PHP-Lizenz verbreitet.<br />

PHP zeichnet sich beson<strong>de</strong>rs durch die leichte Erlernbarkeit, die breite Datenbankunterstützung und<br />

Internet-Protokolleinbindung sowie die Verfügbarkeit zahlreicher, zusätzlicher Funktionsbibliotheken aus.<br />

Beispielsweise existieren Programmbibliotheken, um Bil<strong>de</strong>r und Grafiken zur Einbindung in Webseiten dynamisch<br />

zu generieren.<br />

Geschichte<br />

PHP wur<strong>de</strong> 1995 von Rasmus Lerdorf entwickelt. Der Begriff stand damals noch für Personal Home Page Tools und<br />

war ursprünglich als Ersatz für eine Sammlung von Perl-Skripten gedacht, die Lerdorf zur Protokollierung <strong>de</strong>r<br />

Zugriffe auf seinen Online-Lebenslauf geschrieben hatte. [4] Bald schuf Lerdorf eine umfangreichere Version in <strong>de</strong>r<br />

<strong>Programmiersprache</strong> C, in <strong>de</strong>r PHP bis heute entwickelt wird. Das schließlich veröffentlichte PHP/FI (FI stand für<br />

Form Interpreter) war Perl sehr ähnlich, wenn auch eingeschränkter.


PHP 124<br />

PHP3<br />

PHP 3 wur<strong>de</strong> von Andi Gutmans und Zeev Suraski neu geschrieben, da das inzwischen erschienene PHP/FI 2 ihrer<br />

Meinung nach für E-Commerce unzureichend war. Lerdorf kooperierte nun mit Gutmans und Suraski, und so wur<strong>de</strong><br />

die Entwicklung von PHP/FI eingestellt. Diese Version brachte die Verbreitung <strong>de</strong>r Web-Skriptsprache PHP<br />

be<strong>de</strong>utend voran.<br />

PHP4<br />

Das von Gutmans und Suraski gegrün<strong>de</strong>te Unternehmen Zend Technologies Ltd. entwickelte in <strong>de</strong>r Folge die Zend<br />

Engine 1, die <strong>de</strong>n Kern <strong>de</strong>r PHP-4-Standardimplementierung bil<strong>de</strong>t. Mit PHP 4 wur<strong>de</strong>n die<br />

Ausführungsgeschwindigkeit komplexer Applikationen und die Sicherheit bei Verwendung globaler Variablen<br />

verbessert. Eingeführt wur<strong>de</strong>n die Unterstützung für viele weitere Webserver, das Sessionmanagement, die<br />

Ausgabepufferung sowie eine Anzahl neuer Sprachkonstrukte.<br />

Da das World Wi<strong>de</strong> Web En<strong>de</strong> <strong>de</strong>r 1990er Jahre stark wuchs, bestand großer Bedarf an Skriptsprachen, mit <strong>de</strong>nen<br />

sich dynamische Webseiten realisieren lassen. PHP wur<strong>de</strong> mit <strong>de</strong>r Zeit für die Webentwicklung populärer als <strong>de</strong>r<br />

vorherige De-facto-Standard Perl, weil es durch seine Spezialisierung als einfacher erlernbar gilt.<br />

PHP5<br />

Im Sommer 2004 wur<strong>de</strong> mit Version 5.0 eine weitere Entwicklungsstufe veröffentlicht. Wesentlicher Unterschied<br />

zum Vorgänger ist die Zend Engine II, die vor allem ein verbessertes Objektmo<strong>de</strong>ll nutzt, somit objektorientierte<br />

Anwendungen effizienter ausführt und Sprachkonstrukte wie Überladung ermöglicht. Dazu kommen Exceptions,<br />

Reflections, die Integration <strong>de</strong>r SQLite Datenbank sowie Erweiterungen bei XML- und DOM-Handhabung.<br />

Wichtige Versionen<br />

Haupt-<br />

version<br />

Legen<strong>de</strong>: Ältere Version; nicht mehr unterstützt Ältere Version; noch unterstützt Aktuelle Version Zukünftige Version<br />

Version Veröffentlichung Wichtigste Än<strong>de</strong>rungen<br />

1.x 1.0 8. Juni 1995 Offiziell „Personal Home Page Tools (PHP Tools)“ genannt. Das ist die erste Verwendung <strong>de</strong>s Begriffes<br />

„PHP“.<br />

2.x 2.0 16. April 1996 Von <strong>de</strong>n Entwicklern als das „schnellste und einfachste Tool“ zum Erstellen von dynamischen Webseiten<br />

bezeichnet.<br />

3.x 3.0 6. Juni 1998 Die Entwicklung wird nicht mehr nur von einer Person vorangetrieben. Zeev Suraski und Andi Gutmans<br />

schreiben die Co<strong>de</strong>basis für diese Version vollständig neu.


PHP 125<br />

4.x 4.0 22. Mai 2000<br />

Einfache objektorientierte Programmierung hinzugefügt. Hinzufügen einer fortgeschrittenen zweistufigen<br />

Parser-/Ausführungsmaschine, Zend Engine genannt. [5]<br />

4.0.6 23. Juni 2001 Letzte Sicherheits- und Stabilitätsaktualisierung <strong>de</strong>s Entwicklungszweigs 4.0; fünf Aktualisierungen<br />

4.1 10. Dezember<br />

2001<br />

erschienen zuvor: 4.0.1 bis 4.0.5.<br />

Einführung von „Superglobals“ ($_GET, $_POST, $_SESSION, etc.).<br />

4.1.2 12. März 2002 Letzte Sicherheits- und Stabilitätsaktualisierung <strong>de</strong>s Entwicklungszweigs 4.1; zuvor erschien die<br />

Aktualisierung 4.1.1.<br />

4.2 22. April 2002 Standardmäßige Deaktivierung von register_globals. Daten, die über ein Netzwerk empfangen wer<strong>de</strong>n,<br />

4.2.3 6. September<br />

2002<br />

4.3 27. Dezember<br />

2002<br />

wer<strong>de</strong>n nicht direkt in <strong>de</strong>n globalen Namensraum eingefügt. Damit wer<strong>de</strong>n potentielle Sicherheitslücken in<br />

<strong>de</strong>r Anwendung verhin<strong>de</strong>rt.<br />

Letzte Sicherheits- und Stabilitätsaktualisierung <strong>de</strong>s Entwicklungszweigs 4.2; zwei Aktualisierungen<br />

erschienen zuvor: 4.2.1 und 4.2.2.<br />

Einführung von CLI als Zusatz zu CGI.<br />

4.3.11 31. März 2005 Letzte Sicherheits- und Stabilitätsaktualisierung <strong>de</strong>s Entwicklungszweigs 4.3; zehn Aktualisierungen<br />

4.4 11. November<br />

2005<br />

erschienen zuvor: 4.3.1 bis 4.3.10.<br />

Hinzufügen von Man-Seiten für phpize und php-config-Skripten.<br />

4.4.9 7. August 2008 Letzte Sicherheits- und Stabilitätsaktualisierung <strong>de</strong>s Entwicklungszweigs 4.4; acht Aktualisierungen<br />

erschienen zuvor: 4.4.1 bis 4.4.8.<br />

5.x 5.0 13. Juli 2004 Zend Engine II mit neuem Objektmo<strong>de</strong>ll, das private Metho<strong>de</strong>n und Attribute und Überladung erlaubt.<br />

5.0.5 5. September<br />

2005<br />

5.1 24. November<br />

2005<br />

Exceptions hinzugefügt, Reflections API, MySQLi (MySQL verbessert, objektorientiert und auf aktuelle<br />

MySQL-Versionen zugeschnitten), SQLite integriert, SimpleXML (einfacher XML-Parser, Update und<br />

Insert von Kin<strong>de</strong>lementen möglich), DOM-Unterstützung.<br />

Letzte Sicherheits- und Stabilitätsaktualisierung <strong>de</strong>s Entwicklungszweigs 5.0; vier Aktualisierungen<br />

erschienen zuvor: 5.0.1 bis 5.0.4.<br />

Leistungsverbesserungen durch die Einführung von Compilervariablen. Datenbankabstraktionsschicht<br />

hinzugefügt (PDO).<br />

5.1.6 24. August 2006 Letzte Sicherheits- und Stabilitätsaktualisierung <strong>de</strong>s Entwicklungszweigs 5.1; fünf Aktualisierungen<br />

5.2 2. November<br />

2006<br />

erschienen zuvor: 5.1.1 bis 5.1.5.<br />

Schnellere und effizientere Speicherverwaltung, Filter-Erweiterung hinzugefügt (Filtern und Verifizieren<br />

von Benutzereingaben), JSON hinzugefügt (Serialisierung von PHP-Variablen, nützlich im Zusammenspiel<br />

mit Ajax), ZIP (Auslesen und Erstellen von ZIP-Archiven) hinzugefügt, objektorientierte<br />

Datums-Erweiterung (DateTime und DateTimeZone) hinzugefügt.<br />

5.2.13 25. Februar 2010 Sicherheits- und Stabilitätsaktualisierung; zwölf Aktualisierungen erschienen zuvor: 5.2.1 bis 5.2.12.<br />

5.3 30. Juni 2009 Unterstützung von Namensräumen (Namespaces); verbesserter XML-Support durch Nutzung von<br />

XMLRea<strong>de</strong>r und XMLWriter; SOAP-Unterstützung, Late Static Binding, Jump label (begrenzt auf goto),<br />

Closure, Native PHP-Archive (Phar).<br />

5.3.2 4. März 2010 Sicherheits- und Stabilitätsaktualisierung; eine Aktualisierung erschien zuvor: 5.3.1.<br />

6.x 6.0 Unico<strong>de</strong>-Support; Entfernung <strong>de</strong>r ereg-Erweiterung, „register_globals“, „magic_quotes“ und „safe_mo<strong>de</strong>“;<br />

Entfernung von mime_magic und Restrukturierung von fileinfo() für besseren MIME-Support.<br />

In <strong>de</strong>r Regel wird je<strong>de</strong>m Entwicklungszweig ein Maintainer zugeordnet, <strong>de</strong>r von <strong>de</strong>n Hauptentwicklern bestimmt<br />

wird. Der Maintainer ist nun für die Verwaltung und die Pflege <strong>de</strong>s ihm zugeordneten Entwicklungszweiges<br />

zuständig. Aktuell ist ausschließlich <strong>de</strong>n Zweigen für PHP 5.2.x und PHP 5.3.x ein Maintainer zugeordnet.


PHP 126<br />

Ausblick<br />

Zurzeit wird die Version 6.0 entwickelt. Bisher bekannte Än<strong>de</strong>rungen sind zum einen die Entfernung von „Altlasten“<br />

wie Register Globals, Magic Quotes und <strong>de</strong>m Safe Mo<strong>de</strong>, zum An<strong>de</strong>ren die Unterstützung von Unico<strong>de</strong>. Neuerungen<br />

wie Namensräume, „late static binding“ [6] und ein neuer, nativer MySQL-Treiber waren eigentlich für die Version 6<br />

geplant, wur<strong>de</strong>n aber schon in PHP 5.3 eingeführt.<br />

Allgemein<br />

Darstellung <strong>de</strong>r Funktionsweise von PHP<br />

PHP ist ein System, das PHP-Co<strong>de</strong> serverseitig verarbeitet. Das be<strong>de</strong>utet, dass <strong>de</strong>r Quelltext nicht an <strong>de</strong>n<br />

Webbrowser übermittelt wird, son<strong>de</strong>rn an einen Interpreter auf <strong>de</strong>m Webserver. Erst die Ausgabe <strong>de</strong>s<br />

PHP-Interpreters wird an <strong>de</strong>n Browser geschickt. In <strong>de</strong>n meisten Fällen ist das ein HTML-Dokument, wobei es mit<br />

PHP aber auch möglich ist, an<strong>de</strong>re Dateitypen, wie Bil<strong>de</strong>r o<strong>de</strong>r PDF-Dateien, zu generieren.<br />

Um eine PHP-Datei im Rahmen einer Webanwendung ausführen zu können, benötigt man ein System, das mit <strong>de</strong>n<br />

in <strong>de</strong>r Datei enthaltenen Anweisungen umgehen kann. Aus diesem Grund wird durch eine Schnittstelle, wie ISAPI<br />

o<strong>de</strong>r CGI, <strong>de</strong>r Interpreter von einem Server-Daemon o<strong>de</strong>r Server-Dienst, wie Apache o<strong>de</strong>r IIS, ausgeführt. Die<br />

Kombination von Linux/Windows als Betriebssystem, Apache als Webserver, MySQL als Datenbanksystem und<br />

PHP wird LAMP (für Linux) o<strong>de</strong>r WAMP (für Windows) genannt. Fertige LAMP- und WAMP-Pakete, die das<br />

einzelne La<strong>de</strong>n und Konfigurieren von Paketen aus <strong>de</strong>m Internet unnötig machen, wer<strong>de</strong>n etwa im Projekt XAMPP<br />

entwickelt. Hier gibt es Versionen für Linux, Solaris, Windows und Mac OS X.<br />

Die serverseitige Ausführung bietet einige Vorteile. Beim Client (Browser) sind keine Beson<strong>de</strong>rheiten erfor<strong>de</strong>rlich,<br />

so können keine Inkompatibilitäten auftreten wie bei <strong>de</strong>n verschie<strong>de</strong>nen Ausprägungen von JavaScript. Der<br />

PHP-Quelltext bleibt auf <strong>de</strong>m Server und nur die generierten Daten sind für <strong>de</strong>n Besucher sichtbar. Gleiches gilt für<br />

an<strong>de</strong>re Ressourcen wie Datenbanken, die daher keine direkte Verbindung zum Client benötigen.<br />

Ein Nachteil ist, dass je<strong>de</strong> Aktion <strong>de</strong>s Benutzers erst beim erneuten Aufruf <strong>de</strong>r Seite erfasst wird. Da PHP<br />

normalerweise in einer Webserver-Umgebung läuft, unterliegt es auch <strong>de</strong>m zustandslosen HTTP. Je<strong>de</strong> PHP-Seite<br />

belastet <strong>de</strong>n Webserver durch <strong>de</strong>n Interpreter, zu<strong>de</strong>m arbeitet <strong>de</strong>r Interpreter <strong>de</strong>n Quelltext bei je<strong>de</strong>m Aufruf erneut<br />

ab. Das min<strong>de</strong>rt die Reaktionsgeschwindigkeit <strong>de</strong>s Servers und erhöht die Last. Um <strong>de</strong>m entgegenzuwirken, stehen<br />

verschie<strong>de</strong>ne Byteco<strong>de</strong>-Caches zur Verfügung, die eine zur Ausführung vorbereitete Version <strong>de</strong>s Programmes<br />

zwischenspeichern und somit <strong>de</strong>n Zugriff auf diese Datei beim nächsten Aufruf beschleunigen (siehe auch Abschnitt<br />

Ausführungsgeschwindigkeit).<br />

Mit PHP lassen sich auch kommandozeilenorientierte Skripte schreiben, die vom Internet unabhängig sind. Die<br />

GTK-Erweiterung stellt sogar eine Programmierschnittstelle für eine grafische Oberfläche zur Verfügung, für die<br />

we<strong>de</strong>r ein Webserver noch ein Browser benötigt wer<strong>de</strong>n. Die ersten Versionen <strong>de</strong>r Schnittstellen zur grafischen<br />

Oberfläche und zu an<strong>de</strong>ren Betriebssystemfunktionen waren spärlich und wur<strong>de</strong>n kaum verwen<strong>de</strong>t. Die aktuell<br />

entwickelte PHP-GTK-Version 2 strebt hingegen eine Ab<strong>de</strong>ckung <strong>de</strong>r GTK-API von 95% an. [7] Gegenwärtig wird<br />

PHP jedoch vor allem auf Webservern genutzt.


PHP 127<br />

Co<strong>de</strong>-Beispiel<br />

Einfaches PHP-Skript (gibt „Hallo Welt!“ aus):<br />

<br />

echo "Hallo Welt!";<br />

Das Skript in HTML integriert (gibt ebenfalls „Hallo Welt!“ auf <strong>de</strong>r Webseite aus):<br />

<br />

<br />

<br />

Hallo-Welt-Beispiel<br />

<br />

<br />

<br />

<br />

<br />

echo "Hallo Welt!";<br />

Anmerkung: Der PHP-Interpreter interpretiert <strong>de</strong>n Co<strong>de</strong> zwischen , <strong>de</strong>r übrige Co<strong>de</strong> (üblicherweise<br />

HTML) wird unverän<strong>de</strong>rt an <strong>de</strong>n Client zurückgegeben.<br />

Kritik<br />

Kritiker führen eine Reihe von Unzulänglichkeiten in PHP an. So sei die Sprache zeitweise ungesteuert gewachsen,<br />

es wur<strong>de</strong>n viele ähnlich arbeiten<strong>de</strong> Funktionen oft unterschiedlich benannt und die Reihenfolge <strong>de</strong>r<br />

Funktionsparameter stimme bei Funktionen mit ähnlichem Zweck teils nicht überein. Zu<strong>de</strong>m seien trotz vorhan<strong>de</strong>ner<br />

Objektorientierung die meisten Standardbibliotheken noch prozedural angelegt. Threading fehle in PHP völlig, und<br />

einige PHP-Module sind nicht threadsicher.<br />

PHP besitze zu<strong>de</strong>m keinen eigenen Byteco<strong>de</strong>-Cache, was ohne entsprechen<strong>de</strong> Erweiterung bei je<strong>de</strong>m Aufruf einer<br />

Datei ein komplettes Parsen notwendig macht.<br />

Weiterentwicklung<br />

PHP wird kontinuierlich weiterentwickelt und befin<strong>de</strong>t sich weiterhin in einem Wan<strong>de</strong>l. So wur<strong>de</strong> etwa die<br />

Einstellung <strong>de</strong>r Entwicklung von PHP 4 bekannt gegeben.<br />

Seit <strong>de</strong>r Version 5 unterstützt PHP durch Kapselung <strong>de</strong>r Daten, Destruktoren und Ausnahmebehandlung per<br />

Exceptions verbesserte und erweiterte Möglichkeiten <strong>de</strong>r objektorientierten Programmierung. Auch<br />

Objekt-Variablen sind in PHP 5 wie bei <strong>de</strong>n meisten <strong>Programmiersprache</strong>n nur noch Referenzen auf Objekte und<br />

nicht wie in PHP 4 die Objekte selbst. Ebenso wur<strong>de</strong> <strong>de</strong>m oft bemängelten uneinheitlichen Zugriff auf verschie<strong>de</strong>ne<br />

Datenbanken in <strong>de</strong>r Version 5.1 mit <strong>de</strong>r objektorientierten Datenbankabstraktionsebene PDO entgegengewirkt. Ab<br />

<strong>de</strong>r Version 5.3 wer<strong>de</strong>n von PHP zu<strong>de</strong>m Namensräume unterstützt. [8]<br />

In <strong>de</strong>r Version 6 wer<strong>de</strong>n endgültig Probleme verursachen<strong>de</strong> Komponenten wie Magic Quotes [9] , <strong>de</strong>r Safe Mo<strong>de</strong> [10]<br />

sowie Register Globals [11] , die schon länger standardmäßig <strong>de</strong>aktiviert sind, entfernt. Außer<strong>de</strong>m wer<strong>de</strong>n sämtliche<br />

veralteten (<strong>de</strong>precated) Funktionen sowie Aliase von Funktionen entfernt. Auch wird <strong>de</strong>r Standardzeichensatz von<br />

ISO 8859-1 auf Unico<strong>de</strong> geän<strong>de</strong>rt. [12] Damit wer<strong>de</strong>n vor allem interne Probleme mit Sprachkonstrukten bei <strong>de</strong>r


PHP 128<br />

Verarbeitung von Unico<strong>de</strong> gelöst. Bis PHP 6 gibt es nur wenige Funktionen, bei <strong>de</strong>nen ein Zeichensatz für die<br />

Verarbeitung von Zeichenketten angegeben wer<strong>de</strong>n kann, sowie Funktionen zur Konvertierung von und nach UTF-8.<br />

Häufige Problemquellen<br />

Programmierungsspezifisch<br />

Die schwache Typisierung von PHP ist Teil <strong>de</strong>s Konzepts, aber auch eine häufige Fehlerquelle. Ein Fehler tritt etwa<br />

auf, wenn numerische Werte mit Zeichenketten verglichen wer<strong>de</strong>n sollen, wobei es durch die implizite<br />

Typumwandlung zu unerwarteten Ergebnissen kommen kann, sofern nicht <strong>de</strong>r Operator für typsichere Vergleiche<br />

verwen<strong>de</strong>t wur<strong>de</strong>. Auch die unübliche Vereinigung <strong>de</strong>s Array-Konzepts mit <strong>de</strong>m Dictionary-Konzept sorgt bei<br />

Programmierern, die mit an<strong>de</strong>ren <strong>Programmiersprache</strong>n vertraut sind, teils für Fehler. Zu<strong>de</strong>m ist es in PHP nicht<br />

möglich, eine Variablen<strong>de</strong>klaration zu erzwingen – Variablen wer<strong>de</strong>n vielmehr stets automatisch angelegt, sobald<br />

sie erstmals verwen<strong>de</strong>t wer<strong>de</strong>n. Diese Bequemlichkeit hat zur Folge, dass etwa Tippfehler im Variablennamen zu<br />

schwer auffindbaren Programmfehlern führen können. Dieses Verhalten kann jedoch durch an<strong>de</strong>re Einstellung <strong>de</strong>r<br />

Fehlerberichterstattung abgefangen wer<strong>de</strong>n. [13]<br />

Webanwendungsspezifisch<br />

Im Zusammenhang mit globalen Variablen und unsicheren Serverkonfigurationen können Daten in ein Skript<br />

eingeschleust wer<strong>de</strong>n, in<strong>de</strong>m etwa URL-Parameter gesetzt wer<strong>de</strong>n. Um diese Art von Manipulation zu verhin<strong>de</strong>rn,<br />

empfiehlt das PHP-Handbuch, die Option register_globals=off in <strong>de</strong>r PHP-Konfiguration zu setzen. Seit<br />

PHP 4.2 ist das standardmäßig <strong>de</strong>r Fall; in PHP 5.3 wur<strong>de</strong> die Option als veraltet eingestuft und soll in PHP 6.0<br />

entfernt wer<strong>de</strong>n. [14] Generell sollte je<strong>de</strong> Variable vor <strong>de</strong>r ersten Verwendung initialisiert wer<strong>de</strong>n. [15]<br />

Weiterhin bestehen Gefahren über SQL-Injections o<strong>de</strong>r Cross-Site Scripting-Attacken, die jedoch nicht<br />

PHP-spezifisch sind, son<strong>de</strong>rn für alle Webanwendungen gelten. Sie lassen sich beseitigen, in<strong>de</strong>m alle Daten, die das<br />

[15] [16]<br />

Programm von außen über HTTP o<strong>de</strong>r an<strong>de</strong>re Protokolle empfängt, sorgfältig geprüft und gefiltert wer<strong>de</strong>n.<br />

Schutzsysteme für PHP-Installationen<br />

Suhosin [17] ist ein von Stefan Esser, einem ehemaligen Mitglied <strong>de</strong>s „PHP Security Response Team“ [18] und<br />

Mitentwickler von PHP, entwickeltes Schutzsystem für PHP-Installationen. Es wur<strong>de</strong> entworfen, um <strong>de</strong>n Server und<br />

die Benutzer vor bekannten und unbekannten Fehlern in PHP-Anwendungen und im PHP-Kern zu schützen.<br />

Ausführungsgeschwindigkeit<br />

Setzt man PHP als CGI-Programm ein, so kann sich das negativ auf die Ausführungsgeschwindigkeit auswirken,<br />

<strong>de</strong>nn für je<strong>de</strong> HTTP-Anfrage startet <strong>de</strong>r Webserver hier eine neue Instanz <strong>de</strong>s PHP-Interpreters. Um <strong>de</strong>n Start <strong>de</strong>r<br />

Interpreter-Instanzen zu sparen, setzt man PHP üblicherweise als Servermodul, also als Teil <strong>de</strong>r Webserver-Prozesse,<br />

o<strong>de</strong>r über FastCGI ein.<br />

Laut <strong>de</strong>m Computer Language Shootout [19] wie auch bei <strong>de</strong>ssen Windows-Gegenstück Win32 Computer Language<br />

Shootout [20] liegt PHP bei Standardproblemen in Bezug auf Laufzeit und Ressourcenverbrauch in <strong>de</strong>n meisten<br />

Leistungstests leicht bis <strong>de</strong>utlich hinter an<strong>de</strong>ren verbreiteten Skriptsprachen wie Python o<strong>de</strong>r Perl.


PHP 129<br />

Steigerung <strong>de</strong>r Ausführungsgeschwindigkeit<br />

OP-Co<strong>de</strong>-Caching<br />

Mit <strong>de</strong>r Zend-Engine wird <strong>de</strong>r Co<strong>de</strong> zunächst zu einem (plattformunabhängigen) Byteco<strong>de</strong> (Zend-OP-Co<strong>de</strong>)<br />

übersetzt, aus <strong>de</strong>m zur Ausführung noch Maschinenco<strong>de</strong> erzeugt wer<strong>de</strong>n muss. Durch Anlegen eines Caches für<br />

diesen Byteco<strong>de</strong> kann durch die Vermeidung redundanter Generierung von OP-Co<strong>de</strong> gespart wer<strong>de</strong>n. PHP besitzt<br />

selbst keinen Byteco<strong>de</strong>-Cache, was dazu führt, dass ein Skript bei je<strong>de</strong>m Aufruf neu übersetzt wer<strong>de</strong>n muss. Um<br />

<strong>de</strong>m entgegenzuwirken, gibt es einige Erweiterungen, die diese Funktionalität nachrüsten, wie beispielsweise <strong>de</strong>n<br />

eAccelerator, <strong>de</strong>n Alternative PHP Cache sowie <strong>de</strong>n kommerziellen Zend Optimizer. Beson<strong>de</strong>rs bei umfangreichen<br />

Skripten kann so eine <strong>de</strong>utliche Steigerung <strong>de</strong>r Ausführungsgeschwindigkeit erreicht wer<strong>de</strong>n.<br />

Kompilierung<br />

Mit HipHop existiert eine freie Software zum Übersetzen von PHP-Co<strong>de</strong> in optimierten C++-Co<strong>de</strong>, <strong>de</strong>r kompiliert<br />

wer<strong>de</strong>n kann, was nach Herstellerangaben dort die Leistung im Schnitt auf etwa das Doppelte steigert. [21]<br />

Verbreitete PHP-Applikationen<br />

Eine Auswahl verschie<strong>de</strong>ner, weit verbreiteter Applikationen, die in PHP geschrieben wur<strong>de</strong>n:<br />

• Invision Power Board, phpBB, Simple Machines Forum, vBulletin und WoltLab Burning Board – Foren-Software<br />

• phpMyAdmin, phpPgAdmin – grafische Benutzeroberflächen zur Verwaltung von MySQL- bzw.<br />

PostgreSQL-Datenbanken<br />

• TYPO3, Joomla!, Xoops, Drupal – Content-Management-Systeme (CMS)<br />

• WordPress, Serendipity – Software für das Erstellen von Weblogs<br />

• Hor<strong>de</strong> – Application Framework für Webanwendungen<br />

• SugarCRM – CRM (Customer Relationship Management)<br />

• MediaWiki – Wiki-Software<br />

• osCommerce, Magento – E-Commerce-Applikationen<br />

Lizenz und Bezug<br />

PHP 3 wur<strong>de</strong> unter <strong>de</strong>r GNU General Public License (GPL) vertrieben. Seit Version 4 wird PHP unter <strong>de</strong>r PHP<br />

License vertrieben, da <strong>de</strong>r neue Parser, die Zend Engine, vom Hersteller Zend unter einer nicht GPL-kompatiblen<br />

Lizenz veröffentlicht wird. Die PHP-Lizenz ist eine Softwarelizenz, die die freie Verwendung und Verän<strong>de</strong>rung <strong>de</strong>r<br />

Quelltexte erlaubt. Die Software kann somit kostenlos aus <strong>de</strong>m Internet gela<strong>de</strong>n wer<strong>de</strong>n; daneben ist PHP auch im<br />

Lieferumfang einiger Betriebssysteme (so bei Linux-Distributionen o<strong>de</strong>r Mac OS X) enthalten.<br />

Literatur<br />

• Matthias Kannengiesser: PHP 5 / MySQL 5. Studienausgabe. Franzis, Poing 2007. ISBN 3-7723-6919-7<br />

• George Schlossnagle: Professionelle PHP 5-Programmierung. Addison-Wesley, München 2005. ISBN<br />

3-8273-2198-0<br />

• Jörg Krause: PHP 5, Grundlagen und Profiwissen. 2. Auflage. Hanser, München 2005. ISBN 3-446-40334-5<br />

• Jens Ferner: PHP 5 Referenz. Data Becker, Düsseldorf 2004. ISBN 3-8158-2369-2<br />

• R. Samar, C. Stocker (Hrsg.), A. Gil<strong>de</strong>meister: PHP <strong>de</strong> Luxe – PHP5 Edition. mitp, Bonn 2004. ISBN<br />

3-8266-1482-8<br />

• Martin Goldmann, Markus Schraudolph: PHP 5 – Die Neuerungen. Galileo Press, Bonn 2004. ISBN<br />

3-89842-490-1<br />

• Carsten Möhrke: Besser PHP programmieren. Galileo Press, Bonn 2004. ISBN 3-89842-381-6<br />

• Christian Wenz, Tobias Hauser: PHP 5 Kompendium. Markt und Technik, Düsseldorf 2005. ISBN 3-8272-6292-5


PHP 130<br />

• Stefan Priebsch: Enterprise PHP Tools. entwickler.press, Frankfurt M 2006. ISBN 3-935042-93-0<br />

• Stephan Schmidt: PHP Design Patterns. 1. Auflage. O’Reilly, Köln 2006. ISBN 3-89721-442-3<br />

• Christopher Kunz, Peter Prochaska, Stefan Esser: PHP-Sicherheit. 2. Auflage. dpunkt-Verlag, Hei<strong>de</strong>lberg 2007.<br />

ISBN 3-89864-450-2<br />

• Damir Enseleit: SELFPHP – Das PHP Kochbuch. Franzis, Poing 2006. ISBN 3-7723-7107-8<br />

• Thomas Theis: Einstieg in PHP 5 & MySQL 5. 4. Auflage. Galileo press, Bonn 2006. ISBN 3-89842-854-0<br />

• Tobias Wassermann: Sichere Webanwendungen mit PHP. 1. Auflage. mitp, Bonn 2007. ISBN 3-8266-1754-1<br />

Weblinks<br />

• Offizielle Website [2] (englisch)<br />

• PHP-Handbuch in <strong>de</strong>utsch [22]<br />

Referenzen<br />

[1] PHP 5 ChangeLog Version 5.3.2. (http:/ / www. php. net/ ChangeLog-5. php#5. 3. 2) The PHP Group, 4. März 2010, abgerufen am 12. März<br />

2010.<br />

[2] http:/ / www. php. net/<br />

[3] Rasmus Lerdorf: „PHP's <strong>de</strong>sign goal from the very beginning is very simple. To solve the common web problem. That's it.“ (http:/ / www.<br />

advogato. org/ article/ 470. html#3)<br />

[4] Ankündigung von Rasmus Lerdorf zu PHP 1.0 in <strong>de</strong>r Newsgroup comp.infosystems.www.authoring.cgi (http:/ / groups. google. ch/ group/<br />

comp. infosystems. www. authoring. cgi/ msg/ cc7d43454d64d133?oe=UTF-8& output=gplain)<br />

[5] PHP: PHP 4 ChangeLog (http:/ / www. php. net/ ChangeLog-4. php). The PHP Group (3. Januar 2008). Abgerufen am 22. Februar 2008.<br />

[6] PHP-Handbuch: Late Static Bindings (http:/ / <strong>de</strong>. php. net/ lsb)<br />

[7] http:/ / gtk. php. net (Englisch), abgerufen am 17. Juni 2007<br />

[8] PHP-Handbuch: Namespaces (http:/ / <strong>de</strong>. php. net/ manual/ <strong>de</strong>/ language. namespaces. php)<br />

[9] PHP-Handbuch: Magic quotes (http:/ / <strong>de</strong>. php. net/ manual/ en/ security. magicquotes. php)<br />

[10] PHP-Handbuch: Safe mo<strong>de</strong> (http:/ / <strong>de</strong>. php. net/ manual/ en/ features. safe-mo<strong>de</strong>. php)<br />

[11] PHP-Handbuch: Register Globals (http:/ / <strong>de</strong>. php. net/ manual/ en/ security. globals. php)<br />

[12] PHP-Conference 2005: Präsentation von Andrei Zmievski (http:/ / www. gravitonic. com/ downloads/ talks/ intlphpcon2005/ php_unico<strong>de</strong>.<br />

pdf) (PDF)<br />

[13] PHP-Handbuch: Option error_reporting (http:/ / <strong>de</strong>. php. net/ manual/ <strong>de</strong>/ ref. errorfunc. php#ini. error-reporting)<br />

[14] PHP: Beschreibung <strong>de</strong>r php.ini-Direktiven <strong>de</strong>s Sprachkerns. (http:/ / <strong>de</strong>3. php. net/ manual/ <strong>de</strong>/ ini. core. php#ini. register-globals) In: PHP<br />

Manual. Abgerufen am 4. Juli 2009.<br />

[15] PHP: Verwendung von Register Globals. (http:/ / <strong>de</strong>3. php. net/ manual/ <strong>de</strong>/ security. globals. php) In: PHP Manual. Abgerufen am 4. Juli<br />

2009.<br />

[16] PHP: Vom Nutzer übermittelte Daten. (http:/ / <strong>de</strong>3. php. net/ manual/ <strong>de</strong>/ security. variables. php) In: PHP Manual. Abgerufen am 4. Juli<br />

2009.<br />

[17] Hauptseite <strong>de</strong>s Suhosin-Projekts (http:/ / www. har<strong>de</strong>ned-php. net/ suhosin/ in<strong>de</strong>x. html)<br />

[18] News auf Golem.<strong>de</strong>: „PHP-Sicherheit: Stefan Esser wirft hin“ (http:/ / www. golem. <strong>de</strong>/ showhigh2. php?file=/ 0612/ 49448. html)<br />

[19] The Computer Language Benchmarks Game (http:/ / shootout. alioth. <strong>de</strong>bian. org)<br />

[20] The Great Win32 Computer Language Shootout (http:/ / dada. perl. it/ shootout/ )<br />

[21] Alexan<strong>de</strong>r Neumann: Facebook will PHP beschleunigen. (http:/ / www. heise. <strong>de</strong>/ <strong>de</strong>veloper/ meldung/<br />

Facebook-will-PHP-beschleunigen-920684. html) In: heise Developer. heise Zeitschriften Verlag, 3. Februar 2010, abgerufen am 23. Februar<br />

2010.<br />

[22] http:/ / <strong>de</strong>. php. net/ manual/ <strong>de</strong>/


Profan (<strong>Programmiersprache</strong>) 131<br />

Profan (<strong>Programmiersprache</strong>)<br />

XProfan ist eine basicähnliche <strong>Programmiersprache</strong>, die direkt für die ereignisorientierte Programmierung<br />

graphischer Oberflächen geschaffen wur<strong>de</strong>.<br />

Entwicklungsgeschichte, Versionen<br />

Profan² ist eine 1990 von Roland G. Hülsmann erfun<strong>de</strong>ne <strong>Programmiersprache</strong>, welche seit Version 8 zu XProfan<br />

(exten<strong>de</strong>d Profan²) herangewachsen ist.<br />

XProfan gilt als eine auch für Anfänger einfache <strong>Programmiersprache</strong>; sie enthält Elemente <strong>de</strong>r Sprachen Basic und<br />

Pascal. Der Fokus liegt hierbei auf <strong>de</strong>n 32 bit Windows-Umgebungen, es existieren aber auch funktional<br />

eingeschränkte Profan²-Versionen für Linux und MS-DOS.<br />

XProfan stellt die Mittel zur Verfügung, einfach und schnell eine Windows-Anwendung zu entwerfen. Dabei sind<br />

viele Sprachkonstrukte zur Dialoggestaltung und Datenverarbeitung bereits fest integriert, <strong>de</strong>r Entwickler kann sich<br />

um das „was“ kümmern, statt sich mit <strong>de</strong>m „wie“ herumschlagen zu müssen. Neben diesen grundlegen<strong>de</strong>n<br />

Funktionen bietet Profan² Schnittstellen z. B. zu Datenbanken (dBASE ist fest integriert, ODBC kann genutzt<br />

wer<strong>de</strong>n) o<strong>de</strong>r <strong>de</strong>m Internet (FTP, SMTP).<br />

Durch die Nutzung <strong>de</strong>r Windows-API o<strong>de</strong>r DLLs lässt sich <strong>de</strong>r Funktionsumfang beinahe beliebig erweitern. Neben<br />

<strong>de</strong>n zahlreichen von <strong>de</strong>r Community bereitgestellten Libraries können auch viele, für an<strong>de</strong>re Sprachen entworfene<br />

Bibliotheken genutzt wer<strong>de</strong>n.<br />

Bis Version 7.0 war Profan² eine rein prozedurale <strong>Programmiersprache</strong>, mit Version 8.0 – die erstmals unter <strong>de</strong>m<br />

Namen XProfan vertrieben wur<strong>de</strong> – hielt die objektorientierte Programmierung Einzug. Diese Richtung wur<strong>de</strong> mit<br />

<strong>de</strong>r im Frühjahr 2005 erschienenen Version 9 nochmals erweitert. Neben <strong>de</strong>r rein prozeduralen Entwicklung ist nun<br />

auch eine rein objektorientierte o<strong>de</strong>r eine Mischform möglich.<br />

Die aktuelle Version trägt die Versionsnummer 11.2a und zeichnet sich vor allem durch die neu integrierte<br />

OpenGL-Schnittstelle aus.<br />

Mit seinen vielfältigen Möglichkeiten bietet Profan² eine gute Plattform zum Einstieg in die Programmierung von<br />

Windows-Anwendungen, bietet aber gleichzeitig erfahrenen Entwicklern genug Spielraum (z. B. im Bereich<br />

Messagehandling, über Rückruffunktionen (callback function) o<strong>de</strong>r mit <strong>de</strong>m Debugger).<br />

Profan² wur<strong>de</strong> mit Borland Delphi (bis Version 9.1 in Delphi 2, Version 10 in Delphi 5, ab Version 11 in Turbo<br />

Delphi 2006) entwickelt. Es besitzt sowohl Interpreter als auch Compiler und Linker. Kompilierte Programme sind<br />

erheblich schneller als <strong>de</strong>r Interpreter, können jedoch mit an<strong>de</strong>ren Sprachen wie C in Bezug auf die<br />

Abarbeitungsgeschwindigkeit nicht konkurrieren.<br />

Seit April 2007 gibt es von David Strutz (<strong>de</strong>m Betreiber <strong>de</strong>r XProfan.Com) eine an die Syntax von Profan²<br />

angelehnte kleine Son<strong>de</strong>rversion <strong>de</strong>s Profan² namens jProfan. jProfan ist kein offizielles „Profan²“ o<strong>de</strong>r „XProfan“,<br />

bietet aber <strong>de</strong>n Entwicklern ebenso eine basicähnliche <strong>Programmiersprache</strong> <strong>de</strong>ssen Programme in DOM-fähigen<br />

Browsern wie z. B. Firefox o<strong>de</strong>r Internet-Explorer ablaufen und somit betriebssystemunabhängig sind. Dies<br />

ermöglicht eine extra hierfür (auch von David Strutz) in JavaScript programmierte virtuelle API namens jUI welche<br />

Funktionen zur Bereitstellung einer grafischen Oberfläche bietet auf die jProfan aufbaut. Das Beson<strong>de</strong>re an jProfan<br />

ist – neben <strong>de</strong>r Betriebssystemunabhängigkeit – das je<strong>de</strong>r einfach auf <strong>de</strong>r Website dank <strong>de</strong>r in jProfan entwickelten<br />

jProfan-IDE kostenlos jProfan-Programme entwickeln kann und diese je<strong>de</strong>m zur Verfügung stellen kann. Beson<strong>de</strong>rs<br />

für Schulen o<strong>de</strong>r Programmieranfänger ist diese Variante interessant, da grundsätzlich nichts installiert wer<strong>de</strong>n muss<br />

und ein leichterer Einstieg in höhere Versionen <strong>de</strong>s Profan² o<strong>de</strong>r XProfan gegeben ist. Bislang existiert noch keine<br />

offizielle Version von jProfan.


Profan (<strong>Programmiersprache</strong>) 132<br />

Am 10. Oktober 2007 lief die Subskriptions-Aktion für Version 11 an. Neuerungen sind vor allem ein dynamisches<br />

Speichermanagement, dynamische Arrays, native Unterstützung für Trayicons, Imagelist und Treeviews,<br />

Unterstützung zum Speichern von JPEG und PNG, Subclassing sowie <strong>de</strong>r Wegfall programmtechnischer Grenzen.<br />

Aktuell ist die XProfan Version 11.2a, die mehrere Bugfixes und Erweiterungen im Vergleich zur Version 11<br />

erfahren hat.<br />

Seit April 2009 gibt es von Frank Abbing einen eigenständigen externen Inline Assembler "XPIA". XPIA bietet eine<br />

Erweiterung <strong>de</strong>s XProfan-Befehlssatzes unter Zuhilfenahme schnellerer Assembler-Funktionen und<br />

Assembler-Bibliotheken. Die Syntax <strong>de</strong>r einbettbaren Assemblerco<strong>de</strong>s ist annähernd zu 100% MASM32 kompatibel<br />

und unterstützt auch Macros und High-Level-Co<strong>de</strong>. XPIA kommt ab Version 4 ohne installiertes MASM32-Paket<br />

und externen Precompiler aus und enthält weitere nützliche Tools.<br />

Profan² ist für folgen<strong>de</strong> Betriebssysteme erhältlich:<br />

Bis Version 6.6:<br />

• Windows 3.x<br />

• MS-DOS<br />

• Linux<br />

• Atari Portfolio<br />

• OS/2<br />

Ab Version 7 und XProfan:<br />

• 95, 98, ME, NT, 2000 XP, Vista, 7<br />

Funktionsweise<br />

Der Quelltext kann direkt interpretiert und/o<strong>de</strong>r kompiliert wer<strong>de</strong>n. Die entstehen<strong>de</strong>n Kompilate können vom<br />

Kompiler mit einer beliebigen Runtime zur einer ausführbaren Win32-Anwendung gelinkt wer<strong>de</strong>n. Das<br />

XProfan-Standardruntime kann bearbeitet wer<strong>de</strong>n und es stellt einen beliebig erweiterbaren Grundsprachschatz<br />

sicher.<br />

Beson<strong>de</strong>rheiten/Features<br />

• Eine Beson<strong>de</strong>rheit stellt die Profan² SE-Version dar. Diese eingeschränkte Version ist für Schulen und<br />

Bildungseinrichtungen kostenfrei erhältlich und soll z. B. im Informatikunterricht o<strong>de</strong>r in Arbeitsgruppen<br />

Verwendung fin<strong>de</strong>n.<br />

• XProfan bietet die Möglichkeit zur prozeduralen und zur objektorientierten Programmierung.<br />

• Kompilate können von <strong>de</strong>r Runtime auch dann noch ausgeführt wer<strong>de</strong>n wenn die Runtimes bereits mit einem<br />

eigenen Kompilat verlinkt sind. Dies bietet auch Anfängern die Möglichkeit, die eigenen Anwendungen modular<br />

aufzubauen und sich das Plug-in-Prinzip zu Nutze zu machen.<br />

• XProfan-Programme wer<strong>de</strong>n nicht zu nativem Maschinenco<strong>de</strong>, son<strong>de</strong>rn nur zu einem kompakteren Zwischenco<strong>de</strong><br />

kompiliert, <strong>de</strong>r zur Laufzeit vom Runtime interpretiert wird, wodurch sich ein Geschwindigkeitsnachteil ergibt.<br />

• Units (ähnlich wie statische Bibliotheken aus C++) herstellen und/o<strong>de</strong>r nutzen. Diese Units sind bereits kompiliert<br />

und können eine Erweiterung <strong>de</strong>s Grundsprachschatzes darstellen.<br />

• OpenGL ist im Sprachschatz inbegriffen.<br />

• InlineAssembler dank kostenloser Zusatzprogramme wie z. B. PreKompiler möglich.<br />

• Win32-XProfanprogramme können unter Linux mit WINE ausgeführt wer<strong>de</strong>n.


Profan (<strong>Programmiersprache</strong>) 133<br />

„Hallo Welt“ in XProfan<br />

Print "Hallo Welt"<br />

WaitInput<br />

o<strong>de</strong>r einfach nur:<br />

messagebox("Hallo Welt","Info",0)<br />

Weblinks<br />

• Offizielle Seite [1]<br />

• XProfan Community [2]<br />

• Online Dokumentation [3]<br />

• Debugger für XProfan [4]<br />

Referenzen<br />

[1] http:/ / xprofan. <strong>de</strong>/ start. htm<br />

[2] http:/ / xprofan. com/ start. htm<br />

[3] http:/ / xprofan. com/ hilfe<br />

[4] http:/ / prf<strong>de</strong>bug. <strong>de</strong><br />

PureBasic<br />

PureBasic<br />

Entwickler: Fantaisie Software<br />

Aktuelle Version: Windows: 4.41 (31. Januar 2010)<br />

Linux: 4.41 (31. Januar 2010)<br />

Mac OS X: 4.41 (31. Januar 2010)<br />

Amiga OS: 4.00 (10. Dezember 2006)<br />

Betriebssystem: Windows, Linux, Mac OS X, Amiga OS<br />

Kategorie: Prozedurale <strong>Programmiersprache</strong><br />

Lizenz: Proprietär<br />

Deutschsprachig: Ja<br />

www.purebasic.<strong>de</strong> [1]<br />

PureBasic ist eine von Frédéric Laboureur (Fantaisie Software, Frankreich) entwickelte prozedurale<br />

<strong>Programmiersprache</strong> für Windows, Linux, Mac OS X und Amiga OS, die kommerziell vertrieben wird.


PureBasic 134<br />

Allgemeines<br />

PureBasic ist eine auf BASIC basieren<strong>de</strong> <strong>Programmiersprache</strong>. Die Schlüsselfeatures sind Portierbarkeit<br />

(gegenwärtig wer<strong>de</strong>n Windows, Linux, Mac OS X vollständig sowie Amiga OS teilweise unterstützt), die Erstellung<br />

sehr schneller und hochoptimierter ausführbarer Programme und die einfach zu erlernen<strong>de</strong> BASIC-Syntax. Damit ist<br />

PureBasic für Anfänger ebenso wie Experten geeignet. Trotz <strong>de</strong>r anfängerfreundlichen Syntax machen die<br />

Möglichkeiten fortgeschrittener Features, wie z. B. Zeiger, Strukturen, Prozeduren, dynamisch verknüpfte Listen,<br />

PureBasic zu einer vielseitigen <strong>Programmiersprache</strong>. Auch die Verwendung von Inline-Assembler für zeitkritische<br />

Co<strong>de</strong>-Abschnitte ist möglich.<br />

Features<br />

• Umfangreiche Standard-Bibliothek. Zum Beispiel für GUI-Gadgets, Grafik, Sound, Netzwerk, Datenbank,<br />

Kompression, Kryptografie, u.v.a<br />

• Erweiterbarer Funktionsumfang durch selbsterstellte Bibliotheken.<br />

• Entwicklungsumgebung mit integriertem 32-Bit- bzw. 64-Bit-Compiler, <strong>de</strong>r auch Inline-Assembler unterstützt.<br />

• Die integrierte Entwicklungsumgebung enthält einen visuellen Designer in <strong>de</strong>n Versionen für Linux und<br />

Windows.<br />

• Quelltext ist portierbar zwischen Windows, Linux, Mac OS X und teilweise Amiga OS.<br />

• Erstellte Anwendungen benötigen keine externen DLLs o<strong>de</strong>r an<strong>de</strong>re externe Ressourcen.<br />

• Unterstützung von Prozeduren zur strukturierten Programmierung mit lokalen und globalen Variablen<br />

• Voller Zugriff auf die Programmierschnittstelle (API) <strong>de</strong>s jeweils verwen<strong>de</strong>ten Betriebssystems.<br />

• Einfache Realisierung von 2D- und 3D-Spielen durch integrierte Bibliotheken möglich (DirectX, SDL, OGRE).<br />

Geschichte<br />

Der PureBasic-Erfin<strong>de</strong>r Frédéric Laboureur schrieb En<strong>de</strong> <strong>de</strong>r 1990er Jahre für die Amiga-Version von Blitz Basic<br />

viele zusätzliche Befehle in 68000 Assembler (Assemblersprache für die Motorola 68000er-Familie). Da Blitz Basic<br />

für <strong>de</strong>n Amiga einige Jahre zuvor offiziell eingestellt wur<strong>de</strong>, entwickelte er zusammen mit Roger Beausoleil <strong>de</strong>n<br />

ersten Compiler, <strong>de</strong>r die für Blitz Basic geschriebenen Befehle nutzte. Dieser Compiler unterstützte schon damals<br />

verschie<strong>de</strong>ne Prozessorarchitekturen (zunächst Co<strong>de</strong>-Generierung für PowerPC sowie 680x0). Später wur<strong>de</strong> er auf<br />

die heute unterstützten Systeme Windows, Linux und Mac OS X portiert. Das Ergebnis war PureBasic. Zunächst<br />

wollte Laboureur seine Sprache Phoenix taufen. Jedoch verwarf er diese I<strong>de</strong>e, da er befürchtete, dass Anwen<strong>de</strong>r<br />

diesen Namen ohne das Anhängsel BASIC in Suchmaschinen nicht fin<strong>de</strong>n wür<strong>de</strong>n. Anschließend wollte er es<br />

PowerBasic nennen. Doch dieser Name war bereits für eine an<strong>de</strong>re <strong>Programmiersprache</strong> vergeben. Letzten En<strong>de</strong>s<br />

entschied sich Laboureur für PureBasic. Durch pure (<strong>de</strong>utsch klar, rein) möchte er ausdrücken, dass PureBasic leicht<br />

zu verstehen und einfach anzuwen<strong>de</strong>n ist. Die erste Version von PureBasic, die nicht <strong>de</strong>n Beta-Status trug, erschien<br />

am 17. Dezember 2000. Seit <strong>de</strong>m 4. November 2007 ist die Version 4.10 für Windows, Linux und Mac OS X<br />

verfügbar, mit <strong>de</strong>r es erstmals möglich ist, unabhängig vom Betriebssystem auf <strong>de</strong>n gesamten Befehlssatz von<br />

PureBasic zurückzugreifen, was die Portierbarkeit <strong>de</strong>r Quelltexte vereinfacht. Aktuelle Version ist 4.41 vom 31.<br />

Januar 2010.<br />

Lizenz<br />

PureBasic wird pro Anwen<strong>de</strong>r lizenziert. Das be<strong>de</strong>utet, dass ein Benutzer mit <strong>de</strong>m Kauf einer Lizenz PureBasic auf<br />

je<strong>de</strong>m beliebigen Computer installieren darf. Eine Purebasic Lizenz gilt für alle unterstützten Plattformen, sie ist also<br />

nicht an eine Entwicklungsplattform gebun<strong>de</strong>n. Allerdings darf die Lizenz nicht zwischen mehreren Personen geteilt<br />

wer<strong>de</strong>n. Die Lizenz von PureBasic ist somit proprietär. Ausnahme bil<strong>de</strong>n lediglich die Standardbibliotheken <strong>de</strong>r<br />

Version für Amiga OS, die als Open Source frei verfügbar sind. Eine Beson<strong>de</strong>rheit <strong>de</strong>r Lizenz ist das darin<br />

enthaltene Recht auf lebenslang kostenlose Updates auf neue Versionen.


PureBasic 135<br />

Vertriebswege<br />

Vertrieben wird PureBasic in <strong>de</strong>r Regel online über die offizielle Homepage [2] o<strong>de</strong>r über <strong>de</strong>n <strong>de</strong>utschen<br />

PureBasic-Support auf www.purearea.net [3] .<br />

Hallo-Welt-Programm<br />

Der folgen<strong>de</strong> Quelltext stellt ein einfaches PureBasic-Programm dar, das die Meldung "Hallo Welt!" in einem<br />

Benachrichtigungsfenster ausgibt:<br />

MessageRequester("Nachricht", "Hallo Welt!")<br />

Die Ausgabe unter Windows:<br />

Dieser Co<strong>de</strong> gibt "Hallo Welt!" in einer Console aus:<br />

OpenConsole()<br />

Print("Hallo Welt!")<br />

Input() ;wartet auf das Drücken von Enter<br />

Ausgabe:<br />

Entwicklungsumgebung<br />

Die integrierte Entwicklungsumgebung<br />

von PureBasic setzt sich neben vielen<br />

nützlichen Werkzeugen aus einem<br />

Texteditor, Compiler, Debugger sowie<br />

einen visuellen Designer zusammen.<br />

Syntaxhervorhebung, Co<strong>de</strong>-Faltung,<br />

Zeilennummerierung und mehr wird<br />

durch die Verwendung <strong>de</strong>r<br />

Editor-Komponente Scintilla<br />

unterstützt. Außer<strong>de</strong>m lässt sich die<br />

Entwicklungsumgebung individuell an die eigenen Bedürfnisse anpassen. So kann man zum Beispiel eigene Farben<br />

zur Syntaxhervorhebung <strong>de</strong>finieren o<strong>de</strong>r Werkzeuge von Drittanbietern in die Entwicklungsumgebung integrieren.


PureBasic 136<br />

PureBasic-Applikationen<br />

PureBasic Editor PureBasic Visual Designer<br />

Folgend eine Liste mit Spielen und Programmen, die mit PureBasic erstellt wur<strong>de</strong>n:<br />

Spiele<br />

• Dune 2077 [4] , Echtzeit-Strategiespiel<br />

• Hostile Skies [5] , 2D-Shooter mit Hubschraubern<br />

• Krakout unlimited 2 [6] , Remake <strong>de</strong>s C64-Klassikers Krakout<br />

• Lady's Gar<strong>de</strong>n [7] , vergleichbar mit Pac-Man<br />

• Breaker [8] , ein Remake von Arkanoid (kommerziell)<br />

• Brickliner [9] , ein Mix aus Puzzle und Tetris (kommerziell)<br />

• Legend - Hand of God [10] , Rollenspiel (kommerziell)<br />

• Restricted Area [11] , Rollenspiel (kommerziell)<br />

Anwendungen<br />

• PureVisionXP [12] , alternativer visueller Designer für PureBasic (kommerziell)<br />

• SoccerTrainer [13] , eine Verwaltungssoftware für Fußball-Trainer (kommerziell)<br />

• PureWare Business-Software [14] , eine komplette Business-Anwendung mit Touch-Kassenfunktion (teilweise<br />

Freeware, Premium-Edition kommerziell)<br />

Weblinks<br />

• Offizielle Homepage mit offiziellem Forum [15] (<strong>de</strong>utsch, englisch und französisch)<br />

• PureArea.net - PureBasic Support- und Bestellseite [3] (<strong>de</strong>utsch und englisch)<br />

• Purebasic-Lounge (Forum) [16] Alternative Deutsche PureBasic-Community<br />

• PureBoard [17] (<strong>de</strong>utsches Purebasic-Forum)


PureBasic 137<br />

Referenzen<br />

[1] http:/ / www. purebasic. <strong>de</strong><br />

[2] http:/ / www. purebasic. com<br />

[3] http:/ / www. purearea. net<br />

[4] http:/ / www. computerbild. <strong>de</strong>/ download/ Dune-2077-2240006. html<br />

[5] http:/ / www. reelmediaproductions. com/ hs<br />

[6] http:/ / www. krakout. com/<br />

[7] http:/ / www. reelmediaproductions. com/ lady<br />

[8] http:/ / www. wegroup. org/ games/ arkanoid-games/ breaker. html<br />

[9] http:/ / www. wegroup. org/ games/ puzzle-logic/ brickliner. html<br />

[10] http:/ / www. legend-game. com/<br />

[11] http:/ / www. restrictedarea. <strong>de</strong>/<br />

[12] http:/ / www. reelmediaproductions. com/ purevision<br />

[13] http:/ / www. soccer-trainer. com/<br />

[14] http:/ / www. pureware. at/<br />

[15] http:/ / www. purebasic. com/ german/<br />

[16] http:/ / purebasic-lounge. com/<br />

[17] http:/ / www. purebasic. fr/ german/<br />

Python (<strong>Programmiersprache</strong>)<br />

Python<br />

Basisdaten<br />

Paradigmen: multiparadigmatisch<br />

Erscheinungsjahr: 1991<br />

Entwickler: Python Software Foundation<br />

Aktuelle Version: 3.1.2 (21. März 2010)<br />

2.6.5 (19. März 2010)<br />

Typisierung: stark, dynamisch („Duck Typing“)<br />

wichtige Implementierungen: CPython, Jython, IronPython, PyPy<br />

Einflüsse: ABC, Algol 60, Modula-3, Icon, C, Perl, LISP, Smalltalk, TCL, Haskell<br />

Beeinflusste: Ruby, Boo, Groovy<br />

Lizenz:<br />

Python License [1]<br />

www.python.org [2]<br />

Python [ˈpaɪθn̩] ist eine universelle höhere <strong>Programmiersprache</strong>. [3]<br />

Ihre Entwurfsphilosophie betont<br />

Programmlesbarkeit. [4] Ihr Gebrauch von Einrückung zur Blockbegrenzung ist ungewöhnlich unter populären<br />

<strong>Programmiersprache</strong>n.<br />

Python unterstützt mehrere Programmierparadigmen. So wer<strong>de</strong>n objektorientierte, aspektorientierte und funktionale<br />

Programmierung unterstützt. Wie an<strong>de</strong>re dynamische Sprachen, wird Python oft als Skriptsprache genutzt.<br />

Die Sprache hat ein offenes, gemeinschaftsbasiertes Entwicklungsmo<strong>de</strong>ll, gestützt durch die gemeinnützige Python<br />

Software Foundation, die <strong>de</strong> facto die Definition <strong>de</strong>r Sprache in CPython, <strong>de</strong>r Referenzumsetzung pflegt.


Python (<strong>Programmiersprache</strong>) 138<br />

Entwicklungsgeschichte<br />

Die Sprache wur<strong>de</strong> Anfang <strong>de</strong>r 1990er Jahre von Guido van Rossum am Centrum Wiskun<strong>de</strong> & Informatica (Zentrum<br />

für Mathematik und Informatik) in Amsterdam als Nachfolger für die Programmier-Lehrsprache ABC entwickelt und<br />

war ursprünglich für das verteilte Betriebssystem Amoeba gedacht. Alle bisherigen Implementierungen <strong>de</strong>r Sprache<br />

(siehe auch Jython o<strong>de</strong>r Stackless Python) übersetzen <strong>de</strong>n Text eines Python-Programms transparent in einen<br />

Zwischenco<strong>de</strong>, <strong>de</strong>r dann von einem Interpreter ausgeführt wird.<br />

Namensherkunft<br />

Der Name geht nicht etwa (wie das Logo vermuten ließe) auf die gleichnamige Schlangengattung (Pythons) zurück,<br />

son<strong>de</strong>rn bezog sich ursprünglich auf die englische Komikertruppe Monty Python. In <strong>de</strong>r Dokumentation fin<strong>de</strong>n sich<br />

daher auch einige Anspielungen auf Sketche aus <strong>de</strong>m Flying Circus. [5] Trotz<strong>de</strong>m etablierte sich die Assoziation zur<br />

Schlange, was sich unter an<strong>de</strong>rem in <strong>de</strong>r <strong>Programmiersprache</strong> Cobra [6] sowie <strong>de</strong>m Python-Toolkit „Boa“ [7] äußert.<br />

Ziele<br />

Python wur<strong>de</strong> mit <strong>de</strong>m Ziel entworfen, möglichst einfach und übersichtlich zu sein. Dies soll durch zwei<br />

Maßnahmen erreicht wer<strong>de</strong>n: Zum einen kommt die Sprache mit relativ wenigen Schlüsselwörtern aus [8] , zum<br />

an<strong>de</strong>ren ist die Syntax reduziert und auf Übersichtlichkeit optimiert. Dies führt dazu, dass Python eine Sprache ist, in<br />

<strong>de</strong>r schnell und einfach programmiert wer<strong>de</strong>n kann. Sie ist daher beson<strong>de</strong>rs dort geeignet, wo Übersichtlichkeit und<br />

Lesbarkeit <strong>de</strong>s Co<strong>de</strong>s eine herausragen<strong>de</strong> Rolle spielen – zum Beispiel in <strong>de</strong>r Teamarbeit, bei Beschäftigung mit<br />

<strong>de</strong>m Quelltext nach längeren Pausen o<strong>de</strong>r bei Programmieranfängern.<br />

Durch die Möglichkeit, auch Programme an<strong>de</strong>rer Sprachen als Modul einzubetten, wer<strong>de</strong>n viele Nischen in <strong>de</strong>r<br />

Programmierung abge<strong>de</strong>ckt. Bei Bedarf lassen sich so beispielsweise zeitkritische Teile durch maschinennah in C<br />

programmierte Routinen ersetzen, o<strong>de</strong>r Python kann als Skriptsprache eines an<strong>de</strong>ren Programms dienen (Beispiele:<br />

OpenOffice.org, Blen<strong>de</strong>r, Cinema 4D, Maya, PyMOL, SPSS und GIMP).<br />

Python ist eine Multiparadigmensprache. Das heißt, Python zwingt <strong>de</strong>n Programmierer nicht zu einem einzigen<br />

bestimmten Programmierparadigma, son<strong>de</strong>rn erlaubt es, das für die jeweilige Aufgabe am besten geeignete<br />

Paradigma zu wählen. Objektorientierte und strukturierte Programmierung wer<strong>de</strong>n vollständig unterstützt, weiterhin<br />

gibt es Spracheigenschaften für funktionale und aspektorientierte Programmierung.<br />

Die Datentypen wer<strong>de</strong>n dynamisch verwaltet; eine statische Typprüfung (wie z. B. bei C++) gibt es nicht. Die<br />

Freigabe nicht mehr benutzter Speicherbereiche erfolgt durch automatische Speicherbereinigung (garbage<br />

collection). Unico<strong>de</strong>-Unterstützung existiert seit Version 2.0.<br />

In <strong>de</strong>r Versionsreihe 2.6 können sich Entwickler mit <strong>de</strong>m Kommandozeilenparameter „-3“ alle Konstrukte in ihrem<br />

Co<strong>de</strong> anzeigen lassen, die es ab Python 3.0 nicht mehr gibt. [9]<br />

Datentypen und Strukturen<br />

Python besitzt eine größere Anzahl von grundlegen<strong>de</strong>n Datentypen. Neben <strong>de</strong>r herkömmlichen Ganzzahl- und<br />

Gleitkommaarithmetik unterstützt es transparent auch beliebig große Ganzzahlen und komplexe Zahlen.<br />

Es verfügt über die übliche Ausstattung an Zeichenkettenoperationen. Zeichenketten sind in Python allerdings<br />

unverän<strong>de</strong>rliche Objekte (wie auch in Java). Damit führen Operationen, die das Än<strong>de</strong>rn einer Zeichenkette<br />

bewerkstelligen sollen – wie z. B. das Ersetzen von Zeichen – dazu, dass statt<strong>de</strong>ssen eine neue Zeichenkette<br />

zurückgegeben wird.<br />

In Python ist alles ein Objekt; Klassen, Typen, Metho<strong>de</strong>n, Module etc. Der Datentyp ist an das Objekt (<strong>de</strong>n Wert)<br />

gebun<strong>de</strong>n und nicht an eine Variable, d. h. Datentypen wer<strong>de</strong>n dynamisch vergeben, so wie bei Smalltalk o<strong>de</strong>r LISP<br />

– und nicht wie bei Java. Alle Parameter wer<strong>de</strong>n per Referenz übergeben. Durch die Bindungsregeln, die <strong>de</strong>n


Python (<strong>Programmiersprache</strong>) 139<br />

Zusammenhang zwischen Objekten und Variablen festlegen, scheint es bei unverän<strong>de</strong>rlichen Objekten aber so als<br />

wür<strong>de</strong>n diese als Wert übergeben.<br />

Trotz <strong>de</strong>r dynamischen Typverwaltung enthält Python eine gewisse Typprüfung. Diese ist strenger als bei Perl, aber<br />

weniger strikt als etwa bei Objective CAML. Implizite Umwandlungen nach <strong>de</strong>m Duck-Typing-Prinzip sind unter<br />

an<strong>de</strong>rem für numerische Typen <strong>de</strong>finiert, so dass man beispielsweise eine komplexe Zahl mit einer langen Ganzzahl<br />

ohne explizite Typumwandlung multiplizieren kann. An<strong>de</strong>rs als bei Perl gibt es allerdings keine implizite<br />

Umwandlung zwischen Zahlen und Zeichenketten; in Operationen für Zeichenketten kann also anstelle einer<br />

Zeichenkette nicht direkt eine Zahl verwen<strong>de</strong>t wer<strong>de</strong>n. Der Operator == überprüft zwei Objekte auf<br />

(Wert-)Gleichheit. Der Operator is überprüft die tatsächliche I<strong>de</strong>ntität zweier Objekte. [10]<br />

Sammeltypen<br />

Python besitzt mehrere Sammeltypen, darunter Listen, Tupel, Mengen (Sets) und Wörterbücher (Dictionaries).<br />

Listen, Tupel und Zeichenketten sind Folgen (Sequenzen, Arrays) und kennen fast alle die gleichen Metho<strong>de</strong>n: Über<br />

die Zeichen einer Kette kann man ebenso iterieren wie über die Elemente einer Liste. Listen sind erweiterbare Fel<strong>de</strong>r<br />

(Arrays), wohingegen Tupel eine feste Länge haben und unverän<strong>de</strong>rlich sind.<br />

Der Zweck solcher Unverän<strong>de</strong>rlichkeit hängt mit <strong>de</strong>n Wörterbüchern zusammen, ein Datentyp, <strong>de</strong>r auch als<br />

assoziatives Array bezeichnet wird. Um auch unter <strong>de</strong>n Bedingungen <strong>de</strong>r Übergabe per Referenz die<br />

Datenkonsistenz zu sichern, müssen die Schlüssel eines Wörterbuches vom Typ „unverän<strong>de</strong>rlich“ sein. Die ins<br />

Wörterbuch eingetragenen Werte können dagegen von beliebigem Typ sein.<br />

Sets sind Mengen von Objekten und in CPython ab Version 2.4 im Standardsprachumfang enthalten. Diese<br />

Datenstruktur kann beliebige (paarweise unterschiedliche) Objekte aufnehmen und stellt Mengenoperationen wie<br />

beispielsweise Durchschnitt, Differenz und Vereinigung zur Verfügung.<br />

Objektsystem<br />

Das Typsystem von Python ist auf das Klassensystem abgestimmt. Obwohl die eingebauten Datentypen genau<br />

genommen keine Klassen sind, können Klassen von einem Typ erben. So kann man die Eigenschaften von<br />

Zeichenketten o<strong>de</strong>r Wörterbüchern erweitern – auch von Ganzzahlen. Python unterstützt daneben<br />

Mehrfachvererbung.<br />

Die Sprache unterstützt direkt <strong>de</strong>n Umgang mit Typen und Klassen. Typen können ausgelesen (ermittelt) und<br />

verglichen wer<strong>de</strong>n und verhalten sich wie Objekte – in Wirklichkeit sind die Typen (wie in Smalltalk) selbst ein<br />

Objekt. Die Attribute eines Objektes können als Wörterbuch extrahiert wer<strong>de</strong>n.<br />

Syntax<br />

Eines <strong>de</strong>r Entwurfsziele für Python war die gute Lesbarkeit <strong>de</strong>s Quellco<strong>de</strong>s. Die Anweisungen benutzen häufig<br />

englische Schlüsselwörter, wo an<strong>de</strong>re Sprachen Symbole einsetzen. Darüber hinaus besitzt Python weniger<br />

syntaktische Konstruktionen als viele an<strong>de</strong>re strukturierte Sprachen wie C, Perl o<strong>de</strong>r Pascal:<br />

• zwei Schleifenformen<br />

• for zur Iteration über die Elemente einer Sequenz<br />

• while zur Wie<strong>de</strong>rholung einer Schleife, solange ein logischer Ausdruck wahr ist.<br />

• Verzweigungen<br />

• if … elif … else für Verzweigungen<br />

Beim letzten Punkt bieten an<strong>de</strong>re <strong>Programmiersprache</strong>n zusätzlich switch und/o<strong>de</strong>r goto. Diese wur<strong>de</strong>n zugunsten<br />

<strong>de</strong>r Lesbarkeit in Python weggelassen und müssen durch if-Konstrukte o<strong>de</strong>r an<strong>de</strong>re Verzweigungsmöglichkeiten<br />

(Slices, Wörterbücher) abgebil<strong>de</strong>t wer<strong>de</strong>n.


Python (<strong>Programmiersprache</strong>) 140<br />

Strukturierung durch Einrücken<br />

Python benutzt wie Miranda und Haskell Einrückungen als Strukturierungselement. Diese I<strong>de</strong>e wur<strong>de</strong> erstmals von<br />

Peter J. Landin vorgeschlagen und von ihm off-si<strong>de</strong> rule („Abseitsregel“) genannt. In <strong>de</strong>n meisten an<strong>de</strong>ren<br />

<strong>Programmiersprache</strong>n wer<strong>de</strong>n Blöcke durch Klammern o<strong>de</strong>r Schlüsselwörter markiert, während verschie<strong>de</strong>n große<br />

Leerräume außerhalb von Zeichenketten keine spezielle Semantik tragen. Bei diesen Sprachen ist die Einrückung zur<br />

optischen Hervorhebung eines Blockes zwar erlaubt und in <strong>de</strong>r Regel auch erwünscht, aber nicht vorgeschrieben. Für<br />

Programmierneulinge wird <strong>de</strong>r Zwang zu lesbarem Stil aber als Vorteil gesehen.<br />

Hierzu ein kurzes Beispiel: Hier sind Funktionen in C und in Python, die das gleiche ausführen – die Fakultät einer<br />

Ganzzahl berechnen.<br />

Fakultätsfunktion in C (ohne Einrückung):<br />

int fakultaet(int x) {if (x > 1) return x * fakultaet(x - 1); else<br />

return 1;}<br />

Fakultätsfunktion in C (mit Einrückung):<br />

int fakultaet(int x)<br />

{<br />

}<br />

if (x > 1)<br />

else<br />

return x * fakultaet(x - 1);<br />

return 1;<br />

Jetzt die gleiche Funktion in Python:<br />

<strong>de</strong>f fakultaet(x):<br />

if x > 1:<br />

else:<br />

return x * fakultaet(x - 1)<br />

return 1<br />

Die Fakultätsfunktion ohne Einrückung in Python:<br />

<strong>de</strong>f fakultaet(x): return x * fakultaet(x - 1) if x > 1 else 1<br />

Es ist jedoch darauf zu achten, die Einrückungen im gesamten Programmtext gleich zu gestalten. Die gemischte<br />

Verwendung von Leerzeichen und Tabulatorzeichen kann zu Problemen führen, da für <strong>de</strong>n Pythoninterpreter ein<br />

Tabulator äquivalent zu acht Leerzeichen behan<strong>de</strong>lt wird. Je nach Konfiguration <strong>de</strong>s Editors können Tabulatoren<br />

optisch mit weniger als acht Leerzeichen dargestellt wer<strong>de</strong>n, was zu Syntaxfehlern o<strong>de</strong>r ungewollter<br />

Programmstrukturierung führen kann. Als vorbeugen<strong>de</strong> Maßnahme kann man <strong>de</strong>n Editor Tabulatoren durch eine<br />

feste Anzahl von Leerzeichen ersetzen lassen. Die Python-Distribution enthält in <strong>de</strong>r Standardbibliothek das Modul<br />

tabnanny, welches die Vermischung von Tabulatoren und Leerzeichen erkennen und beheben hilft.


Python (<strong>Programmiersprache</strong>) 141<br />

Funktionales Programmieren<br />

Ausdrucksstarke syntaktische Elemente zur funktionalen Programmierung vereinfachen das Arbeiten mit Listen und<br />

an<strong>de</strong>ren Sammeltypen. Eine solche Vereinfachung ist die Listennotation, die aus <strong>de</strong>r funktionalen<br />

<strong>Programmiersprache</strong> Haskell stammt; hier bei <strong>de</strong>r Berechnung <strong>de</strong>r ersten fünf Zweierpotenzen:<br />

zahlen = [1, 2, 3, 4, 5]<br />

zweierpotenzen = [2 ** n for n in zahlen]<br />

Weil in Python Funktionen als Argumente auftreten dürfen, kann man auch ausgeklügeltere Konstruktionen<br />

ausdrücken, wie <strong>de</strong>n Continuation-passing style.<br />

Pythons Schlüsselwort lambda könnte manche Anhänger <strong>de</strong>r funktionalen Programmierung fehlleiten. Solche<br />

lambda-Blöcke in Python können nur Ausdrücke enthalten, aber keine Anweisungen. Damit sind sie nicht <strong>de</strong>r<br />

allgemeinste Weg, um eine Funktion zurückzugeben. Die übliche Vorgehensweise ist statt<strong>de</strong>ssen, <strong>de</strong>n Namen einer<br />

lokalen Funktion zurückzugeben. Das folgen<strong>de</strong> Beispiel zeigt dies anhand einer einfachen Funktion nach <strong>de</strong>n I<strong>de</strong>en<br />

von Haskell Brooks Curry:<br />

<strong>de</strong>f add_and_print_maker(x):<br />

<strong>de</strong>f temp(y):<br />

print("{} + {} = {}".format(x, y, x + y))<br />

return temp<br />

Damit ist auch Currying auf einfache Art möglich, um generische Funktionsobjekte auf problemspezifische<br />

herunterzubrechen. Hier ein einfaches Beispiel:<br />

<strong>de</strong>f curry(func, knownargument):<br />

return lambda unknownargument: func(unknownargument, knownargument)<br />

Wird die curry-Funktion aufgerufen, erwartet diese eine Funktion mit zwei notwendigen Parametern sowie die<br />

Parameterbelegung für <strong>de</strong>n zweiten Parameter dieser Funktion. Der Rückgabewert von curry ist eine Funktion,<br />

die dasselbe tut wie func aber nur noch einen Parameter benötigt.<br />

Anonyme Namensräume (sog. Closures) sind mit <strong>de</strong>n o.g. Mechanismen in Python ebenfalls einfach möglich. Ein<br />

simples Beispiel für einen Stack, intern durch eine Liste repräsentiert:<br />

<strong>de</strong>f stack():<br />

l = []<br />

<strong>de</strong>f pop(): return l.pop()<br />

<strong>de</strong>f push(element): l.append(element)<br />

<strong>de</strong>f isempty(): return len(l) == 0<br />

return pop, push, isempty<br />

POP, PUSH, ISEMPTY = stack()<br />

Auf diese Weise erhält man die drei Funktionsobjekte POP, PUSH, ISEMPTY, um <strong>de</strong>n Stack zu modifizieren<br />

bzw. auf enthaltene Elemente zu prüfen, ohne l direkt modifizieren zu können.


Python (<strong>Programmiersprache</strong>) 142<br />

Ausnahmebehandlung<br />

Python nutzt ausgiebig die Ausnahmebehandlung (engl. exception handling) als ein Mittel, um Fehlerbedingungen<br />

zu testen. Dies ist so weit in Python integriert, dass es sogar möglich ist, Syntaxfehler abzufangen und zur Laufzeit<br />

zu behan<strong>de</strong>ln.<br />

Ausnahmen haben einige Vorteile gegenüber an<strong>de</strong>ren beim Programmieren üblichen Verfahren <strong>de</strong>r<br />

Fehlerbehandlung (wie z.B. Fehler-Rückgabewerte und globale Statusvariablen). Sie sind Thread-sicher und können<br />

leicht bis in die höchste Programmebene weitergegeben o<strong>de</strong>r an einer beliebigen an<strong>de</strong>ren Ebene <strong>de</strong>r<br />

Funktionsaufruffolge behan<strong>de</strong>lt wer<strong>de</strong>n. Der korrekte Einsatz von Ausnahmebehandlungen beim Zugriff auf<br />

dynamische Ressourcen erleichtert es zu<strong>de</strong>m, bestimmte auf Race Conditions basieren<strong>de</strong> Sicherheitslücken zu<br />

vermei<strong>de</strong>n, die entstehen können, wenn Zugriffe auf bereits veralteten Statusabfragen basieren.<br />

Der Python-Ansatz legt <strong>de</strong>n Einsatz von Ausnahmen nahe, wann immer eine Fehlerbedingung entstehen könnte.<br />

Nützlich ist dieses Prinzip beispielsweise bei <strong>de</strong>r Konstruktion robuster Eingabeauffor<strong>de</strong>rungen:<br />

while True:<br />

try:<br />

num = raw_input("Eine Zahl eingeben: ")<br />

num = int(num)<br />

break<br />

except ValueError:<br />

print("Eine _Zahl_, bitte!")<br />

Dieser Co<strong>de</strong> wird <strong>de</strong>n Benutzer so lange nach einer Nummer fragen, bis dieser eine Zeichenfolge eingibt, die sich<br />

per int() in eine Ganzzahl konvertieren lässt. Durch die Ausnahmebehandlung wird hier vermie<strong>de</strong>n, dass eine<br />

Fehleingabe zu einem Laufzeitfehler führt, <strong>de</strong>r das Programm zur Beendigung zwingt.<br />

Ebenso kann auch das hier nicht berücksichtigte Interrupt-Signal (SIGINT, häufig Strg+C) mittels<br />

Ausnahmebehandlung in Python abgefangen und behan<strong>de</strong>lt wer<strong>de</strong>n (except KeyboardInterrupt: …).<br />

Standardbibliothek<br />

Python verfügt über eine große Standardbibliothek, wodurch es sich für viele Anwendungen gut eignet. Sie ist eine<br />

<strong>de</strong>r größten Stärken von Python. Das meiste davon ist plattformunabhängig, so dass auch größere<br />

Python-Programme oft auf Unix, Windows, Mac OS X und an<strong>de</strong>ren Plattformen ohne Än<strong>de</strong>rung laufen. Die Module<br />

<strong>de</strong>r Standardbibliothek können mit in C o<strong>de</strong>r Python selbst geschriebenen Modulen ergänzt wer<strong>de</strong>n.<br />

Die Standardbibliothek ist beson<strong>de</strong>rs auf Internet-Anwendungen zugeschnitten, mit <strong>de</strong>r Unterstützung einer großen<br />

Anzahl von Standardformaten und -Protokollen (wie MIME und HTTP). Module zur Schaffung grafischer<br />

Schnittstellen, zur Verbindung mit relationalen Datenbanken und zur Manipulation regulärer Ausdrücke sind<br />

ebenfalls enthalten.<br />

Mit Hilfe <strong>de</strong>s mitgelieferten Moduls Tkinter kann in Python (wie in Perl und Tcl) schnell eine grafische Oberfläche<br />

(GUI) mit Tk erzeugt wer<strong>de</strong>n. Es gibt darüber hinaus eine Vielzahl von weiteren Wrappern von an<strong>de</strong>ren Anbietern.<br />

Sie stellen Anbindungen (engl. language bindings) zu GUI-Bibliotheken an<strong>de</strong>rer <strong>Programmiersprache</strong>n wie z. B.<br />

PyGTK, PyQt, PyKDE, wxPython, PyObjC und PyFLTK zur Verfügung.


Python (<strong>Programmiersprache</strong>) 143<br />

Beispiel<br />

Als nicht triviales Beispiel sei hier <strong>de</strong>r Quicksort-Algorithmus angegeben:<br />

<strong>de</strong>f quicksort(liste):<br />

if len(liste) = pivotelement]<br />

return quicksort(links) + [pivotelement] + quicksort(rechts)<br />

Hier ermöglicht insbeson<strong>de</strong>re die Listennotation für die Variablen links und rechts eine kompakte Darstellung. Zum<br />

Vergleich eine imperative Formulierung dieser zwei Zeilen:<br />

...<br />

nehmen<br />

links, rechts = [], [] # Leere Listen links und rechts<br />

pivotelement = liste.pop() # Das letzte Element aus <strong>de</strong>r Liste<br />

for element in liste: # Die verkürzte Liste durchlaufen<br />

anhängen<br />

...<br />

if element < pivotelement:<br />

else:<br />

Interaktive Benutzung<br />

links.append(element) # wenn < dann an linke Liste anhängen<br />

rechts.append(element) # wenn nicht < (also >=) dann an rechte Liste<br />

So wie LISP, Ruby, Groovy – und Perl im Debugger – unterstützt <strong>de</strong>r Python-Interpreter auch einen interaktiven<br />

Modus, in <strong>de</strong>m Ausdrücke am Terminal eingegeben und die Ergebnisse sofort betrachtet wer<strong>de</strong>n können. Das ist<br />

nicht nur für Neulinge, die die Sprache lernen, angenehm, son<strong>de</strong>rn auch für erfahrene Programmierer:<br />

Co<strong>de</strong>-Stückchen können interaktiv ausgiebig getestet wer<strong>de</strong>n, bevor man sie in ein geeignetes Programm aufnimmt.<br />

Darüber hinaus steht mit PyShell ein Kommandozeileninterpreter für verschie<strong>de</strong>ne unixoi<strong>de</strong><br />

Computer-Betriebssysteme zur Verfügung, <strong>de</strong>r neben klassischen Unix-Shellkommandos auch direkte Eingaben in<br />

Python-Form verarbeiten kann.<br />

Implementierungen<br />

• CPython<br />

• PyPy<br />

• Parrot<br />

• Jython (für die Java Virtual Machine)<br />

• IronPython (für .NET)<br />

• Stackless Python


Python (<strong>Programmiersprache</strong>) 144<br />

Entwicklungsumgebung<br />

Es existieren einige spezielle Entwicklungsumgebungen für Python, beispielsweise Eric Python IDE. Des Weiteren<br />

existieren Plugins für größere IDEs wie Eclipse und Netbeans. Texteditoren für Programmierer wie Vim und Emacs<br />

lassen sich gegebenenfalls auch für Python anpassen.<br />

Verbreitung und Einsatz<br />

• Python ist für die meisten gängigen Betriebssysteme frei erhältlich und eine <strong>de</strong>r drei Sprachen, die häufig in einer<br />

LAMP-Umgebung eingesetzt wer<strong>de</strong>n. Um Python in <strong>de</strong>n Webserver einzubin<strong>de</strong>n, wur<strong>de</strong> mod python entwickelt,<br />

das die Ausführung im Vergleich zu CGI wesentlich beschleunigt und Daten persistent speichern kann. Als<br />

Alternative stellt WSGI eine universelle Schnittstelle zwischen Webserver und Python(-Framework) zur<br />

Verfügung.<br />

• Eine Reihe von Web-Application-Frameworks nutzt Python, darunter Django, Pylons, TurboGears, web2py<br />

o<strong>de</strong>r Zope.<br />

• Es gibt einen in Java implementierten Python-Interpreter namens Jython, mit <strong>de</strong>m die Bibliothek <strong>de</strong>s Java<br />

Runtime Environments für Python verfügbar gemacht wird.<br />

• Ebenso existiert eine Python-Implementierung (IronPython) für die .NET- bzw. Mono-Plattform.<br />

• Um Python als Skriptsprache für Programme in C++ zu nutzen, setzt sich vermehrt die Boost.Python-Bibliothek<br />

durch.<br />

• Ein Python-Parser für Parrot und ein in Python geschriebener Interpreter für Python, PyPy, welcher von <strong>de</strong>r EU<br />

geför<strong>de</strong>rt wur<strong>de</strong>, sind ebenfalls in Entwicklung.<br />

• Es gibt einen Python-Interpreter für das Symbian-Betriebssystem, so dass Python auf verschie<strong>de</strong>nen<br />

Mobiltelefonen verfügbar ist.<br />

• Es existiert ein Python-Interpreter für Mikrocontroller namens PyMite. [11]<br />

• Python in <strong>de</strong>r Version 2.5.1 ist Bestandteil von AmigaOS 4.0.<br />

• Python wird im Rahmen <strong>de</strong>s Projektes 100-Dollar-Laptop als Standardsprache für die Benutzeroberfläche<br />

verwen<strong>de</strong>t. Da <strong>de</strong>r 100-Dollar-Laptop für die Schulausbildung von Kin<strong>de</strong>rn konzipiert ist, soll bei Benutzung <strong>de</strong>r<br />

dafür gestalteten grafischen Benutzeroberfläche „Sugar“ auf Knopfdruck <strong>de</strong>r gera<strong>de</strong> laufen<strong>de</strong> Python-Quellco<strong>de</strong><br />

angezeigt wer<strong>de</strong>n. [12] Damit soll Kin<strong>de</strong>rn die Möglichkeit gegeben wer<strong>de</strong>n, die dahinterliegen<strong>de</strong><br />

Informationstechnologie real zu erleben und nach Belieben „hinter die Kulissen“ zu schauen.<br />

Kritik<br />

• Bei <strong>de</strong>r Definition (aber nicht beim Aufruf) von Metho<strong>de</strong>n muss <strong>de</strong>r Parameter self, <strong>de</strong>r <strong>de</strong>m Objekt entspricht,<br />

<strong>de</strong>ssen Metho<strong>de</strong> aufgerufen wird, explizit angegeben wer<strong>de</strong>n. Dies wird oft als unelegant und „nicht<br />

objektorientiert“ empfun<strong>de</strong>n. [13] Es ist aber nötig, um bestimmte wichtige Konstrukte zu ermöglichen. [14]<br />

• Die Art, wie Python zwischen so genannten „verän<strong>de</strong>rlichen“ (mutable) und „unverän<strong>de</strong>rlichen“ (immutable)<br />

Datentypen unterschei<strong>de</strong>t, kann für Neulinge zu überraschen<strong>de</strong>m Verhalten führen. [15]<br />

• In einer Metho<strong>de</strong>n<strong>de</strong>finition erfor<strong>de</strong>rt <strong>de</strong>r Aufruf <strong>de</strong>r Basisklassenversion <strong>de</strong>rselben Metho<strong>de</strong> die explizite Angabe<br />

<strong>de</strong>r Klasse und Instanz. Dies wird als Verletzung <strong>de</strong>s DRY (Don't Repeat Yourself)-Prinzips gesehen und<br />

behin<strong>de</strong>rt Umbenennungen (dies wur<strong>de</strong> in Python 3.0 behoben [16] ).<br />

• Einige in an<strong>de</strong>ren Sprachen gebräuchliche Kontrollstrukturen, wie do/while [13] , sind in Python nicht vorhan<strong>de</strong>n<br />

und müssen auf an<strong>de</strong>re Weise realisiert wer<strong>de</strong>n (z. B. durch „while True: … break“).<br />

• Auf Multiprozessor-Systemen behin<strong>de</strong>rt <strong>de</strong>r sogenannte Global Interpreter Lock (GIL) von CPython die Effizienz<br />

von Python-Anwendungen, die Multithreading benutzen. [17] (Diese Beschränkung existiert unter Jython o<strong>de</strong>r<br />

IronPython nicht.) Es ist nicht geplant, <strong>de</strong>n GIL zu ersetzen. Statt<strong>de</strong>ssen wird empfohlen, statt Threads mehrere<br />

[18] [19]<br />

miteinan<strong>de</strong>r kommunizieren<strong>de</strong> Prozesse zu verwen<strong>de</strong>n.


Python (<strong>Programmiersprache</strong>) 145<br />

• In <strong>de</strong>n aktuell vorherrschen<strong>de</strong>n Implementationen ist die Geschwindigkeit niedriger als bei vielen kompilierbaren<br />

Sprachen [20] , aber ähnlich wie bei Perl [21] , PHP [22] o<strong>de</strong>r Smalltalk [22] und höher als bei Ruby. [23] Das ist zum<br />

Teil gewollt: Bei <strong>de</strong>r Entwicklung von CPython geht Klarheit vor Performanz. [24] Dabei beruft man sich auf<br />

Autoritäten wie Donald Knuth und Tony Hoare, die von verfrühter Optimierung abraten. Wenn<br />

Performanzprobleme auftreten, die nicht durch Optimierung <strong>de</strong>s Python-Co<strong>de</strong>s gelöst wer<strong>de</strong>n können [25] , setzt<br />

man einen JIT-Compiler wie Psyco ein o<strong>de</strong>r lagert zeitkritische Funktionen in maschinennähere Sprachen wie C<br />

aus.<br />

Literatur<br />

Für <strong>de</strong>n Einstieg<br />

• Hans Petter Langtangen: A Primer on Scientific Programming with Python. [26] Springer 2009. ISBN<br />

978-3-642-02474-0<br />

• Mark Pilgrim: Dive Into Python. [27] Springer, New York 2004. ISBN 1-59059-356-1 (Download verfügbar)<br />

• Mark Pilgrim: Dive Into Python 3. [28] Springer, New York 2009. ISBN 1-4302-2415-0 (Download verfügbar)<br />

• Mark Pilgrim, Florian Wollenschein: Python 3 - Intensivkurs [29] Springer, Berlin 2010. ISBN 978-3-642-04376-5<br />

(Deutsche Übersetzung von Dive Into Python 3)<br />

• C H.Swaroop: A byte of Python. [30] (Download verfügbar)<br />

• Thomas Theis: Einstieg in Python. Galileo Press, Bonn 2002. ISBN 3-89842-227-5<br />

• Thomas Theis: Einstieg in Python 3 Galileo Press Bonn 2009. ISBN 978-3-8362-1406-3<br />

• Mark Lutz, David Ascher: Einführung in Python. O’Reilly, Cambridge 2000. ISBN 3-89721-129-7<br />

• Martin Uzák: Python 2.x. Das Einsteigerseminar. bhv, Bonn 2002. ISBN 3-8266-7206-2<br />

• Peter Walerowski: Python - Grundlagen und Praxis. Addison-Wesley, München 2008. ISBN 3-8273-2517-X<br />

• Ivan van Laningham: Jetzt lerne ich Python. Markt+Technik, München 2000. ISBN 3-8272-5843-X<br />

Referenzen<br />

• Martin von Löwis, Nils Fischbeck: Python 2 – Einführung und Referenz <strong>de</strong>r objektorientierten Skriptsprache,<br />

Addison-Wesley, ISBN 3-8273-1691-X<br />

• Michael Weigend: Python GE-PACKT., mitp-Verlag, ISBN 3-8266-0724-4<br />

• Michael Lauer: Python und GUI-Toolkits, mitp-Verlag, ISBN 3-8266-0844-5<br />

Weiterführen<strong>de</strong>s<br />

• Peter Kaiser, Johannes Ernesti: Python - Das umfassen<strong>de</strong> Handbuch - Aktuell zu Python 2.5 [31] , Galileo Press,<br />

ISBN 978-3-8362-1110-9, Download verfügbar<br />

• Farid Hajji: Das Python-Praxisbuch, Addison-Wesley, ISBN 978-3-8273-2543-3<br />

• Stefan Schwarzer: Python Workshop, Addison-Wesley, ISBN 3-8273-1880-7<br />

• Michael Weigend: Objektorientierte Programmierung mit Python, mitp-Verlag, ISBN 3-8266-0966-2<br />

• Hans P. Langtangen: Python Scripting for Computational Science, Springer, ISBN 3-540-43508-5<br />

• Thomas W. Christopher: Python Programming Patterns, Prentice Hall, ISBN 0-13-040956-1<br />

• Gregor Lingl: Python für Kids, mitp-Verlag, ISBN 3-8266-0951-4<br />

• Jason R. Briggs: Snake Wrangling for Kids – Learning to Program with Python, engl. [32] . Für achtjährige und<br />

ältere Kin<strong>de</strong>r, Creative Commons Lizenz.<br />

• Schlangengerangel für Kin<strong>de</strong>r - Programmieren Lernen für Kin<strong>de</strong>r [33] Deutsche Version von Snake Wrangling<br />

for Kids. Für achtjährige und ältere Kin<strong>de</strong>r, Creative Commons Lizenz.


Python (<strong>Programmiersprache</strong>) 146<br />

Weblinks<br />

• www.python.org [34] (englisch)<br />

• Übersetzung <strong>de</strong>s offiziellen Tutorials zur Version 3.1 [35]<br />

• Kurs – Einstieg in Python [36]<br />

• Eric S. Raymond über seine Erfahrungen mit Python [37] (englisch)<br />

• Kurzeinführung „Learn Python in 10 minutes“ [38] (englisch)<br />

• Python Tutorial für Anfänger inkl. Objektorientierung und Threads [39]<br />

• A Byte of Python - Umfangreiches und für Einsteiger geeignetes Python Tutorial [30] (<strong>de</strong>utsch)<br />

Referenzen<br />

[1] Python License (http:/ / www. python. org/ psf/ license/ )<br />

[2] http:/ / www. python. org/<br />

[3] What is Python Good For? (http:/ / www. python. org/ doc/ faq/ general/ #what-is-python-good-for). General Python FAQ. Python<br />

Foundation. Abgerufen am 5. September 2008.<br />

[4] What is Python? Executive Summary (http:/ / www. python. org/ doc/ essays/ blurb/ ). Python documentation. Python Foundation. Abgerufen<br />

am 21. März 2007.<br />

[5] Offizielle Python FAQ (http:/ / www. python. org/ doc/ faq/ general/ #why-is-it-called-python), sowie Python Tutorial, Kapitel 1 (http:/ /<br />

docs. python. org/ tut/ no<strong>de</strong>3. html)<br />

[6] Cobra (http:/ / cobra-language. com/ )<br />

[7] http:/ / boa-constructor. sourceforge. net<br />

[8] http:/ / docs. python. org/ ref/ keywords. html<br />

[9] heise.<strong>de</strong>: Python 2.6 öffnet Wege zu Version 3 (http:/ / www. heise. <strong>de</strong>/ newsticker/ Python-2-6-oeffnet-Wege-zu-Version-3--/ meldung/<br />

116831) vom 2. Oktober 2008, abgerufen am 4. Oktober 2008<br />

[10] http:/ / my. safaribooksonline. com/ 0596002815/ lpython2-CHP-7-SECT-6<br />

[11] PyMite in <strong>de</strong>r Python Wiki (http:/ / wiki. python. org/ moin/ PyMite)<br />

[12] OLPC-Wiki: „ Python für <strong>de</strong>n 100-Dollar-Laptop (http:/ / wiki. laptop. org/ go/ Python)“<br />

[13] http:/ / web. archive. org/ web/ 20031002184114/ www. amk. ca/ python/ writing/ warts. html<br />

[14] Guido van Rossum: Why explicit self has to stay (http:/ / neopythonic. blogspot. com/ 2008/ 10/ why-explicit-self-has-to-stay. html)<br />

[15] http:/ / mail. python. org/ pipermail/ python-i<strong>de</strong>as/ 2007-January/ 000073. html<br />

[16] http:/ / www. python. org/ <strong>de</strong>v/ peps/ pep-3135/<br />

[17] http:/ / blog. snaplogic. org/ ?p=94<br />

[18] http:/ / www. python. org/ doc/ faq/ library/ #can-t-we-get-rid-of-the-global-interpreter-lock<br />

[19] http:/ / www. artima. com/ weblogs/ viewpost. jsp?thread=214235<br />

[20] Python–C (http:/ / shootout. alioth. <strong>de</strong>bian. org/ u32q/ benchmark. php?test=all& lang=python& lang2=gcc& box=1)<br />

[21] Python–Perl (http:/ / shootout. alioth. <strong>de</strong>bian. org/ u32q/ benchmark. php?test=all& lang=python& lang2=perl)<br />

[22] Benchmark-Vergleich Python–PHP (http:/ / shootout. alioth. <strong>de</strong>bian. org/ u32q/ benchmark. php?test=all& lang=python& lang2=php)<br />

[23] Benchmark-Vergleich Python–Ruby (http:/ / shootout. alioth. <strong>de</strong>bian. org/ u32q/ benchmark. php?test=all& lang=python& lang2=ruby)<br />

[24] Python Culture (http:/ / www. python. org/ <strong>de</strong>v/ culture/ )<br />

[25] Python Patterns – An Optimization Anecdote (http:/ / www. python. org/ doc/ essays/ list2str. html)<br />

[26] http:/ / www. springer. com/ 978-3-642-02474-0/<br />

[27] http:/ / diveintopython. org/<br />

[28] http:/ / diveintopython3. org/<br />

[29] http:/ / www. python3-intensivkurs. <strong>de</strong><br />

[30] http:/ / abop-german. berlios. <strong>de</strong>/<br />

[31] http:/ / www. galileocomputing. <strong>de</strong>/ openbook/ python/<br />

[32] http:/ / www. briggs. net. nz/ log/ writing/ snake-wrangling-for-kids/<br />

[33] http:/ / co<strong>de</strong>. google. com/ p/ swfk-<strong>de</strong>/<br />

[34] http:/ / www. python. org<br />

[35] http:/ / tutorial. pocoo. org/<br />

[36] http:/ / www. linux-user. <strong>de</strong>/ ausgabe/ 2006/ 09/ 080-python-1/<br />

[37] http:/ / www. linuxjournal. com/ article/ 3882<br />

[38] http:/ / www. poromenos. org/ tutorials/ python<br />

[39] http:/ / www. sunjy. <strong>de</strong>/ python/ in<strong>de</strong>x. html


REALbasic 147<br />

REALbasic<br />

REALbasic<br />

Entwickler: REAL Software, Inc.<br />

Aktuelle Version: 2010 Release 1 (9. Februar 2010)<br />

Betriebssystem: Windows, MacOSX, Linux<br />

Kategorie: <strong>Programmiersprache</strong><br />

Lizenz: Kommerziell<br />

Deutschsprachig: ja<br />

www.realsoftware.com [1]<br />

REALbasic ist eine objektorientierte <strong>Programmiersprache</strong> mit Visuellen Entwicklungsumgebungen für Mac OS X,<br />

Linux und Windows und basiert in ihren Befehlen und <strong>de</strong>r Syntax auf <strong>de</strong>r <strong>Programmiersprache</strong> BASIC.<br />

Es ähnelt sehr stark Visual Basic 6, so dass es <strong>de</strong>rzeit sehr beliebt bei Visual-Basic-6-Anhängern ist, die nicht zu<br />

.NET wechseln wollen. RealBasic wird mit einer großen Bibliothek an Elementen ausgeliefert. Eine eigene Version<br />

<strong>de</strong>r Entwicklungsumgebung für Linux ist seit 2005 verfügbar.<br />

REALbasic-Programmco<strong>de</strong> kann ohne Än<strong>de</strong>rungen auch auf <strong>de</strong>n jeweils an<strong>de</strong>ren Plattformen compiliert wer<strong>de</strong>n und<br />

erzeugt dabei Stand-Alone-Anwendungen für das jeweilige System (es wird keine zusätzliche Laufzeitumgebung<br />

benötigt). Für jeweils plattformspezifische Än<strong>de</strong>rungen sind Direktiven implementiert, die es erlauben, <strong>de</strong>n<br />

Quellco<strong>de</strong> entsprechend anzupassen. Bis zur Version 5.5.5 lief die REALbasic-IDE noch nativ auf Mac OS 9,<br />

nachfolgen<strong>de</strong> Versionen konnten bis 2007 Release 3 noch Mac OS 9 Programme kompilieren.<br />

In Deutschland wird REALbasic von ASH vertrieben.<br />

Geschichte<br />

REALbasic wur<strong>de</strong> ursprünglich von <strong>de</strong>m US-Amerikaner Andrew Barry unter <strong>de</strong>m Namen CrossBasic entwickelt,<br />

damals als reine Macintosh-Software. Da CrossBasic einerseits sehr einfach zu bedienen war, an<strong>de</strong>rerseits aber<br />

durchaus professionelle Programme damit entwickelt wer<strong>de</strong>n konnten, entstand schnell eine große Community. Aus<br />

<strong>de</strong>m ursprünglichen Hobby-Projekt (Barry war hauptberuflich Spiele-Entwickler) wur<strong>de</strong> En<strong>de</strong> <strong>de</strong>r 1990er Jahre eine<br />

kommerzielle Software: Der heutige Besitzer und CEO, Geoff Perlman, kaufte das Projekt und grün<strong>de</strong>te in Austin<br />

(Texas) die REAL Software Inc. Trotz einiger Anlaufschwierigkeiten ist REALbasic heute die führen<strong>de</strong><br />

BASIC-Entwicklungsumgebung auf <strong>de</strong>m Mac.<br />

Literatur<br />

• Burkhard Piereck: REALbasic für Einsteiger und Umsteiger. Smart Books Publishing AG, 2009, ISBN<br />

978-3908497905.<br />

Weblinks<br />

• Offizielle REALbasic Homepage [2]<br />

• RealBasic.<strong>de</strong> - Deutsches Nutzer-Forum [3]<br />

• REALbasic Developer Magazin - englische Zeitschrift zu REALbasic [4]


REALbasic 148<br />

Referenzen<br />

[1] http:/ / www. realsoftware. com/<br />

[2] http:/ / www. realbasic. com<br />

[3] http:/ / www. realbasic. <strong>de</strong>/ forum/<br />

[4] http:/ / www. rb<strong>de</strong>veloper. com/<br />

Ruby (<strong>Programmiersprache</strong>)<br />

Paradigmen: multiparadigmatisch<br />

Erscheinungsjahr: 1995<br />

Ruby<br />

Offizielles Logo<br />

Basisdaten<br />

Entwickler: Yukihiro Matsumoto und an<strong>de</strong>re<br />

Aktuelle Version:<br />

1.9.1 (31. Januar 2009 [1] )<br />

Typisierung: dynamisch („Duck-Typing“)<br />

wichtige Implementierungen: Ruby MRI, YARV, JRuby, Rubinius (siehe unten)<br />

Einflüsse: Smalltalk, Perl, Python, LISP, Scheme, CLU, Eiffel, Ada, Dylan, JavaScript<br />

Beeinflusste: Groovy<br />

Betriebssystem: plattformunabhängig<br />

Lizenz: GPL und eigene (siehe Nutzungsbedingungen)<br />

ruby-lang.org [2]<br />

Ruby (engl. für Rubin) ist eine mo<strong>de</strong>rne, vielseitige höhere <strong>Programmiersprache</strong>, die Mitte <strong>de</strong>r Neunziger Jahre von<br />

Yukihiro Matsumoto entworfen wur<strong>de</strong>.<br />

Ruby ist interpretiert und objektorientiert, unterstützt aber mehrere weitere Programmierparadigmen (unter an<strong>de</strong>rem<br />

Prozedurale und Funktionale Programmierung sowie Nebenläufigkeit), bietet dynamische Typisierung, Reflexion<br />

und Automatische Speicherbereinigung.


Ruby (<strong>Programmiersprache</strong>) 149<br />

Geschichte<br />

Aus Unzufrie<strong>de</strong>nheit über verfügbare Skriptsprachen begann Yukihiro<br />

„Matz“ Matsumoto 1993, an einer eigenen Sprache zu arbeiten, und<br />

gab am 21. Dezember 1995 die erste Version von Ruby, 0.95, frei. [3]<br />

Den Namen, hergeleitet vom E<strong>de</strong>lstein Rubin, wählte er als Anspielung<br />

auf die <strong>Programmiersprache</strong> Perl. [4] Zunächst wur<strong>de</strong> Ruby mangels<br />

englischsprachiger Dokumentation fast ausschließlich in Japan benutzt,<br />

wo es einen ähnlichen Stellenwert erlangte wie Perl und Python in<br />

Europa und Amerika. Um das Jahr 2000 wur<strong>de</strong>n Aktivitäten gestartet,<br />

um Ruby auch außerhalb Japans bekannt zu machen, woraufhin mit <strong>de</strong>r<br />

Zeit auch englische Dokumentationen entstan<strong>de</strong>n. Inzwischen gibt es<br />

auch dutzen<strong>de</strong> <strong>de</strong>utschsprachige Bücher zu Ruby im Allgemeinen und<br />

speziellen Themen.<br />

Heute wird die Sprache als Open-Source-Projekt weitergepflegt.<br />

Merkmale<br />

Programmierparadigmen<br />

Der Entwickler von Ruby, Yukihiro Matsumoto.<br />

Ruby ist eine objektorientierte Sprache. Die Sprache wur<strong>de</strong> aber ähnlich wie C++ als „Multiparadigmen-Sprache“<br />

entworfen. Das be<strong>de</strong>utet, dass es <strong>de</strong>m Entwickler offen steht, weitere Programmierparadigmen zur Erstellung seiner<br />

Programme zu nutzen. Die verbreitetsten Paradigmen sollen im Folgen<strong>de</strong>n beschrieben wer<strong>de</strong>n.<br />

Objektorientierte Programmierung<br />

Ruby ist wie Smalltalk vollständig objektorientiert: Alle Datentypen sind in Ruby Objekte, auch solche, die in vielen<br />

an<strong>de</strong>ren Sprachen als primitive Datentypen gelten, wie etwa Zahlen o<strong>de</strong>r Zeichenketten.<br />

Ruby unterstützt mehrere Ansätze <strong>de</strong>r Vererbung.<br />

Klassenbasierte Objektorientierung<br />

Eine Klasse kann wie folgt <strong>de</strong>finiert wer<strong>de</strong>n:<br />

class Auto<br />

end<br />

<strong>de</strong>f beschleunigen<br />

end<br />

puts "BrumBrumBrum"<br />

auto1 = Auto.new<br />

auto1.beschleunigen<br />

Ausgabe:<br />

BrumBrumBrum<br />

Auto erbt dabei automatisch von <strong>de</strong>r Mutterklasse Object. Eine Klasse, die von einer an<strong>de</strong>ren Klasse als Object erbt,<br />

wird so <strong>de</strong>finiert:


Ruby (<strong>Programmiersprache</strong>) 150<br />

class GutesAuto < Auto<br />

end<br />

<strong>de</strong>f bremsen<br />

end<br />

puts "Quietsch"<br />

auto2 = GutesAuto.new<br />

auto2.beschleunigen<br />

auto2.bremsen<br />

Ausgabe:<br />

BrumBrumBrum<br />

Quietsch<br />

Die Klasse GutesAuto erbt alle Metho<strong>de</strong>n <strong>de</strong>r Klasse Auto, u. a. auch beschleunigen. Zusätzlich wird für GutesAuto<br />

die Metho<strong>de</strong> bremsen <strong>de</strong>finiert.<br />

Prototypenbasierte Objektorientierung<br />

Ruby unterstützt zu<strong>de</strong>m, ähnlich wie JavaScript o<strong>de</strong>r Io, prototypenbasierte Objektorientierung.<br />

Das obige Beispiel mit Prototypen realisiert:<br />

auto1 = Object.new<br />

<strong>de</strong>f auto1.beschleunigen<br />

end<br />

puts "BrumBrumBrum"<br />

auto1.beschleunigen<br />

auto2 = auto1.clone<br />

<strong>de</strong>f auto2.bremsen<br />

end<br />

puts "Quietsch"<br />

auto2.beschleunigen<br />

auto2.bremsen<br />

Ausgabe:<br />

BrumBrumBrum<br />

BrumBrumBrum<br />

Quietsch


Ruby (<strong>Programmiersprache</strong>) 151<br />

Objektorientierung mit Mixins<br />

Bis vor einiger Zeit wur<strong>de</strong>n Mixins als reine Ergänzung zu klassenbasierter Objektorientierung angesehen.<br />

Spätestens aber seit Sprachen wie Potion ist klar, dass es sich hierbei um ein eigenes Konzept <strong>de</strong>r Objektorientierung<br />

han<strong>de</strong>lt. Dieses wird auch von Ruby unterstützt.<br />

In Ruby sind Mixins Module, die in an<strong>de</strong>re Objekte eingebun<strong>de</strong>n wer<strong>de</strong>n. Die Metho<strong>de</strong>n <strong>de</strong>s Beispiels aus <strong>de</strong>n<br />

bei<strong>de</strong>n oberen Abschnitten ließe sich zum Beispiel so in Module teilen:<br />

module Gaspedal<br />

end<br />

<strong>de</strong>f beschleunigen<br />

end<br />

puts "BrumBrumBrum"<br />

module Bremse<br />

end<br />

<strong>de</strong>f bremsen<br />

end<br />

puts "Quietsch"<br />

Ein Auto mit Gaspedal und Bremsen ließe sich dann wie folgt zusammenbauen:<br />

auto = Object.new<br />

auto.extend Gaspedal<br />

auto.extend Bremse<br />

Natürlich lässt sich das mit Klassen kombinieren:<br />

class Auto<br />

end<br />

inclu<strong>de</strong> Gaspedal<br />

class GutesAuto < Auto<br />

end<br />

inclu<strong>de</strong> Bremse<br />

Aber auch mit Prototypen ist es nutzbar:<br />

auto1 = Object.new<br />

auto1.extend Gaspedal<br />

auto2 = auto1.clone<br />

auto2.extend Bremse


Ruby (<strong>Programmiersprache</strong>) 152<br />

Prozedurale Programmierung<br />

Im Gegensatz zu Sprachen wie Java und C# ist es in Ruby nicht notwendig, seine Programme explizit in einer Klasse<br />

zu <strong>de</strong>finieren. Da je<strong>de</strong>s Ruby-Programm in einem globalen main-Objekt erstellt wird, ist dieses sich oft<br />

wie<strong>de</strong>rholen<strong>de</strong> Sprachkonstrukt unnötig. Statt<strong>de</strong>ssen kann ein Programm auch aus Prozeduren aufgebaut wer<strong>de</strong>n.<br />

Folgen<strong>de</strong>r Co<strong>de</strong>abschnitt ist bereits ein vollständig lauffähiges Ruby-Programm:<br />

<strong>de</strong>f gruessen<br />

end<br />

puts "Hallo Welt!"<br />

gruessen<br />

Ausgabe:<br />

Hallo Welt!<br />

Funktionale Programmierung<br />

Weil in Ruby je<strong>de</strong>r Ausdruck einen Wert hat, lassen sich Probleme funktional behan<strong>de</strong>ln.<br />

Im folgen<strong>de</strong>n Beispiel gibt das case-Konstrukt je nach Wert <strong>de</strong>r Variable sprache einen an<strong>de</strong>ren String zurück.<br />

gruss = case sprache<br />

end<br />

when "Deutsch" then "Hallo Welt"<br />

when "Englisch" then "Hello, world"<br />

when "Japanisch" then "konnichiwa sekai"<br />

else raise "Unbekannte Sprache"<br />

Über ein Lambda-Konstrukt kann man einen Co<strong>de</strong>block in einer Funktionsvariablen speichern.<br />

print_function = lambda { |item| print item + 1 }<br />

[1,2,3].each &print_function<br />

# >> 234<br />

Weitere Paradigmen<br />

Ruby unterstützt Metaprogrammierung, aspektorientierte Programmierung durch Active Support o<strong>de</strong>r AspectR [5]<br />

und kontextorientierte Programmierung [6] durch ContextR. [7]<br />

Prinzipien<br />

Prinzip <strong>de</strong>r geringsten Überraschung<br />

Ruby folgt <strong>de</strong>m Prinzip <strong>de</strong>r geringsten Überraschung (kurz POLS für „Principle of least surprise“). Rubys Designer<br />

versuchen, die Sprache so zu gestalten, dass Programmierer sie intuitiv nutzen können und möglichst wenig von<br />

ihrem Verhalten überrascht wer<strong>de</strong>n. Matsumoto gibt an, die Sprache primär auf seine eigenen Bedürfnisse<br />

ausgerichtet zu haben:<br />

„Das Prinzip <strong>de</strong>r geringsten Überraschung ist das Prinzip meiner geringsten Überraschung. Und es ist das<br />

Prinzip <strong>de</strong>r geringsten Überraschung nach<strong>de</strong>m Du Ruby sehr gut gelernt hast.“<br />

– Yukihiro „Matz“ Matsumoto


Ruby (<strong>Programmiersprache</strong>) 153<br />

Duck Typing<br />

Die Duck-Typing-Philosophie von Ruby basiert auf <strong>de</strong>r I<strong>de</strong>e, <strong>de</strong>n Typ eines Objekts nicht von <strong>de</strong>ssen Klasse,<br />

son<strong>de</strong>rn von <strong>de</strong>ssen Metho<strong>de</strong>n abhängig zu machen.<br />

class Ente<br />

end<br />

<strong>de</strong>f beschreibung<br />

end<br />

"Eine graue Ente"<br />

<strong>de</strong>f sprechen<br />

end<br />

"Quak!"<br />

class Kuh<br />

end<br />

<strong>de</strong>f beschreibung<br />

end<br />

"Eine dicke Kuh"<br />

<strong>de</strong>f sprechen<br />

end<br />

"Muuuh!"<br />

<strong>de</strong>f lass_sprechen tier<br />

end<br />

puts tier.beschreibung+" macht "+tier.sprechen<br />

lass_sprechen Ente.new<br />

lass_sprechen Kuh.new<br />

Ausgabe:<br />

Eine graue Ente macht Quak!<br />

Eine dicke Kuh macht Muuuh!<br />

Im Beispiel ist es für lass_sprechen unerheblich, von welcher Klasse tier ist, es ist nur wichtig, dass die Metho<strong>de</strong>n<br />

beschreibung und sprechen verstan<strong>de</strong>n wer<strong>de</strong>n.<br />

Ruby bietet Exceptions, Introspection und an<strong>de</strong>re Mechanismen, um das Duck Typing abzusichern, sofern <strong>de</strong>r<br />

Programmierer das wünscht.


Ruby (<strong>Programmiersprache</strong>) 154<br />

Syntax<br />

Beson<strong>de</strong>rheiten<br />

Zeilenumbrüche markieren das En<strong>de</strong> einer Anweisung, Semikolons bewirken dasselbe. Sonstiger Whitespace hat<br />

keine Be<strong>de</strong>utung.<br />

Klammern um Argumente können bei Ein<strong>de</strong>utigkeit weggelassen wer<strong>de</strong>n, sowohl bei <strong>de</strong>r Deklaration einer<br />

Metho<strong>de</strong>, als auch beim Aufruf. Der zuletzt berechnete Wert einer Metho<strong>de</strong> ist gleichzeitig ihr Rückgabewert:<br />

<strong>de</strong>f sperre text<br />

end<br />

text.split("").join " "<br />

puts sperre "Syntaktischer Zucker!"<br />

Ruby unterschei<strong>de</strong>t fünf verschie<strong>de</strong>ne Gültigkeitsbereiche:<br />

• Normalerweise ist eine Variable lokal und nur innerhalb <strong>de</strong>r umgeben<strong>de</strong>n Metho<strong>de</strong> gültig.<br />

• Ein @ vor Variablen <strong>de</strong>klariert diese als Attribute, sie wer<strong>de</strong>n dann dauerhaft <strong>de</strong>r Instanz zugeordnet und für<br />

diese sichtbar.<br />

• Ein vorangestelltes @@ macht Variablen zu Klassenvariablen, die zur umgeben<strong>de</strong>n Klasse gehören.<br />

• Mit $ wer<strong>de</strong>n Variablen global und sind damit im gesamten Programm sichtbar.<br />

• Schließlich gibt es Variablen, die nur innerhalb eines Blocks gültig sind.<br />

Blöcke<br />

Anstatt von For-Schleifen macht man in Ruby häufig Gebrauch von sogenannten Blöcken. Dies sind Co<strong>de</strong>abschnitte,<br />

die nach bestimmten Vorgaben, etwa für alle Elemente einer Datenstruktur, ausgeführt wer<strong>de</strong>n. Sie können unter<br />

an<strong>de</strong>rem benutzt wer<strong>de</strong>n, um Strukturen auszuwerten o<strong>de</strong>r zu manipulieren. Ausdrücke wie<br />

array.each do |i|<br />

end<br />

...<br />

o<strong>de</strong>r in <strong>de</strong>r Kurzschreibweise<br />

array.each { |i| ... }<br />

iterieren über array, wobei <strong>de</strong>m Block in je<strong>de</strong>m Iterationsschritt ein Visitor für das aktuelle Element mit <strong>de</strong>r<br />

Bezeichnung i übergeben wird. Mit Blöcken wer<strong>de</strong>n elegante Konstruktionen wie 5.times{ ... } o<strong>de</strong>r array.sort_by{|i|<br />

i.size} möglich.<br />

Iteratoren, also Metho<strong>de</strong>n, die Blöcke aufrufen, können auch selbst <strong>de</strong>finiert wer<strong>de</strong>n:<br />

<strong>de</strong>f mach_zweimal<br />

end<br />

yield<br />

yield<br />

mach_zweimal { puts "Block aufgerufen!" }<br />

Ausgabe:<br />

Block aufgerufen!<br />

Block aufgerufen!


Ruby (<strong>Programmiersprache</strong>) 155<br />

Bestandteile<br />

Interaktive Ruby-Shell<br />

Interactive Ruby (kurz: irb) ist ein Read-Eval-Print Loop (kurz REPL) für Ruby, mit welchem <strong>de</strong>r Anwen<strong>de</strong>r<br />

interaktiv Ruby programmieren kann. Er kann zum Analysieren und Testen eingesetzt wer<strong>de</strong>n:<br />

irb(main):001:0> (5 + 7) * 2<br />

=> 24<br />

irb(main):002:0> ((5 + 7) * 2).to_s.reverse<br />

=> "42"<br />

irb(main):003:0> "Ein Beispielstring".size<br />

=> 18<br />

Irb wird mit <strong>de</strong>m Ruby-Interpreter ausgeliefert, kann aber auch mit Hilfe von TryRuby [8] im Browser ausgeführt<br />

wer<strong>de</strong>n.<br />

RDoc und ri<br />

RDoc ist ein Software-Dokumentationswerkzeug, welches aus Ruby- und C-Quelltexten automatisch<br />

HTML-Dokumentationsdateien erstellt. Weiterhin wird eine Datenbank aufgebaut, die mit <strong>de</strong>m Tool ri durchsucht<br />

wer<strong>de</strong>n kann. RDoc und ri sind Bestandteil <strong>de</strong>r Standarddistribution und wer<strong>de</strong>n zusammen mit <strong>de</strong>m Interpreter<br />

ausgeliefert.<br />

RubyGems<br />

RubyGems (kurz: gems) ist das offizielle Paketsystem für Ruby. Mit ihm hat <strong>de</strong>r Anwen<strong>de</strong>r die Möglichkeit mehrere<br />

Versionen eines Programmes o<strong>de</strong>r einer Bibliothek kontrolliert zu installieren und wie<strong>de</strong>r zu entfernen. Durch die<br />

Versionierung <strong>de</strong>r Pakete können alte und neue Versionen problemlos nebeneinan<strong>de</strong>r existieren.<br />

Implementierungen<br />

Die ursprüngliche Referenzimplementierung von Ruby (aktuelle Version: 1.9.1) wur<strong>de</strong> von Yukihiro „Matz“<br />

Matsumoto als Interpreter in C entworfen. Er wird oft als CRuby, MRI (Matz's Ruby Interpreter) o<strong>de</strong>r MatzRuby<br />

bezeichnet und ist <strong>de</strong>rzeit am weitesten verbreitet. Den Kern bil<strong>de</strong>t YARV (kurz für Yet Another Ruby VM), eine<br />

virtuelle Maschine. Statt ein Rubyprogramm direkt auszuführen, wird es so zunächst in Byteco<strong>de</strong> übersetzt und dann<br />

von YARV interpretiert, wodurch sich ein Geschwindigkeitsvorteil ergibt. Weiterhin enthält diese Version eine<br />

leistungsstarke Regexp-Maschine namens Oniguruma und unterstützt Multibyte-Zeichensätze wie UTF-8. Die<br />

Vorgängerversion (1.8.7) wird vorerst weiter gepflegt, da 1.9.1 nicht kompatibel zu dieser ist und eine Vielzahl von<br />

Programmen <strong>de</strong>shalb noch nicht fehlerfrei auf <strong>de</strong>r neuen Version läuft.<br />

Der offizielle Interpreter läuft auf <strong>de</strong>n folgen<strong>de</strong>n Betriebssystemen:<br />

• POSIX-kompatible Systeme (u. a. Linux, BSD und Mac OS X)<br />

• Microsoft Windows (u. a. 2000 und XP)<br />

Inzwischen sind mehrere alternative Implementierungen von Ruby verfügbar, unter an<strong>de</strong>rem:<br />

• JRuby, eine Neuimplementierung <strong>de</strong>s Ruby-Interpreters in Java mit <strong>de</strong>m Ziel, Ruby nahtlos in die Java-Plattform<br />

zu integrieren. JRuby ist fast vollständig kompatibel zu Ruby 1.8.7, teilweise auch zu 1.9. JRuby ist zu<strong>de</strong>m<br />

kompatibel zu einigen Ruby-Erweiterungen von Rubinius (Foreign Function Interface, Multi-VM-API).<br />

• Rubinius, eine von Smalltalk-80 inspirierte Implementierung. Abgesehen von <strong>de</strong>r virtuellen Maschine ist<br />

Rubinius vollständig in Ruby geschrieben. Rubinius is nahezu vollständig kompatibel zu Ruby 1.8.7 und hat<br />

experimentellen Support für 1.9. Rubinius nutzt die Low Level Virtual Machine (LLVM) und ist kompatibel mit


Ruby (<strong>Programmiersprache</strong>) 156<br />

C Erweiterungen <strong>de</strong>r Referenzimplementierung.<br />

• Microsofts IronRuby [9] und Gar<strong>de</strong>ns Point Ruby.NET [10] , die Ruby ins .NET-Framework integrieren sollen<br />

und in C# implementiert wer<strong>de</strong>n.<br />

• Cardinal [11] , ein Interpreter für die virtuelle Maschine Parrot.<br />

• MagLev [12] ist eine Implementierung <strong>de</strong>s Unternehmens Gemstone für <strong>de</strong>ren proprietäre Smalltalk VM.<br />

• MacRuby [13] ist eine Implementierung in Objective-C von Apple, die bis Version 0.4, wie Ruby 1.9, YARV<br />

nutzt, ab Version 0.5 allerdings, wie Rubinius, auf die LLVM setzt. MacRuby ist als einzige Implementierung nur<br />

zu Ruby 1.9 kompatibel, nicht mehr zu Ruby 1.8.<br />

• tinyrb [14] ist eine minimalistische Implementierung, angelehnt an die virtuellen Maschinen von Lua und Potion<br />

[15] . Es wird keine vollständige Kompatibiblität zu Ruby erreicht wer<strong>de</strong>n: Zwar soll je<strong>de</strong>s Programm, dass tinyrb<br />

ausführen kann, auch von Ruby ausführbar sein, jedoch soll tinyrb nicht je<strong>de</strong>s Rubyprogramm ausführen können.<br />

• Ruby Enterprise Edition [16] ist eine modifizierte Version <strong>de</strong>r Referenzimplementierung, bei <strong>de</strong>r im<br />

wesentlichen <strong>de</strong>r Garbage Collector neu implementiert wur<strong>de</strong>. (Siehe dazu: Kritik)<br />

• Eine auf ABAP aufbauen<strong>de</strong> Neuimplementierung namens Blue Ruby wird im Moment von SAP entwickelt. Als<br />

einzige <strong>de</strong>r hier aufgeführten Implementierungen ist Blue Ruby <strong>de</strong>rzeit nicht quelloffen.<br />

Ein wichtiges Merkmal ist hierbei, ob diese Implementierungen in <strong>de</strong>r Lage sind, Ruby On Rails auszuführen.<br />

Derzeit können dies neben <strong>de</strong>r Referenzimplementierung nur JRuby [17] , Rubinius [18] und die Ruby Enterprise<br />

Edition [19] (Stand: November 2009).<br />

Die Kompatibilität zur Referenzimplementierung wird durch das RubySpec Projekt [20] überprüft, das im Moment<br />

von allen genannten Implementierungen, mit Ausnahme von tinyrb und Cardinal, genutzt wird (Stand: November<br />

2009). Es stellt dabei sowohl eine Testsuite als auch eine Spezifikation für Ruby 1.8 und 1.9 dar. RubySpec war<br />

ursprünglich ein Teil von Rubinius, wur<strong>de</strong> aber ausgelagert und nun auch von einer Vielzahl an<strong>de</strong>rer Entwickler<br />

vorangetrieben.<br />

Kritik<br />

Kritik an <strong>de</strong>r Sprache:<br />

• Da Variablen vor Gebrauch nicht <strong>de</strong>klariert wer<strong>de</strong>n müssen, können bei Tippfehlern unerwartete Laufzeitfehler<br />

auftreten.<br />

• Ruby ist nicht immer abwärtskompatibel. [21]<br />

• Metaprogrammierung und Monkeypatching erlauben es einem Co<strong>de</strong>stück, alle Klassen und Objekte <strong>de</strong>s<br />

Prozesses, in <strong>de</strong>m es ausgeführt wird, zu än<strong>de</strong>rn. [22]<br />

• Ruby hatte bis vor kurzem keine offizielle Spezifikation. Allerdings wur<strong>de</strong> RubySpec von Matz als Spezifikation<br />

angenommen. Zu<strong>de</strong>m gibt es von Matz und an<strong>de</strong>ren Entwicklern das Bestreben, eine weitere Spezifikation zu<br />

erstellen, mit <strong>de</strong>m Ziel, einen ISO-Standard zu etablieren. [23] Ein erster Entwurf für eine solche Spezifikation<br />

wur<strong>de</strong> am 27. November 2009 veröffentlicht. [24]<br />

Kritik an <strong>de</strong>r Referenzimplementierung:<br />

• Der Garbage Collector manipuliert die Speichereinträge für Objekte direkt, sodass Copy-On-Write-Mechanismen<br />

<strong>de</strong>s Betriebssystems ausgehebelt wer<strong>de</strong>n und es möglich ist, dass ein Rubyprogramm nach <strong>de</strong>m Durchlaufen <strong>de</strong>s<br />

Garbage Collectors eventuell mehr Speicher belegt als zuvor. [25]<br />

• Der Garbage Collector benutzt Mark-And-Sweep, was eine relativ simple, aber ineffiziente Strategie darstellt. [26]<br />

• YARVs Global Interpreter Lock führt dazu, dass mehrere Threads eines Prozesses nicht gleichzeitig auf<br />

[27] [28]<br />

verschie<strong>de</strong>nen Prozessoren ausgeführt wer<strong>de</strong>n können.


Ruby (<strong>Programmiersprache</strong>) 157<br />

Sonstiges<br />

Anwendungen und Bibliotheken<br />

Mit RubyForge [29] und <strong>de</strong>m Ruby Application Archive [30] (RAA) stehen zwei Repositorien zur Verfügung, die<br />

zusammen über 7000 Anwendungen und Bibliotheken beherbergen.<br />

Als <strong>de</strong>rzeit be<strong>de</strong>utendste Anwendung, die auf Ruby basiert, ist das Web-Framework Ruby on Rails zu nennen.<br />

Nutzungsbedingungen<br />

Ruby ist freie Software. Aufgrund <strong>de</strong>ssen ist es kostenlos nutzbar und im Quelltext verfügbar. Dadurch ergibt sich<br />

die Möglichkeit, die Sprache an seine eigenen Bedürfnisse anzupassen o<strong>de</strong>r sie in eigene Programme einzubin<strong>de</strong>n.<br />

Der Interpreter und die Standardbibliothek von Ruby sind grundsätzlich unter <strong>de</strong>n Bedingungen <strong>de</strong>r GPL nutzbar.<br />

Des Weiteren besteht die Möglichkeit, Ruby unter an<strong>de</strong>ren Konditionen zu verwen<strong>de</strong>n. [31]<br />

Literatur<br />

Für Einsteiger<br />

• Daniel Bovensiepen: Das Einsteigerseminar Ruby. vmi Buch, Hei<strong>de</strong>lberg 2007, ISBN 978-3-8266-7459-4<br />

• Sascha Kersken: Praxiswissen Ruby. O’Reilly, 2007, ISBN 978-3-89721-478-1<br />

• Kevin C. Baird: Das Ruby-Praxisbuch. Franzis, 2008, ISBN 978-3-7723-7904-8<br />

Gesamtdarstellungen<br />

• Dave Thomas: Programming Ruby, Second Edition. Pragmatic Bookshelf, 2004, ISBN 0-9745140-5-5 (englisch)<br />

• Hal Fulton: The Ruby Way. Addison-Wesley Professional, 2006, ISBN 978-0-672-32884-8 (englisch)<br />

Für Fortgeschrittene<br />

• Lucas Carlson, Leonard Richardson: Ruby Cookbook. O’Reilly Media, 2006, ISBN 978-0-596-52369-5 (englisch)<br />

• Russ Olsen: Design Patterns in Ruby. Addison-Wesley Professional, 2007, ISBN 978-0-321-49045-2 (englisch)<br />

Referenzen<br />

• Michael Fitzgerald: Ruby: kurz & gut. O’Reilly, 2007, ISBN 978-3-89721-534-4<br />

Weblinks<br />

• Offizielle Webseite von Ruby [2]<br />

• Zusammenstellung von Tutorials zu Ruby [32]<br />

• Dokumentationssammlung zu Ruby [33] (englisch)<br />

• Deutsches Rubyforum [34]<br />

• Links zum Thema Ruby [35] im Open Directory Project<br />

• Deutsches Magazin für Ruby on Rails [36]


Ruby (<strong>Programmiersprache</strong>) 158<br />

Referenzen<br />

[1] Ruby 1.9.1 released (http:/ / www. ruby-lang. org/ en/ news/ 2009/ 01/ 30/ ruby-1-9-1-released/ )<br />

[2] http:/ / www. ruby-lang. org/ <strong>de</strong>/<br />

[3] RubyConf: History of Ruby (http:/ / blog. nicksieger. com/ articles/ 2006/ 10/ 20/ rubyconf-history-of-ruby)<br />

[4] Ein Interview mit <strong>de</strong>m Schöpfer von Ruby (http:/ / www. linux<strong>de</strong>vcenter. com/ pub/ a/ linux/ 2001/ 11/ 29/ ruby. html)<br />

[5] http:/ / aspectr. sourceforge. net/<br />

[6] http:/ / www. swa. hpi. uni-potsdam. <strong>de</strong>/ cop/<br />

[7] http:/ / contextr. rubyforge. org/<br />

[8] http:/ / tryruby. sophrinix. com/<br />

[9] http:/ / www. ironruby. net/<br />

[10] http:/ / plas. fit. qut. edu. au/ rubynet/<br />

[11] http:/ / cardinal2. rubyforge. org/<br />

[12] http:/ / ruby. gemstone. com/<br />

[13] http:/ / www. macruby. org/ trac/ wiki/ MacRuby<br />

[14] http:/ / macournoyer. com/ blog/ 2009/ 02/ 12/ tinyrb/<br />

[15] http:/ / github. com/ whymirror/ potion<br />

[16] http:/ / www. rubyenterpriseedition. com<br />

[17] http:/ / wiki. jruby. org/ wiki/ JRuby_on_Rails<br />

[18] http:/ / blog. fallingsnow. net/ 2008/ 05/ 17/ rails-on-rubinius/<br />

[19] http:/ / www. rubyenterpriseedition. com/<br />

[20] http:/ / rubyspec. org/<br />

[21] http:/ / www. infoq. com/ news/ 2007/ 12/ ruby-19<br />

[22] http:/ / avdi. org/ <strong>de</strong>vblog/ 2008/ 02/ 23/ why-monkeypatching-is-<strong>de</strong>stroying-ruby/<br />

[23] http:/ / www. ruby-forum. com/ topic/ 169195<br />

[24] http:/ / ruby-std. netlab. jp/<br />

[25] http:/ / blog. beaver. net/ 2005/ 03/ ruby_gc_and_copyonwrite. html<br />

[26] http:/ / rubyconf2008. confreaks. com/ how-ruby-can-be-fast. html<br />

[27] http:/ / www. infoq. com/ news/ 2007/ 05/ ruby-threading-futures<br />

[28] http:/ / www. igvita. com/ 2008/ 11/ 13/ concurrency-is-a-myth-in-ruby/<br />

[29] http:/ / rubyforge. org/<br />

[30] http:/ / raa. ruby-lang. org/<br />

[31] Rubys Lizenzbedingungen (http:/ / www. ruby-lang. org/ en/ about/ license. txt)<br />

[32] http:/ / www. ruby-lang. org/ <strong>de</strong>/ documentation/<br />

[33] http:/ / ruby-doc. org/<br />

[34] http:/ / rubyforen. <strong>de</strong>/<br />

[35] http:/ / www. dmoz. org/ World/ Deutsch/ Computer/ Programmieren/ Sprachen/ Ruby/<br />

[36] http:/ / it-republik. <strong>de</strong>/ railsway/ magazin-ausgaben/ Ruby-%26-Mac-000306. html


Smalltalk (<strong>Programmiersprache</strong>) 159<br />

Smalltalk (<strong>Programmiersprache</strong>)<br />

Smalltalk<br />

Logo von Smalltalk<br />

Basisdaten<br />

Entwickler: diverse<br />

Aktuelle Version: Smalltalk 80 (1980)<br />

Einflüsse: Lisp, Simula<br />

Beeinflusste: Objective-C, Java, Ruby<br />

Betriebssystem: Windows, Linux, Mac OS X,<br />

uvm.<br />

Lizenz: implementierungsspezifisch<br />

http:/ / smalltalk. org<br />

Smalltalk ist eine dynamische, im Original untypisierte objektorientierte <strong>Programmiersprache</strong> und zugleich eine<br />

vollständige Entwicklungsumgebung, die in <strong>de</strong>n 1970er Jahren am Xerox PARC Forschungszentrum durch Alan<br />

Kay, Dan Ingalls, A<strong>de</strong>le Goldberg und an<strong>de</strong>re entwickelt wur<strong>de</strong>. Sie wur<strong>de</strong> allgemein unter <strong>de</strong>m Namen<br />

Smalltalk-80 freigegeben und hat die Entwicklung vieler späterer <strong>Programmiersprache</strong>n, wie z. B. Objective-C, Java<br />

und Ruby beeinflusst. Smalltalk wur<strong>de</strong> von Lisp und Simula mit seinem Klassen-Konzept beeinflusst und wur<strong>de</strong><br />

nach Simula-67 die erste populäre objektorientierte <strong>Programmiersprache</strong>.<br />

Smalltalk ist im Gegensatz zu Sprachen wie C++ o<strong>de</strong>r Java eine rein objektorientierte <strong>Programmiersprache</strong>, d. h.<br />

Daten wie Integer, Character o. ä., die in an<strong>de</strong>ren objektorientierten Sprachen z. T. als primitive Datentypen<br />

repräsentiert wer<strong>de</strong>n, wer<strong>de</strong>n in Smalltalk ebenfalls über Objekte und zugehörige Klassen realisiert. Die<br />

Smalltalk-Entwicklungsumgebung enthielt viele I<strong>de</strong>en, die später mit <strong>de</strong>r Macintosh- und Atari-TOS/GEM- und<br />

dann später auch Windows-Benutzeroberfläche verbreitet wur<strong>de</strong>n. Verwen<strong>de</strong>t wur<strong>de</strong> ein Grafikbildschirm mit<br />

verschiebbaren Fenstern, Aufklappmenüs und Schriften von verschie<strong>de</strong>ner Größe. Eine Maus mit drei Tasten – rot,<br />

blau und gelb – diente erstmals als zusätzliches Eingabegerät. Das Mo<strong>de</strong>l-View-Controller-Konzept (MVC) spielte<br />

in <strong>de</strong>r Smalltalk-80-Entwicklungsumgebung eine wesentliche Rolle.<br />

Wichtige Eigenschaften von Smalltalk<br />

• Alles in Smalltalk ist ein Objekt, auch Zeichenketten, Integer, Boolesche Werte, Klassen(-<strong>de</strong>finitionen),<br />

ausführbarer Co<strong>de</strong>, Stackframes, <strong>de</strong>r Speicher, Co<strong>de</strong>blöcke etc.<br />

• Objekte wer<strong>de</strong>n dadurch aktiviert, dass man ihnen Nachrichten (Messages) schickt. Dies führt dazu, dass die<br />

entsprechen<strong>de</strong> Metho<strong>de</strong> (Funktion) <strong>de</strong>s Objekts ausgeführt wird.<br />

• Der gesamte Quelltext ist i. d. R. offen und kann somit verän<strong>de</strong>rt wer<strong>de</strong>n. Nur sehr wenige Metho<strong>de</strong>n greifen auf<br />

echte 'Primitives' <strong>de</strong>r VM (virtuellen Maschine) zurück.<br />

• Dynamische Bindung – erst zur Laufzeit wird ermittelt, welche Metho<strong>de</strong> tatsächlich aufgerufen wird. Eine frühe<br />

(„statische“) Bindung, wie dies bei <strong>de</strong>r statischen Typisierung vorgesehen ist, wur<strong>de</strong> in <strong>de</strong>r Smalltalk<br />

<strong>Programmiersprache</strong> bewusst ausgespart.<br />

• Vererbung: Je<strong>de</strong> Klasse (außer <strong>de</strong>r Wurzelklasse Object) ist von genau einer Oberklasse abgeleitet, <strong>de</strong>ren<br />

Verhalten sie erbt und beliebig erweitern kann (keine Mehrfachvererbung).


Smalltalk (<strong>Programmiersprache</strong>) 160<br />

• Automatische Speicherbereinigung (englisch garbage collection), die nicht durch <strong>de</strong>n Programmierer beeinflusst<br />

wer<strong>de</strong>n muss. Ein Objekt 'lebt' solange, wie es von an<strong>de</strong>ren Objekten referenziert wird.<br />

• Smalltalkprogramme wer<strong>de</strong>n in Byteco<strong>de</strong> übersetzt, <strong>de</strong>r durch eine virtuelle Maschine ausgeführt wird. Dadurch<br />

laufen Smalltalk-Programme ohne jegliche Än<strong>de</strong>rung auf je<strong>de</strong>m System, für das eine virtuelle Maschine existiert.<br />

Ursprünglich wur<strong>de</strong> <strong>de</strong>r Byteco<strong>de</strong> interpretiert; kommerzielle Umgebungen arbeiten inzwischen fast<br />

ausschließlich mit dynamischer Übersetzung.<br />

• Üblicherweise hat man eine Programmierumgebung (selbst in Smalltalk geschrieben), in <strong>de</strong>r man Quelltext am<br />

„leben<strong>de</strong>n“ Objekt än<strong>de</strong>rn und dann auch direkt in <strong>de</strong>r geän<strong>de</strong>rten Form (weiter)ausführen kann.<br />

„Smalltalkprogramme“ kann man än<strong>de</strong>rn, während sie laufen.<br />

• Die Quelltexteingabe erfolgt üblicherweise im Klassenbrowser. Mo<strong>de</strong>rne RefactoringBrowser setzen sich<br />

allmählich gegen einfache Klassenbrowser durch, weil sie automatisierte Refactoring-Funktionen unterstützen<br />

und damit die Produktivität nochmals erheblich steigern, ähnlich wie sich das in <strong>de</strong>r Java-Welt mit Eclipse<br />

etabliert hat.<br />

• Eine überraschen<strong>de</strong> Eigenschaft im Vergleich zu traditionellen Sprachen ist, dass die Kontrollstrukturen wie<br />

if-then-else, for, while nicht in die Sprache eingebaut sind. Zumin<strong>de</strong>st erscheint dies <strong>de</strong>m Programmierer so. Zum<br />

Beispiel wird eine IF-Anweisung so ausgeführt, in<strong>de</strong>m eine ifTrue:-Botschaft an ein Boolesches Objekt gesandt<br />

wird. Als Parameter wird ein Block (Anweisungsfolge) übergeben. Lediglich in <strong>de</strong>r Klasse True wird dieser<br />

Block ausgeführt. In <strong>de</strong>r Klasse False ist diese Metho<strong>de</strong> zwar auch implementiert, aber sie führt <strong>de</strong>n Block nicht<br />

aus.<br />

Es gibt nur drei eingebaute ausführbare Konstrukte:<br />

• Sen<strong>de</strong>n einer Botschaft an ein Objekt<br />

• Zuweisen eines Objekts an eine Variable<br />

• Ein Objekt als Rückgabewert einer Metho<strong>de</strong> liefern<br />

Geschichte und Be<strong>de</strong>utung von Smalltalk<br />

1970–1980<br />

In diese Zeit fällt die Entwicklung <strong>de</strong>r ersten Versionen von Smalltalk-71, Smalltalk-72, Smalltalk-74 und<br />

Smalltalk-76 [1] bis hin zum heute verbreiteten Standard Smalltalk-80 am Forschungszentrum Xerox PARC.<br />

1980–1990<br />

Die Programmierung mit Klassenbrowser und die Verwendung einer virtuellen Maschine zur Ausführung stellte von<br />

Anfang an gewisse Min<strong>de</strong>stanfor<strong>de</strong>rungen an die Hardware. Dies geschah zu einer Zeit in <strong>de</strong>r die erschwinglichen<br />

Computer nicht über graphische Benutzeroberflächen verfügten und die Rechenleistung nicht für eine solche<br />

ausreichte. Smalltalk war seiner Zeit voraus und konnte zu Beginn nur auf Workstations effektiv eingesetzt wer<strong>de</strong>n.<br />

Im Ergebnis gab es daher nur wenige Smalltalk-Entwickler – dafür umso mehr C-Programmierer. Mit <strong>de</strong>m<br />

Aufkommen <strong>de</strong>r graphischen Benutzeroberflächen im Mikrocomputerbereich entstand das objektorientierte C++ und<br />

da die meisten Entwickler C bereits kannten, konnte sich C++ sehr schnell verbreiten und Smalltalk blieb eine<br />

Ran<strong>de</strong>rscheinung. Zu<strong>de</strong>m geschah dies in einer Zeit, in <strong>de</strong>r Performance sehr wichtig war und Smalltalk auf hohe<br />

Ausführungsgeschwindigkeiten keinen beson<strong>de</strong>ren Wert legte (Alan Kay: „It's still fast enough for our neurons“).


Smalltalk (<strong>Programmiersprache</strong>) 161<br />

1990–2000<br />

Anfang und Mitte <strong>de</strong>r Neunziger Jahre wur<strong>de</strong> Smalltalk in vielen Bereichen populär, in <strong>de</strong>nen es auf die<br />

Beherrschung von Komplexität ankam (z. B. bei Expertensystemen). Verschie<strong>de</strong>ne große Anbieter wie IBM<br />

begannen, Smalltalk stark zu unterstützen und in Großkun<strong>de</strong>nprojekten einzusetzen. Es gab eine sprunghafte<br />

Zunahme verschie<strong>de</strong>ner Implementierungen von Smalltalk. Mit <strong>de</strong>m Internet-Boom und <strong>de</strong>m davon profitieren<strong>de</strong>m<br />

Java, büßte Smalltalk En<strong>de</strong> <strong>de</strong>r 90er Jahre seine gera<strong>de</strong> aufkommen<strong>de</strong> Popularität jedoch wie<strong>de</strong>r ein.<br />

In Java wur<strong>de</strong>n einige Konzepte von Smalltalk (wie z.B. die Virtuelle Maschine und <strong>de</strong>r Garbage Collector)<br />

übernommen. Die Syntax war jedoch wie<strong>de</strong>r an C angelehnt. Auch kamen erneut traditionelle Mittel zum Einsatz,<br />

wie die Vermischung <strong>de</strong>r Objektorientierung mit einfachen Datentypen und imperative Strukturen, geringe<br />

Selbstbezüglichkeit und <strong>de</strong>r Edit-Compile-Test-Debug-Zyklus mit Quellco<strong>de</strong> als reiner Textdatei etc. Java dafür bot<br />

Normierung, Aufstiegspfa<strong>de</strong> für C-Programmierer und nicht zuletzt Allianzmöglichkeiten gegen die<br />

MS-Windows-Dominanz. Zu<strong>de</strong>m wur<strong>de</strong> es von Sun kostenlos zur Verfügung gestellt.<br />

Das En<strong>de</strong> <strong>de</strong>s kurzen Smalltalk-Booms wur<strong>de</strong> durch <strong>de</strong>n Nie<strong>de</strong>rgang <strong>de</strong>r Firma ParcPlace unterstrichen, die als<br />

Ausgründung <strong>de</strong>s Xerox PARC mit VisualWorks (heute bei Cincom) <strong>de</strong>n direkten Nachfolger <strong>de</strong>r<br />

Originalimplementierung anbot, <strong>de</strong>r die damals mächtigste Smalltalk-Entwicklungsumgebung darstellte: Mit<br />

VisualWorks geschaffene Anwendungen liefen bereits 1991 bitkompatibel (durch VM) auf Windows, Mac OS,<br />

Solaris (und an<strong>de</strong>ren UNIX-Systemen) und konnte ab 1994 <strong>de</strong>ren verschie<strong>de</strong>ne Benutzeroberflächen mit „Camelon<br />

View“ unabhängig vom Laufzeitsystem simulieren.<br />

Die aufkommen<strong>de</strong> Dominanz von Microsoft Windows entwertete jedoch diese und an<strong>de</strong>re interessante<br />

Eigenschaften, da sich die Frage nach <strong>de</strong>r Plattformunabhängigkeit dadurch für immer weniger Anwen<strong>de</strong>r stellte.<br />

Die Wettbewerber von Microsoft suchten statt<strong>de</strong>ssen nach Mitteln, die MS Windows Dominanz zurückzudrängen.<br />

Nach<strong>de</strong>m sich be<strong>de</strong>uten<strong>de</strong> Firmen wie IBM und Sun für Java entschie<strong>de</strong>n und dafür Marketing betrieben, gewannen<br />

Java und C++ klar die Oberhand bezüglich kommerzieller Unterstützung, was zur heutigen Situation führte.<br />

Obwohl Smalltalk sehr leicht zu erlernen (nur wenige Sprachkonstrukte) und zu <strong>de</strong>buggen ist (selten ist eine<br />

zeitaufwändige explizite Neukompilierung und -erstellung sowie ein Neustart <strong>de</strong>s Programms erfor<strong>de</strong>rlich) und das<br />

Performanceproblem – zum Teil durch effektivere Implementierungen, zum Teil durch leistungsfähigere Hardware<br />

– inzwischen gelöst ist, wird Smalltalk heute noch immer in wenigen Bereichen eingesetzt. Einer <strong>de</strong>r Grün<strong>de</strong> hierfür<br />

kann in <strong>de</strong>r mangeln<strong>de</strong>n Einheitlichkeit <strong>de</strong>r Programmbibliotheken verschie<strong>de</strong>ner Implementationen gesehen<br />

wer<strong>de</strong>n, von <strong>de</strong>nen bisher keine eine „natürliche Dominanz“ (wie die von Sun für Java) entwickelt hat.<br />

Nach<strong>de</strong>m ParcPlace als Player ausgeschie<strong>de</strong>n war, IBM sein Smalltalk-Engagement zugunsten von Java eingestellt<br />

hatte und verschie<strong>de</strong>nen zunächst erfolgsversprechen<strong>de</strong> Smalltalk-Implementationen eingestellt wur<strong>de</strong>n (z.B.<br />

Dolphin Smalltalk [2] ), gab es nur noch wenige überzeugte Anhänger, die an einen großen Durchbruch glaubten.<br />

Smalltalk blieb weiter ein Insi<strong>de</strong>rthema.<br />

2000–2009<br />

In <strong>de</strong>n letzten Jahren gibt es mit <strong>de</strong>r Etablierung von freien Implementierungen eine Art „Renaissance“ von<br />

Smalltalk. Insbeson<strong>de</strong>re das von ursprünglichen Smalltalk-Erfin<strong>de</strong>rn entwickelte plattformübergreifen<strong>de</strong> Squeak und<br />

das darauf aufbauen<strong>de</strong> Croquet erhalten wachsen<strong>de</strong> Unterstützung aus Wissenschaft, IT-Industrie und einer großen<br />

freien Entwicklergemeinschaft. Squeak wur<strong>de</strong> erstmals im September 1996 als erstes freies Smalltalk veröffentlicht.<br />

Dan Ingalls, Ted Kaehler, John Maloney, Scott Wallace und Alan Kay schreiben, dass hier, was 1980 fehlschlug,<br />

geglückt sei. [3]<br />

Alan Kays Konzept einer interaktiven, computer- und netzwerkvermittelten Interaktion, das Dynabook, ist<br />

Bestandteil in <strong>de</strong>r Softwareentwicklung für das One Laptop per Child-Projekt. [4] Standardmäßig wer<strong>de</strong>n auf <strong>de</strong>n<br />

Schülerlaptops EToys, auf Squeak basieren<strong>de</strong> Bausteine, installiert.


Smalltalk (<strong>Programmiersprache</strong>) 162<br />

Mit Croquet wird, mit <strong>de</strong>m Hintergrund <strong>de</strong>s heutigen Wissensstands, erneut eine Antwort auf die generelle Frage<br />

nach <strong>de</strong>r optimalen Computer-Mensch-Schnittstelle gesucht. In <strong>de</strong>n 80er Jahren war dies die – erstmals mit<br />

Smalltalk implementierte – zweidimensionale graphische Benutzeroberfläche, die ihre Verbreitung durch Apple und<br />

Microsoft fand. Heute sehen Alan Kay und an<strong>de</strong>re darin eine dreidimensionale, plattformunabhängige, vernetzte<br />

Multibenutzerumgebung, in <strong>de</strong>r Objekte fließend zwischen <strong>de</strong>n verschie<strong>de</strong>nen teilnehmen<strong>de</strong>n Rechnern ausgetauscht<br />

wer<strong>de</strong>n können. Die dazu notwendigen Eigenschaften besitzt nach Auffassung <strong>de</strong>r Mitglie<strong>de</strong>r <strong>de</strong>s 2001 gestarteten<br />

und 2007 veröffentlichten Croquet-Projektes speziell Squeak Smalltalk, welches das ursprünglich zur<br />

Implementierung vorgesehene Java daher ersetzte.<br />

In 2009 ist das Pharo Project gestartet, das auf <strong>de</strong>r Basis von Squeak eine freie, stabile Smalltalk-Plattform bietet, um<br />

weitere Anwendungsbereiche mit freiem Smalltalk zu erreichen. En<strong>de</strong> 2009 wird VisualWorks 7.7 veröffentlicht, die<br />

inzwischen 9. Aktualisierung seit <strong>de</strong>r Übernahme durch Cincom.<br />

Typisierte Variante von Smalltalk<br />

Smalltalk verfügt nicht über ein statisches Typsystem. Insbeson<strong>de</strong>re fin<strong>de</strong>t man dort keine Typ<strong>de</strong>finitionen und<br />

Typannotationen an Variablen o<strong>de</strong>r für die Ein-/Ausgabeparameter von Metho<strong>de</strong>n. Demgemäß fin<strong>de</strong>n auch keinerlei<br />

Typprüfungen bei Wertzuweisungen statt, wie dies für typisierte Sprachen üblich ist, und zwar we<strong>de</strong>r dynamisch<br />

(zur Laufzeit) noch statisch (zur Übersetzungszeit). Die Klassenhierarchie von Smalltalk darf nicht mit einer<br />

Subtypenhierarchie verwechselt wer<strong>de</strong>n - auch wenn mo<strong>de</strong>rne objektorientierte <strong>Programmiersprache</strong>n oftmals Typ-<br />

und Klassen<strong>de</strong>finitionen als einen einzigen Vorgang betrachten, han<strong>de</strong>lt es sich hier um unterschiedliche Konzepte<br />

und auch unterschiedliche Komponenten <strong>de</strong>s Übersetzers und <strong>de</strong>s Laufzeitsystems einer Sprache. Smalltalk verfügt<br />

hinsichtlich <strong>de</strong>r Bildung und Prüfung von Typen über keine solche Komponente.<br />

Es gibt allerdings Varianten von Smalltalk, die über ein statisches Typsystem verfügen, so etwa Strongtalk.<br />

Strongtalk ermöglicht die klassenunabhängige Definition von Typen in einer eigenen Typhierarchie und in <strong>de</strong>r Folge<br />

auch die Annotation solcher Typen an Variablen und Metho<strong>de</strong>n.<br />

Ausdrücke (Expressions)<br />

Ausdrücke haben folgen<strong>de</strong> Form:<br />

objekt nachricht<br />

Das heißt man sen<strong>de</strong>t einem Objekt eine Nachricht. Das Objekt antwortet mit einem Antwortobjekt. Ausdrücke<br />

müssen mit einem Punkt getrennt wer<strong>de</strong>n.<br />

Es gibt drei Arten von Nachrichten, unäre Nachrichten, binäre Nachrichten und Schlüsselwort-Nachrichten.<br />

Unäre Nachrichten haben keinen Parameter und bestehen aus einem Bezeichner:<br />

objekt nachricht<br />

Eine binäre Nachricht hat genau einen Parameter und besteht aus einem o<strong>de</strong>r mehreren Son<strong>de</strong>rzeichen. Vier<br />

Beispiele:<br />

1 + 3<br />

100 @ 200<br />

vorname , nachname<br />

10 // 3<br />

Die meisten arithmetischen Operationen sind in Smalltalk als binäre Nachrichten implementiert.<br />

Eine Schlüsselwort-Nachricht hat eine o<strong>de</strong>r mehrere Parameter, wobei vor <strong>de</strong>n Parametern Doppelpunkte stehen.<br />

objekt nachricht: parameter


Smalltalk (<strong>Programmiersprache</strong>) 163<br />

Diese Schlüsselwort-Nachricht heißt nachricht: und hat einen Parameter parameter.<br />

objekt nachricht: parameter1 nachricht: parameter2<br />

Diese Schlüsselwort-Nachricht heißt nachricht:nachricht: und hat zwei Parameter. D. h. Parameter können bei<br />

Schlüsselwort-Nachrichten mitten in die Nachricht eingefügt wer<strong>de</strong>n. Diese Beson<strong>de</strong>rheit macht es möglich, in<br />

Smalltalk beson<strong>de</strong>rs leicht lesbare Programme zu schreiben:<br />

collection copyFrom: 1 to: 10<br />

Das klingt wie ein Satz. In Java wür<strong>de</strong> man das folgen<strong>de</strong>rmaßen schreiben:<br />

collection.copyFromTo(1, 10);<br />

Ausdrücke können kombiniert und mit Klammern geschachtelt wer<strong>de</strong>n. Ohne Klammern wer<strong>de</strong>n Ausdrücke in<br />

folgen<strong>de</strong>r Reihenfolge ausgeführt: Unäre Nachrichten vor binären Nachrichten vor Schlüsselwort-Nachrichten. Bei<br />

"gleichrangigen" Nachrichten erfolgt die Auswertung von links nach rechts.<br />

Sollen einem Objekt in Folge mehrere Nachrichten geschickt wer<strong>de</strong>n, besteht die Möglichkeit, diese Nachrichten mit<br />

einem Semikolon (;) zu verketten:<br />

objekt<br />

nachricht1;<br />

nachricht2;<br />

nachricht3<br />

Zuweisungen<br />

Eine Zuweisung hat folgen<strong>de</strong> Form:<br />

variable := ausdruck<br />

Blöcke<br />

Blöcke sind Sequenzen von Zuweisungsanweisungen und Expressions. Sie wer<strong>de</strong>n durch eckige Klammern<br />

eingeschlossen. Blöcke können parameterlos sein o<strong>de</strong>r auch Parameter aufweisen.<br />

blockEins := [ Anweisungen ]<br />

blockZwei := [ :einParameter | Transcript show: einParameter ]<br />

Blöcke behalten ihren Kontext, so dass sie bei <strong>de</strong>r Ausführung mit <strong>de</strong>n Objekten arbeiten, die dort bei <strong>de</strong>r Erzeugung<br />

verfügbar waren. Um einen Block ohne Parameter auszuführen gibt es eine parameterlose Metho<strong>de</strong>. Bei <strong>de</strong>m Aufruf<br />

von Blöcken mit Parametern müssen diese mit Werten versorgt wer<strong>de</strong>n.<br />

blockEins value<br />

blockZwei value: 'Test'


Smalltalk (<strong>Programmiersprache</strong>) 164<br />

Kontrollstrukturen<br />

Die Kontrollstrukturen wer<strong>de</strong>n mit booleschen Ausdrücken und Blöcken implementiert. Ein boolescher Ausdruck<br />

liefert nach <strong>de</strong>r Auswertung ein Boolesches Objekt. Diesem wird dann eine Message zugesandt, die als Parameter<br />

einen ausführbaren Block hat. Der Programmtext sieht aber ähnlich aus, wie bei an<strong>de</strong>ren <strong>Programmiersprache</strong>n auch,<br />

so dass man wie dort einfach gewisse Kontrollstrukturen als gegeben anwen<strong>de</strong>n kann.<br />

Einige Beispiele.<br />

IF-Anweisung<br />

o<strong>de</strong>r<br />

aBoolean ifTrue: [ "ein Block mit Anweisungen" ]<br />

( einAusdruck ) ifTrue: [ "ein Block mit Anweisungen" ]<br />

Das aus an<strong>de</strong>ren <strong>Programmiersprache</strong>n bekannte else sähe folgen<strong>de</strong>rmaßen aus:<br />

aBoolean ifTrue: [ ... ] ifFalse: [ ... ]<br />

Schleifen<br />

10 timesRepeat: [ Transcript show: '.' ].<br />

1 to: 10 do: [ :i | Transcript show: i printString ].<br />

[ "ein Block, <strong>de</strong>r ein boole'sches Objekt zurückgibt" ] whileTrue.<br />

[ "ein Block, <strong>de</strong>r ein boole'sches Objekt zurückgibt" ] whileFalse.<br />

[ "ein Block, <strong>de</strong>r ein boole'sches Objekt zurückgibt" ] whileTrue: [<br />

"Block mit Schleifenrumpf" ].<br />

[ "ein Block, <strong>de</strong>r ein boole'sches Objekt zurückgibt" ] whileFalse: [<br />

"Block mit Schleifenrumpf" ]<br />

Collections<br />

Die Smalltalkumgebungen sind mit einer großen Klassenbibliothek ausgestattet. Ein wichtiger allgemeiner<br />

Objekttyp (Klasse) sind die Collections, d. h. Sammlungen von Objekten. Die Klasse Collection steht an <strong>de</strong>r Wurzel<br />

einer ganzen Hierarchie von Klassen.<br />

Eine wichtige Arbeit, die man mit einem Collection-Objekt durchführen kann, ist für je<strong>de</strong>s Element <strong>de</strong>r Collection<br />

einen Block von Anweisungen auszuführen. An<strong>de</strong>re <strong>Programmiersprache</strong>n brauchen hierfür spezielle Konstrukte<br />

(Iteratoren).<br />

aCollection do: [ :einElement | einElement<br />

auszuführen<strong>de</strong>ArbeitFürDiesesElement ]<br />

Es hat sich eingebürgert, <strong>de</strong>n Parameter als each zu bezeichnen, so dass direkt klar ist was hierbei gemeint ist. Bei<br />

Verwendung von mehreren Collections sollte man <strong>de</strong>m noch eine genaue Bezeichnung nachsetzten. Iteriert man<br />

bspw. über alle x und y Werte aus zwei unterschiedlichen Collections:<br />

xWerte do: [:eachX | yWerte do: [:eachY | map addPoint: eachX withY:<br />

eachY]]


Smalltalk (<strong>Programmiersprache</strong>) 165<br />

Programmbeispiel<br />

Das klassische HelloWorld-Beispiel sieht wie folgt aus:<br />

Transcript show: 'Hello World!'.<br />

Transcript ist eine in je<strong>de</strong>r Smalltalkumgebung vor<strong>de</strong>finierte globale Variable, die ein Objekt enthält, auf <strong>de</strong>m man<br />

Dinge protokollieren kann (ein Ausgabefenster).<br />

Wir sen<strong>de</strong>n diesem Objekt die Message<br />

show: aString<br />

Ein bereits etwas komplexeres Beispiel:<br />

'Hello World' do: [ :eachChar|<br />

].<br />

Transcript show: eachChar ; cr.<br />

gibt <strong>de</strong>n Text „Hello World“ vertikal aus. 'Hello World' ist ein String (Zeichenkette). Die Klasse dieses Objektes ist<br />

eine Unterklasse von Collection. Ein String ist also eine Collection (= Sammlung) von Zeichen. In<strong>de</strong>m wir <strong>de</strong>m<br />

Objekt String die Message<br />

aString do: [ :eachChar | OperationenMitDiesemBuchstaben ]<br />

sen<strong>de</strong>n, gehen wir alle Buchstaben (Elemente) <strong>de</strong>s Strings einzeln durch.<br />

Das Dictionary (in Perl Hash, in Java HashMap) ist eine in Smalltalk häufig verwen<strong>de</strong>te Datenstruktur:<br />

d := Dictionary new.<br />

d at: 'grün' put: 'green'.<br />

d at: 'blau' put: 'blue'.<br />

d at: 'rot' put: 'red'.<br />

Transcript show: (d at: 'blau').<br />

Alternativ können die Nachrichten auch wie bereits beschrieben verkettet wer<strong>de</strong>n:<br />

d := Dictionary new.<br />

d at: 'grün' put: 'green';<br />

at: 'blau' put: 'blue';<br />

at: 'rot' put: 'red'.<br />

Transcript show: (d at: 'blau').<br />

Auch das Dictionary ist eine Unterklasse von Collection. Diese Datenstruktur entspricht <strong>de</strong>m assoziativen Array in<br />

an<strong>de</strong>ren <strong>Programmiersprache</strong>n.


Smalltalk (<strong>Programmiersprache</strong>) 166<br />

Schreibweise<br />

Smalltalk wird mit kleinem T geschrieben. Häufig fin<strong>de</strong>t sich die falsche Schreibweise SmallTalk, selbst auf <strong>de</strong>n<br />

offiziellen IBM-Webseiten (allerdings nicht durchgehend). Der Fehler rührt möglicherweise daher, dass<br />

zusammengesetzte Namen in Smalltalk selbst durch Binnenmajuskel strukturiert wer<strong>de</strong>n.<br />

Literatur<br />

• A<strong>de</strong>le Goldberg: Smalltalk-80, The Interactive Programming Environment. Addison-Wesley, 1983, ISBN<br />

0201113724<br />

• Glen Krasner: Smalltalk-80, Bits of History, Words of Advice. Addison-Wesley, 1. August 1983, ISBN<br />

0-201-11669-3<br />

• Johannes Brauer: Grundkurs Smalltalk · Objektorientierung von Anfang an. Eine Einführung in die<br />

Programmierung Vieweg-Verlag, 3. Auflage 2009, ISBN 3834807125<br />

• Sherman R. Alpert, Kyle Brown, Bobby Woolf: The Design Patterns Smalltalk Companion. Addison-Wesley<br />

Professional, 10. Februar 1998, ISBN 0201184621<br />

• Mark J. Guzdial: Squeak: Object-Oriented Design with Multimedia Applications. Prentice Hall, 20. Dezember<br />

2000, ISBN 0130280283<br />

• Mark J. Guzdial, Kimberly M. Rose: Squeak: Open Personal Computing and Multimedia. Prentice Hall, 2.<br />

August 2001, ISBN 0130280917<br />

• Simon Lewis: The Art and Science of Smalltalk. Prentice Hall, 1. März 1995, ISBN 0133713458<br />

• Günther Vinek: Objektorientierte Softwareentwicklung mit Smalltalk. Springer Verlag, 24. April 1997, ISBN<br />

978-3-540-62558-2<br />

• Smalltalk-Bücher als PDF-Dokumente zum Herunterla<strong>de</strong>n [5]<br />

Weblinks<br />

• German Smalltalk Users Group [6] z.B. aktiv im Frankfurter und Münchner Raum<br />

• STIC [7] ist die Hersteller-unabhängige Lobby Organisation (Juni 2007)<br />

• Smalltalk Solutions [8] Jährliche Konferenz zu Smalltalk<br />

• Smalltalk link fountain [9] weitere Links zu Smalltalk<br />

• Dolphin Map · Ein Wiki mit Dolphin Smalltalk spezifischen Informationen [10]<br />

• Vortrag von Alan Kay [11] auf <strong>de</strong>r O'Reilly Etech 2003 Presentation<br />

Implementierungen<br />

• Ambrai Smalltalk [12] – Smalltalk für Mac OS X.<br />

• Cincom Smalltalk [13] – Smalltalk-Dialekt <strong>de</strong>r Firma Cincom [14] . Angeboten wer<strong>de</strong>n folgen<strong>de</strong> Umgebungen:<br />

• ObjectStudio [15] – Entwicklungsumgebung für Microsoft Windows mit COM- und ODBC-Schnittstellen.<br />

• VisualWorks [16] für verschie<strong>de</strong>ne Plattformen. Es ist auch eine kostenlose Version für <strong>de</strong>n unkommerziellen<br />

Einsatz verfügbar.<br />

• Croquet – Freie Implementierung u.a. von Smalltalk Miterfin<strong>de</strong>r Alan Kay als zukunftsorientierte<br />

Anwen<strong>de</strong>roberfläche die netzbasiert, dreidimensional, mehrbenutzerfähig, <strong>de</strong>zentral, multimedial und<br />

plattformübergreifend ist. Das Croquet Consortium [17] wird von führen<strong>de</strong>n wissenschaftlichen Instituten und<br />

Unternehmen unterstützt.<br />

• Dolphin Smalltalk [18] – windowsbasierte Smalltalk-Umgebung (eingestellt?).<br />

• GNU Smalltalk [19] – freies Smalltalk <strong>de</strong>s GNU-Projekts.<br />

• LittleSmalltalk [20] – freie Implementierung basierend auf Timothy A. Budds I<strong>de</strong>en.<br />

• LSW Vision-Smalltalk [21]


Smalltalk (<strong>Programmiersprache</strong>) 167<br />

• StepTalk – GNUstep und Mac OS X Scripting-Framework.<br />

• Squeak – freie plattformunabhängige Implementierung von Smalltalk-80-Erfin<strong>de</strong>rn wie Alan Kay und Dan<br />

Ingalls mit multimedialen Elementen und großer aktiver Unterstützergemein<strong>de</strong>.<br />

• Pharo [22] - ein stabile Variante von Squeak<br />

• Syx [23] – eine weitere freie Smalltalk-Implementierung.<br />

• Smalltalk/X [24] – Smalltalk <strong>de</strong>r Firma eXept Software AG (kostenlos verfügbar, auch für kommerzielle<br />

Projekte).<br />

• Smalltalk MT bei Object Connect [25] o<strong>de</strong>r Smalltalk MT bei Genify [26] – ein C++-nahes Smalltalk-Derivat (C++<br />

mit Smalltalk-Syntax), das zu nativen Co<strong>de</strong> kompiliert.<br />

• Strongtalk [27] – freie (open source) Smalltalk-Implementierung für Microsoft Windows mit beson<strong>de</strong>rem<br />

Augenmerk auf Performance und optionaler starker Typisierung.<br />

• VisualAge for Smalltalk [28] – Smalltalk-Umgebung von IBM (eingestellt, <strong>de</strong>r Nachfolger ist VAST [29] ).<br />

Siehe auch<br />

• Objective-C<br />

• Self (<strong>Programmiersprache</strong>)<br />

• Slate (<strong>Programmiersprache</strong>)<br />

• Strongtalk<br />

• Squeak<br />

• Scratch (<strong>Programmiersprache</strong>)<br />

Referenzen<br />

[1] Vgl. Kay, Alan C. (1993), »The early history of Smalltalk«, in: »ACM SIGPLAN notices« (Tagungsjournal), Bd. 28, No. 3, März,<br />

Association for Computing Machinery, New York, S. 69 ff. – PDF: 2004-0924-2355 (1999-0802-2121) (http:/ / www. smalltalk. org­/<br />

downloads/ papers/ SmalltalkHistoryHOPL. pdf).<br />

[2] http:/ / www. object-arts. com/ content/ navigation/ home. html<br />

[3] Back to the Future: The Story of Squeak (http:/ / users. ipa. net/ ~dwighth/ squeak/ oopsla_squeak. html)<br />

[4] Windleys Technometria, 23. Februar 2006: Alan Kay: The $100 Laptop and Powerful I<strong>de</strong>as (http:/ / www. windley. com/ archives/ 2006/ 02/<br />

alan_kay_the_10. shtml)<br />

[5] http:/ / stephane. ducasse. free. fr/ FreeBooks. html<br />

[6] http:/ / swiki. gsug. org/<br />

[7] http:/ / www. stic. st/<br />

[8] http:/ / www. smalltalksolutions. com/<br />

[9] http:/ / www. mars. dti. ne. jp/ %7Eumejava/ smalltalk/ stLinks/ stLinks. html<br />

[10] http:/ / www. dolphinmap. net<br />

[11] http:/ / www. lisarein. com/ alankay/ tour. html<br />

[12] http:/ / www. ambrai. com/<br />

[13] http:/ / smalltalk. cincom. com/ in<strong>de</strong>x. ssp<br />

[14] http:/ / www. cincom. com<br />

[15] http:/ / smalltalk. cincom. com/ prodinformation/ in<strong>de</strong>x. ssp?content=osfactsheet<br />

[16] http:/ / smalltalk. cincom. com/ prodinformation/ in<strong>de</strong>x. ssp?content=vwfactsheet<br />

[17] http:/ / www. croquetconsortium. org<br />

[18] http:/ / www. object-arts. com/<br />

[19] http:/ / directory. fsf. org/ smalltalk. html<br />

[20] http:/ / www. littlesmalltalk. org/<br />

[21] http:/ / www. lesser-software. com/ lswvst. htm<br />

[22] http:/ / www. pharo-project. org/ home<br />

[23] http:/ / co<strong>de</strong>. google. com/ p/ syx/<br />

[24] http:/ / www. smalltalk-x. <strong>de</strong><br />

[25] http:/ / www. objectconnect. com/<br />

[26] http:/ / www. genify. com<br />

[27] http:/ / www. strongtalk. org/


Smalltalk (<strong>Programmiersprache</strong>) 168<br />

[28] http:/ / www-4. ibm. com/ software/ ad/ smalltalk/<br />

[29] http:/ / www. instantiations. com/ VAST/<br />

Turbo Pascal<br />

Turbo Pascal ist eine integrierte Entwicklungsumgebung <strong>de</strong>r Firma Borland für die <strong>Programmiersprache</strong> Pascal.<br />

Die Anfänge<br />

Der Compiler basierte auf <strong>de</strong>m Blue Label Pascal Compiler, <strong>de</strong>r von An<strong>de</strong>rs Hejlsberg ursprünglich für das<br />

Kassetten-basierte Betriebssystem NasSys <strong>de</strong>s Mikrocomputers Nascom entwickelt wur<strong>de</strong>. Dieser Compiler wur<strong>de</strong><br />

zunächst als Compass Pascal Compiler für das Betriebssystem CP/M und dann als Turbo Pascal Compiler für<br />

MS-DOS und CP/M weiterentwickelt.<br />

Turbo Pascal 1.0<br />

Die erste Version von Turbo Pascal erschien im<br />

November 1983, zu einer Zeit, als das Konzept <strong>de</strong>r<br />

integrierten Entwicklungsumgebungen noch recht neu<br />

war. Ein Programmierer hatte zu dieser Zeit auf einem<br />

IBM-kompatiblen PC im Wesentlichen die Wahl<br />

zwischen <strong>de</strong>m mit DOS mitgelieferten Microsoft<br />

BASIC-Interpreter o<strong>de</strong>r einem professionellen und<br />

teuren BASIC-, C-, Fortran- o<strong>de</strong>r Pascal-Compiler<br />

(UCSD). Die Compiler waren eher umständlich zu<br />

benutzen: Mangels Multitasking unter MS-DOS<br />

Turbo Pascal 1.0 aus <strong>de</strong>m Jahr 1983<br />

bestand je<strong>de</strong>r Testlauf aus <strong>de</strong>m Verlassen, Starten und Neula<strong>de</strong>n <strong>de</strong>r verschie<strong>de</strong>nen Tools (Editor, Compiler, Linker,<br />

Debugger), die für die Softwareentwicklung notwendig sind. Da die meisten PCs zu dieser Zeit keine Festplatten<br />

hatten (eine solche kostete zum damaligen Zeitpunkt 2000 US-Dollar und mehr), musste oft sogar noch mehrmals<br />

die Diskette gewechselt wer<strong>de</strong>n.<br />

In diese Situation hinein kam Turbo Pascal mit <strong>de</strong>m IDE-Konzept, das die verschie<strong>de</strong>nen Tools in einem Programm<br />

vereinte. Es war zu<strong>de</strong>m gera<strong>de</strong> einmal rund 60 KB groß und lief damit auf je<strong>de</strong>m damaligen PC in hoher<br />

Geschwindigkeit. Selbst auf einem PC mit nur einem Diskettenlaufwerk konnte auf Diskettenwechsel verzichtet<br />

wer<strong>de</strong>n, da auf <strong>de</strong>r Turbo-Pascal-Diskette noch genug Platz für das gera<strong>de</strong> bearbeitete eigene Programm war.<br />

Schließlich war das System preislich selbst für Schüler und Stu<strong>de</strong>nten erschwinglich – mit <strong>de</strong>m Ergebnis, dass es im<br />

Laufe <strong>de</strong>r 1980er Jahre auf <strong>de</strong>m PC zum Quasistandard wur<strong>de</strong>.<br />

Folgeversionen<br />

Ohne Turbo Pascal hätte die Sprache Pascal sicher das gleiche Schicksal ereilt wie viele an Universitäten vorher und<br />

nachher geborene „Kunstsprachen“, z. B. Prolog, Modula-2 o<strong>de</strong>r Oberon (die letzten bei<strong>de</strong>n auch von Niklaus<br />

Wirth), die heute praktisch verschwun<strong>de</strong>n sind. Hejlsberg entwickelte die Sprache und das System pragmatisch<br />

weiter: Von Anfang an wur<strong>de</strong> die Laufzeitbibliothek um Routinen ergänzt, die Zugriff auf das System ermöglichten<br />

– ganz entgegen <strong>de</strong>m ursprünglichen Konzept von Wirth. Dabei wur<strong>de</strong> – an<strong>de</strong>rs als z. B. bei <strong>de</strong>r Sprache C – die für<br />

Pascal typische strenge Typprüfung etc. beibehalten (bei<strong>de</strong>s hat Vor- und Nachteile: Eine strenge Prüfung<br />

vermin<strong>de</strong>rt die Gefahr ungewollten Fehlverhaltens eines Programms, macht <strong>de</strong>n Quelltext aber meist länger und<br />

zwingt dazu, bewusst Funktionen zur Typumwandlung zu nutzen). Je umfangreicher ein Programmpaket wird, <strong>de</strong>sto


Turbo Pascal 169<br />

wichtiger wer<strong>de</strong>n solche Funktionen, weshalb auch an<strong>de</strong>re <strong>Programmiersprache</strong>n z. B. C++ diese Konzepte<br />

übernommen haben.<br />

• In Version 3 (September 1986) kam in <strong>de</strong>r MS-DOS-Version Grafik dazu. Dies war die letzte Version, die auch<br />

noch für CP/M erschien, allerdings ohne die Grafikmöglichkeiten, da die meisten CP/M-Rechner nicht<br />

grafikfähig sind. Es gab drei unterschiedliche Versionen für MS-DOS, die es ermöglichten, unterschiedlichen<br />

Co<strong>de</strong> zu generieren, und zwar für emulierten Fließpunkt-Co<strong>de</strong>, Coprozessor-orientierten Co<strong>de</strong>, und BCD-Co<strong>de</strong>.<br />

• In Version 4 (Dezember 1987) kam das Unit-Konzept dazu, das Bibliotheken und große Projekte ermöglichte.<br />

Das Einfügen von Assemblerteilen in <strong>de</strong>n Quelltext wur<strong>de</strong> mit Inline-Co<strong>de</strong>s unterstützt.<br />

• In Version 5 (Oktober 1988) wur<strong>de</strong> <strong>de</strong>r Debugger in die Entwicklungsumgebung integriert. Damit wur<strong>de</strong> es<br />

möglich, innerhalb <strong>de</strong>r IDE zu <strong>de</strong>buggen, Haltepunkte zu setzen und Variablenwerte zu beobachten.<br />

• In Version 5.5 (Mai 1989) kam die Objektorientierung hinzu.<br />

• In Version 6 (November 1990) kam eine objektorientierte<br />

GUI-Bibliothek hinzu (Turbo Vision), ähnlich <strong>de</strong>r späteren MFC für<br />

Windows; Turbo Vision war für <strong>de</strong>n Textmodus <strong>de</strong>s PCs konzipiert,<br />

enthielt aber bereits Steuerelemente wie Fenster,<br />

Befehlsschaltflächen und Bildlaufleisten, die durch Textsymbole<br />

dargestellt wur<strong>de</strong>n. Außer<strong>de</strong>m konnten (auch umfangreichere)<br />

Assemblerfunktionen in Intelsyntax direkt im Quelltext realisiert<br />

wer<strong>de</strong>n. Die Entwicklungsumgebung wur<strong>de</strong> entsprechend erweitert,<br />

so dass auch Assemblerteile im Einzelschrittmodus bei<br />

gleichzeitiger Kontrolle aller Flag- und Registerinhalte ausgeführt wer<strong>de</strong>n konnten.<br />

Version 6.0 von 1990<br />

(im Turbo-Vision-Stil)<br />

• Parallel zu Version 6 kam Turbo Pascal für Windows 1.0 auf <strong>de</strong>n Markt, <strong>de</strong>ssen GUI komplett als<br />

Windows-Anwendung ausgelegt war und das in Version 7 (Borland Pascal) übernommen und ausgebaut wur<strong>de</strong>.<br />

• In Version 7 (Oktober 1992) wur<strong>de</strong> in <strong>de</strong>r professionellen Variante (Borland Pascal) die Entwicklung von<br />

Protected-Mo<strong>de</strong>-Anwendungen innerhalb <strong>de</strong>r IDE möglich – allerdings ohne integrierten Debugger. Im April<br />

1993 folgte noch eine nachgeschobene/fehlerbereinigte Version 7.01; dies war zugleich auch die letzte von<br />

Borland veröffentlichte Pascal-Version.<br />

Anfang <strong>de</strong>r 1990er-Jahre wur<strong>de</strong> Turbo Pascal auf Windows portiert. Dies war allerdings eine Sackgasse. Die<br />

Programmierung war unter Turbo Pascal für Windows ähnlich aufwendig wie in C – mit <strong>de</strong>m zusätzlichen Nachteil,<br />

dass Windows selbst in C programmiert ist, weshalb die Schnittstellen zwischen Windows und Pascalprogramm<br />

min<strong>de</strong>stens grundlegen<strong>de</strong> C-Kenntnisse erfor<strong>de</strong>rn. Borland adaptierte in <strong>de</strong>r Folgezeit das<br />

Rapid-Application-Development-Prinzip, das sich vorher schon bei Visual Basic von Microsoft sehr bewährt hatte:<br />

Die grafischen Elemente einer Windows-Anwendung wer<strong>de</strong>n mit <strong>de</strong>r Maus zusammengestellt, <strong>de</strong>r zugehörige Co<strong>de</strong><br />

wird automatisch erzeugt. Dieses Produkt wur<strong>de</strong> Delphi genannt, die zugrun<strong>de</strong>liegen<strong>de</strong> Sprache ist Object Pascal<br />

von Borland.<br />

Ausschnitt <strong>de</strong>r Anweisungen<br />

begin – Beginn eines Anweisungsblockes<br />

uses crt; – Einbin<strong>de</strong>n <strong>de</strong>r Bibliothek CRT(zur Textein- und -ausgabe) in <strong>de</strong>n Suchpfad<br />

var a, b, c: string; – Variablen<strong>de</strong>klaration<br />

Writeln ('Text'); – Ausgabe von "Text"<br />

Readln (text); – Lese Eingabe und speichere diese in die Variable text<br />

ClrScr; – Löscht <strong>de</strong>n Bildschirminhalt. (Benötigt 'uses crt;')<br />

Textcolor (1); – Setzt die Textfarbe 0-15, 16-31 blinken<strong>de</strong>r Text (Benötigt 'uses crt;')<br />

Textbackground (1); – Setzt die Hintergrundfarbe 0-15 (Benötigt 'uses crt;')<br />

GoToXY(X,Y); - Geht zu Textstelle X/Y (Benötigt 'uses crt;')


Turbo Pascal 170<br />

Sound (x); – Spielt Ton von x Hertz ab<br />

Delay (x); – Programmverzögerung von x ms<br />

Nosound; – Stoppt die Tonausgabe<br />

if a = 'x' then x – Bedingungsanweisung<br />

end; – En<strong>de</strong> eines Anweisungsblocks<br />

end. – Programmen<strong>de</strong><br />

writeln(zahl:10:2); -Ausgabeformatierung, Ausgabe auf 10 Ziffern und 2 Nachkommastellen von zahl<br />

Siehe auch<br />

• Mit Free Pascal und GNU Pascal gibt es zwei Turbo-Pascal-kompatible freie Compiler, die für zahlreiche<br />

Betriebssysteme zur Verfügung stehen. Die Entwicklung von Virtual Pascal wur<strong>de</strong> hingegen eingestellt, obwohl<br />

es noch eine große Gemeinschaft gibt.<br />

Literatur<br />

• Michael Starke: Borland Pascal 7.0. Das Buch. TLC The Learning Companie 1993, ISBN 978-3893622887.<br />

• Karl-Hermann Rollke: Das Borland Pascal 7.0 Buch. Sybex-Verlag GmbH, ISBN 1995, 978-3815500712<br />

• Reiner Schölles: Das große Buch zu Turbo und Borland PASCAL 7.0 Data Becker GmbH + Co. Kg 1994, ISBN<br />

978-3890115887<br />

• Irene Bau<strong>de</strong>r, Jürgen Bär: Borland Pascal 7.0. Das Kompendium. Einführung. Arbeitsbuch. Nachschlagewerk.<br />

Pearson Education 1998, ISBN 978-3877914502<br />

Weblinks<br />

• Im „Museum“ <strong>de</strong>s Borland Developer Network [1] kann man die Versionen 1.0, 3.02 und 5.5 von Turbo Pascal<br />

(nur für MS-DOS) kostenlos und legal herunterla<strong>de</strong>n.<br />

• Die Firma TMT [2] bietet ebenfalls Turbo-Pascal-Klone für 32-Bit-Systeme an, eine abgespeckte Variante ist<br />

kostenlos.<br />

• Bei Webplain.<strong>de</strong> [3] trifft sich die aktivste <strong>de</strong>utschsprachige Turbo-Pascal-Anhängerschaft.<br />

• Paswiki [4] Wiki über Turbo Pascal.<br />

• Viele weitere Informationen und Ressourcen zu Turbo Pascal fin<strong>de</strong>n sich auf <strong>de</strong>r Turbo Pascal Programmers Page<br />

[5] .<br />

• Die Geschichte von Turbo Pascal / Delphi [6]<br />

Referenzen<br />

[1] http:/ / bdn. borland. com/ museum<br />

[2] http:/ / www. frameworkpascal. com/<br />

[3] http:/ / www. webplain. <strong>de</strong><br />

[4] http:/ / www. paswiki. <strong>de</strong><br />

[5] http:/ / www. <strong>de</strong>vq. net/ pascal/<br />

[6] http:/ / www. bernd-leitenberger. <strong>de</strong>/ turbo-pascal-history. shtml


Visual Basic 171<br />

Visual Basic<br />

Visual Basic .NET<br />

Basisdaten<br />

Paradigmen: prozedural, vollständig objektorientiert<br />

Erscheinungsjahr: 2002<br />

Entwickler: Microsoft Corp.<br />

Aktuelle Version: 9.0.21022.8 (16. November 2007)<br />

Typisierung: stark, explizit (auf Wunsch auch implizit), statisch<br />

wichtige Implementierungen: Microsoft Visual Basic .NET, SharpDevelop<br />

Einflüsse: Visual Basic Classic, Java, C#<br />

Betriebssystem: Windows<br />

Lizenz: proprietär<br />

msdn.microsoft.com/<strong>de</strong>-<strong>de</strong>/vbasic/ [1]<br />

Visual Basic (Abk. VB) ist eine proprietäre objektorientierte <strong>Programmiersprache</strong>, <strong>de</strong>ren neuere Versionen auf <strong>de</strong>m<br />

Microsoft .NET-Framework basieren. Um zwischen <strong>de</strong>n alten nicht vollständig objektorientierten und <strong>de</strong>n neuen auf<br />

<strong>de</strong>m .NET-Framework basieren<strong>de</strong>n Versionen zu unterschei<strong>de</strong>n, wer<strong>de</strong>n erstere bis inklusive Visual Basic 6.0 als<br />

Visual Basic Classic, die letzteren hingegen als Visual Basic .NET (Abk. VB.NET) bezeichnet.<br />

Einführung<br />

Der historisch wichtigste Vorteil von Visual Basic ist die einfache Erlernbarkeit <strong>de</strong>r Sprache. Die Sprache ist<br />

bewusst an die englische Sprache angelehnt und benutzt Wörter anstelle von Symbolen. Beispiele sind And statt &&,<br />

Or statt ||,, Mod statt %, wie in C++ üblich. Aus genau diesem Grund bevorzugen jedoch einige Programmierer C#,<br />

da <strong>de</strong>r Leistungsumfang <strong>de</strong>m von VB.NET nahezu gleich ist, die Sprache jedoch teilweise kompaktere<br />

Formulierungen ermöglicht.<br />

Da Visual Basic von Anfang an zum Einsatz mit einer integrierten Entwicklungsumgebung konzipiert wur<strong>de</strong>,<br />

können Visual-Basic-Programme in <strong>de</strong>r Regel mit geringem Zeitaufwand erstellt wer<strong>de</strong>n. Dadurch eignet es sich für<br />

Rapid Application Development. Visual Basic Classic, das noch nicht die objektorientierten Fähigkeiten von<br />

VB.NET hatte, wur<strong>de</strong> oft eingesetzt, um erste Prototypen für Programme zu bauen, die später z. B. in C++<br />

implementiert wur<strong>de</strong>n.<br />

Visual Basic gilt als sehr gut dokumentiert. Die MSDN Library, die die .NET-Architektur, die<br />

Standard-.NET-Sprachen, darunter Visual Basic .NET, sowie Visual Studio .NET dokumentiert und beschreibt, ist<br />

eine <strong>de</strong>r größten (Auslieferung auf drei CDs / 1 DVD) Informationssammlungen für Programmierer.<br />

Visual Basic unterstützt sowohl statische als auch dynamische Typisierung über <strong>de</strong>n Datentyp Object (bzw.<br />

„Variant“ in VB Classic).


Visual Basic 172<br />

Geschichte<br />

In <strong>de</strong>n frühen 1990ern hatte BASIC, das damals zusammen mit vielen Betriebssystemen geliefert wur<strong>de</strong>, gegenüber<br />

an<strong>de</strong>ren Hochsprachen wie C und C++ an Be<strong>de</strong>utung verloren. BASIC bot eine viel eingeschränktere Funktionalität<br />

und Erweiterbarkeit, wodurch es für <strong>de</strong>n professionellen Einsatz nicht geeignet war.<br />

Der spätere historische Erfolg von Visual Basic beruht vor allem auf <strong>de</strong>r einfachen Erlernbarkeit, visuellen<br />

Entwicklungsumgebungen und <strong>de</strong>r unkomplizierten Ausbaufähigkeit <strong>de</strong>r zugehörigen Programmbibliotheken.<br />

Kritiker bemängeln die mangelhafte Funktionalität. Oft ist auch von langsamen Ausführungsgeschwindigkeiten bei<br />

leistungsschwachen Rechnern (meist nur während <strong>de</strong>r Interpretation) die Re<strong>de</strong>, welche jedoch heute bei mo<strong>de</strong>rnen<br />

Rechnern nach <strong>de</strong>r Übersetzung vernachlässigbar ist.<br />

1991: Visual Basic 1 und Visual Basic für DOS – Die Anfänge<br />

Visual Basic Classic<br />

Paradigmen: prozedural, objekt- und ereignisorientiert<br />

Erscheinungsjahr: 1991<br />

Entwickler: Microsoft Corp.<br />

Aktuelle Version: 6.0 (1998)<br />

Typisierung: stark, statisch, implizit und explizit (auf Wunsch nur explizit)<br />

wichtige Implementierungen: Microsoft Visual Basic<br />

Dialekte: VBA, VBScript<br />

Einflüsse: QuickBasic<br />

Beeinflusste: Gambas<br />

Betriebssystem: Windows<br />

MS DOS (nur Version 1)<br />

Lizenz: proprietär<br />

Die Firma Microsoft, <strong>de</strong>ren Firmengeschichte mit <strong>de</strong>r Entwicklung<br />

eines BASIC-Interpreters begann, verband im Jahre 1991 ihren<br />

QuickBasic-Compiler mit einer Umgebung zur interaktiven Gestaltung<br />

von Benutzeroberflächen. Diese Umgebung, die auf Alan Cooper<br />

(manchmal als „Vater“ von Visual Basic bezeichnet) zurückgeht,<br />

erlaubte es zum ersten Mal, schnell und einfach Anwendungen für<br />

Windows zu erstellen.<br />

Der Quellco<strong>de</strong> von Visual-Basic-1-Programmen wur<strong>de</strong> interpretiert,<br />

Der Formen<strong>de</strong>signer in Visual Basic for MS-DOS<br />

d. h. <strong>de</strong>r Quellco<strong>de</strong> wur<strong>de</strong> während <strong>de</strong>r Ausführung (also zur Laufzeit) abgearbeitet. Die mit <strong>de</strong>r Übersetzung<br />

erzeugten Programmdateien (EXE-Datei) enthielten keinen direkt ausführbaren Maschinenco<strong>de</strong>, son<strong>de</strong>rn so<br />

genannten P-Co<strong>de</strong>. Zur Ausführung musste <strong>de</strong>shalb stets eine separate Laufzeitbibliothek mitgeliefert wer<strong>de</strong>n. Dies<br />

gilt auch noch für die Versionen 5 und 6 von Visual Basic, die nativen Co<strong>de</strong> erzeugen können.


Visual Basic 173<br />

Visual Basic für Windows kam vor Visual Basic für MS-DOS (Abk.<br />

„VBDOS“) auf <strong>de</strong>m Markt. VBDOS basierte stärker auf <strong>de</strong>n<br />

Vorgängern Microsoft BASIC PDS bzw. QuickBASIC und konnte<br />

entsprechen<strong>de</strong>n Quellco<strong>de</strong> unmittelbar verarbeiten. [2] VBDOS erzeugte<br />

Programme für <strong>de</strong>n Ablauf unter DOS (und hierbei auch eigenständig<br />

ausführbare Dateien ohne eine zusätzliche Laufzeitbibliothek), nicht<br />

aber Windows-Programme. Während die Windows-Variante von<br />

Visual Basic eine grafische Benutzeroberfläche hatte und auch<br />

Bitmaps anzeigen konnte, lief VBDOS im Textmodus und bil<strong>de</strong>te eine<br />

quasi-grafische Benutzeroberfläche aus ASCII-Zeichen nach. VBDOS<br />

war nicht so erfolgreich wie die Version für Windows, sodass es nie<br />

eine Nachfolgeversion gab.<br />

Mit Visual Basic wur<strong>de</strong> die Strategie <strong>de</strong>r verschie<strong>de</strong>nen Ausführungen<br />

eingeführt. Vorher entsprach QuickBASIC <strong>de</strong>r „Standard Edition“ und<br />

BASIC PDS <strong>de</strong>r „Professional Edition“. Es waren Beispielprogramme<br />

enthalten, die zum Beispiel die Einbindung eines Hilfesystems, die<br />

Unterstützung von Windows-Schriftarten und die Verwendung von<br />

Präsentationsgrafiken <strong>de</strong>monstrierten.<br />

1992–1993: Visual Basic 2–3 – Integrierung <strong>de</strong>s Entwicklungsprozesses<br />

IDE von VBDOS<br />

VBDOS Hilfedatei<br />

Mit <strong>de</strong>n nur noch unter Windows erschienenen Folgeversionen „Visual Basic 2“ (1992) und „Visual Basic 3“ (1993)<br />

wur<strong>de</strong>n vor allem Erweiterungen <strong>de</strong>r Sprache und <strong>de</strong>r Entwicklungsumgebung umgesetzt. Unter an<strong>de</strong>rem wur<strong>de</strong>n<br />

Objekte eingeführt. Ab Visual Basic 2 wur<strong>de</strong>n außer<strong>de</strong>m so genannte Zusatzsteuerelemente (Controls) vom Typ<br />

VBX (Visual Basic Extensions) unterstützt, mit <strong>de</strong>nen frem<strong>de</strong> Hersteller o<strong>de</strong>r an<strong>de</strong>re C-Programmierer die<br />

Funktionalität von Visual Basic erweitern konnten, und die ein wichtiger Faktor beim Erfolg von Visual Basic<br />

waren.<br />

1996–1998: Visual Basic 4–6 – 32 Bit und COM<br />

Das nach einer längeren Pause im Jahre 1996 veröffentlichte Visual Basic 4 gab es erstmals nicht nur in einer<br />

16-Bit-Version für Windows-Systeme bis Version 3.1, son<strong>de</strong>rn auch als 32-Bit-Version, mit <strong>de</strong>r man für Windows<br />

NT und Windows 95 optimierte Programme erstellen konnte. Dem Sprung von 16 auf 32 Bit folgte im<br />

darauffolgen<strong>de</strong>n Jahr die nächste große Neuerung: Visual-Basic-5-Programme wur<strong>de</strong>n erstmals in Maschinenco<strong>de</strong><br />

kompiliert. Damit war es – im Gegensatz zu <strong>de</strong>n Vorgängerversionen – nicht mehr möglich, <strong>de</strong>n Quelltext von<br />

Visual-Basic-Programmen aus <strong>de</strong>r ausführbaren Datei zu extrahieren. Außer<strong>de</strong>m ergab sich ein erheblicher<br />

Performancegewinn. Durch diese Neuerungen eignete sich Visual Basic 5 erstmals auch zum Erstellen zeitkritischer<br />

Anwendungen. Trotz<strong>de</strong>m waren Visual-Basic-Programme immer noch langsamer als etwa C++-Programme.<br />

Mit Visual Basic 4, 5 und 6 (1998) wur<strong>de</strong>n <strong>de</strong>r Sprache objektorientierte Elemente hinzugefügt, jedoch ohne alle<br />

Kriterien <strong>de</strong>r objektorientierten Programmierung zu erfüllen. Visual Basic 6 war dabei die letzte<br />

Visual-Basic-Version, die die Erstellung von nativen Win32-Programmen ermöglichte.<br />

Visual Basic 4 erweiterte das Konzept von „Standard Edition“ und „Professional Edition“ um die „Enterprise<br />

Edition“. Mit Visual Basic 5 wur<strong>de</strong> außer<strong>de</strong>m eine „Control Creation Edition“ (CCE) veröffentlicht, die zwar<br />

kostenlos war, jedoch prinzipiell nur zur Erstellung von Steuerelementen (ActiveX-Controls, OCX) genutzt wer<strong>de</strong>n<br />

konnte.


Visual Basic 174<br />

2002–2003: Visual Basic .NET<br />

Um die Jahrtausendwen<strong>de</strong> hatte Visual Basic Vorsprung eingebüßt. Viele an<strong>de</strong>re Hochsprachen boten nun auch die<br />

Möglichkeit, einfach Windows-Benutzeroberflächen zu erstellen, zum Beispiel C++ mit <strong>de</strong>n Microsoft Foundation<br />

Classes (MFC). Doch schwererwiegend war sicher, dass sich VB inzwischen zu einem komplexen und eher<br />

inhomogenen Produkt entwickelt hatte, <strong>de</strong>ssen Wartung und Verbesserung zunehmend schwieriger wur<strong>de</strong>. Wohl aus<br />

diesen Grün<strong>de</strong>n stoppte Microsoft die Weiterentwicklung dieses Produktes (trotz <strong>de</strong>s kommerziellen Erfolgs und <strong>de</strong>s<br />

Protestes vieler VB-Programmierer) und integrierte die <strong>Programmiersprache</strong> Visual Basic in die hauseigene<br />

.NET-Architektur. Dabei wur<strong>de</strong> die Sprache zu einem hohen Grad verän<strong>de</strong>rt, um <strong>de</strong>n Ansprüchen an eine<br />

.NET-Sprache zu genügen. Visual Basic .NET ist <strong>de</strong>shalb vollständig objektorientiert. Der Quellco<strong>de</strong> wird bei <strong>de</strong>r<br />

Kompilierung nicht mehr in nativen Win32-Co<strong>de</strong> übersetzt, son<strong>de</strong>rn in Co<strong>de</strong> <strong>de</strong>r Common Intermediate Language,<br />

<strong>de</strong>m .NET-Pendant <strong>de</strong>s Java-Byteco<strong>de</strong>s. Dieser Co<strong>de</strong> wird zur Laufzeit in Maschinenco<strong>de</strong> umgesetzt und kann an die<br />

aktuelle Plattform angepasst wer<strong>de</strong>n.<br />

Die Umstellung auf .NET-Technologie brachte neben diesen Än<strong>de</strong>rungen im Hintergrund auch Än<strong>de</strong>rungen für <strong>de</strong>n<br />

Programmierer. Das .NET-Framework stellt zahlreiche Funktionsbibliotheken zur Verfügung, z. B. für Dateizugriffe<br />

o<strong>de</strong>r zum Lesen und Schreiben von XML-Dateien. Am wichtigsten sind hier die Windows Forms, die das veraltete<br />

Thun<strong>de</strong>r-Forms-System <strong>de</strong>r vorherigen Versionen zur Erstellung von Benutzeroberflächen ablöst. Der<br />

augenscheinlichste Unterschied <strong>de</strong>r Windows Forms gegenüber <strong>de</strong>n Thun<strong>de</strong>r Forms ist die Tatsache, dass kein<br />

spezielles Dateiformat mehr zur Speicherung verwen<strong>de</strong>t wird, son<strong>de</strong>rn die Formulare als Klassen durch Co<strong>de</strong> erstellt<br />

wer<strong>de</strong>n. Dabei wird <strong>de</strong>r Konstruktor <strong>de</strong>r Fensterklasse verwen<strong>de</strong>t, um die ebenfalls durch Klassen repräsentierten<br />

Steuerelemente zu erstellen. Mo<strong>de</strong>rne Integrierte Entwicklungsumgebungen ermöglichen die visuelle Erstellung von<br />

Formularen, wobei <strong>de</strong>r für <strong>de</strong>n Konstruktor <strong>de</strong>r Fensterklasse notwendige Co<strong>de</strong> von <strong>de</strong>r Entwicklungsumgebung<br />

erzeugt wird. Auf <strong>de</strong>r an<strong>de</strong>ren Seite gab es mit <strong>de</strong>m Verlust <strong>de</strong>r „Edit and Continue“-Funktion einen großen<br />

entwicklungstechnischen Rückschritt. So konnte man noch in <strong>de</strong>r Version 6 im Debug-Modus <strong>de</strong>n Co<strong>de</strong> än<strong>de</strong>rn und<br />

die Ausführung ohne Unterbrechung weiterlaufen lassen, was in VB.NET 2002 nicht mehr möglich war, in <strong>de</strong>r<br />

übernächsten Version (Visual Basic 2005) jedoch wie<strong>de</strong>r eingeführt wur<strong>de</strong>.<br />

Mit Visual Basic .NET kann man auch Web-Anwendungen erstellen, in<strong>de</strong>m man <strong>de</strong>n VB-Co<strong>de</strong> in einer<br />

ASP.NET-Umgebung laufen lässt. Die hier verwen<strong>de</strong>te GUI-Bibliothek heißt Web Forms und ist größtenteils eine<br />

Anpassung von Windows-Forms-Elementen an die Möglichkeiten von Webbrowsern und sonstigen Webclients.<br />

Die Umstellung von früheren Visual-Basic-Versionen, welche in Abgrenzung zu Visual Basic .NET Visual Basic<br />

Classic genannt wer<strong>de</strong>n, bringt einige Probleme mit sich: Da die Sprache und die Funktionsbibliothek so<br />

tiefgreifen<strong>de</strong> Än<strong>de</strong>rungen erfahren haben, kann ein Visual-Basic-Classic-Co<strong>de</strong>projekt nur mit großem Aufwand auf<br />

die neue Version migriert wer<strong>de</strong>n. Microsoft liefert zwar mit seiner Entwicklungsumgebung Visual Studio einen<br />

sogenannten Migrationsassistenten mit. Dieser wan<strong>de</strong>lt die Co<strong>de</strong>struktur meist korrekt um und beherrscht bis auf<br />

wenige Spezialfälle die Konvertierung von Thun<strong>de</strong>r Forms nach Windows Forms, hat aber zum Beispiel starke<br />

Probleme mit Grafikprogrammierung, da die verwen<strong>de</strong>ten Grafiksysteme von Visual Basic Classic (GDI, in<br />

Thun<strong>de</strong>r-Forms-Steuerelementen gekapselt) und Visual Basic .NET (GDI+) praktisch inkompatibel zueinan<strong>de</strong>r sind.<br />

Zur besseren Portierung gibt es von Microsoft neben <strong>de</strong>m Migrationsassistenten eine Funktionssammlung im<br />

.NET-Framework (im Microsoft.VisualBasic-Namensraum), die einige wichtige Visual-Basic-Classic-Funktionen<br />

unter .NET zur Verfügung stellt. Bestehen<strong>de</strong> COM-Komponenten können ohne Einschränkungen weiterbenutzt<br />

wer<strong>de</strong>n.<br />

Seit Visual Basic .NET wird Visual Basic nur noch als Teil von Microsoft Visual Studio angeboten. Visual Basic 7<br />

wur<strong>de</strong> mit „Visual Studio .NET 2002“ ausgeliefert und basiert auf <strong>de</strong>m .NET-Framework, Version 1.0 (build 3705).<br />

Das erste Update auf Visual Basic 7.1 bzw. .NET-Framework 1.1 (build 4322) sowie „Visual Studio .NET 2003“<br />

brachte nur kleinere Än<strong>de</strong>rungen, was sich im „kleinen“ Versionssprung wi<strong>de</strong>rspiegelt. Etwa kann ab Visual Basic<br />

7.1 eine Zählervariable im Kopf einer For-Schleife <strong>de</strong>klariert wer<strong>de</strong>n. Außer<strong>de</strong>m wur<strong>de</strong> die Unterstützung für<br />

mobile Geräte hinzugefügt. Auf diesen dient nicht das .NET-Framework 1.1 als Laufzeitumgebung, son<strong>de</strong>rn das


Visual Basic 175<br />

„.NET Compact Framework 1.0“.<br />

In Visual Basic .NET kann man, an<strong>de</strong>rs als in Visual Basic Classic, auch dann Programme erstellen, wenn man keine<br />

Entwicklungsumgebung erworben hat. Das .NET-Framework verfügt nämlich aus technischen Grün<strong>de</strong>n über einen<br />

Kommandozeilencompiler namens vbc.exe.<br />

2005–2007: Visual Basic 8 und 9<br />

Im November 2005 erfolgte <strong>de</strong>r erste große Versionssprung <strong>de</strong>s .NET-Frameworks und <strong>de</strong>s<br />

.NET-Compact-Frameworks auf Version 2.0, begleitet von <strong>de</strong>r Veröffentlichung <strong>de</strong>s neuen Visual Basic 8 als Teil<br />

von „Visual Studio 2005“ (das „.NET“ ist aus <strong>de</strong>m Namen entfallen). Mit dieser Version wur<strong>de</strong>n einige<br />

Restrukturierungen an <strong>de</strong>r .NET-Laufzeitbibliothek vorgenommen. Am auffälligsten ist die Unterstützung <strong>de</strong>r<br />

generischen Programmierung, die <strong>de</strong>n aus C++ bekannten Templates ähnelt. Viele Schnittstellen und Attribute <strong>de</strong>r<br />

Laufzeitbibliothek sind auch als generische Implementation verfügbar. Weiter ist seit <strong>de</strong>r Version 2005 eine<br />

kostenlose, leistungsfähig eingeschränkte Express Edition von Visual Basic .NET verfügbar. [3]<br />

Mit Visual Basic 8 wur<strong>de</strong> <strong>de</strong>r Operator IsNot eingeführt, <strong>de</strong>r Aufsehen erlangte, als Microsoft sich diese Erfindung<br />

patentieren ließ. [4] Eine an<strong>de</strong>re Neuerung ist <strong>de</strong>r My-Namensraum, <strong>de</strong>r unterschiedliche systemabhängige Funktionen<br />

in einer für <strong>de</strong>n Programmierer übersichtlichen Weise darstellt, etwa <strong>de</strong>n Zugriff auf Computerkomponenten, die<br />

Windows-Registrierungsdatenbank o<strong>de</strong>r Informationen über das Betriebssystem und <strong>de</strong>n aktuellen Benutzer.<br />

2007 wur<strong>de</strong> parallel zur Veröffentlichung von Windows Vista die neue Visual-Basic-Version 9 [5] bzw. das „Visual<br />

Studio 2008“ veröffentlicht. Die größte sprachliche Än<strong>de</strong>rung ist wohl die Unterstützung <strong>de</strong>r neuen<br />

.NET-Komponente LINQ. Visual Basic 9 basiert auf <strong>de</strong>m mit Windows Vista ausgelieferten und für Windows XP<br />

erhältlichen .NET-Framework 3.0 (vormals WinFX). Der wohl be<strong>de</strong>utendste Bestandteil <strong>de</strong>s Versionsupdates ist die<br />

Windows Presentation Foundation, die nicht nur Windows Forms, son<strong>de</strong>rn auch das Windows-interne<br />

Grafiksubsystem GDI ablöst. [6]<br />

Seit November 2007 basieren alle Visual-Studio-2008-Versionen auf <strong>de</strong>m .NET-Framework 3.5, mit <strong>de</strong>m die<br />

folgen<strong>de</strong>n Technologien eingeführt bzw. erweitert wur<strong>de</strong>n: Language Integrated Query (LINQ), neue Compiler für<br />

C#, Visual Basic und C++, ASP.NET mit AJAX, ADO.NET Entity Framework, Datenanbieterunterstützung für SQL<br />

Server 2008, Unterstützung für .NET Framework Client Profile u.a.. [7]<br />

Ableger<br />

Aufgrund seiner Popularität und einfachen Erlernbarkeit wur<strong>de</strong> Visual Basic Classic von Microsoft für verschie<strong>de</strong>ne<br />

spezifische Umgebungen adaptiert.<br />

Visual Basic Script<br />

→ Hauptartikel: Visual Basic Script<br />

Visual Basic Script (kurz: VBScript o<strong>de</strong>r VBS) ist eine interpretierte Visual-Basic-Variante, die zum Erstellen von<br />

dynamischen Webseiten o<strong>de</strong>r kleineren Scripts eingesetzt wird. Die Sprache verwen<strong>de</strong>t die gleiche Syntax wie<br />

Visual Basic Classic. Oberflächen können nicht direkt, son<strong>de</strong>rn nur indirekt durch Einbetten <strong>de</strong>s VBScript-Co<strong>de</strong>s in<br />

HTML über <strong>de</strong>n Windows Scripting Host erstellt wer<strong>de</strong>n. Dabei kann VBS auf alle COM-Objekte mit<br />

IDispatch-Schnittstelle zugreifen. VBS wur<strong>de</strong> außer für Windows- und clientseitige Web-Scripts auch für<br />

serverseitige Web-Scripts in einer ASP-Umgebung verwen<strong>de</strong>t. Mit ASP.NET wur<strong>de</strong> VBS jedoch durch VB.NET<br />

verdrängt.


Visual Basic 176<br />

Visual Basic for Applications<br />

→ Hauptartikel: Visual Basic for Applications<br />

Visual Basic for Applications (kurz: VBA) ist ebenfalls eine auf Visual Basic Classic basieren<strong>de</strong> interpretierte<br />

Skriptsprache. Sie wur<strong>de</strong> speziell zum Automatisieren wie<strong>de</strong>rkehren<strong>de</strong>r Aufgaben innerhalb an<strong>de</strong>rer Programme<br />

entwickelt und hat große Popularität erlangt, seit Microsoft es mit seinem Büroprogramm Office ausliefert. Über die<br />

ältesten VBA-Anbindungen verfügen Microsoft Excel, Microsoft Access (bei<strong>de</strong> seit 1995) und Microsoft Word (seit<br />

1997). Auch VBA konkurriert mit .NET, da Visual Studio .NET mit <strong>de</strong>n Visual Studio Tools for Applications<br />

(vormals Visual Studio Tools for Office) ausgeliefert wird, die eine ähnliche Funktion wie VBA übernehmen.<br />

Entwicklungsumgebungen<br />

Die (historisch bedingt) populärste integrierte Entwicklungsumgebung für Visual Basic ist „Microsoft Visual Basic“<br />

bzw. „Microsoft Visual Studio“, zu <strong>de</strong>r es lange Zeit keine Alternative gab. Für Visual Basic .NET gibt es jedoch<br />

eine freie Entwicklungsumgebung namens SharpDevelop (kurz: #<strong>de</strong>velop). Es gibt außer<strong>de</strong>m eine Express Edition<br />

von Visual Basic, die kostenfrei und gera<strong>de</strong> für Anfänger geeignet ist.<br />

Syntaxbeispiele<br />

Um einen Vergleich zu ermöglichen, erfüllen alle <strong>de</strong>r folgen<strong>de</strong>n Programme <strong>de</strong>nselben Zweck: Sie geben alle ein<br />

Hinweisfeld mit <strong>de</strong>m Inhalt „Hallo Welt!“ aus.<br />

Syntax von Visual Basic Classic<br />

Die Syntax von Visual Basic Classic ist sehr stark an QuickBasic angelehnt. Dieses Beispiel enthält die Startfunktion<br />

Main <strong>de</strong>s Programmes. Der Befehl MsgBox erstellt das Meldungsfeld.<br />

Sub Main()<br />

End Sub<br />

MsgBox "Hallo Welt!"<br />

Das untere Beispiel zeigt eine Formular-Ereignisbehandlungsroutine für die Schaltfläche Command1.<br />

Private Sub Command1_Click() ' Wenn man auf <strong>de</strong>n Button klickt<br />

erscheint in einem Bezeichnungsfeld<br />

End Sub<br />

Label1.Caption = "Hallo Welt!" ' die Nachricht Hallo Welt<br />

Syntax von Visual Basic .NET<br />

Visual Basic .NET verfügt über Befehle, die <strong>de</strong>nen von Visual Basic Classic sehr ähnlich sind. Diese<br />

VB.NET-spezifischen Zusatzfunktionen erleichtert vor allem die Konvertierung von Visual-Basic-Classic-Co<strong>de</strong><br />

nach Visual Basic .NET. So ist das folgen<strong>de</strong> Visual-Basic-.NET-Co<strong>de</strong>beispiel <strong>de</strong>m vorangehen<strong>de</strong>n sehr ähnlich. Die<br />

MsgBox-Funktion befin<strong>de</strong>t sich hier im Microsoft.VisualBasic-Namensraum, <strong>de</strong>r eine Kompatibilitätsschicht<br />

zwischen <strong>de</strong>r .NET-Laufzeitbibliothek und <strong>de</strong>r alten Visual-Basic-Funktionsbibliothek darstellt.<br />

Module Hello<br />

Public Sub Main()<br />

End Sub<br />

End Module<br />

MsgBox("Hallo Welt!")


Visual Basic 177<br />

Mit Visual-Basic-.NET-Mitteln lässt sich dieser Co<strong>de</strong> statt als Modul auch als Klasse realisieren. Diese<br />

Vorgehensweise hat <strong>de</strong>n Vorteil, dass sie sich leichter erweitern lässt und sich besser in das Konzept von .NET<br />

einfügt. In <strong>de</strong>r Klasse ist die Main-Funktion ein statisches Mitglied, kann also ohne Instanz aufgerufen wer<strong>de</strong>n.<br />

(Siehe auch Objektorientierte Programmierung.)<br />

Public Class Form1<br />

Private Sub Form1_Load(ByVal sen<strong>de</strong>r As Object, ByVal e As<br />

System.EventArgs) Handles Me.Load<br />

End Sub<br />

End Class<br />

MessageBox.Show("Hello World!")<br />

In <strong>de</strong>r Visual-Basic-.NET-Klasse sind manche Funktionen nur noch gebräuchlich, um Informationen zu gewinnen.<br />

Hier wür<strong>de</strong> MsgBox nur benutzt, um <strong>de</strong>n gedrückten Button zu ermitteln:<br />

Class Hello<br />

Public Shared Sub Main()<br />

Dim a<br />

a = MsgBox("Hallo Welt!", MsgBoxStyle.YesNo) ' a ist jetzt <strong>de</strong>r<br />

Wert, <strong>de</strong>n <strong>de</strong>r gedrückte Button zurückgibt<br />

End Sub<br />

End Class<br />

Beson<strong>de</strong>rheiten<br />

Als .NET-Sprache unterliegt Visual Basic .NET <strong>de</strong>n Vor- und Nachteilen dieser Plattform. Visual Basic Classic<br />

machte viele kleinere Dinge an<strong>de</strong>rs als an<strong>de</strong>re Sprachen. Aus Grün<strong>de</strong>n <strong>de</strong>r Abwärtskompatibilität sind viele dieser<br />

Punkte als „Altlasten“ in Visual Basic .NET enthalten. Einige Beispiele:<br />

• Üblicherweise (so auch im .NET Framework) entspricht <strong>de</strong>r in eine Zahl konvertierte logische Wert Falsch bzw.<br />

False <strong>de</strong>m Wert 0, Wahr o<strong>de</strong>r True wird als 1 interpretiert. In Visual Basic Classic steht True aber für -1. Diese<br />

Konvention erlaubte es, nicht zwischen einem logischen und einem binären Not-Operator unterschei<strong>de</strong>n zu<br />

müssen (-1 = 11111111 in Zweierkomplementdarstellung). Daher ergeben in Visual Basic .NET die<br />

Konvertierungen CInt(True) o<strong>de</strong>r CType(True, Int32) immer noch <strong>de</strong>n Wert -1; <strong>de</strong>r Aufruf <strong>de</strong>r .NET<br />

Framework-Metho<strong>de</strong> Convert.ToInt32(True) evaluiert hingegen auf 1.<br />

• In <strong>de</strong>n meisten <strong>Programmiersprache</strong>n <strong>de</strong>klariert eine Anweisung <strong>de</strong>r Form int a[5]; ein fünfelementiges Array mit<br />

Indizes von 0 bis 4 o<strong>de</strong>r von 1 bis 5. In VB.NET <strong>de</strong>klariert Dim a(5) As Integer ein sechselementiges Array mit<br />

Indizes von 0 bis 5, um abwärtskompatibel zur VB Classic Syntax Dim a([lowerBound To] upperBound) zu<br />

bleiben.<br />

• Visual Basic .NET erlaubt es, an<strong>de</strong>rs als zum Beispiel C#, globale Variablen ohne Klassenzugehörigkeit zu<br />

<strong>de</strong>finieren. Dies wi<strong>de</strong>rspricht <strong>de</strong>m objektorientierten Paradigma (keine Deklaration ohne Klasse) und kann für<br />

unübersichtlichen und schwer wartbaren Co<strong>de</strong> sorgen, wenn sich globale Deklarationen über viele Module im<br />

Projekt erstrecken.


Visual Basic 178<br />

Rechtliche Aspekte<br />

Visual Basic Classic ist, an<strong>de</strong>rs als viele mo<strong>de</strong>rne Hochsprachen, kein offener Standard, son<strong>de</strong>rn proprietär und<br />

geistiges Eigentum von Microsoft. Dadurch ist Visual Basic Classic normalerweise auch an Microsoft Windows<br />

gebun<strong>de</strong>n, also nicht portabel zu an<strong>de</strong>ren Betriebssystemen. Mit Visual Basic .NET hat sich diese Bindung gelockert,<br />

da einige Teile <strong>de</strong>r .NET-Infrastruktur durch die Ecma International offen standardisiert wor<strong>de</strong>n sind. Die<br />

Patentierung <strong>de</strong>s in Visual Basic .NET 8 eingeführten IsNot-Operators hat diese Be<strong>de</strong>nken jedoch wie<strong>de</strong>r verstärkt.<br />

Literatur<br />

• Klaus Werner Wirtz: Objektorientierte Programmentwicklung mit Visual Basic .NET Band 1 – Grundlagen [8] .<br />

Ol<strong>de</strong>nbourg 2008, ISBN 978-3-486-58603-9.<br />

• Thomas Theis: Einstieg in Visual Basic 2008 [9] . Galileo Computing, 2008, ISBN 978-3-8362-1192-5.<br />

• René Martin: Einstieg in VB.NET [10] . Galileo Computing, 2003, ISBN 3-89842-277-1.<br />

• Joachim Fuchs, Andreas Barchfeld: Das Visual Basic 2005 Co<strong>de</strong>book. Addison Wesley in Pearson Education<br />

Deutschland, München 2006, ISBN 3-8273-2272-3.<br />

• Peter Monadjemi: Visual Basic 2005 Kompendium, 2006 Markt-und-Technik.<br />

• Klaus Löffelmann: Visual Basic 2008 – Das Entwicklerbuch, 1428 Seiten, 2008 Microsoft Press, ISBN<br />

978-3-86645-506-1.<br />

Weblinks<br />

• MSDN Developer Center – Visual Basic [11]<br />

• Get the BASICs. VB.NET für Einsteiger und Umsteiger in zehn Teilen [12] – MSDN Webcast<br />

• Bills Neunte [13] – Artikel zu <strong>de</strong>n Neuerungen bei Visual Basic 9<br />

• Links zum Thema Visual Basic [14] im Open Directory Project<br />

• Visual Basic 2005 – Das Entwicklerbuch (Klaus Löffelmann) als PDF-Dokument [15]<br />

• Visual Basic 2008 – Der Crashkurs (Klaus Löffelmann) als PDF-Dokument [16]<br />

• Webcasts (Lernvi<strong>de</strong>os): von Visual Basic 6 zu Visual Basic 2008 [17]<br />

• .NET-Technologien in Visual Basic 6.0 [18]<br />

• Visual Basic 2008 Express [19]<br />

• OpenBook von Galileo-Computing [20]<br />

Referenzen<br />

[1] http:/ / msdn. microsoft. com/ <strong>de</strong>-<strong>de</strong>/ vbasic/<br />

[2] Von QBasic nach VBDOS / VBWIN (http:/ / www. antonis. <strong>de</strong>/ qb2vb/ in<strong>de</strong>x. htm)<br />

[3] Produktseite Visual Basic Express Edition (http:/ / www. microsoft. com/ germany/ express/ product/ visualbasicexpress. aspx)<br />

[4] Patent auf <strong>de</strong>n IsNot-Operator (http:/ / appft1. uspto. gov/ netacgi/ nph-Parser?Sect1=PTO1& Sect2=HITOFF& d=PG01& p=1& u=/<br />

netahtml/ PTO/ srchnum. html& r=1& f=G& l=50& s1="20040230959". PGNR. & OS=DN/ 20040230959& RS=DN/ 20040230959)<br />

(englisch)<br />

[5] Überblick über die Än<strong>de</strong>rungen in Visual Basic 9 (http:/ / msdn. microsoft. com/ <strong>de</strong>-<strong>de</strong>/ library/ ms364068. aspx) (englisch)<br />

[6] Zukünftige Visual-Studio-Versionen (http:/ / msdn. microsoft. com/ <strong>de</strong>-<strong>de</strong>/ vstudio/ bb936699. aspx) (englisch)<br />

[7] Architektur von .NET Framework 3.5 (http:/ / msdn. microsoft. com/ <strong>de</strong>-<strong>de</strong>/ library/ bb822049. aspx) (<strong>de</strong>utsch)<br />

[8] http:/ / www08. mg. hs-nie<strong>de</strong>rrhein. <strong>de</strong>/ wi/ dozenten/ wirtz/ publikationen/ visualbasicnetgrundlagen. html<br />

[9] http:/ / www. galileocomputing. <strong>de</strong>/ openbook/ einstieg_vb_2008/<br />

[10] http:/ / www. galileocomputing. <strong>de</strong>/ openbook/ vb_net/<br />

[11] http:/ / msdn. microsoft. com/ <strong>de</strong>-<strong>de</strong>/ vbasic/ <strong>de</strong>fault. aspx<br />

[12] http:/ / www. microsoft. com/ germany/ msdn/ webcasts/ serien/ MSDNWCS-0610-01. mspx<br />

[13] http:/ / it-republik. <strong>de</strong>/ dotnet/ artikel/ Bills-Neunte-1503. html<br />

[14] http:/ / www. dmoz. org/ World/ Deutsch/ Computer/ Programmieren/ Sprachen/ Visual_Basic/<br />

[15] http:/ / www. microsoft. com/ germany/ msdn/ aktuell/ news/ MicrosoftVisualBasic2005DasEntwicklerbuch. mspx<br />

[16] http:/ / www. microsoft-press. <strong>de</strong>/ product. asp?cnt=product& id=ms-5518


Visual Basic 179<br />

[17] http:/ / www. microsoft. com/ germany/ msdn/ webcasts/ serien/ MSDNWCS-0808-01. mspx<br />

[18] http:/ / msdn. microsoft. com/ <strong>de</strong>-<strong>de</strong>/ vbrun/<br />

[19] http:/ / www. microsoft. com/ germany/ Express/ download/ download<strong>de</strong>tails. aspx?p=vb<br />

[20] http:/ / openbook. galileocomputing. <strong>de</strong>/ einstieg_vb_2008/


Esotherische <strong>Programmiersprache</strong>n<br />

Esoterische <strong>Programmiersprache</strong><br />

Esoterische <strong>Programmiersprache</strong>n sind <strong>Programmiersprache</strong>n, die nicht für <strong>de</strong>n praktischen Einsatz entwickelt<br />

wur<strong>de</strong>n, son<strong>de</strong>rn ungewöhnliche Sprachkonzepte umsetzen. Eine einfache Bedienung ist selten, teilweise wer<strong>de</strong>n<br />

Sprachen konzipiert, um möglichst komplizierte Algorithmen o<strong>de</strong>r unverständliche Syntax zu haben, oft aber auch<br />

um neue I<strong>de</strong>en auszuprobieren, o<strong>de</strong>r um ungewöhnliche Möglichkeiten wie extreme Vereinfachung aufzuzeigen. Mit<br />

Esoterik im umgangssprachlichen Sinn haben „esoterische <strong>Programmiersprache</strong>n“ nichts zu tun.<br />

Die Motivation hinter <strong>de</strong>r Entwicklung von esoterischen <strong>Programmiersprache</strong>n kann unterschiedlich sein. In einigen<br />

Fällen han<strong>de</strong>lt es sich schlicht um aka<strong>de</strong>mische Scherze, häufig setzt sich aber <strong>de</strong>r Entwickler <strong>de</strong>r Sprache ein<br />

bestimmtes Ziel. So wur<strong>de</strong>n zum Beispiel bei Brainfuck konventionelle Spracheigenschaften so weit wie möglich<br />

entfernt, bis eine turingmaschinenähnliche Sprache übrig blieb, die mit einem extrem kleinen Compiler auskommt.<br />

Die Beschäftigung mit esoterischen <strong>Programmiersprache</strong>n kann zu tieferem Verständnis seriöser<br />

<strong>Programmiersprache</strong>n sowie zur Verbesserung strukturellen Denkens führen. Praktische Be<strong>de</strong>utung haben die<br />

esoterischen <strong>Programmiersprache</strong>n somit in Forschung und Lehre. Abhängig vom verfolgten Konzept können<br />

esoterische <strong>Programmiersprache</strong>n Konzepte für Sprach<strong>de</strong>sign und/o<strong>de</strong>r System<strong>de</strong>sign <strong>de</strong>monstrieren. Allerdings gibt<br />

es eine Vielzahl von esoterischen <strong>Programmiersprache</strong>n, die nicht originär sind, son<strong>de</strong>rn nur Konzepte an<strong>de</strong>rer<br />

esoterischer <strong>Programmiersprache</strong>n unwesentlich verän<strong>de</strong>rn.<br />

Einer <strong>de</strong>r produktivsten Entwickler esoterischer <strong>Programmiersprache</strong>n ist David Morgan-Mar [1]<br />

<strong>de</strong>utschsprachigen Raum Gerson Kurz [2] .<br />

Beispielsprachen<br />

• 3Co<strong>de</strong> von Sean Heber<br />

• Beatnik (Wörter stehen für ihre Scrabble-Werte) von Cliff L. Biffle<br />

• Befunge (zweidimensionale Sprache) von Chris Pressey<br />

• Bo³ (ähnlich Befunge) von Markus Bo<strong>de</strong><br />

• BIT von David Morgan-Mar<br />

• Brainfuck (minimale imperative <strong>Programmiersprache</strong>, winziger Compiler) von Urban Müller<br />

• Brainfuck2D (Brainfuck auf die Ebene projiziert)<br />

• Chef (Co<strong>de</strong> sieht aus wie ein Kochrezept) von David Morgan-Mar<br />

• Cow (Co<strong>de</strong> besteht aus Kuhlauten (Moo), basiert auf Brainfuck) von Sean Heber<br />

• Emoticon (hat Emoticons als Befehle)<br />

• Haifu von David Morgan-Mar<br />

• HQ9+ (<strong>Programmiersprache</strong> spezialisiert auf triviale Aufgaben) von Cliff L. Biffle<br />

• INTERCAL (sollte das Programmieren erschweren) von Donald R. Woods und James M. Lyon<br />

• Iota and Jot (hat nur 2 Befehle)<br />

• Java2K (Wahrscheinlichkeitstheoretische Sprache) von Gerson Kurz<br />

• KaForkL (Programmieren mit RGB-Bil<strong>de</strong>rn inklusive grafischer IDE) von Kore Nordmann [3]<br />

• LOLCODE (Die Syntax besteht aus falsch geschriebenem Netzjargon.) von Adam Lindsay<br />

• Loopy (ähnlich Brainfuck2D)<br />

• Malbolge (erklärtermaßen schlimmste <strong>Programmiersprache</strong>) von Ben Olmstead<br />

• Ook! (Syntax besteht einzig und allein aus <strong>de</strong>m Wort „Ook“ sowie <strong>de</strong>n Zeichen: .?!) von David Morgan-Mar<br />

, im<br />

180


Esoterische <strong>Programmiersprache</strong> 181<br />

• Piet (Programmco<strong>de</strong> besteht aus Bil<strong>de</strong>rn) von David Morgan-Mar<br />

• Shakespeare Programming Language (Co<strong>de</strong> sieht wie ein Stück von Shakespeare aus) Kalle Hasselström und Jon<br />

Åslund<br />

• Taxi (Wegbeschreibung an einen Taxifahrer) von Sean Heber<br />

• Unlambda (Minimale funktionale <strong>Programmiersprache</strong>)<br />

• Whirl von Sean Heber<br />

• Whenever von David Morgan-Mar<br />

• Whitespace (Co<strong>de</strong> besteht nur aus nichtdruckbaren Zeichen) von Edwin Brady und Chris Morris<br />

• ZOMBIE von David Morgan-Mar<br />

Literatur<br />

• Oliver Lau, Hexenwerk - Ein Plädoyer für esoterische <strong>Programmiersprache</strong>n, c’t 22/07, S. 192-199.<br />

Weblinks<br />

• The Esoteric Programming Languages Ring [4]<br />

• Vortrag: Vom Nutzen unnützer Programmierung [5]<br />

• Esolang wiki [6] Ein Wiki, das sich mit esoterischen <strong>Programmiersprache</strong>n beschäftigt (en)<br />

• The LOLCODE Wiki [7]<br />

Referenzen<br />

[1] DM's Esoteric Programming Languages (http:/ / www. dangermouse. net/ esoteric/ )<br />

[2] programming languages (http:/ / p-nand-q. com/ humor/ programming_languages. html)<br />

[3] KaForkL - image programming language (http:/ / kore-nordmann. <strong>de</strong>/ projects/ kaforkl/ in<strong>de</strong>x. html)<br />

[4] http:/ / b. webring. com/ hub?ring=esolang<br />

[5] http:/ / ulm. ccc. <strong>de</strong>/ ~schabi/ weirdprog20c3/<br />

[6] http:/ / esoteric. voxelperfect. net/ wiki/ Main_Page<br />

[7] http:/ / lolco<strong>de</strong>. com/


Brainfuck 182<br />

Brainfuck<br />

Brainfuck ist eine so genannte esoterische <strong>Programmiersprache</strong>, entworfen vom Schweizer Urban Müller um 1993.<br />

Die Sprache wird manchmal auch Brainf*ck, Brainf*** o<strong>de</strong>r BF genannt.<br />

Brainfuck ist zwar für <strong>de</strong>n ernsthaften Einsatz zu umständlich und ineffektiv, aber gut geeignet um Grundlagen <strong>de</strong>r<br />

Computertechnik zu lernen. Speziell zeichnet sich Brainfuck durch ein extrem einfaches Sprachkonzept und<br />

hochkompakte Realisierung <strong>de</strong>s Compilers aus, gleichzeitig wur<strong>de</strong> aber die (prinzipielle) universelle Einsetzbarkeit<br />

nicht eingeschränkt.<br />

Allgemeines<br />

Müllers Ziel war es, eine einfache Turing-vollständige Sprache zu entwerfen, welche mit einem möglichst kleinen<br />

Compiler übersetzt wer<strong>de</strong>n konnte – inspiriert wur<strong>de</strong> er dabei durch False, eine an<strong>de</strong>re esoterische<br />

<strong>Programmiersprache</strong>, <strong>de</strong>ren Compiler nur 1024 Byte groß war. Er schaffte es schließlich, die zweite Version seines<br />

Compilers für <strong>de</strong>n Amiga in lediglich 240 Byte zu schreiben. Brian Raiter gelang es, dies zu unterbieten, in<strong>de</strong>m er –<br />

unter Verwendung von nur 171 Bytes – einen Brainfuck-Compiler für x86 Linux schrieb. Für MS-DOS gibt es einen<br />

Brainfuck-Interpreter von Bertram Felgenhauer mit einer Größe von nur 98 Bytes. [1]<br />

Sprach<strong>de</strong>sign<br />

Ein BF-Programm ähnelt stark <strong>de</strong>r formalen Definition einer Turingmaschine. Statt eines Lese-/Schreibkopfes auf<br />

einem Band, Zustän<strong>de</strong>n sowie einem frei <strong>de</strong>finierbaren Alphabet wer<strong>de</strong>n jedoch im Sinne einer iterativen<br />

<strong>Programmiersprache</strong> ein Zeiger auf ein Datenfeld, Schleifenkonstrukte und eine rudimentäre ALU verwen<strong>de</strong>t. Der<br />

Programmco<strong>de</strong> wird dabei separat vom Datenfeld gespeichert. (siehe Harvard-Architektur)<br />

Befehlssatz<br />

Brainfuck besitzt acht Befehle, jeweils bestehend aus einem einzigen Zeichen:<br />

Zeichen C-Äquivalent Semantik<br />

> ++ptr; inkrementiert <strong>de</strong>n Zeiger<br />

< --ptr; <strong>de</strong>krementiert <strong>de</strong>n Zeiger<br />

+ ++*ptr; inkrementiert <strong>de</strong>n aktuellen Zellenwert<br />

- --*ptr; <strong>de</strong>krementiert <strong>de</strong>n aktuellen Zellenwert<br />

. putchar(*ptr); Gibt <strong>de</strong>n aktuellen Zellenwert als ASCII-Zeichen auf <strong>de</strong>r Standardausgabe aus<br />

, *ptr =<br />

getchar();<br />

Liest ein Zeichen von <strong>de</strong>r Standar<strong>de</strong>ingabe und speichert <strong>de</strong>ssen ASCII-Wert in <strong>de</strong>r aktuellen Zelle<br />

[ while (*ptr) { Springt nach vorne, hinter <strong>de</strong>n passen<strong>de</strong>n ]-Befehl, wenn <strong>de</strong>r aktuelle Zellenwert null ist<br />

] } Springt zurück, hinter <strong>de</strong>n passen<strong>de</strong>n [-Befehl, wenn <strong>de</strong>r aktuelle Zellenwert verschie<strong>de</strong>n von null ist<br />

Anmerkung: Es gibt verschie<strong>de</strong>ne semantisch äquivalente Varianten <strong>de</strong>r letzten bei<strong>de</strong>n Befehle, die hier angegebenen<br />

lassen sich jedoch am effizientesten implementieren.<br />

An<strong>de</strong>re im Quelltext vorkommen<strong>de</strong> Zeichen (z. B. Buchstaben, Zahlen, Leerzeichen, Zeilenumbrüche) wer<strong>de</strong>n in <strong>de</strong>r<br />

Regel ignoriert und können so als Quelltextkommentar verwen<strong>de</strong>t wer<strong>de</strong>n.


Brainfuck 183<br />

Turing-Vollständigkeit<br />

Für verschie<strong>de</strong>ne BF-Umgebungen wur<strong>de</strong> Turing-Vollständigkeit bewiesen:<br />

• Für ein unendlich großes Feld aus Zellen unendlicher Größe durch Frans Faase [2]<br />

• Für ein unendlich großes Feld aus Zellen endlicher Größe durch Daniel B. Cristofani [3]<br />

• Für ein endlich großes Feld aus Zellen unendlicher Größe durch Daniel B. Cristofani [4]<br />

Bei einer BF-Variante mit endlicher Zellgröße sowie endlicher Feldgröße (z. B. BFmin) han<strong>de</strong>lt es sich − wie bei<br />

je<strong>de</strong>m realen Computer − um einen endlichen Automaten.<br />

Beispielprogramme in Brainfuck<br />

Hello World!<br />

Das folgen<strong>de</strong> Programm gibt „Hello World!" und einen Zeilenumbruch aus.<br />

++++++++++<br />

[<br />

>+++++++>++++++++++>+++>+. // Zeilenumbruch<br />

Zur besseren Lesbarkeit ist dieser Brainfuckco<strong>de</strong> auf mehrere Zeilen verteilt und kommentiert wor<strong>de</strong>n. Brainfuck<br />

ignoriert alle Zeichen, die keine Brainfuckbefehle sind. Alle Zeichen mit Ausnahme von +-[],. können <strong>de</strong>swegen<br />

zur Kommentierung <strong>de</strong>r Quellco<strong>de</strong>s genutzt wer<strong>de</strong>n.<br />

Zunächst wird die erste (die „nullte“) Zelle <strong>de</strong>s Datenfelds auf <strong>de</strong>n Wert 10 gesetzt (a[0] = 10). Die Schleife am<br />

Anfang <strong>de</strong>s Programms errechnet dann mit Hilfe dieser Zelle weitere Werte für die zweite, dritte, vierte und fünfte<br />

Zelle. Für die zweite Zelle wird <strong>de</strong>r Wert 70 errechnet, welcher nahe <strong>de</strong>m ASCII-Wert <strong>de</strong>s Buchstaben 'H'<br />

(ASCII-Wert 72) liegt. Die dritte Zelle erhält <strong>de</strong>n Wert 100, nahe <strong>de</strong>m Buchstaben 'e' (ASCII-Wert 101), die vierte<br />

<strong>de</strong>n Wert 30 nahe <strong>de</strong>m Wert für Leerzeichen (ASCII-Wert 32), die fünfte <strong>de</strong>n Wert 10, welches <strong>de</strong>m ASCII-Zeichen<br />

„Line Feed“ entspricht und als Zeilenumbruch interpretiert wird (o<strong>de</strong>r wer<strong>de</strong>n sollte, siehe dazu <strong>de</strong>n Abschnitt<br />

„Implementierungen“).<br />

Die Schleife errechnet die Werte, in<strong>de</strong>m einfach auf die zu anfangs mit 0 initialisierten Zellen 10-mal 7, 10, 3 und 1<br />

addiert wird. Nach je<strong>de</strong>m Schleifendurchlauf wird a[0] dabei um eins verringert, bis es <strong>de</strong>n Wert 0 hat und die<br />

Schleife dadurch been<strong>de</strong>t wird.<br />

Am En<strong>de</strong> <strong>de</strong>r Schleife hat das Datenfeld dann folgen<strong>de</strong> Werte: a[0] = 0; a[1] = 70; a[2] = 100; a[3]<br />

= 30; a[4] = 10;


Brainfuck 184<br />

Als nächstes wird <strong>de</strong>r Zeiger auf die zweite Zelle <strong>de</strong>s Datenfelds (a[1]) positioniert und <strong>de</strong>r Wert <strong>de</strong>r Zelle um zwei<br />

erhöht. Damit hat es <strong>de</strong>n Wert 72, welches <strong>de</strong>m ASCII-Wert <strong>de</strong>s Zeichens 'H' entspricht. Dieses wird daraufhin<br />

ausgegeben. Nach <strong>de</strong>mselben Schema wer<strong>de</strong>n die weiteren auszugeben<strong>de</strong>n Buchstaben mit Hilfe <strong>de</strong>r durch die<br />

Schleife initialisierten Werte, sowie <strong>de</strong>r bereits verwen<strong>de</strong>ten Werte, errechnet.<br />

Grundlagen <strong>de</strong>r Programmierung in Brainfuck<br />

Anmerkung: Obwohl die Zeichen // wie die aus an<strong>de</strong>ren <strong>Programmiersprache</strong>n bekannten Kommentare aussehen,<br />

sind es keine. Deshalb wird ein Pluszeichen z. B. in n+1 als ein Inkrementierbefehl ausgewertet, im unten<br />

angegebenen Beispiel steht aus diesem Grund n plus 1.<br />

Schleifen<br />

Schleifen beginnen mit [ und en<strong>de</strong>n mit ]. Die Schleife wird solange ausgeführt, bis die aktuelle Zelle 0 ist. Die<br />

einfachste sinnvolle Form ist die Nullschleife, die die aktuelle Zelle <strong>de</strong>krementiert, bis diese Null ist:<br />

[-]<br />

Einfache Schleife<br />

,[.,]<br />

Einfaches Echo-Programm. Zeichen wer<strong>de</strong>n von <strong>de</strong>r Standar<strong>de</strong>ingabe gelesen und wie<strong>de</strong>r auf die Standardausgabe<br />

ausgegeben.<br />

Bedingungen<br />

• x ungleich y (wird durch Subtraktion <strong>de</strong>r bei<strong>de</strong>n Zahlen erreicht)<br />

Wichtig ist, dass Zelle 0 auf 0 gesetzt ist, ansonsten kann es dazu kommen, dass <strong>de</strong>r Bedingungsblock mehrmals<br />

aufgerufen wird.<br />

>+++++>++++ // addiere 5 zu Zelle 1 und 4 zu Zelle 2<br />

[-] // subtrahiere Zelle 2 von Zelle 1<br />

< // gehe zu Zelle 1<br />

[ // wird aufgerufen wenn Zelle 1 ungleich 0 ist<br />

< // gehe zu Zelle 0 (somit wird die Schleife<br />

nur ein mal durchlaufen)<br />

]<br />

Rechenoperationen<br />

Verschieben <strong>de</strong>s Wertes einer Zelle in die nächste (zuerst Nullsetzung <strong>de</strong>r Folgezelle, dann in einer Schleife<br />

Inkrementierung <strong>de</strong>r Folgezelle, gleichzeitige Dekrementierung <strong>de</strong>r aktuellen):<br />

>[-]+[-]>[-]+>+[-] // verschiebe Inhalt von Zelle n


Brainfuck 185<br />

plus 2 nach Zelle n<br />

+-+++++[>+>+[-][-]>[-]>[-][[-]>+>>]


Brainfuck 186<br />

[->+[>+[>>>>>[->++[[-]>+>>]<br />

><br />

[[-]


Brainfuck 187<br />

Referenzen<br />

[1] (http:/ / www. hugi. scene. org/ compo/ compoold. htm#compo6)<br />

[2] BF is Turing-complete (http:/ / www. iwriteiam. nl/ Ha_bf_Turing. html)<br />

[3] http:/ / www. hevanet. com/ cristofd/ brainfuck/ utm. b<br />

[4] http:/ / www. hevanet. com/ cristofd/ brainfuck/ urmutm. b<br />

[5] (http:/ / freakx. net/ bf2d/ )<br />

[6] http:/ / www. muppetlabs. com/ ~breadbox/ bf/<br />

[7] http:/ / esoteric. sange. fi/ brainfuck/<br />

[8] http:/ / koti. mbnet. fi/ villes/ php/ bf. php<br />

[9] http:/ / 4mhz. <strong>de</strong>/ bf<strong>de</strong>v. html<br />

[10] http:/ / www. my-palm. <strong>de</strong>/<br />

[11] http:/ / www. feldkord-programming. <strong>de</strong>/ Programme. htm#Brainfuck-Compiler<br />

Brainfuck2D<br />

Brainfuck ist eine so genannte esoterische <strong>Programmiersprache</strong>, entworfen vom Schweizer Urban Müller um 1993.<br />

Die Sprache wird manchmal auch Brainf*ck, Brainf*** o<strong>de</strong>r BF genannt.<br />

Brainfuck ist zwar für <strong>de</strong>n ernsthaften Einsatz zu umständlich und ineffektiv, aber gut geeignet um Grundlagen <strong>de</strong>r<br />

Computertechnik zu lernen. Speziell zeichnet sich Brainfuck durch ein extrem einfaches Sprachkonzept und<br />

hochkompakte Realisierung <strong>de</strong>s Compilers aus, gleichzeitig wur<strong>de</strong> aber die (prinzipielle) universelle Einsetzbarkeit<br />

nicht eingeschränkt.<br />

Allgemeines<br />

Müllers Ziel war es, eine einfache Turing-vollständige Sprache zu entwerfen, welche mit einem möglichst kleinen<br />

Compiler übersetzt wer<strong>de</strong>n konnte – inspiriert wur<strong>de</strong> er dabei durch False, eine an<strong>de</strong>re esoterische<br />

<strong>Programmiersprache</strong>, <strong>de</strong>ren Compiler nur 1024 Byte groß war. Er schaffte es schließlich, die zweite Version seines<br />

Compilers für <strong>de</strong>n Amiga in lediglich 240 Byte zu schreiben. Brian Raiter gelang es, dies zu unterbieten, in<strong>de</strong>m er –<br />

unter Verwendung von nur 171 Bytes – einen Brainfuck-Compiler für x86 Linux schrieb. Für MS-DOS gibt es einen<br />

Brainfuck-Interpreter von Bertram Felgenhauer mit einer Größe von nur 98 Bytes. [1]<br />

Sprach<strong>de</strong>sign<br />

Ein BF-Programm ähnelt stark <strong>de</strong>r formalen Definition einer Turingmaschine. Statt eines Lese-/Schreibkopfes auf<br />

einem Band, Zustän<strong>de</strong>n sowie einem frei <strong>de</strong>finierbaren Alphabet wer<strong>de</strong>n jedoch im Sinne einer iterativen<br />

<strong>Programmiersprache</strong> ein Zeiger auf ein Datenfeld, Schleifenkonstrukte und eine rudimentäre ALU verwen<strong>de</strong>t. Der<br />

Programmco<strong>de</strong> wird dabei separat vom Datenfeld gespeichert. (siehe Harvard-Architektur)<br />

Befehlssatz<br />

Brainfuck besitzt acht Befehle, jeweils bestehend aus einem einzigen Zeichen:


Brainfuck2D 188<br />

Zeichen C-Äquivalent Semantik<br />

> ++ptr; inkrementiert <strong>de</strong>n Zeiger<br />

< --ptr; <strong>de</strong>krementiert <strong>de</strong>n Zeiger<br />

+ ++*ptr; inkrementiert <strong>de</strong>n aktuellen Zellenwert<br />

- --*ptr; <strong>de</strong>krementiert <strong>de</strong>n aktuellen Zellenwert<br />

. putchar(*ptr); Gibt <strong>de</strong>n aktuellen Zellenwert als ASCII-Zeichen auf <strong>de</strong>r Standardausgabe aus<br />

, *ptr =<br />

getchar();<br />

Liest ein Zeichen von <strong>de</strong>r Standar<strong>de</strong>ingabe und speichert <strong>de</strong>ssen ASCII-Wert in <strong>de</strong>r aktuellen Zelle<br />

[ while (*ptr) { Springt nach vorne, hinter <strong>de</strong>n passen<strong>de</strong>n ]-Befehl, wenn <strong>de</strong>r aktuelle Zellenwert null ist<br />

] } Springt zurück, hinter <strong>de</strong>n passen<strong>de</strong>n [-Befehl, wenn <strong>de</strong>r aktuelle Zellenwert verschie<strong>de</strong>n von null ist<br />

Anmerkung: Es gibt verschie<strong>de</strong>ne semantisch äquivalente Varianten <strong>de</strong>r letzten bei<strong>de</strong>n Befehle, die hier angegebenen<br />

lassen sich jedoch am effizientesten implementieren.<br />

An<strong>de</strong>re im Quelltext vorkommen<strong>de</strong> Zeichen (z. B. Buchstaben, Zahlen, Leerzeichen, Zeilenumbrüche) wer<strong>de</strong>n in <strong>de</strong>r<br />

Regel ignoriert und können so als Quelltextkommentar verwen<strong>de</strong>t wer<strong>de</strong>n.<br />

Turing-Vollständigkeit<br />

Für verschie<strong>de</strong>ne BF-Umgebungen wur<strong>de</strong> Turing-Vollständigkeit bewiesen:<br />

• Für ein unendlich großes Feld aus Zellen unendlicher Größe durch Frans Faase [2]<br />

• Für ein unendlich großes Feld aus Zellen endlicher Größe durch Daniel B. Cristofani [3]<br />

• Für ein endlich großes Feld aus Zellen unendlicher Größe durch Daniel B. Cristofani [4]<br />

Bei einer BF-Variante mit endlicher Zellgröße sowie endlicher Feldgröße (z. B. BFmin) han<strong>de</strong>lt es sich − wie bei<br />

je<strong>de</strong>m realen Computer − um einen endlichen Automaten.<br />

Beispielprogramme in Brainfuck<br />

Hello World!<br />

Das folgen<strong>de</strong> Programm gibt „Hello World!" und einen Zeilenumbruch aus.<br />

++++++++++<br />

[<br />

>+++++++>++++++++++>+++>+


Brainfuck2D 189<br />

>. // Zeilenumbruch<br />

Zur besseren Lesbarkeit ist dieser Brainfuckco<strong>de</strong> auf mehrere Zeilen verteilt und kommentiert wor<strong>de</strong>n. Brainfuck<br />

ignoriert alle Zeichen, die keine Brainfuckbefehle sind. Alle Zeichen mit Ausnahme von +-[],. können <strong>de</strong>swegen<br />

zur Kommentierung <strong>de</strong>r Quellco<strong>de</strong>s genutzt wer<strong>de</strong>n.<br />

Zunächst wird die erste (die „nullte“) Zelle <strong>de</strong>s Datenfelds auf <strong>de</strong>n Wert 10 gesetzt (a[0] = 10). Die Schleife am<br />

Anfang <strong>de</strong>s Programms errechnet dann mit Hilfe dieser Zelle weitere Werte für die zweite, dritte, vierte und fünfte<br />

Zelle. Für die zweite Zelle wird <strong>de</strong>r Wert 70 errechnet, welcher nahe <strong>de</strong>m ASCII-Wert <strong>de</strong>s Buchstaben 'H'<br />

(ASCII-Wert 72) liegt. Die dritte Zelle erhält <strong>de</strong>n Wert 100, nahe <strong>de</strong>m Buchstaben 'e' (ASCII-Wert 101), die vierte<br />

<strong>de</strong>n Wert 30 nahe <strong>de</strong>m Wert für Leerzeichen (ASCII-Wert 32), die fünfte <strong>de</strong>n Wert 10, welches <strong>de</strong>m ASCII-Zeichen<br />

„Line Feed“ entspricht und als Zeilenumbruch interpretiert wird (o<strong>de</strong>r wer<strong>de</strong>n sollte, siehe dazu <strong>de</strong>n Abschnitt<br />

„Implementierungen“).<br />

Die Schleife errechnet die Werte, in<strong>de</strong>m einfach auf die zu anfangs mit 0 initialisierten Zellen 10-mal 7, 10, 3 und 1<br />

addiert wird. Nach je<strong>de</strong>m Schleifendurchlauf wird a[0] dabei um eins verringert, bis es <strong>de</strong>n Wert 0 hat und die<br />

Schleife dadurch been<strong>de</strong>t wird.<br />

Am En<strong>de</strong> <strong>de</strong>r Schleife hat das Datenfeld dann folgen<strong>de</strong> Werte: a[0] = 0; a[1] = 70; a[2] = 100; a[3]<br />

= 30; a[4] = 10;<br />

Als nächstes wird <strong>de</strong>r Zeiger auf die zweite Zelle <strong>de</strong>s Datenfelds (a[1]) positioniert und <strong>de</strong>r Wert <strong>de</strong>r Zelle um zwei<br />

erhöht. Damit hat es <strong>de</strong>n Wert 72, welches <strong>de</strong>m ASCII-Wert <strong>de</strong>s Zeichens 'H' entspricht. Dieses wird daraufhin<br />

ausgegeben. Nach <strong>de</strong>mselben Schema wer<strong>de</strong>n die weiteren auszugeben<strong>de</strong>n Buchstaben mit Hilfe <strong>de</strong>r durch die<br />

Schleife initialisierten Werte, sowie <strong>de</strong>r bereits verwen<strong>de</strong>ten Werte, errechnet.<br />

Grundlagen <strong>de</strong>r Programmierung in Brainfuck<br />

Anmerkung: Obwohl die Zeichen // wie die aus an<strong>de</strong>ren <strong>Programmiersprache</strong>n bekannten Kommentare aussehen,<br />

sind es keine. Deshalb wird ein Pluszeichen z. B. in n+1 als ein Inkrementierbefehl ausgewertet, im unten<br />

angegebenen Beispiel steht aus diesem Grund n plus 1.<br />

Schleifen<br />

Schleifen beginnen mit [ und en<strong>de</strong>n mit ]. Die Schleife wird solange ausgeführt, bis die aktuelle Zelle 0 ist. Die<br />

einfachste sinnvolle Form ist die Nullschleife, die die aktuelle Zelle <strong>de</strong>krementiert, bis diese Null ist:<br />

[-]<br />

Einfache Schleife<br />

,[.,]<br />

Einfaches Echo-Programm. Zeichen wer<strong>de</strong>n von <strong>de</strong>r Standar<strong>de</strong>ingabe gelesen und wie<strong>de</strong>r auf die Standardausgabe<br />

ausgegeben.


Brainfuck2D 190<br />

Bedingungen<br />

• x ungleich y (wird durch Subtraktion <strong>de</strong>r bei<strong>de</strong>n Zahlen erreicht)<br />

Wichtig ist, dass Zelle 0 auf 0 gesetzt ist, ansonsten kann es dazu kommen, dass <strong>de</strong>r Bedingungsblock mehrmals<br />

aufgerufen wird.<br />

>+++++>++++ // addiere 5 zu Zelle 1 und 4 zu Zelle 2<br />

[-] // subtrahiere Zelle 2 von Zelle 1<br />

< // gehe zu Zelle 1<br />

[ // wird aufgerufen wenn Zelle 1 ungleich 0 ist<br />

< // gehe zu Zelle 0 (somit wird die Schleife<br />

nur ein mal durchlaufen)<br />

]<br />

Rechenoperationen<br />

Verschieben <strong>de</strong>s Wertes einer Zelle in die nächste (zuerst Nullsetzung <strong>de</strong>r Folgezelle, dann in einer Schleife<br />

Inkrementierung <strong>de</strong>r Folgezelle, gleichzeitige Dekrementierung <strong>de</strong>r aktuellen):<br />

>[-]+[-]>[-]+>+[-] // verschiebe Inhalt von Zelle n<br />

plus 2 nach Zelle n<br />

+-+++++[>+>+[-]


Brainfuck2D 191<br />

Division funktioniert am einfachsten als restlose Division, alles an<strong>de</strong>re resultiert in <strong>de</strong>m Fall in einer Endlosschleife.<br />

Die I<strong>de</strong>e ist ansonsten dieselbe wie bei <strong>de</strong>r Multiplikation: p[1] = p[0] / 5; Nebeneffekt: p[0] = 0<br />

[>+>[-]>[-]>[-]>[-][[-]>+>>]]<br />

><br />

[[-]


Brainfuck2D 192<br />

das heißt bei Verzweigungen teilt er sich, und ermöglicht damit (Pseudo-)Threads.<br />

Implementierungen<br />

Da Brainfuck keine standardisierte <strong>Programmiersprache</strong> ist, kann es zu Inkompatibilitäten kommen. Diese betreffen<br />

am häufigsten die verschie<strong>de</strong>nen Zeilenumbruchformate <strong>de</strong>r Betriebssysteme Windows und Unix, sowie <strong>de</strong>ren<br />

unterschiedliche Zeichenco<strong>de</strong>s für die Eingabetaste. Die meisten Brainfuckprogramme, darunter auch die von Urban<br />

Müller, sind auf Unix-Umgebungen ausgelegt und können daher mit Implementierungen, die von<br />

Windows-Zeichenco<strong>de</strong>s ausgehen, nicht korrekt übersetzt wer<strong>de</strong>n.<br />

Literatur<br />

• Oliver Lau, Hexenwerk - Ein Plädoyer für esoterische <strong>Programmiersprache</strong>n, c’t 22/07, S. 192-199.<br />

Weblinks<br />

• Brainfuck - An Eight-Instruction Turing-Complete Programming Language [6] von Brian Raiter<br />

• Brainfuck Archive [7] bei Panu Kalliokoski<br />

• Brainfuck Interpreter [8] , Brainfuck Co<strong>de</strong> im Browser testen.<br />

• Brainfuck Developer [9] , eine Brainfuck-IDE für Windows<br />

• Brainfuck Palm-OS Engine und IDE [10] von Rudolf Seitz<br />

• Brainfuck Compiler [11] In Java programmierter Compiler. Erzeugt Java-Byteco<strong>de</strong> und erstellt eine ausführbare<br />

.jar-Datei aus diesem Programm. Von Sven Feldkord.<br />

Referenzen<br />

[1] (http:/ / www. hugi. scene. org/ compo/ compoold. htm#compo6)<br />

[2] BF is Turing-complete (http:/ / www. iwriteiam. nl/ Ha_bf_Turing. html)<br />

[3] http:/ / www. hevanet. com/ cristofd/ brainfuck/ utm. b<br />

[4] http:/ / www. hevanet. com/ cristofd/ brainfuck/ urmutm. b<br />

[5] (http:/ / freakx. net/ bf2d/ )


Quelle(n) und Bearbeiter <strong>de</strong>s/<strong>de</strong>r Artikel(s) 193<br />

Quelle(n) und Bearbeiter <strong>de</strong>s/<strong>de</strong>r Artikel(s)<br />

ActionScript Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=71478717 Bearbeiter: Archiv, Bernd vdB, Blaufisch, Christian Scholz, ChristianErtl, Cljk, Comkee, Complex, Crux, Dinah,<br />

Doc-Holliday26, Edoe, EricPoehlsen, Filzstift, FutureCrash, Head, Hidd, Holly Tyler, HyperDagobert, INM, ITMönch, Ifrost, Ims, Jochen Hilgers, Joni2, Justy, Kai Baumgarten, Kku, Kubieziel,<br />

Kubrick, Laurusnobilis, Le petit prince, Madokan, Meph666, Merlissimo, MichaelDie<strong>de</strong>rich, Mikepowers, Molily, Morki, Nolispanmo, Owltom, Peterlustig, Philipendula, Pjacobi, Prauch,<br />

Psyk42, Ralf5000, Revolus, STBR, Schnargel, Seewolf, Shepard, Srbauer, SteBo, Succu, Timothy da Thy, Tobias Bergemann, Tönjes, U86774, V.R.S., W!B:, WikiPimpi, Wikieditoroftoday, 87<br />

anonyme Bearbeitungen<br />

Algol 60 Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=70167254 Bearbeiter: Aka, Andre Engels, B. N., Bierdimpfl, ChristophDemmer, Daniel Mex, FutureCrash, Haring, HenrikHolke,<br />

Hubi, Humbug, Jpp, Karl-Henner, Kku, Ktnagel, Langec, Lei<strong>de</strong>r, Lenny222, MKI, Marc van Woerkom, Moros, Nd, PeterFrankfurt, Phe, Pit, Pruefer, Ptrs, Rotkaeppchen68, Schnargel,<br />

SebastianBreier, SonniWP, SonniWP2, Terabyte, Tsor, Uwe Hermann, Vrumfon<strong>de</strong>l, Warp, Wegner8, Zeichen<strong>de</strong>rzeit, Zeno Gantner, Zron, 24 anonyme Bearbeitungen<br />

AppleScript Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72228233 Bearbeiter: Bdk, Bgeissl, D, DE, Don Leut, Filzstift, Fomafix, Hagbard, Jamie starr, JasN, Jwdietrich2, Karl-Henner,<br />

Kubieziel, Lichtkind, Lukas Niemeyer, Menphrad, Polluks, Romancieslik, Sarkana, Sparti, Wecu, Wiegels, 33 anonyme Bearbeitungen<br />

Assemblersprache Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72354265 Bearbeiter: 45054, Abigor, Ahoerstemeier, Aleks-ger, Amens, ArchiSchme<strong>de</strong>s, Avoi<strong>de</strong>d, BKS-Ordner,<br />

BLueFiSH.as, Baumanns, Baxerus, Bdk, Ben-Zin, Bernard La<strong>de</strong>nthin, Bholliger, Carbenium, Chiananda, ChristianHujer, Ckeen, Complex, Conny, Conversion script, Cortex a8, Cryjack, D,<br />

DarkDust, Diba, Doo<strong>de</strong>e, Drccpp, Ephraim33, Estron, Euku, Fgb, Frank Murmann, Gum'Mib'Aer, Harald Tribune, Hirzel, Homer Landskirty, Hubi, Humbug, Ichmichi, Jan Giesen, Jens Prüfer,<br />

Joho345, Julben, Karl-Henner, Kickof, Kurt Jansson, Lei<strong>de</strong>r, Littl, LivingShadow, Logopodo, LosHawlos, MFM, Magnus, MalteAhrens, Marco Breuer, Mario Blunk, Markus Moll, Martin-vogel,<br />

Masterbrain, Matthias Winkelmann, Matthäus Wan<strong>de</strong>r, Melmei, Mh, Mikue, Moon2005, Nschle85, OliverWei<strong>de</strong>l, Oreissig, Paethon, Pausetaste, Peter(TOO), Peter200, PeterVitt, Piefke,<br />

Pomponius, Protoss<strong>de</strong>sign, Pruefer, Ramgeis, Reptilologe, Ringler, Rtc, Schewek, Schlesinger, Sicaine, Siegmaralber, Sim.krueger, Sinn, StYxXx, Stargaming, Stefan Kühn, Stefan506, Stern,<br />

Stevemitchell, T0ast3r, Terabyte, Thüringer, Tiago, Tinz, Traroth, Trockenfisch, Tux edo, VampLanginus, Vi<strong>de</strong>o2005, WKr, WiESi, Wikipediaphil, Woches, XJamRastafire, YPkx22m40,<br />

YourEyesOnly, dialin-145-254-190-065.arcor-ip.net, א, 143 anonyme Bearbeitungen<br />

B (<strong>Programmiersprache</strong>) Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=71936928 Bearbeiter: B0b, Conversion script, DaB., Das Ed, ER1984, Fomafix, Gms, Head, Kh555, Kingruedi,<br />

Klemen Kocjancic, Kurt Jansson, Ocrho, RokerHRO, Schewek, Sicherlich, Spinne, Steffen, Tobias Bergemann, Urizen, Znortquap, Zumbo, 6 anonyme Bearbeitungen<br />

BASIC Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72412438 Bearbeiter: AFBorchert, Abubiju, Achim Raschka, Ae-a, Aka, Andre Engels, Andy king50, Arbol01, Archiv, Ardo Beltz,<br />

BLueFiSH.as, Ben-Zin, Benedikt, Bierdimpfl, Buddhanatur, Byteemoz, Cactus26, Complex, Conversion script, Cuno.1, CyranoJones, Dachris, DangerGround, Demicx, Djj, Djordjes, DocSny<strong>de</strong>r,<br />

EUBürger, Elvis untot, Entlinkt, ErnstRohlicek, Euphoriceyes, FelixBlumstrauß, Fomafix, Frank Murmann, Gansweith, Generator, HannesH, Hans Bauer, HaukeZuehl, Herr Th., Hubi, Jacco,<br />

Joho345, Jpp, Juesch, KaHe, Karl Gruber, Karl-Henner, Kassan<strong>de</strong>r <strong>de</strong>r Minoer, Knoerz, Knorxx, Knuth Konrad, Kopoltra, Koyaanis Qatsi, LKD, Langec, Libro, Lichtkind, LustigerKreis,<br />

Löschfix, Magnus, Malcdu3, Mandi47, Manuel Krüger-Krusche, MarkusHagenlocher, MarkusKnittig, Martin Wantke, Martin-vogel, Matthäus Wan<strong>de</strong>r, Mh, Mijozi, Mikenolte, Mr. An<strong>de</strong>rson,<br />

Mr. B.B.C., Naddy, Nameless, Numbo3, Onegin, Paddy, PatriceNeff, Paul Ebermann, Peter200, PhilippWeissenbacher, Picpatz, Pittigrilli, Plenz, Polluks, Poxy, Raymond, Reinhard Kraasch,<br />

Rho, Robert Wünsche, RokerHRO, Schewek, Schildie, Sebs, Sesalo, Siego, Snevern, SonniWP2, Sovok, SpaceRat, Stefan h, Stefan2, SuperFLoh, T-st, TheK, Thornard, Till.niermann,<br />

TobiasHerp, Traroth, Tzzzpfff, Uimp, Ulsimitsuki, VampLanginus, Vi<strong>de</strong>o2005, WAH, Wainberg.<strong>de</strong>, Wiegels, Wikipediaphil, Wikitroll, Wilske, Wurzeldrei, Zeno Gantner, Zinnmann,<br />

cache.it.helsinki.fi, pD902E342.dip.t-dialin.net, 186 anonyme Bearbeitungen<br />

Borland Delphi Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=65905886 Bearbeiter: -<br />

C (<strong>Programmiersprache</strong>) Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72294294 Bearbeiter: Achim Raschka, Achim.oetringhaus, Aconcagua, Ahoerstemeier, Ak1, Alexzop,<br />

Alicante1986, Andreas Stockter, AndreasB, Antonsusi, Archiv, Ath, Axelfarr, AydinC, B.Nafz, B0b, BLueFiSH.as, Bananeweizen, Barbulo, Baumanns, Bautsch, Ben-Zin, Benji, Bernard<br />

La<strong>de</strong>nthin, Beson<strong>de</strong>reUmstaen<strong>de</strong>, Bitsandbytes, Bombenleger, Boris23, Brf, Cactus26, Carminox, Catmangu, Chewie100, Christoph D, Cient, Claudio Carobolante, Cliffhanger, Complex, Conny,<br />

Conversion script, Corbil, Cvk, DL5MDA, DaB., Dagobert Drache, Daniel B, DarkDust, DavidbowiE, Der Wolf im Wald, Derbrain, DeusTron, Develord, Dietmar Giljohann, Digedag1234,<br />

DocSny<strong>de</strong>r, Dr.Inform, Drahkrub, Duesentrieb, Dundak, Edding, Eozae, Epsilon, Estron, Euphoriceyes, FaUl, Fantomas, Fcc go, Flashenposter, Flo12, Flominator, Fomafix, Fristu, G, GDK,<br />

GNB, Gauss, Geekux, Georg-Johann, Gms, Gunther, HHK, Hannes Hirzel, Harald wehner, Hashar, He3nry, Head, Heizer, Himuralibima, Hokanomono, Howwi, Hubi, JAF, JensGoldbecker,<br />

Jivee Blau, Jodo, Jofi, Johnny drossel, Jojo-schmitz, Jonathan Hornung, Jpp, Jurpel, Jörg Weinmann, KL47, Ka<strong>de</strong>ck, KagamiNoMiko, Karl-Henner, Kassan<strong>de</strong>r <strong>de</strong>r Minoer, Kh555, Kingruedi,<br />

Knorxx, Koala, Koethnig, Kurt Jansson, Kurt seebauer, LKD, Landau, Lehrig, Lemzwerg, Levin, Liebeskind, Longamp, Lustiger seth, Lyserg, M43kS, MF-Warburg, MGla, Magnus,<br />

MarsMaster, Martin-vogel, Maveric149, Membeth, Merlin G., Mh, Miez, Mijobe, MikeTheGuru, Mikenolte, Montauk, Mr. An<strong>de</strong>rson, MrG <strong>de</strong>, Nachtgestalt, Nephelin, Neubert, NiTeChiLLeR,<br />

Nicki<strong>de</strong>rweissehund, Nicolas G., Nikai, Noddy93, Norbert M. T., Noshow, Numbo3, Octotron, Onee, Otpyrc, Pascal76, PaterMcFly, PatriceNeff, Peter seibel, PhilippWeissenbacher, Planegger,<br />

Plasmagunman, Polluks, Preek, Programmierer, Prometeus, Q. Wertz, Quickfix, R2D2 C3PO, Ratopi, Reptilologe, Revvar, Richardigel, RokerHRO, RolandIllig, Roo1812, Rtc, SHerz,<br />

SK-Genius, SLXViper, STBR, Sansculotte, Sargoth, Schewek, Schily, Schnargel, Schnuffi72, Schoos, Schwans, Schweikhardt, Scooter, Scsboy1, Semper, Serpens, Sfischer, Shlomo, Sig11,<br />

Silberchen, Simonski, Skriptor, Snert, Sparti, StarShaper, Stefan Kögl, Stefan Kühn, Stefan Schultz, Steffen, Stern, Suedwand, Sysrq, TTL, Teewurst, TheK, ThiloSchulz, Tilo Körner, Tinz,<br />

Tirkon, Trac3R, Trustable, Tönjes, Ulrich.fuchs, Urs, WAH, Warp, Wee<strong>de</strong>, WikiNick, Wikpe<strong>de</strong>d, Wolle1024, Wuffel, YMS, Yanestra, Youandme, Zxb, 399 anonyme Bearbeitungen<br />

C+ + Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72461588 Bearbeiter: AT, Abaumg, AbcAeffchen, Achim Raschka, Addicted, Aka, Akkarin, Alfred Nobel, Amin K, AndreasB,<br />

Androl, Apfelschorle, Aquisgranum, Arcy, Arpy, Aths, Augiasstallputzer, AydinC, BKSlink, BarkingFish, Ben-Zin, Bentakle, Bernard La<strong>de</strong>nthin, BerndGehrmann, Berni, Bhabba, Bitsandbytes,<br />

BlackMaster, Bleichi, Brf, BuSchu, Bur, Callidior, Calvin-gr, Casoboy16, Ce, Ce2, Chatter, ChristianHujer, Christoph D, Ckeen, Co<strong>de</strong>master, Complex, Conversion script, Corbil, Crux, Curtis<br />

Newton, Cvk, D, D0ktorz, Dachris, Data-Experts, Der Wolf im Wald, DeusTron, Dibe, Dinah, DocSny<strong>de</strong>r, Dodo von <strong>de</strong>n Bergen, Dr.Inform, Dru56, Dtk, Dubbaluga, Dundak, E86, E<strong>de</strong>l682,<br />

Emes, Engie, Erhard Henkes, ErrorXVI, Euku, EvaK, Fe<strong>de</strong>r und Schwert, Ferk, Firefox13, Flagran, Flogger, Florian Keßeler, Flostre, Fomafix, Foobar, FutureCrash, Fuzzile, Ganomi, Gardini,<br />

Gauss, Giuly, Gnufix, Gnushi, Gorp, Gronau, Guandalug, Gunther, H4xX0r, HaTe, Ha<strong>de</strong>s, Hallo leute, He3nry, Head, Heinrich5991, Heinte, Helm, Hermann T., Herzl, High-Fish, HugoRune,<br />

Igge, Insi<strong>de</strong>r, Ixitixel, JAF, JD, Jackalope, Janmohr, Janni93, Johannes2, Jonathan Hornung, Jowereit, Jpp, Juesch, Jwnabd, Jón, KL47, Ka<strong>de</strong>ck, Kaetsch, Kalumet, Karl Bednarik, Karottenreibe,<br />

Kassan<strong>de</strong>r <strong>de</strong>r Minoer, Kate, Kh80, Kingruedi, Kleiner Revert, Knopper22, Koenraad, Kolk, Konrad F., Kopoltra, Kubrick, Kungfuman, Kurt Jansson, Kurt seebauer, Langec, LeClochard,<br />

Lennart Spitzner, Lenny222, Levin, Liebeskind, Longamp, Lostintranslation, MaKoLine, Magnus, Malteleip, Manu b, Marc van Woerkom, Marc-André Aßbrock, Markus Mueller,<br />

Markus.schulze, MarkusHagenlocher, Martin Fuchs, Martin-vogel, Matt314, Matthias Kupfer, Matthäus Wan<strong>de</strong>r, Memnon335bc, Merlin G., Merlissimo, Micwil, Mijobe, MikeTheGuru,<br />

Mikenolte, Mjoppien, Mnh, Mo4jolo, Morlang, Mps, Muck31, Mugros, Nd, Nephelin, Netzki, Newr.88.72, Nicolas G., Nk94.com, Nolispanmo, Norro, Nschle85, Nulobert, Numbo3, Ocrho,<br />

Old.cpp, Olei, Ominion, Otets, Paddy, Paethon, PaterMcFly, PatriceNeff, Paul Wenk, Pendulin, Perrak, Peter200, Philipendula, Pi, Pill, Pinetik, Pinguin.tk, Pit, Plucked, Pohli74, Poldi, Poxy,<br />

Provi-neu, R. Barth, Raimar, RalfG., René Schwarz, Revvar, Rho, Richardigel, Roadsi<strong>de</strong> Attractions, RobertoRSi, RokerHRO, Rolf D., Rudi Mentehr, S.K., Sallynase, Sammler05, San Jose,<br />

Sapn, Sargoth, Schilken, Schlesinger, SchwarzerKrauser, Sechmet, Seewolf, Sefi, SehLax, Semper, Sensenmann, Sfischer, ShadowCrawler, Simon2, Skriptor, Slt, Spartanischer Esel, Sparti,<br />

Speck-Ma<strong>de</strong>, StarShaper, Steef389, Stefan, Stefan Kühn, Stefan Schultz, Stern, Suit, Superbass, Synelec, Sypholux, T34, Taschenrechner, Terabyte, TheK, ThePacker, ThePeritus, Thomaswm,<br />

Thornard, Thüringer, Tobias Bergemann, Transor, Traroth, Traute Meyer, Trockenfisch, Trublu, Tsor, Tunichtgut, Tuxman, Ulz, Uwe Gille, Valnar, Vargenau, Vkoleviathan, VladimirTepes,<br />

Vlatterm, Volker Alexan<strong>de</strong>r, W.ama<strong>de</strong>us, Walter Koch, Warp, Wat kickstn so?, Wdwd, WebScientist, Webkid, Wee<strong>de</strong>, Whitespace123, WiESi, Wie gesagt, Wikieditoroftoday, Wikihelp,<br />

Wilfried Elmenreich, Windharp, Wmbolle, Yetzt, YourEyesOnly, Zampano69, Zamperl5, Zeno Gantner, Zollernalb, Zook, Zuknapp, Zäh-Scharp, Überraschungsbil<strong>de</strong>r, 691 anonyme<br />

Bearbeitungen<br />

C- Sharp Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72436518 Bearbeiter: 21Cyberboy, APPER, Addicted, Adrianwn, Aka, Alexan<strong>de</strong>r Noé, Archiv, Arcy, Ardo Beltz, ArtMechanic,<br />

B0b, BSDev, Bitsandbytes, Blah, Blakeks, Blaubahn, Boogieman95028, CSonic, Carminox, ChristianErtl, Chrizel, Complex, D, Daniel Bovensiepen, DerAnalyst, Derwok, Djordjes, Doc z,<br />

Dundak, E7, Echom, Euku, Expent, Filzstift, Fjeller, Florian Adler, Fomafix, FordPrefect42, Frank Jacobsen, FrankDopatka, Generalpd, Guenson, HaukeIngmar, Helix91, HesseTom, High-Fish,<br />

Hurlbrink, Ijbond, J. 'mach' wust, J0eyB, JDF, Jackalope, Jan223, Janni79, Jpp, Just-Ben, Jutta234, Karl-Henner, KleinerHerbert, Knorxx, Koethnig, Konrad F., Kookaburra, Korinth, Krawi, Kvn,<br />

LKD, Lei<strong>de</strong>r, Lichtkind, Liquidat, Lofote, Lon Molescraft, LordDeath, M.L, Ma-Lik, Mannerheim, Marc H., MarcoBorn, Martin Herbst, Martin-vogel, Matthias M., Maynard, Mig000,<br />

Mikenolte, Moros, MovGP0, Mps, Mumme, Neitram, Nephelin, Netzki, Nils-Hero, Nolispanmo, Nonvolatil, Norro, Novox, Nrainer, Numbo3, Ohauahauaha, PIGSgrame, PSS, Paddy,<br />

PatriceNeff, Peating, Pemu, PerfektesChaos, Peter Steinberg, PeterReut, PeterVitt, Polarkreis0815, Prowal, RFranssen, Racer93, Reinhard Kraasch, Revvar, Ri st, Robb, Robert Wünsche,<br />

RohMusik, RokerHRO, Rotstifttäter, Rudimenter, STBR, Salmi, Scared, Schwarzweiß, Sebastian.Dietrich, Seufert, Sinn, Slady, Smach, Smurn, Snert, Spotty, Sprezzatura, StYxXx, Stamann,<br />

SteMicha, Stefan Schultz, StephanGrein, Stern, Stummvoll, ThoRr, Thomas Willerich, Thornard, Timekeeper, Torsch, Tribes, Ursb, UweHaupt, Vertigo21, Wiegels, WikiNick, Wikipediaphil,<br />

WoTsch, Wolle1024, XChris, Xanim, Zumbo, Zäh-Scharp, Україна, 298 anonyme Bearbeitungen<br />

COBOL Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=71561640 Bearbeiter: 7lima, Achim Raschka, Aka, Albu, Andre Engels, Andy king50, Ath, BKSlink, Baumfreund-FFM,<br />

Ben<strong>de</strong>r235, Bierdimpfl, Cactus26, Charmion, Clemfix, Dealerofsalvation, DerHexer, Dragan, Eike sauer, Emmo.Tevkliss, Felistoria, Fkuehne, Fomafix, Froggy, Gstueb, HV, Hcy, Head,<br />

Hieronymus A., Hpb, Hubi, Ikarus1969, Jailbird, Jed, John, John Eff, Jonelo, Joni2, Jpp, Kh80, Kubieziel, Kungfuman, L.Willms, Lateiner, Lei<strong>de</strong>r, Longamp, MacBarfuss, MarkusHagenlocher,<br />

Martin Herbst, Martin-vogel, Matthäus Wan<strong>de</strong>r, Moralapostel, Nameless, Nocturne, Ozuma, PhilippWeissenbacher, Pill, Python-Clown, Ralf Schroth, Ralf5000, RokerHRO, Roland Berger,


Quelle(n) und Bearbeiter <strong>de</strong>s/<strong>de</strong>r Artikel(s) 194<br />

Sarang, Schatte, Siggi, Sslomski, Stefan Kühn, SuperFLoh, Sypholux, T1gerch3n, Tamas Szabo, Timothy da Thy, UlrichJ, Unscheinbar, Urfin, Usarobert, Velgreyer, Vi<strong>de</strong>o2005, Warp, WeißNix,<br />

Wiki und ylvie, Wkrautter, Zangala, Zeno Gantner, Århus, 129 anonyme Bearbeitungen<br />

D (<strong>Programmiersprache</strong>) Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=71824458 Bearbeiter: Avoi<strong>de</strong>d, B0b, Berliner Schildkröte, Bernard La<strong>de</strong>nthin, Björn Bornhöft, Boemmels,<br />

Complex, D, Dapete, Dennis Westphal, DocSny<strong>de</strong>r, DrumsInVitro, Engie, Fast.ch, Flogger, Fomafix, Geist, <strong>de</strong>r stets verneint, Gerold Broser, Ha<strong>de</strong>s, Haeber, Jpp, Juliana da Costa José,<br />

Keinfarbton, Knorxx, Kubieziel, Kuebi, Kuhlo, L9urch, Lei<strong>de</strong>r, Lichtkind, Mafutrct, Manni88, Manuae, Marcel Kaeming, Mark192, Martin Fuchs, Meph666, Mo4jolo, Muck31, No dammagE,<br />

Ocrho, Red<strong>de</strong>r, Rohieb, RokerHRO, Salomon<strong>de</strong>rossi, Simonski, Stern, TUFKAUP, TheHammer, Tuergeist, Tönjes, Umweltschützen, Uncopy, Vigilius, WeirdCat, WiESi, Xanim,<br />

YourEyesOnly, Zumbo, 103 anonyme Bearbeitungen<br />

DarkBASIC Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72300191 Bearbeiter: Aka, Arcanis, Ardo Beltz, Cperrin88, D Man, DangerGround, Elvis untot, Fomafix, Lanna, Lyzzy, M.L,<br />

MarcoBorn, Maruschka, Nemonand, OttoK, QualiStattQuanti, Speck-Ma<strong>de</strong>, Urizen, 15 anonyme Bearbeitungen<br />

FORTRAN Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=6756105 Bearbeiter: Aka, Alekx, Amoxys, Androl, Arved, Ath, Aths, Bdk, Bhaak, Bierdimpfl, BurghardRichter, Cactus26,<br />

Cmo<strong>de</strong>r, Daddy Cool, Daniel FR, Daniel Mex, D<strong>de</strong>nbrok, Der Hakawati, Diba, Don Magnifico, Eclipse, Fortran-Guru, Gissi, Igrimm12, JCS, Jaellee, Jahobr, JanKorger, Jkbw, Karl-Henner,<br />

Klausmach, Knorxx, Lars Beck, Lei<strong>de</strong>r, Levin, Lichtkind, Marc van Woerkom, Martin-vogel, Matthäus Wan<strong>de</strong>r, Mm177, Mvb, Nagy+, Nd, Netzrack.N, Nummer9, Oge, Peter200, Plaicy,<br />

Polluks, Redf0x, RobertLechner, RokerHRO, SDSchulze, Schnargel, SebastianBreier, Sig11, Sithschi, Stefan Kühn, Tastas, Tobias Bergemann, Tserc, Tuxman, Weialawaga, WilfriedC,<br />

Winkelmann, Wizzar, ZDragon, Zeichen<strong>de</strong>rzeit, 128 anonyme Bearbeitungen<br />

FreeBASIC Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=71315324 Bearbeiter: AN, Ae-a, Aka, Allefant, Androl, Ath, Bdk, Blauerflummi, ChristianErtl, Church of emacs, Complex,<br />

Cs<strong>de</strong>rats, D0c, DasBee, DennisExtr, Don Magnifico, Dusky Joe, Euphoriceyes, FB Volta, Filzstift, Florian Weber-alt, Fomafix, Guizza, Habakuk, Jcornelius, Joli Tambour, Kampfmaus,<br />

Keymaster, Krawi, Krulli, Lichtkind, Markus Böhme, MarkusHagenlocher, Mecki468, MeckiIgel, Michael Reschke, MichaelFrey, MisterD, Mosmas, Okiesp, PC-286, Pelz, PeterFrankfurt,<br />

Polluks, Priwo, Psygate, RokerHRO, Sarkana, Sascha Brück, Semper, Sinn, Ska13351, Stefan Majewsky, Stefan506, TaPMaN, Tsor, Ttbya, Verwüstung, W!B:, Wort2, 147 anonyme<br />

Bearbeitungen<br />

Hallo Welt Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=6987072 Bearbeiter: -Matthäus-, 08-15, 1stMachine, A1000, Abubiju, Ahellwig, Aka, Akribix, Alkab, AllesMeins, Andreas 06,<br />

Apollo0880, Arbol01, Arne List, Arty, Asteroid7687, Atom3000, Avoi<strong>de</strong>d, BSI, Bautsch, Bdk, Benji, Bernard La<strong>de</strong>nthin, Blakeks, Boogieman95028, Boris23, Boskoop, Bpascal, Cactus26,<br />

Candid Dauth, Carbenium, Carstor, Checkup, Chmaas, Chrislb, Christopher Lorenz, Church of emacs, Cliffhanger, Cmo<strong>de</strong>r, Complex, Conny, Crux, D, DangerGround, Daniel B, Dapete,<br />

DarkwingDE, Das emm, DasBee, Dbenzhuser, Der Ersteller, Der.Traeumer, DerPaul, DeusTron, Diddi, DocSny<strong>de</strong>r, Don Magnifico, Dsmcg21, Dundak, DutiesAtHand, Dyne, EcKiEsTiEg,<br />

ErikDunsing, Euku, Felix Stember, Fischchen, Fischi02, Flashenposter, Flogger, Flokass, Fomafix, Freanir, Friesen, Fristu, Fronti, Fschoenm, Fuenfundachtzig, Gail, Gauss, Generalpd, Gismatis,<br />

Gnu1742, Goldti, Gorko122, Grich, Guandalug, Gunther, HAL Neuntausend, HJPhilippi, HaeB, Hans Bauer, Har<strong>de</strong>nacke, Haring, HaukeZuehl, Haun, Head, Hella, Herr Th., Hholzgra, Hmilch,<br />

Hokanomono, Holger I., Howwi, Hubi, Huha, Hutty, Hweihe, Hydro, IGEL, J.C.Denton, JCS, JD, JPB, JaBernet, Jackalope, Janneman, Jed, Jello, Jergen, Jodoform, Johannes2, Jpp, Jörg<br />

Knappen, K0nze, KL47, Ka<strong>de</strong>ck, Kajk, Kantor.JH, Karottenreibe, Keil, Kiker99, Killerpinscher, Kloth, Kluecke, Knallkopf, Knorxx, Krischik, Kubieziel, Kungfuman, Kup, Kwer Wolf,<br />

L.Willms, Landaley, Langec, Larf, Leithian, Levin, Lichtkind, Linkin', Littl, Lobla, Lostintranslation, Lumio, MAK, MGascoyne, MGla, Makkonen, Manuel Strehl, Marcadore, MarianSigler,<br />

Markus Mueller, Martin Wantke, Martin-vogel, Martin83MZ, Meisterplanlos, Memset, Michael Hüttermann, Michaelsy, MicrosoftSam, Mijanima, MisterD, Mkogler, Mnh, Modran, Molily,<br />

Morszeck, Mosmas, Mps, Much89, Nb, Nd, Neg, Nert, Nolispanmo, Norbert Glauner, Novox, Nux, Oberlaen<strong>de</strong>r, Ocrho, Onoxegy, PDD, PatriceNeff, PcPasi, Pcgod, PeeCee, Peter200,<br />

PhilippWeissenbacher, Pietz, Plaicy, Planegger, Polarlys, Poldi, Polluks, Primus von Quack, Priwo, Profmaad, Prometoys, Psypath, R2C2, RAFPeterM, Ralf Roletschek, Ralf99, Rax, Raymond,<br />

Rdb, Redfrettchen, Reinerh, Reinhard Kraasch, Rgg, Ri st, Richan, Richardigel, RoadsterDirk, Roger Zenner, Roland2, RolandIllig, Rs newhouse, Rtc, S.K., S.kapfer, SK-Genius, STBR, Salzach,<br />

Sbeyer, Scared, Schaengel89, Schlesinger, Schmiddtchen, Schnargel, Self, Semiliki, Semper, Seth Cohen, Sevenfifty, ShiKai, Sicherlich, Siehe-auch-Löscher, SilverSrv, Sinn, Sirmoloch,<br />

Skriptor, Slomoman, Snert, Spid, Spuerhund, Srittau, Stefanp, Stern, StillesGrinsen, Stoerte, Stw, Suchenwi, SuperFLoh, Sven-steffen arndt, Szs, TableSitter, Testudo Aquatilis, Tethys, Teutates,<br />

TheK, ThePeritus, TheWinner, Theghaz, Thgoiter, Thom, Tian, Tobi B., Tobias Bergemann, TobiasHerp, Tobiask, Tpeuss, Trainspotter, Trebla01, Trublu, Tuetechips, Unscheinbar, Valdachim,<br />

Viperb0y, Vlado, WIKImaniac, WalterSpiegel, Wdwd, WiESi, Wiegels, Wikipediaphil, Wiktator, Wurzeldrei, XJamRastafire, Xqt, YourEyesOnly, °, 633 anonyme Bearbeitungen<br />

Java (<strong>Programmiersprache</strong>) Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72307003 Bearbeiter: -jha-, 1000の言葉, 130.60.153.xxx, A11158, A1e DE, AF666, AWendt, Achermann,<br />

Achim Raschka, Afrank99, Aka, Alicante1986, Almdudla, Andre Engels, Andreas lenz, Andrsvoss, Ardo Beltz, Asarion, Ataxa, Ath, Axji, BK, Baikonur, Bartscht, Bastie, Ben-Zin, Bernard<br />

La<strong>de</strong>nthin, BertholdWagner, Bildungsbürger, Bitsandbytes, Boris23, Bullpup, Buntfalke, Carlo Lupo, Carter666, CengizS, Chaddy, Chee<strong>de</strong>r, Christi4nK, ChristianErtl, ChristianHujer, Chrkl,<br />

Church of emacs, CommonsDelinker, Complex, Conversion script, Crux, D, DaB., Dachris, DanielSHaischt, Das Ed, Dedi, Deicksta, Der uzi, DerHexer, Dertoradium, DeusTron, Dewars82,<br />

Diba, Dishayloo, Dnaber, DocSny<strong>de</strong>r, Dr.Inform, DrPepper, Dralon, DreadVenturous, Duesentrieb, Dunkelangst, El Con<strong>de</strong>, Elian, Elya, ErikDunsing, ErnstRohlicek, Euklid23, Euku, Fast.ch, Fcc<br />

go, Felix Stember, FerdiBf, Fgb, Fire, Fisch, Flogger, Florian Keßeler, FlorianN, Fomafix, FrankDopatka, Fred Stober, Friedrich Braune, Frog, Frosty79, GNosis, GeorgGerber, Gil, Gnu1742,<br />

Golgol, Gorp, Gravitex76, Grebsnork, Gum'Mib'Aer, Gut informiert, HHK, Ha<strong>de</strong>s, HaeB, Haeber, Hafenbar, Hagbard, Hank van Helvete, Har<strong>de</strong>nacke, He3nry, Head, Heiko, Heinovh, Hendrik<br />

Brummermann, Hernani, Herr Schroe<strong>de</strong>r, Hhoffmann, Hirne<strong>de</strong>rl, Hllizi, Howwi, Hubi, ILA-boy, INM, Infernum, InikOfDoom, Inkowik32, Inspectre, Intertorsten, J Schmitt, Janschejbal, Jed,<br />

JensBaitinger, Jfwagener, Jkbw, Jod<strong>de</strong>l, Jodo, Johann.Uhrmann, Jonelo, Jowereit, Jpp, Kampet, Kanei<strong>de</strong>rdaniel, Karl-Henner, Kdwnv, Keks, Keyanoo, Kingruedi, Kku, Knallfrosch, Knopper22,<br />

Knorxx, Koethnig, Kopoltra, Korinth, Koyaanis Qatsi, Kpg, Krawi, Kristjan, Kubieziel, Kurt Jansson, Kurt seebauer, Kühler Grill, LBV-Zivi, Langec, Laubbaum, Lehmi, Lei<strong>de</strong>r, Lenny222,<br />

Leo141, Leon, LittleJoe, LivingShadow, Locked, Lummer, M82RviGaIGbJg, MAK, Ma-Lik, Ma-games.<strong>de</strong>, Madmandan, MagicMuscleMan, Magnumman<strong>de</strong>l, Magnus, Magnus Manske, Marc<br />

Schuelper, Mark Nowiasz, MarkusKnittig, Martin Fuchs, Martin-vogel, Matthias Reissner, Matthäus Wan<strong>de</strong>r, Maximum, Meph666, Messi, Metalhead64, Michael Hüttermann, MichaelDie<strong>de</strong>rich,<br />

Michon90, Mike.lifeguard, Mr.atix, Musik-chris, Myr, Nameless, Ncnever, Nd, Necrophorus, Nephelin, NicTheQuick, Nk3000, Nomadhunter, Nospoftombl, Numbo3, Nutzer 2206, OWeh,<br />

OecherAlemanne, OliD, OliverWei<strong>de</strong>l, Onoxegy, Ot, P77a, PatriceNeff, Paul Ebermann, PeeCee, Peter200, PeterReut, Philipp Claßen, PhilippWeissenbacher, Phontoras, Pinguin.tk, Pjacobi,<br />

Polarlys, Polluks, Pph, Priwo, PsY.cHo, Pythagoras1, Racer93, Ralbisser, Raubsaurier, Rauenstein, Raymond, Revvar, Richardigel, Robb, Rohieb, RosarioVanTulpe, STBR, Schmiddtchen,<br />

Schmidtm, Schr66, Schranziger, Sebastian.Dietrich, Seicke, Semper, Seraphie, Sherlock Holmes, Siegmaralber, SkaMi, Skriptor, Snert, Softeis, Sparti, Speifensen<strong>de</strong>r, Spuckey, Spuk968, St.s,<br />

Stefan Birkner, Stefan Kühn, Stefan h, Stern, Supaari, SuperFLoh, Superwurmi, Syrcro, Sysrq, The Programmer, TheK, Thomy <strong>de</strong>r Genuss, Thornard, Thüringer, Tiago, Tigeryoshi,<br />

Till.niermann, Tobiask, TomK32, Toyota prius 2, Trac3R, Trockenfisch, Tsor, Ugh, Ukuechle, Ulfl, Ulrich Schiek, Ulrich.fuchs, Uncopy, Unscheinbar, Untitled, Viperb0y, Vogella, WAH,<br />

WWW MACVENUS DE, Walter.pachl, Warp, Webkid, Wee<strong>de</strong>, WeißNix, WiESi, Wiegels, WikiBene, Wikiroe, Winhistory, WissensDürster, Wolfgang1018, Wondigoma, Www.zunami.at,<br />

Xflupp, YMS, Yuuki Mayuki, Zahnstein, Zeno Gantner, Zensurgegner, Zinnmann, Zook, p3EE0E91B.dip.t-dialin.net, °°Ben³, 732 anonyme Bearbeitungen<br />

JavaScript Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72436823 Bearbeiter: 130.60.153.xxx, 132-180, 21.213.186.195.dial.bluewin.ch, A Ruprecht, ADK, ASM, Abe Lincoln, Abena,<br />

Acetobacter, Achim Raschka, Aka, Alauda, Anaximan<strong>de</strong>r, Andre Engels, Archiv, Armin P., Arno Oesterheld, Arnomane, Asw-hamburg, Autor, Ben-Zin, Benji, Benzen, Bierdimpfl,<br />

Bitsandbytes, Black-Hole, Blah, Blaubahn, CHRiSNEW, Callidior, Canyousee, Capaci34, Carminox, Choas, ChrisHamburg, Chrisfrenzel, ChristianErtl, Chth, Church of emacs, Cjlpa,<br />

Co<strong>de</strong>ispoetry, Complex, Conversion script, CyRoXX, D, Dachris, Darklock, Dein Deutschlehrer, Demus Wiesba<strong>de</strong>n, Deorkdfkierkfietewre, Der.Traeumer, DerHexer, Diba, Docmo, Dominic Z.,<br />

Don Magnifico, Dreeh, Dullnraamer, EWriter, Edoe, ElRaki, Em<strong>de</strong>e, Empro2, Entlinkt, Ephraim33, Etagenklo, FabianLange, Florian Adler, Fomafix, Frank Jacobsen, FreelancerHamburg,<br />

Fritzbruno, Frosty79, Fsswsb, Fusselwurm, GNosis, Gary Luck, Gidoca, Gnu1742, Gunk, HJH, Hacker1, HaeB, Haeber, HannesH, Hansbaer, Haplochromis, HardDisk, Harry<strong>de</strong>luxe, Head,<br />

Howwi, Hozro, Hubi, Hzerres, IGEL, IZazen, Jakov, Jergen, Jpp, Jpschober, JuergenL, Kai Pirinja, Kanei<strong>de</strong>rdaniel, Karl-Henner, Kenny1987, Kjuu, Kku, Konrad F., Krawi, Kubrick, Kurt<br />

Jansson, LBV-Zivi, Langec, Lehmi, Lewa, Liberatus, Louis Bafrance, M43kS, Marc-André Aßbrock, Marcel Zimmer, Martin-vogel, Mcaviglia, Meister-Lampe, Meister-Mini, Meph666, Messi,<br />

Micha koller, Moguntiner, Molily, Mstolt, Muck31, Multi io, Myops, Ndieckow, Netspy, Nicolas17, Ninjamask, Novox, Numbo3, Olliminatore, P. Birken, PIGSgrame, Parzi, PatriceNeff, Paul<br />

Ebermann, Pelzi, PerfektesChaos, Perrak, Peter200, Philonous, Pittimann, Pjacobi, PointedEars, Polluks, Popolfi, Potterfan, Powerstat, PsY.cHo, Pseliger, Q. Wertz, Rbb, Reinhard Kraasch,<br />

Reinhard16, Remi, Revvar, Ri st, Robert Wünsche, Rohieb, RokerHRO, RolandIllig, S.Didam, S.moeller, S1, Samtrot, Schnargel, Schrepfer, Schwans, Schweikhardt, Scooty, Sebastian.Dietrich,<br />

Seewolf, Semper, Septembermorgen, Simonsais, Sinn, Slartibartfass, Spuk968, Stefan Birkner, Stefan Mintert, SteveTheGuitarChief, Stfn, Struppi, Sysrq, T. Schmidbauer, Taratonga, TheK,<br />

Thire, Thogo, Thomas Forster, Till.niermann, Tim Pritlove, Tinloaf, Tix.64, Tobi B., Tobias Bergemann, Tolentino, Tom-99, Trugbild, Ungebeten, Unscheinbar, Ute-s, V.R.S., Vanger, Verita,<br />

Vi<strong>de</strong>o2005, Viperb0y, Vjanoschka, Volatile, Vortex98347, Vulture, WAH, Walter Koch, Wanja, Warp, Webrian, Wee<strong>de</strong>, Wiki-observer, WikiCare, Wikieditoroftoday, Wolfgang1018,<br />

Wondigoma, XRay, YMS, YourEyesOnly, Zeno Gantner, Zollernalb, Zumbo, Λx.x, 522 anonyme Bearbeitungen<br />

Lua Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72353699 Bearbeiter: A350, Aditu, Aka, Angerfist92, Ardo Beltz, Armin P., Aule, Bdk, Beelzebubs Grandson, Bernard La<strong>de</strong>nthin,<br />

Bitsandbytes, Centic, ChrFranke, Ckue, Conspiration, Cvk, D, DL5MDA, Daf, Deorma, Edoe, Elya, Erik Streb, Gigammc, Gisteron, Gronau, Gulrak, HV, Harl, Hedwig in Washington,<br />

Hermannthomas, Horcrux7, Hubi, JRG, Knut, Kuli, Lars73, Larsgrefer, Liberatus, MrChaosCoffee, Nikai, Numbo3, PhilippWeissenbacher, Pindakaas, Polluks, Rbrausse, RolandIllig, Saibo,<br />

Schweikhardt, Skypher, Sprezzatura, Stargaming, Stefan506, StephanGrein, TShilo12, TeesJ, Teves, Trublu, Tsor, Umweltschützen, Wikpe<strong>de</strong>d, Yarin Kaul, 109 anonyme Bearbeitungen<br />

Objective- C Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72323892 Bearbeiter: Amin Negm-Awad, Ardo Beltz, Bernard La<strong>de</strong>nthin, Bhaak, Boecko, Centic, D, Dagobert Drache, Dawn,<br />

Flone, Fuzzile, Global667, Gronau, HRoestTypo, IOOI, Jobi, JoeDante, Jpp, Jtanzler, Karl-Henner, Kay.loehmann, Kiezkind, Kingruedi, Knorxx, Kockster, Lace, Lei<strong>de</strong>r, Lenny222, Lichtkind,<br />

Liebeskind, LukasHetzi, M2b, Magnus, Marc van Woerkom, Markus Fleck-Graffe, MarkusHagenlocher, Maximum, Mnh, Morszeck, Mpeylo, Nac Mac Feegle, Nasir, Nephelin, Netspy, Oefe,<br />

Philipp Sªsse, Pingi, Plasmagunman, Polluks, Ratopi, Rbb, Revolus, Revvar, Richardigel, RokerHRO, Sarkana, Schnargel, Sibarius, Stefan Hintz, Stefan.hintz, Succu, Texec, Tom9811, TomK32,<br />

Traroth, Trustable, TwoThe, Warp, WeißNix, Wiegels, 123 anonyme Bearbeitungen<br />

Pascal (<strong>Programmiersprache</strong>) Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=71926803 Bearbeiter: 130.60.153.xxx, AKFoerster, Ahellwig, Aka, Alexan<strong>de</strong>r.stohr, Andre Engels, Arbol01,<br />

Ath, Avatar, Avoi<strong>de</strong>d, Baba66, Ben-Zin, BerndGehrmann, Blaubahn, Cactus26, Carol.Christiansen, Charmion, Cjesch, Clusterfuck, Complex, Conversion script, Curtis Newton, Cyper, D,


Quelle(n) und Bearbeiter <strong>de</strong>s/<strong>de</strong>r Artikel(s) 195<br />

D0ktorz, Danny243, DerPaul, Diba, Doktor Datentod, Don Magnifico, Dp99, Dr.tux, Echoray, ErhardRainer, Fabian7351, Flo 1, Flothi, Fomafix, Freak 1.5, Gce, Georg Peter, Gms, Gnu1742,<br />

Gnushi, Gronau, Gurt, HaSee, He3nry, Hermannthomas, Herzschritt, Hubertl, Implementation, Irrgärtner, Jed, Jens Beckmann, Joho345, Jonelo, Jutta234, Jwdietrich2, Jörg Knappen,<br />

Karl-Henner, Karlscharbert, Kingruedi, Klxtctc, Knoerz, LKD, Lei<strong>de</strong>r, Leithian, Liberatus, Lofote, Lupenrein, Lupinoid, Lustiger seth, MAK, MGla, Magnus, Marcus Cyron, MarkusKnittig,<br />

Martin-vogel, Matthäus Wan<strong>de</strong>r, Mh, Miriel, Mps, Muck31, NaHSO4, Neg, Nephelin, Onee, P. Birken, PDCA, PDD, Paddy, Pelz, Peterlustig, Philipendula, PhilippWeissenbacher, Polluks,<br />

Ralf5000, Ri st, S.Didam, Saemikneu, Sargoth, Schaelss, Schreibvieh, Shiyaki, Siego, Sinn, Soebe, SonniWP2, Staro1, StefanRybo, Steffen, Steschke, T34, TheK, TheTruth90, Thomas Stauß,<br />

Thomas W. Mueller, Thüringer, Tim, Trustable, Umtrunk, Unscheinbar, Wael<strong>de</strong>r, Warp, Webkid, Wirthi, Wkrautter, Wuzel, Xilef, Xqt, Zebbo, gw.phinware.<strong>de</strong>, lodoss.inf.ethz.ch,<br />

p3EE045A9.dip.t-dialin.net, pD9009835.dip.t-dialin.net, 236 anonyme Bearbeitungen<br />

PEARL Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=53985695 Bearbeiter: Abdull, Ath, Avatar, ChristophDemmer, Crux, Gnu1742, Haeber, Hholzgra, J. 'mach' wust, JCS, Jed, Jutta234,<br />

Lantash, Lichtkind, M.Marangio, Melancholie, Nightwish62, Polarlys, Polluks, Raupach, Thornard, Tom md, Weissbier, YMS, 14 anonyme Bearbeitungen<br />

Perl (<strong>Programmiersprache</strong>) Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72254632 Bearbeiter: 217, 2Bios, 5gon12e<strong>de</strong>r, AF666, AFBorchert, AcE, Achim Raschka, Ahellwig,<br />

Ahnungsloser, Aka, Akermit, Akz, Alauda, Alexan<strong>de</strong>r.stohr, Alexh, Anschroewp, Apulix, Arbec, Aschmidt, Avatar, BLueFiSH.as, Ballapete, Beauty, Benni Bärmann, BerndB,<br />

BernhardSchmalhofer, Berni, Betterworld, Bhaak, Blaufisch, Brf, Brion VIBBER, Btr, Caky, Centic, Chrisfrenzel, ChristianErtl, ChristianHujer, ChristophDemmer, CommonsDelinker, Complex,<br />

Conversion script, Cspan64, D, D0ktorz, Daniel Mex, DarkDust, Das emm, Diba, Dnaber, Dohndorf, Dominik, Dralon, Edao, Ekuah, El Cazangero, Electrocat, Em<strong>de</strong>e, Endorphine, Erusx,<br />

Eserte12, Esky212, Etagenklo, Firebat, Florian, Fomafix, Fretchen1, Fw, Ge<strong>de</strong>on, GeeF, Gfis, Guandalug, Gubaer, Gunther, Gurt, Gurumaker, HAL Neuntausend, HHK, HaSee, Hadibe, Haeber,<br />

Head, Heinte, HenrikHolke, Hernani, Herr Th., Herzrein, Hubi, Hydro, Iblech, Iblue, Ilja Lorek, Itangast, Ixitixel, J. 'mach' wust, JPense, Jaellee, Jailbird, Jed, Jens Meißner, Jergen, Johannesl,<br />

Joli Tambour, Jonelo, Jumbo1435, Jutta234, Jörg Knappen, JøMa, Karl-Henner, Kasper4711, Kek00207, Kiker99, Konrad F., Krischan111, Kubieziel, Kuli, Kurt Jansson, Langec, Ldi91, Lehmi,<br />

Leipnizkeks, Leit, Leithian, Lichtkind, MFM, MGla, Ma-Lik, Magnus, Malteser, Marc van Woerkom, Marcus Schätzle, Markus.oehler, Martin-vogel, Matt1971, Matthäus Wan<strong>de</strong>r, MattiasS,<br />

Media lib, Melancholie, Merkel, Messi, Mezzofortist, Micha koller, MichaelFrey, Mijobe, Mnh, Moritz Lenz, Mosmas, Mps, MrTux, Mwka, Mx2000, Nalpdii, Nef, Nephelin, Neufra, Ninjamask,<br />

Nolispanmo, Ocrho, Ollinaie, PIGSgrame, Papiermond, Pasc2, PaterMcFly, Pddywnger, Peddn, Pelz, Perlentaucher, PhilippWeissenbacher, Phrood, Pinguin.tk, Polarlys, Polluks, Poupou<br />

l'quourouce, Priwo, Qualito, Quetzalcóatl, Ramiro, Raphael Frey, Raubsaurier, Reaper35, Reiskocher, Renekaemmerer, Ri st, Rl, RoBri, RobertLechner, RokerHRO, Roland2, Rupp.<strong>de</strong>,<br />

STEFFENW, Schaengel89, Schnargel, Schusch, Schweikhardt, Seewolf, Siúlóir, Slartidan, Sleske, Sohin, SoniC, Specht, Speck-Ma<strong>de</strong>, Stan 78, Staro1, Steevie, Stefan Kühn, Stefan Majewsky,<br />

Stefan h, StefanAndres, Sunks, Sven423, Svetho, Tashbarg, Tels, TheK, ThePeter, Theomega, Theoprakt, Thornard, Thüringer, Tim, Tinita, TobiasHerp, Trac3R, Trustable, Tschild, Tsor, Ttbya,<br />

Ttobsen, Tullius, Tönjes, UV, Uellue, Uncopy, Uwe Hermann, Vanger, Wahrerwattwurm, Wasserseele, Weisbrod, Wer8olf, Wgeorg, Wiegels, Wikiplex, Wiktator, Wondigoma, Wrongfilter,<br />

Wutzofant, XTaran, Xidimax, Xwolf, Zeno Gantner, Zu7, Zumbo, Zupftom, 502 anonyme Bearbeitungen<br />

PHP Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72408555 Bearbeiter: -jha-, 217, A.hafner, Abe Lincoln, Abubiju, Achim Raschka, Acrux, Aka, Akl, Akorczak, Alarm fuer die galaxis,<br />

Alexan<strong>de</strong>r Brock, Alti, Andreas von Oettingen, Apricum, Ar291, ArminRonacher, ArschMitOhren, Arty, Athalis, Augiasstallputzer, Aule, Avoi<strong>de</strong>d, Awacs, BG11A, BLueFiSH.as, Bachsau,<br />

Bahnemann, Barpfotenbaer, Bbestmann, Benefix, Benji, Bernard La<strong>de</strong>nthin, Bernd vdB, Bernd89, Biktora, Birnkammer fabian, Bitsandbytes, Björn Bornhöft, Blaufisch, Boonekamp, Breeze,<br />

Brian johnson, Burnz, C167, Caramdir, Chatfix, Chlämens, Chris828, Christian Müller, Christoph Pojer, Ckeen, Cken<strong>de</strong>l, Clemfix, Cocoun, Complex, Conversion script, Corvin Gröning, Cvk,<br />

Cybercraft, D, D0ktorz, Da ola, DaSourcerer, Dachris, DangerGround, DasBee, Deever, Delete, Dentastic, Der Wolf im Wald, Der.Traeumer, DerHexer, DerSchnüffler, DeusTron, Diba, Djotrim,<br />

Dnaber, Dodo von <strong>de</strong>n Bergen, Dominic Z., Dominik, Drf, Druffeler, Dundak, Dutch damager, Eichhornleib, Engeser, Engie, Entlinkt, Euphoriceyes, Eurolo, EvaK, Evilboy, FFSquall, Fafer,<br />

Fester franz, Filzstift, Finex, Fire, Fleshgrin<strong>de</strong>r, FloSch, Flotsam, Flups, Flurfunker, Fomafix, Frank C. Müller, FreelancerHamburg, Frie<strong>de</strong>ls-home.com, Fristu, Fritz Grimpen, Fritz Jörn, FritzG,<br />

Fstoertz, FutureCrash, Gauss, Gavin Mitchell, Generalpd, GeorgGerber, Gerald Zincke, Gilliamjf, Gronau, Gunk, Gurt, Gurumaker, H3ir, Haeber, Hannes Trink, Hannsest316, Har<strong>de</strong>nacke,<br />

HeWö, Head, Hello111, Hendrik Brummermann, Herr Th., Hinrich, Hmilch, Hoo man, Houbsi, Howwi, Hubi, Hummelblau.<strong>de</strong>, Hydro, Hypersmil, IGEL, ISkriD, Iblue, Igelball, Igrimm12,<br />

Impulz, Ingmar R., Inschanör, Int80h, Ipgehtnicht, J.Sauer, JAF, JLG, Jarling, Jed, Jens Kohl, Joli Tambour, Joliver, Jonathan Hornung, Josef Spin<strong>de</strong>lböck, Jowi, JuergenL, Jörg Kopp, Kai<br />

Wasserbäch, Kai-Hendrik, Karl-Henner, KeineAhnung1337, Kevin <strong>de</strong>rsum, Kevinin, Kh555, KingCrunch, Kintaro221, Klauseck, Klever, Kloeschen, Knoe<strong>de</strong>l, Kolossos, Krawi, Kubieziel,<br />

Kubrick, Kurt Jansson, Kurt seebauer, Kvn, LKD, Langec, Langnickel, Lares0, Lehmi, Leipnizkeks, Lew, Libro, Lichtkind, Lmh, Longamp, Louisharms2, Löschfix, MFM, MaKoLine, Madokan,<br />

Maelcum, Magnumman<strong>de</strong>l, Magnus, Malkusch, Mannerheim, Manni88, Marco Bockelbrink, Marian.sigler, MarkGGN, Marti95., Masterbrain, Matthäus Wan<strong>de</strong>r, Mattog, Meph666,<br />

MichaelDie<strong>de</strong>rich, Mijozi, Mikepowers, Misery, MlaWU, Mnh, MoLa, Mononoke, Morget, Morten Haan, MovGP0, Mpils, Mstolt, Mugros, Murph, Mwka, My name, Nasir, Neakro, Neil Hilist,<br />

Netspy, Neverything, Nick-less, Nikkis, Nolispanmo, Noobsrai, Norro, Nrieck, Numbo3, OecherAlemanne, Okuhl, Olei, Olemo, Ollinaie, Pascal Bajorat, Pascalhurni, PatriceNeff, Patrick Paas,<br />

Pberndt, PeeCee, Pelz, Perlentaucher, Peter200, Petkli, PhilippWeissenbacher, Phulab, Pkn, Pne, Polarlys, Progman, PsY.cHo, Qualle, Querverplänkler, Quirin, RBQ, Rainer Wasserfuhr, Raphael<br />

Haase, Raymond, Rbe, Reinhard Kraasch, Revvar, Rikumaster, Roerd, Rohieb, Roland Kaufmann, Roland2, Roterraecher, S1, S4V4Ge, Sansculotte, Sappy, Sargoth, Scared, Schnargel, Schoegy,<br />

Schubbay, Schwarzweiß, Seewolf, Semper, Senshi, Simon-Martin, Sinn, Sintonak.X, Skicu, Slomoman, Snapper007, Solid State, Southpark, Speifensen<strong>de</strong>r, Staro1, SteBo, Steef389, Stefan,<br />

Stefan Kühn, Stefan Majewsky, Stefan Schultz, Stefan506, Stefreak, Stephan Herz, Stern, Suit, Sunks, SvPe, Sven-steffen arndt, Sven423, Sys.Bak, Tajben<strong>de</strong>r, TheK, Theyak, Thomas.gutbier,<br />

Thüringer, Tian, Tilman Berger, Tilo Körner, Timohummel, Timtaler, TinoTischer, Tjö, To.ni, Tobi B., Tobi91, TobiasHerp, TobiasNYC, Tobiask, Togs, TomK32, Tomx992, Tony L.,<br />

Torsten.Stefan, Traroth, Trustable, Tsor, Tsukasa, Tönjes, Uellue, Unscheinbar, UrLunkwill, Ute Erb, Vanger, Ventrue, Wanzo, Warhog, Webmeischda, Werbeagentur-Schnüffel, Wiegels,<br />

WikiPimpi, Wilhans, WissensDürster, Wittkowsky, Woodworker, Wst, Wuzur, Wynk, XT3000, XTaran, YMS, Yarin Kaul, Yellowcard, YourEyesOnly, Zahnstein, Zaphiro, Zumbo,<br />

gw.phinware.<strong>de</strong>, 817 anonyme Bearbeitungen<br />

Profan (<strong>Programmiersprache</strong>) Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=53543621 Bearbeiter: A Ruprecht, Aka, Beck's, Bernard La<strong>de</strong>nthin, CF2, Cactus007, Complex, Ephraim33,<br />

Fomafix, Frabbing, Frank Murmann, Howwi, Hummelblau.<strong>de</strong>, IF, Jutta234, Kuhlo, Mhp1255, Nordwind64, Schnatzel, Sd5, Timosch, WortUmBruch, 45 anonyme Bearbeitungen<br />

PureBasic Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=71315485 Bearbeiter: An<strong>de</strong>sdaf, Antonsusi, Ardo Beltz, Benpicco, Blitzbat, Boemmels, Brodkey65, ChrisHamburg, Chrisfrenzel,<br />

D, DangerGround, DasBee, Dealerofsalvation, Echoray, Exil, Gardini, Guandalug, Hroudtwolf, Inkowik32, Karl Nickel, Koerpertraining, Kombble, Langec, MarcoBorn, Martin Aggel, Mh,<br />

Mikenolte, Mknjc, Mr. An<strong>de</strong>rson, Nonanet, PDD, Pelz, Pischdi, Polarwolf.eu, Robert Wünsche, RobertLechner, S.K., STBR, SimonSimCity, Sinn, Sovok, Spacecaptain, Traitor, Tschäfer,<br />

Tönjes, Wolle212, Xls, ZettaMe, 127 anonyme Bearbeitungen<br />

Python (<strong>Programmiersprache</strong>) Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72469978 Bearbeiter: 5gon12e<strong>de</strong>r, AF666, AWak3N, AZH, Aetas volat., Aka, Alexan<strong>de</strong>r.stohr, Alexian,<br />

AlfonsGeser, Amgon, Andreas aus Hamburg in Berlin, AndreasB, AndreasSchreiber, Ardo Beltz, ArminRonacher, Badger, Baloghandris, Ben-Zin, BercherP, Bernd vdB, Bitsandbytes, Blackbird,<br />

Blauebirke, Blinry, Boemmels, Bronger, C-logic, CIMMA, Callidior, Carlolf, Carſten, Cghost, ChrisHamburg, Chrislb, Christian2003, Chsterz, Ckahrs, Ckeen, Contributor, D, D0ktorz, Dapete,<br />

Das Gurke, DasBee, Der Messer, DerAnalyst, DerHexer, Dilettant, Dishayloo, DoBu, Doener1, DonKult, Dracman, Drbashir117, Dwi Secundus, E-Malte, Edoe, Eehmke, Elvis untot,<br />

Enth'ust'eac, ErikDunsing, Fbahr, Felanox, FelixP, Fire, FischX, Fkoch, Flindner, Flogger, Fomafix, Fragment, Frank78, FutureCrash, Ghisguth, Gnushi, Gronau, Gs93, Gurt, Haeber, Harald<br />

Tribune, He3nry, Head, Heinrich Puschmann, Heliozentrik, HenHei, Herr Th., Herrick, High-Fish, Homer Landskirty, Hubertl, Hubi, Hugels, Hydro, INM, ITMönch, Ich hab hunga, J. 'mach'<br />

wust, J.Ammon, JWN, Jaan, Jan Giesen, Janneman, Jens Lallensack, Jfieres, Johann.Uhrmann, Jorges, Jutta234, Kackwurst, Kai-Hendrik, Karl-Henner, Kheinisch, Kku, Klaeren, Klemens<br />

Winter, Kn0rke, Knorxx, Koelnerbinchen, Kopoltra, Krille, Kubieziel, Kurs 2010, Kurt Jansson, Kurt seebauer, Langec, Levin, Lichtkind, LoKiLeCh, LukasHetzi, Lukian, Löschfix, MGla, Marc<br />

van Woerkom, Marco Krohn, Marcus Schätzle, Markus.schulze, Martin-vogel, Mathias Schindler, Matthias Kupfer, Matzematik, Melancholie, Michael Meier, Michael Reschke, MichaelB.,<br />

Mig-O, Milanx, Mjoppien, Modn, Muck31, MusiKk, Musik-chris, Mvo, Mx2000, My name, Nachtigalle, Nankea, Napa, Nd, Nephelin, Nerd, Nikai, Nocta, Nolispanmo, Ocrho, Oefe, Ohno,<br />

Olliminatore, Pemu, Peter200, PhilippWeissenbacher, Phrontis, Phrood, Pilawa, Pjacobi, Pokernikus, Polarlys, Priwo, Prometheus89, Prowal, Pydo, Python-Clown, RabbitsDad,<br />

Radikal.reduziert, RalfZosel, Raphael Frey, Rat, Rbb, Red Rooster, RedMars, Retfah, Revvar, Robin Stocker, Roland2, Rs2411, S!ska, S1, SK-Genius, Sansculotte, Sbeyer, Schweikhardt,<br />

Semper, SilP, Simon04, Snert, Sol1, Sprezzatura, Sputnik, Stauba, Stefan Kühn, Stefan64, Steffen, Stern, Stw, Stylor, SuperFLoh, Svens Welt, Tafkas, Template namespace initialisation script,<br />

TheK, Theoprakt, Thornard, Thüringer, Tismer, TobiasHerp, Tom82, Trac3R, Trockenfisch, Trustable, Tsor, Tsukasa, Tullius, Umeier, Uncopy, Ungebeten, Vanger, Viruzz, WStephan,<br />

Weialawaga, Wesener, WiESi, Wiegels, Wikpe<strong>de</strong>d, Wiska Bodo, Wrongfilter, Wurstwolf, X2on, Xorx77, Xsteve, YMS, YourEyesOnly, Zagy, Zeno Gantner, Zorak1103, °, 330 anonyme<br />

Bearbeitungen<br />

REALbasic Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=70546254 Bearbeiter: AHZ, Achates, AndreasPrang, Christian Sakowski, Complex, CosmoJasra, Dauerbaustelle, Dickerchen,<br />

Fast.ch, Felix Krause, HaSee, Ignatius Segensreich, Istandil, JD, Jens Meißner, Jutta234, Marcel Zimmer, Marcgeldon, Memex, Mnh, Moeppel64, Morszeck, Mps, Overbenny, Polluks,<br />

RobertLechner, S.K., Steffen, Tönjes, Urizen, Www.capitalcorner.<strong>de</strong>, 22 anonyme Bearbeitungen<br />

Ruby (<strong>Programmiersprache</strong>) Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=70900089 Bearbeiter: *p-marc, --, Aka, Aldawalda, AndreasSchwarz, Athalis, BKSlink, BeatePaland,<br />

Ben-k86, Benjie Maus, Bhaak, Bierdimpfl, Blauebirke, Blinry, C3o, Cactus26, Chol, Chricho, ChristianBier, Cirr, D, D0ktorz, Daniel Bovensiepen, DanielSHaischt, Das emm, DerHexer, Dwi<br />

Secundus, Ecki, Erkan Yilmaz, FF-Wonko, Fandorin, Flappaport, Flogger, Flominator, Fomafix, Fristu, FutureCrash, Gissi, Gnu1742, Gurt, HALsixsixsix, HHK, Hador, Haize, Hcy, Head,<br />

Heilbron, Hurone, Hydro, IGEL, Ich hab hunga, JCS, Jed, Jens Meiert, Johnny Slogan, Josef 'Jupp' Schugt (aka 'Penpen'), Jpp, Karl-Henner, Kiker99, Klausb, Knub.nafets, Kubieziel, Kurmis,<br />

Lenny222, Levin, Lichtkind, Loupram, Martin Hampl, Media lib, Meph666, Messi, Mikue, Mr. An<strong>de</strong>rson, Muck31, Murphy the crow, Nachtigalle, Nephelin, Netzki, Nikai, Nockel12, Onee,<br />

Otih, Ozuma, PeeCee, Pendulin, Philipendula, Philipp Claßen, Pjacobi, QualiStattQuanti, Ralf5000, Revvar, Richardigel, Rt73, S.kapfer, SBraun, Sbeyer, Schaengel89, Sicherlich, Spazion,<br />

Sprezzatura, Stefan Kühn, Stefan h, StephanGrein, Stern, Teqsun81, TheK, Thinkdiv, Thüringer, Timcn, WiESi, Wiegels, Wikiwikigreif, Winfried Mueller, Wst, Xaphir, Xqt, Yamavu, Zeno<br />

Gantner, Zwoenitzer, 210 anonyme Bearbeitungen<br />

Smalltalk (<strong>Programmiersprache</strong>) Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=21003529 Bearbeiter: 3.141.186.195.dial.bluewin.ch, Abe Lincoln, Aka, AndreasB, Andrush, Archiv,<br />

Arved, BeeJay, Ben-Zin, Bierdimpfl, Blauebirke, Blinry, Boemmels, Brion VIBBER, ChristianErtl, Conversion script, D, DanielSHaischt, Don Magnifico, Drumknott, Duesentrieb, El capitan,


Quelle(n) und Bearbeiter <strong>de</strong>s/<strong>de</strong>r Artikel(s) 196<br />

Ephraim33, ErnstRohlicek, Fleminra, Flo 1, Flogger, Fomafix, Fristu, Georgheeg, Guandalug, HannesH, Head, Heinte, Hytrion, JRG, Jekub, Jpp, Jst brd, Kaktus, Kallistratos, Kdkeller, Knoerz,<br />

Kpjas, Kubieziel, Kuli, Kurt Jansson, LargoAreno, Liebeskind, Lukian, Magnus, Marcelglaeser, Matumio, Melkom, Memex, MibiMoon, Michael Balzer, Mkleine, Mtwoll, Nicky knows,<br />

Nikolaus, Nolispanmo, Paul Ebermann, Pingi, Pinguin.tk, Pit, Rbb, Richardigel, RoKo, RokerHRO, Rolf b, STBR, Sbeyer, Schaengel89, Softeis, Speedy DeLete, Spuk968, Stargaming, Stefan<br />

Kühn, Steffenjung, Stern, Stowasser, SuperFLoh, Terabyte, Tönjes, Uwe Gille, Vinci, Vulture, Walter, Walter Koch, Wilfried Elmenreich, Wst, Xflupp, Zeno Gantner, °, 160 anonyme<br />

Bearbeitungen<br />

Turbo Pascal Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=72465008 Bearbeiter: Avh, BLueFiSH.as, Ben-Zin, Burkhard L, Ce, Chrisfrenzel, Croco97, D, Daniel Seibert, DasBee, Don<br />

Magnifico, FGodard, Fakemailer, Flattervieh, Flups, FutureCrash, Gerold Broser, Get It, HAL Neuntausend, Haize, HartmutS, Henning Ihmels, Highbrow, Himuralibima, Hubertl, Hukukçu,<br />

Jaguarkid, Jed, Joschi71, Jpp, Kickof, King, Krawi, Laza, LoKiLeCh, Longamp, MarkusHagenlocher, Mps, Mvb, Nephelin, Nyxos, Olei, OttoK, PDD, Peterlustig, Phil1987, Phrontis, Pkn,<br />

Plaicy, RFranssen, Ralf5000, Re<strong>de</strong>emer, Rehro, Revolus, Septembermorgen, Sinn, Steffen, Thomas W. Mueller, Tors, Tritonus05, Tönjes, Ungebeten, Wzwz, Yokokokon, YourEyesOnly, Zeno<br />

Gantner, 113 anonyme Bearbeitungen<br />

Visual Basic Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=71554830 Bearbeiter: Ahellwig, Aka, BSDev, Baumfreund-FFM, Behalten, Bernard La<strong>de</strong>nthin, Björn Bornhöft, Blaubahn,<br />

Boonekamp, C.Wesner, Chaddy, Chesk, Chiccodoro, ChristianGlaeser, Coaster J, Complex, Cypressious, DasBee, Dewars82, Diba, Don Magnifico, DrSoong, Dundak, Engie, Ento, Etix,<br />

Eulenjäger, Euphoriceyes, Ferdinand f., Filzstift, Florian Sening, Fomafix, Fox21, Frank Murmann, Gerbil, Gol<strong>de</strong>ner Kater, Guenter47, Hans Genten, Hans Koberger, Heinzi.at, Hozro, Hubertl,<br />

INM, Ifm, Jackalope, Jan-Rainbow, Jens m0, Jergen, Joschi71, Jost Rie<strong>de</strong>l, Jpp, Koelnerbinchen, Konrad F., Krawi, Kww, LKD, Leithian, Lemzwerg, LonelyPixel, Ma-Lik, Mark553, Mnh, My<br />

name, Nddsf, Nixsager, Nolispanmo, OHM-9, Opethmaniac, Pc-world, PeeCee, Peter200, QualiStattQuanti, Regi51, Reptilologe, Rita2008, RomanLatosik, STBR, Seewolf, Stammtisch, Stefan<br />

Majewsky, Strecke, Streifengrasmaus, TableSitter, Thun<strong>de</strong>rBlaze, Tolentino, Trustable, Tönjes, Umweltschutz, WAH, Wms15, YMS, Zaphiro, Михајло Анђелковић, 171 anonyme<br />

Bearbeitungen<br />

Esoterische <strong>Programmiersprache</strong> Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=71801665 Bearbeiter: Achim Raschka, Aka, Arbol01, BKS-Ordner, Citizen, Crux, D, Das .:X, Dolos,<br />

Duesentrieb, Euku, Frakturfreund, FrankBuss, GDK, Gerhardvalentin, GodsBoss, Inschanör, Jonathan Hornung, Kubieziel, Lextard, Lichtkind, Lx, Maynard, Mnh, Mo4jolo, Nina, Nivram,<br />

Phrood, Rax, Reeno, Rs newhouse, Sascha.leib, ShiKai, Sir Anguilla, TheBug, Tsor, Tuxman, Tzzzpfff, Ulrich.fuchs, Wertzumteufl, WilhelmHH, Xqt, Zone42, 51 anonyme Bearbeitungen<br />

Brainfuck Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=71516876 Bearbeiter: Achim Raschka, Adokhugi, Alex42, Arbol01, Balaklava, Ben<strong>de</strong>r235, Bernhard-h, Björn Bornhöft,<br />

Capaci34, Choas, Christian2003, Citizen, Crux, DasBee, Dishayloo, Duesentrieb, Eike sauer, Elvis untot, Era<strong>de</strong>st, Euphoriceyes, EvaK, FelixN, Fgb, Fomafix, GNosis, Generalpd, Gerd<br />

Taddicken, HaSee, Harald Tribune, Homer Landskirty, Horas, IGEL, Igge, J budissin, Jacks grinsen<strong>de</strong> Rache, Jfwagener, Joerg s, Johannesbauer, Jpp, Karl-Henner, Kiker99, Koethnig, Kopoltra,<br />

LKD, Laza, Lichtkind, Lummer, Lx, Magnus, Maxliebscher, Mcreichelt, Mijobe, Miriel, Mkleine, Morsix, Nagasaki, Nikai, Norro, Oktae<strong>de</strong>r, PDD, Peter200, Philipendula, Phrood, Polarlys,<br />

PowPit, RAFPeterM, Rafl, Rdb, Reinhard Kraasch, Roger Zenner, RokerHRO, RolandIllig, RosarioVanTulpe, Schnulli00, Smeyen, Stefan Majewsky, Stefan64, Stefanp, Suchenwi, T.D.Rostock,<br />

Taisa, Tengai, TheBug, TheReincarnator, Thornard, Thyâlae, Timwi, Tischlampe, Tripwire, Tsor, Tuxman, Tzzzpfff, Unscheinbar, Uwe Gille, V.R.S., VanGore, Vi<strong>de</strong>o2005, Vigilius, Wee<strong>de</strong>,<br />

WiESi, WissensDürster, Wolle212, Wsombeck, Xororand, Zap, 百科全書, 137 anonyme Bearbeitungen<br />

Brainfuck2D Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?oldid=44212227 Bearbeiter: Achim Raschka, Adokhugi, Alex42, Arbol01, Balaklava, Ben<strong>de</strong>r235, Bernhard-h, Björn Bornhöft,<br />

Capaci34, Choas, Christian2003, Citizen, Crux, DasBee, Dishayloo, Duesentrieb, Eike sauer, Elvis untot, Era<strong>de</strong>st, Euphoriceyes, EvaK, FelixN, Fgb, Fomafix, GNosis, Generalpd, Gerd<br />

Taddicken, HaSee, Harald Tribune, Homer Landskirty, Horas, IGEL, Igge, J budissin, Jacks grinsen<strong>de</strong> Rache, Jfwagener, Joerg s, Johannesbauer, Jpp, Karl-Henner, Kiker99, Koethnig, Kopoltra,<br />

LKD, Laza, Lichtkind, Lummer, Lx, Magnus, Maxliebscher, Mcreichelt, Mijobe, Miriel, Mkleine, Morsix, Nagasaki, Nikai, Norro, Oktae<strong>de</strong>r, PDD, Peter200, Philipendula, Phrood, Polarlys,<br />

PowPit, RAFPeterM, Rafl, Rdb, Reinhard Kraasch, Roger Zenner, RokerHRO, RolandIllig, RosarioVanTulpe, Schnulli00, Smeyen, Stefan Majewsky, Stefan64, Stefanp, Suchenwi, T.D.Rostock,<br />

Taisa, Tengai, TheBug, TheReincarnator, Thornard, Thyâlae, Timwi, Tischlampe, Tripwire, Tsor, Tuxman, Tzzzpfff, Unscheinbar, Uwe Gille, V.R.S., VanGore, Vi<strong>de</strong>o2005, Vigilius, Wee<strong>de</strong>,<br />

WiESi, WissensDürster, Wolle212, Wsombeck, Xororand, Zap, 百科全書, 137 anonyme Bearbeitungen


Quelle(n), Lizenz(en) und Autor(en) <strong>de</strong>s Bil<strong>de</strong>s 197<br />

Quelle(n), Lizenz(en) und Autor(en) <strong>de</strong>s Bil<strong>de</strong>s<br />

Datei:Listing1.jpg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Listing1.jpg Lizenz: Public Domain Bearbeiter: Grandy02, Joho345, 1 anonyme Bearbeitungen<br />

Datei:Icon falscher Titel.svg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Icon_falscher_Titel.svg Lizenz: Public Domain Bearbeiter: User:Mad<strong>de</strong>n<br />

Bild:Fblogo.gif Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Fblogo.gif Lizenz: GNU Free Documentation License Bearbeiter: Allefant, Michael Reschke<br />

Image:FBI<strong>de</strong> 0.4.6.png Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:FBI<strong>de</strong>_0.4.6.png Lizenz: GNU General Public License Bearbeiter: Michael Reschke<br />

Datei:Piet Program Hello World(1).gif Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Piet_Program_Hello_World(1).gif Lizenz: Creative Commons Attribution-Sharealike 3.0<br />

Bearbeiter: User:Mosmas<br />

Datei:Java-Logo.svg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Java-Logo.svg Lizenz: unbekannt Bearbeiter: Afrank99, Jodo, 4 anonyme Bearbeitungen<br />

Bild:DIN-Logo.svg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:DIN-Logo.svg Lizenz: unbekannt Bearbeiter: unbekannt. Original uploa<strong>de</strong>r was Afrank99 at <strong>de</strong>.wikipedia. Later<br />

version(s) were uploa<strong>de</strong>d by Schnelliboy at <strong>de</strong>.wikipedia.<br />

Datei:Larry Wall YAPC 2007.jpg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Larry_Wall_YAPC_2007.jpg Lizenz: Creative Commons Attribution-Sharealike 2.0 Bearbeiter:<br />

Randal Schwartz from Portland, OR, USA<br />

Datei:JPL.jpg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:JPL.jpg Lizenz: GNU Free Documentation License Bearbeiter: Horst Frank, Lennert B, Ruslik0, 2 anonyme<br />

Bearbeitungen<br />

Datei:Cpan.jpg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Cpan.jpg Lizenz: unbekannt Bearbeiter: Chaddy, Ixitixel, Lichtkind<br />

Datei:Damian Conway.jpg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Damian_Conway.jpg Lizenz: Creative Commons Attribution 2.0 Bearbeiter: Edward, FlickreviewR, GeeJo,<br />

Nilfanion, Para, Schutz<br />

Datei:Tim O'Reilly 2005 Where 2.0 Conference1.jpg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Tim_O'Reilly_2005_Where_2.0_Conference1.jpg Lizenz: Creative Commons<br />

Attribution 2.0 Bearbeiter: Dodo, Edward, Guety<br />

Datei:TPF logo.png Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:TPF_logo.png Lizenz: unbekannt Bearbeiter: Ixitixel, Lichtkind<br />

Datei:randal l. schwartz.jpg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Randal_l._schwartz.jpg Lizenz: Creative Commons Attribution-Sharealike 1.0 Bearbeiter: Derrick Story<br />

Datei:Drei mongolische kamele.JPG Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Drei_mongolische_kamele.JPG Lizenz: Creative Commons Attribution-Sharealike 2.5<br />

Bearbeiter: User:He-ba-mue<br />

Datei:PHP-logo.svg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:PHP-logo.svg Lizenz: unbekannt Bearbeiter: Biktora<br />

Datei:PHP funktionsweise.svg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:PHP_funktionsweise.svg Lizenz: GNU Free Documentation License Bearbeiter: Benutzer:Cactus007,<br />

Benutzer:MovGP0<br />

Datei:Purebasic_logo.gif Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Purebasic_logo.gif Lizenz: unbekannt Bearbeiter: Karl Nickel<br />

Datei:Helloworld-pbx86.png Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Helloworld-pbx86.png Lizenz: unbekannt Bearbeiter: Kombble<br />

Datei:HalloWeltConsole.jpg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:HalloWeltConsole.jpg Lizenz: unbekannt Bearbeiter: Benutzer:Kombble<br />

Datei:Pb_i<strong>de</strong>.gif Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Pb_i<strong>de</strong>.gif Lizenz: unbekannt Bearbeiter: Karl Nickel<br />

Datei:Pb_v<strong>de</strong>.gif Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Pb_v<strong>de</strong>.gif Lizenz: unbekannt Bearbeiter: Karl Nickel<br />

Datei:Python_logo.svg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Python_logo.svg Lizenz: Tra<strong>de</strong>marked Bearbeiter: www.python.org<br />

Datei:Ruby logo.svg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Ruby_logo.svg Lizenz: Creative Commons Attribution-Sharealike 2.5 Bearbeiter: Yukihiro Matsumoto, Ruby<br />

Visual I<strong>de</strong>ntity Team<br />

Datei:Yukihiro Matsumoto.JPG Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Yukihiro_Matsumoto.JPG Lizenz: Public Domain Bearbeiter: Cep21<br />

Bild:Smalltalk-powered.gif Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Smalltalk-powered.gif Lizenz: unbekannt Bearbeiter: ChristianBier, DanielSHaischt, Zeno Gantner<br />

Datei:turbo1_0.gif Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Turbo1_0.gif Lizenz: unbekannt Bearbeiter: Breeze, Croco97, 1 anonyme Bearbeitungen<br />

Datei:Turbopascal 6.png Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Turbopascal_6.png Lizenz: unbekannt Bearbeiter: Benzen, Rehro<br />

Datei:Microsoft NET Logo.svg Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Microsoft_NET_Logo.svg Lizenz: unbekannt Bearbeiter: Frank Murmann<br />

Datei:Vbdos form.png Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Vbdos_form.png Lizenz: unbekannt Bearbeiter: Ferdinand f.<br />

Datei:VBDOS_IDE.PNG Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:VBDOS_IDE.PNG Lizenz: unbekannt Bearbeiter: Ferdinand f.<br />

Datei:Wiki.hlp.gif Quelle: http://<strong>de</strong>.wikipedia.org/w/in<strong>de</strong>x.php?title=Datei:Wiki.hlp.gif Lizenz: unbekannt Bearbeiter: Benutzer:Ferdinand f.


Lizenz 198<br />

Lizenz<br />

Wichtiger Hinweis zu <strong>de</strong>n Lizenzen<br />

Die nachfolgen<strong>de</strong>n Lizenzen bezieht sich auf <strong>de</strong>n Artikeltext. Im Artikel gezeigte Bil<strong>de</strong>r und Grafiken können unter einer an<strong>de</strong>ren Lizenz stehen sowie von Autoren erstellt wor<strong>de</strong>n sein, die nicht in <strong>de</strong>r Autorenliste<br />

erscheinen. Durch eine noch vorhan<strong>de</strong>ne technische Einschränkung wer<strong>de</strong>n die Lizenzinformationen für Bil<strong>de</strong>r und Grafiken daher nicht angezeigt. An <strong>de</strong>r Behebung dieser Einschränkung wird gearbeitet.<br />

Das PDF ist daher nur für <strong>de</strong>n privaten Gebrauch bestimmt. Eine Weiterverbreitung kann eine Urheberrechtsverletzung be<strong>de</strong>uten.<br />

Creative Commons Attribution-ShareAlike 3.0 Unported - Deed<br />

Diese "Commons Deed" ist lediglich eine vereinfachte Zusammenfassung <strong>de</strong>s rechtsverbindlichen Lizenzvertrages (http:/ / <strong>de</strong>. wikipedia. org/ wiki/ Wikipedia:Lizenzbestimmungen_Commons_Attribution-ShareAlike_3. 0_Unported)<br />

in allgemeinverständlicher Sprache.<br />

Sie dürfen:<br />

• das Werk bzw. <strong>de</strong>n Inhalt vervielfältigen, verbreiten und öffentlich zugänglich machen<br />

• Abwandlungen und Bearbeitungen <strong>de</strong>s Werkes bzw. Inhaltes anfertigen<br />

Zu <strong>de</strong>n folgen<strong>de</strong>n Bedingungen:<br />

• Namensnennung — Sie müssen <strong>de</strong>n Namen <strong>de</strong>s Autors/Rechteinhabers in <strong>de</strong>r von ihm festgelegten Weise nennen.<br />

• Weitergabe unter gleichen Bedingungen — Wenn Sie das lizenzierte Werk bzw. <strong>de</strong>n lizenzierten Inhalt bearbeiten, abwan<strong>de</strong>ln o<strong>de</strong>r in an<strong>de</strong>rer Weise erkennbar als Grundlage für eigenes Schaffen verwen<strong>de</strong>n, dürfen Sie die<br />

daraufhin neu entstan<strong>de</strong>nen Werke bzw. Inhalte nur unter Verwendung von Lizenzbedingungen weitergeben, die mit <strong>de</strong>nen dieses Lizenzvertrages i<strong>de</strong>ntisch, vergleichbar o<strong>de</strong>r kompatibel sind.<br />

Wobei gilt:<br />

• Verzichtserklärung — Je<strong>de</strong> <strong>de</strong>r vorgenannten Bedingungen kann aufgehoben wer<strong>de</strong>n, sofern Sie die ausdrückliche Einwilligung <strong>de</strong>s Rechteinhabers dazu erhalten.<br />

• Sonstige Rechte — Die Lizenz hat keinerlei Einfluss auf die folgen<strong>de</strong>n Rechte:<br />

• Die gesetzlichen Schranken <strong>de</strong>s Urheberrechts und sonstigen Befugnisse zur privaten Nutzung;<br />

• Das Urheberpersönlichkeitsrecht <strong>de</strong>s Rechteinhabers;<br />

• Rechte an<strong>de</strong>rer Personen, entwe<strong>de</strong>r am Lizenzgegenstand selber o<strong>de</strong>r bezüglich seiner Verwendung, zum Beispiel Persönlichkeitsrechte abgebil<strong>de</strong>ter Personen.<br />

• Hinweis — Im Falle einer Verbreitung müssen Sie an<strong>de</strong>ren alle Lizenzbedingungen mitteilen, die für dieses Werk gelten. Am einfachsten ist es, an entsprechen<strong>de</strong>r Stelle einen Link auf http:/ / creativecommons. org/ licenses/<br />

by-sa/ 3. 0/ <strong>de</strong>ed. <strong>de</strong> einzubin<strong>de</strong>n.<br />

Haftungsbeschränkung<br />

Die „Commons Deed“ ist kein Lizenzvertrag. Sie ist lediglich ein Referenztext, <strong>de</strong>r <strong>de</strong>n zugrun<strong>de</strong>liegen<strong>de</strong>n Lizenzvertrag übersichtlich und in allgemeinverständlicher Sprache aber auch stark vereinfacht wie<strong>de</strong>rgibt. Die Deed selbst<br />

entfaltet keine juristische Wirkung und erscheint im eigentlichen Lizenzvertrag nicht.<br />

GNU Free Documentation License<br />

Version 1.2, November 2002<br />

Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.<br />

51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA<br />

Everyone is permitted to copy and distribute verbatim copies<br />

of this license document, but changing it is not allowed.<br />

0. PREAMBLE<br />

The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it,<br />

either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being consi<strong>de</strong>red responsible for modifications ma<strong>de</strong> by others.<br />

This License is a kind of "copyleft", which means that <strong>de</strong>rivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license <strong>de</strong>signed for free<br />

software.<br />

We have <strong>de</strong>signed this License in or<strong>de</strong>r to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this<br />

License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or<br />

reference.<br />

1. APPLICABILITY AND DEFINITIONS<br />

This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright hol<strong>de</strong>r saying it can be distributed un<strong>de</strong>r the terms of this License. Such a notice grants a world-wi<strong>de</strong>, royalty-free<br />

license, unlimited in duration, to use that work un<strong>de</strong>r the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license<br />

if you copy, modify or distribute the work in a way requiring permission un<strong>de</strong>r copyright law.<br />

A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.<br />

A "Secondary Section" is a named appendix or a front-matter section of the Document that <strong>de</strong>als exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters)<br />

and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of<br />

historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.<br />

The "Invariant Sections" are certain Secondary Sections whose titles are <strong>de</strong>signated, as being those of Invariant Sections, in the notice that says that the Document is released un<strong>de</strong>r this License. If a section does not fit the above<br />

<strong>de</strong>finition of Secondary then it is not allowed to be <strong>de</strong>signated as Invariant. The Document may contain zero Invariant Sections. If the Document does not i<strong>de</strong>ntify any Invariant Sections then there are none.<br />

The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released un<strong>de</strong>r this License. A Front-Cover Text may be at most 5 words, and a<br />

Back-Cover Text may be at most 25 words.<br />

A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors<br />

or (for images composed of pixels) generic paint programs or (for drawings) some wi<strong>de</strong>ly available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to<br />

text formatters. A copy ma<strong>de</strong> in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by rea<strong>de</strong>rs is not Transparent. An image format is not<br />

Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque".<br />

Examples of suitable formats for Transparent copies inclu<strong>de</strong> plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML,<br />

PostScript or PDF <strong>de</strong>signed for human modification. Examples of transparent image formats inclu<strong>de</strong> PNG, XCF and JPG. Opaque formats inclu<strong>de</strong> proprietary formats that can be read and edited only by proprietary word processors,<br />

SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.<br />

The "Title Page" means, for a printed book, the title page itself, plus such following pages as are nee<strong>de</strong>d to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title<br />

page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.<br />

A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section<br />

name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according<br />

to this <strong>de</strong>finition.<br />

The Document may inclu<strong>de</strong> Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are consi<strong>de</strong>red to be inclu<strong>de</strong>d by reference in this License, but only as regards<br />

disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.<br />

2. VERBATIM COPYING<br />

You may copy and distribute the Document in any medium, either commercially or noncommercially, provi<strong>de</strong>d that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced<br />

in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may<br />

accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.<br />

You may also lend copies, un<strong>de</strong>r the same conditions stated above, and you may publicly display copies.<br />

3. COPYING IN QUANTITY<br />

If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that<br />

carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly i<strong>de</strong>ntify you as the publisher of these copies. The front cover<br />

must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document<br />

and satisfy these conditions, can be treated as verbatim copying in other respects.<br />

If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.<br />

If you publish or distribute Opaque copies of the Document numbering more than 100, you must either inclu<strong>de</strong> a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a<br />

computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of ad<strong>de</strong>d material. If you use the latter<br />

option, you must take reasonably pru<strong>de</strong>nt steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time<br />

you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.<br />

It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provi<strong>de</strong> you with an updated version of the Document.<br />

4. MODIFICATIONS<br />

You may copy and distribute a Modified Version of the Document un<strong>de</strong>r the conditions of sections 2 and 3 above, provi<strong>de</strong>d that you release the Modified Version un<strong>de</strong>r precisely this License, with the Modified Version filling the role<br />

of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:<br />

• A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use<br />

the same title as a previous version if the original publisher of that version gives permission.<br />

• B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal<br />

authors, if it has fewer than five), unless they release you from this requirement.<br />

• C. State on the Title page the name of the publisher of the Modified Version, as the publisher.<br />

• D. Preserve all the copyright notices of the Document.<br />

• E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.<br />

• F. Inclu<strong>de</strong>, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version un<strong>de</strong>r the terms of this License, in the form shown in the Ad<strong>de</strong>ndum below.<br />

• G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.<br />

• H. Inclu<strong>de</strong> an unaltered copy of this License.<br />

• I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled<br />

"History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item <strong>de</strong>scribing the Modified Version as stated in the previous sentence.<br />

• J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These<br />

may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.<br />

• K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or <strong>de</strong>dications given<br />

therein.<br />

• L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not consi<strong>de</strong>red part of the section titles.<br />

• M. Delete any section Entitled "Endorsements". Such a section may not be inclu<strong>de</strong>d in the Modified Version.<br />

• N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section.<br />

• O. Preserve any Warranty Disclaimers.<br />

If the Modified Version inclu<strong>de</strong>s new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option <strong>de</strong>signate some or all of these sections as<br />

invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.<br />

You may add a section Entitled "Endorsements", provi<strong>de</strong>d it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization<br />

as the authoritative <strong>de</strong>finition of a standard.<br />

You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of<br />

Back-Cover Text may be ad<strong>de</strong>d by (or through arrangements ma<strong>de</strong> by) any one entity. If the Document already inclu<strong>de</strong>s a cover text for the same cover, previously ad<strong>de</strong>d by you or by arrangement ma<strong>de</strong> by the same entity you are<br />

acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that ad<strong>de</strong>d the old one.<br />

The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.<br />

5. COMBINING DOCUMENTS<br />

You may combine the Document with other documents released un<strong>de</strong>r this License, un<strong>de</strong>r the terms <strong>de</strong>fined in section 4 above for modified versions, provi<strong>de</strong>d that you inclu<strong>de</strong> in the combination all of the Invariant Sections of all of<br />

the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.<br />

The combined work need only contain one copy of this License, and multiple i<strong>de</strong>ntical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the<br />

title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of<br />

Invariant Sections in the license notice of the combined work.


Lizenz 199<br />

In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled<br />

"Dedications". You must <strong>de</strong>lete all sections Entitled "Endorsements".<br />

6. COLLECTIONS OF DOCUMENTS<br />

You may make a collection consisting of the Document and other documents released un<strong>de</strong>r this License, and replace the individual copies of this License in the various documents with a single copy that is inclu<strong>de</strong>d in the collection,<br />

provi<strong>de</strong>d that you follow the rules of this License for verbatim copying of each of the documents in all other respects.<br />

You may extract a single document from such a collection, and distribute it individually un<strong>de</strong>r this License, provi<strong>de</strong>d you insert a copy of this License into the extracted document, and follow this License in all other respects regarding<br />

verbatim copying of that document.<br />

7. AGGREGATION WITH INDEPENDENT WORKS<br />

A compilation of the Document or its <strong>de</strong>rivatives with other separate and in<strong>de</strong>pen<strong>de</strong>nt documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation<br />

is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is inclu<strong>de</strong>d in an aggregate, this License does not apply to the other works in the aggregate which are not<br />

themselves <strong>de</strong>rivative works of the Document.<br />

If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the<br />

Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.<br />

8. TRANSLATION<br />

Translation is consi<strong>de</strong>red a kind of modification, so you may distribute translations of the Document un<strong>de</strong>r the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright hol<strong>de</strong>rs,<br />

but you may inclu<strong>de</strong> translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may inclu<strong>de</strong> a translation of this License, and all the license notices in the Document, and any<br />

Warranty Disclaimers, provi<strong>de</strong>d that you also inclu<strong>de</strong> the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of<br />

this License or a notice or disclaimer, the original version will prevail.<br />

If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.<br />

9. TERMINATION<br />

You may not copy, modify, sublicense, or distribute the Document except as expressly provi<strong>de</strong>d for un<strong>de</strong>r this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate<br />

your rights un<strong>de</strong>r this License. However, parties who have received copies, or rights, from you un<strong>de</strong>r this License will not have their licenses terminated so long as such parties remain in full compliance.<br />

10. FUTURE REVISIONS OF THIS LICENSE<br />

The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in <strong>de</strong>tail to address new<br />

problems or concerns. See http:/ / www. gnu. org/ copyleft/ .<br />

Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and<br />

conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version<br />

ever published (not as a draft) by the Free Software Foundation.<br />

ADDENDUM: How to use this License for your documents<br />

To use this License in a document you have written, inclu<strong>de</strong> a copy of the License in the document and put the following copyright and license notices just after the title page:<br />

Copyright (c) YEAR YOUR NAME.<br />

Permission is granted to copy, distribute and/or modify this document<br />

un<strong>de</strong>r the terms of the GNU Free Documentation License, Version 1.2<br />

or any later version published by the Free Software Foundation;<br />

with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.<br />

A copy of the license is inclu<strong>de</strong>d in the section entitled<br />

"GNU Free Documentation License".<br />

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this:<br />

with the Invariant Sections being LIST THEIR TITLES, with the<br />

Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.<br />

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.<br />

If your document contains nontrivial examples of program co<strong>de</strong>, we recommend releasing these examples in parallel un<strong>de</strong>r your choice of free software license, such as the GNU General Public License, to permit their use in free<br />

software.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!