Kapitel 1: Einleitung / 1.1 Was ist eine Programmiersprache? / 1.1.1 Hallo Welt

Es gibt ziemlich viele Programmiersprachen. Beim Aufzählen einiger bekannter Vertreter beginnt man wohl mit Assembler (der „Maschinensprache“), Basic (das kennen die älteren Semester unter Ihnen vielleicht noch aus C-64 Tagen), dann vielleicht C, C++ und Objective-C, die lange Zeit von Apple verwendete Sprache, zudem Java (beliebt bei Serverprogrammierern), .NET (sprich: „dot net“, die Basis der aktuellen Sprachenfamilie unter Windows) und nun also Swift.

Eine Programmiersprache vermittelt zwischen dem Menschen, dem Programmierer, und dem Computer, der Maschine. Der Maschine würde eine Folge von Nullen und Einsen genügen um zu verstehen, was sie machen soll. Und dem Menschen wäre es am liebsten, einem Computer in natürlicher Sprache seine Anweisungen zu geben. Dabei tut sich eine ziemliche Kluft auf:

Nicht nur, dass der Mensch sich nicht für jeden kleinsten Maschinenschritt eine Aufeinanderfolge von 0 und 1 merken kann, die natürliche menschliche Sprache ist außerdem auch noch viel zu unpräzise, als dass eine Maschine ihr Folge leisten könnte. Wenn ein Mensch sagt, etwas stimme immer, meint er oft: Es stimmt praktisch immer, also in 99,5% aller Fälle. Die Maschine kann mit einem so gemeinten „immer“ nichts anfangen. „Immer“ ist für die Maschine genau 100%. Nur 99,5% sind für die Maschine genau 99,5%. Die Kluft ist also auch eine der Sprachpräzision.

Und hier setzen Programmiersprachen an. Sie kommen dem Menschen entgegen, indem sie ihm die Nullen und Einsen ersparen und durch Befehle und Texte ersetzen, die dem menschlichen Denken eher entsprechen. Und sie kommen der Maschine entgegen, indem sie den Menschen mit sanftem Druck von der Notwendigkeit sprachlicher Präzision überzeugen. Drückt der Mensch sich
nicht präzise genug aus, erscheint eine Fehlermeldung.

SprachentwicklungDie hier dargestellte  Abfolge von Assembler nach Swift ist in ihrer Auswahl natürlich willkürlich, wenn auch historisch in etwa stimmig. An kommt es mir aber auf die Maschinennähe.

Assembler ist von all diesen Sprachen der Maschine am nächsten: „Ganz dicht dran am Blech.“ Der Prozessor im Computer – heute wie in den 70er Jahren – kennt Befehlsfolgen aus, wie gesagt, den Zuständen 0 oder 1, an oder aus, Strom oder nicht Strom. Grob gesprochen „denkt“ der Prozessor so:

Schritt 1: Schreibe die Zahl 97 in das Register A.
Schritt 2: Schreibe die Zahl 1 in das Register B.
Schritt 3: Addiere die Zahlen in Register A und B und schreibe das Ergebnis nach Register A.

Schritt 1 z.B. schreibt sich in Maschinensprache, der Prozessorsprache, so: 10110000 01100001. Hierbei kann man die ersten acht Ziffern und die zweiten acht Ziffern als je eine Zahl aus dem Binärsystem verstehen, einem Zahlensystem mit zwei Ziffern, 0 und 1. Im Dezimalsystem (dem für uns alltäglichen System aus den zehn Ziffer 0 bis 9) lautet Schritt 1 so: 176 97. Und im Hexadezimalsystem, einem von Programmierern gern verwendeten Zahlensystem mit den 16 Ziffern 0 bis F, lautet er so: B0 61.

In der Programmiersprache Assembler lautet Schritt 1 so:

mov a, 61

Hierbei entspricht mov a dem B0 und 61, naja, eben 61. Jede Zahl aus dem Maschinencode entspricht einem Kürzel (Mnemonic) in Assembler. Besser lesbar für den Menschen: „Bewege (move) nach a die 61 (Hexadezimal)“, aber letztlich entsprechen die Mnemonics fast 1:1 der Maschinensprache – so sehr sogar, dass viele Programmierer Assembler „Maschinensprache“ nennen.

Lochkarte zur Speicherung von Maschinencode
Lochkarte zur Speicherung von Maschinencode

Um eine neue Programmiersprache oder eine neue Programmierumgebung zu begrüßen, schreiben Entwickler gerne ein „Hallo Welt“, ein kurzes Programm, das nichts weiter tut, als eben diese beiden Wörter auf dem Bildschirm darzustellen (oder was sonst für ein Ausgabegerät zur Verfügung steht: Auf einem Drucker meinetwegen oder einer Braillezeile).
Ein „Hallo Welt“ in Assembler sieht in etwa folgendermaßen aus:

; Hallo Welt auf dem Amiga
move.l  4.w,a6
lea     dosn(pc),a1
jsr     -408(a6)        ; OldOpenLibrary

move.l  d0,a6
lea     s(pc),a0
move.l  a0,d1
jsr     -948(a6)        ; PutStr

move.l  a6,a1
move.l  4.w,a6
jsr     -414(a6)        ; CloseLibrary
moveq   #0,d0
rts
dosn:   dc.b    "dos.library",0
s:      dc.b    "Hallo Welt!",10,0

Hierbei handelt es sich um Assemblercode, wie er auf dem Amiga Heimcomputer verwendet wurde. Alles wirkt zwar verstehbar, vielleicht interessant, aber doch kryptisch. Bemerkenswert sind hierbei zwei Dinge:

Zum einen handelt es sich bereits um eine modernere Form von Assembler, hinter den Semikolon sind Kommentare hinterlegt und die letzten beiden Zeilen zeigen, dass diese Form von Assembler sogar schon mit Zeichenketten umgehen kann. Man ist vom Blech also schon einen weiteren Schritt weg.

Zum anderen werden bereits hier Bibliotheken (Libraries) verwendet, man könnte auch sagen, es wird eine API verwendet, eine Programmierschnittstelle (Application Programming Interface): Da die Darstellung von Zeichen auf dem Bildschirm erstens recht kompliziert in Assemblercode zu schreiben ist und zweitens sehr oft benötigt wird, wird ein Codeblock (hier: PutStr, put String, gib eine Zeichenkette auf dem Bildschirm aus) zur Wiederverwendung so ausgegliedert, dass er an beliebiger Stelle aufgerufen werden kann.

Im Vergleich hierzu ist Java Quelltext viel kürzer:

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hallo Welt!");
  }
}

Java hintersteht in Vergleich zu Assembler ein anderes und weit moderneres Konzept: Es gibt Klassen (die erste und die fünfte Codezeile umklammern die Klasse HelloWorld), darin Methoden (die Zeilen zwei und vier umklammern die Methode main) und wiederum darin einen Methodenaufruf: Die Klasse System enthält das Objekt out und dies hat die Methode println, der der Parameter „Hallo Welt!“ als String, als Zeichenkette übergeben wird.

Dies System aus Klassen, Objekten und Methoden heißt Objektorientiertheit. Objektorientierte Programmierung ist eines der wesentlichen Elemente moderner Programmierung und damit auch der Swift-Programmierung. Entsprechend ist dem ein ganzes, noch folgendes Kapitel gewidmet.

Wollte ich den anderen Sprachen gegenüber gehässig sein, würde ich jetzt schreiben, das Hallo Welt von Swift lautet folgendermaßen:

println("Hallo Welt!")

Das wäre aber ungerecht. Denn wie gesagt, auch Swift ist objektorientiert und benötigt Klassen, um ausführbaren Code zu erzeugen, so dass auch diese Swift-Zeile genauso in eine Klassen und Methodendeklaration eingehüllt werden muss wie der Java Code (natürlich in der Swift Variante davon).

Aber um des Effekts Willen lass ich das Swift Hallo Welt einfach mal so stehen. Und so ganz falsch ist es auch nicht, wie wir noch sehen werden, dass man in einigen Fällen mit nur einer Zeile Code auskommt.

Kapitel 1.1.1: Hallo Welt

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.