Einführung in die Programmierung (Kapitel 1, 2, 3)

Generationen von Programmiersprachen; Was benötige ich zum Programmieren?

Autor: Ing. Andreas Hammer, MSc (WU)

Dieses Dokument, das Design der Seite sowie die darin enthaltenen Quellcodes sind urheberrechtlich geschützt.
Der private Gebrauch ist kostenlos möglich.
Eine kommerzielle Nutzung sowie die Verwendung an Schulen, anderen Ausbildungsstätten (im weitesten Sinne) sowie zur betrieblichen Aus- und Weiterbildung erfordern die Zustimmung des Autors.
Kontaktieren Sie mich in diesem Fall bitte per E-Mail ().

Es ist NICHT gestattet, dieses Dokument weiterzuverbreiten!
Es ist dabei egal, welches Medium verwendet wird. Es ist somit auch NICHT zulässig, dieses Dokument im Internet zu verbreiten. Darunter fällt auch das Spiegeln (mirroring) auf anderen Servern. Setzen Sie bitte stattdessen einen Link, gerne auch auf eine einzelne Seite bzw. Absatz. Sie dürfen selbstverständlich aus diesem Dokument - im Rahmen eines üblichen Zitats - zitieren (bitte Quelle angeben).

Im Folgenden wird zur Vereinfachung und leichteren Lesbarkeit nur die männliche Form verwendet. Es sind damit natürlich beide Geschlechter gemeint. Für die Richtigkeit, Vollständigkeit und Aktualität der vermittelten Inhalte wird keine Haftung übernommen! Die Benutzung erfolgt somit auf eigene Gefahr!
Für Feedback, Hinweise auf Irrtümer und Fehler bin ich dankbar (Feedback).

Letzte Aktualisierung: 16. Mai 2009
Dieses Dokument wurde im Juli 2008 komplett überarbeitet und größtenteils neu geschrieben.

1.1. Einleitung

Bevor man sich mit einer neuen Thematik beschäftigt, muss man - wie Sie sicherlich schon des öfteren gemerkt haben - zunächst einmal einige grundsätzliche Dinge zu dem jeweiligen Thema wissen. Genau so und kein bisschen anders ist es in der Programmierung. Auf dieser Seite werden die Dinge erklärt, die Sie wissen sollten, bevor sie mit dem Programmieren beginnen.

Dieses Dokument richtet sich an alle jene, die noch nie programmiert haben, sich einen Überblick über verschiedene Programmiersprachen verschaffen wollen oder ihre Kenntnisse in bestimmten Bereichen (z.B. Zahlensysteme: Binär-, Hexadezimal-, Oktalsystem) auffrischen möchten.

Wenn Sie bereits Programmiererfahrung gesammelt haben, mit einer Entwicklungsumgebung bzw. Editor und Compiler/Interpreter umgehen können, können Sie bedenkenlos diese Einführung überspringen und direkt zum jeweiligen Tutorial wechseln (siehe Navigationsmenü links).

1.2. Was bedeutet der Begriff "Programmieren"?

In unserem Fall heißt Programmieren nicht mehr, als Programme zu schreiben. Im alltäglichen Sprachgebrauch verwendet man das Wort "Programmieren" oftmals in anderem Bezug, denn nicht gerade wenige Leute behaupten, sie würden ihren Videorekorder (bzw. DVD-Recorder, bald vielleicht öfter ein Blu-ray-Recorder) "programmieren", obwohl damit lediglich gemeint ist, dass diese Personen dem Videorekorder/DVD-Recorder Anweisungen geben, wann er welchen Film aufzunehmen hat. Und genau hier sind wir an dem Punkt angelangt, an dem deutlich wird, was der Begriff "Programmieren" eigentlich bedeutet. Programmieren heißt nichts anderes, als Anweisungen (Befehle) erteilen. Wenn Sie etwas programmieren, "sagen" Sie dem Computer, Ihrem technischen Gegenüber, was er tun soll. Und wenn Sie nichts falsch gemacht haben, macht der Computer auch genau das was Sie wollen.

Ich verwende den Begriff "Programmieren" im Sinne von "Erstellen eines Programmes, einer Software". Man unterscheidet im Softwareentwicklungszyklus verschiedene Phasen. In einer näheren Eingrenzung (im engeren Sinn) kann man als Programmierung auch nur die Umsetzung (= Implementierung) des zuvor erstellten Konzepts in Quellcode (dieser besteht aus Anweisungen in einer Programmiersprache) verstehen.

1.3. Generationen von Programmiersprachen

An dieser Stelle angelangt, werden Sie sicherlich nach dem Wie? fragen. Wie kann ich meinem Computer Befehle erteilen - oder besser: Wie programmiere ich?

Um Ihnen zu zeigen, wie leicht es der "moderne" Programmierer hat, werde ich einen kurzen Rückblick in die "Urzeit" des Computers wagen. Um Ihnen keine falsche Zeitvorstellung zu geben, mit der Urzeit meint man ungefähr die Mitte des zwanzigsten Jahrhunderts. Strom kann bekanntlich nur fließen oder nicht fließen. Dies kann man mit zwei Zuständen darstellen: logisch 1 (Eins; Strom fließt) und logisch 0 (Null; Strom fließt nicht). Aus der Mathematik dürfte Ihnen dafür der Begriff Binärsystem (auch: Dualsystem) bekannt sein. Es ist ein Zahlensystem, das zur Darstellung von Zahlen nur zwei verschiedene Ziffern verwendet.

Abschrecken lassen sollten Sie sich davon auf keinen Fall, sollten Sie zu den "Mathematik-Muffeln" gehören. Sie können auch ohne mathematisches Interesse und ausgeprägte Mathematik-Kenntnisse programmieren. Ein zweites Google werden Sie dann allerdings nicht erfinden. ;-)
Die Grenzen liegen m.E. nach dort, wo es um die Neuentwicklung/-erfindung von Algorithmen geht. Ein Algorithmus ist eine "genau definierte Handlungsvorschrift zur Lösung eines Problems oder einer bestimmten Art von Problemen in endlich vielen Schritten" (Wikipedia). Ein Beispiel: Sie komprimieren (oder verschlüsseln oder was auch immer) eine Datei. Die Software geht dabei immer nach einem festgelegen Plan, dem gleichen Prinzip vor. Der Algorithmus sagt, wie's geht, ein Kochrezept quasi. Er legt die Schritte fest, die durchzuführen sind. Das Problem Komprimierung Ihrer Datei wird in endlich vielen Schritten gelöst. Am Ende steht ein Ergebnis, sonst würde die Software immer noch arbeiten.

Um wieder zum Thema zurückzukommen. Es dürfte niemanden wundern, zu erfahren, dass man dem Computer in binärer Weise mitteilen muss, was er zu tun hat. Z.B. 01100101 01111000 10101010 10101111 - sehr sinnloses Beispiel. Tatsächlich benötigt jeder Prozessor seine Befehle und Daten in Maschinensprache. Dabei ist jeder Prozessor anders. Die Befehle in Zahlenform bezeichnet man als Opcode (= operation code), alle zusammen ergeben den Befehlssatz. Klingt relativ kompliziert, ist es auch. Glücklicherweise hat man bald versucht, sich die Arbeit zu erleichtern und begann damit, Assemblersprachen zu entwickeln. Assemblersprachen vereinfachen die Sache schon einmal erheblich. Sie führen sogenannte Mnemonics (Mnemo-Codes) ein, d.h. dem Opcode wird ein Name zugeordnet. Aus einer "sinnlosen" Zahlenfolge wird dann etwa ADD (führt eine Addition durch). Das macht es leichter erlernbar, verständlicher und besser merkbar. Dennoch spricht man immer noch von einer niederen Programmiersprache.

Statt in Maschinensprache schreiben Sie nun Ihre Anweisungen in Assembler. Vorausgesetzt, es ist ein Assembler für den Prozessor, den Sie verwenden möchten, verfügbar. Nochmal: Jeder Prozessor ist anders. Denken Sie etwa an die Steuerelektronik in der Industrie, in der Automobilbranche, in Elektrogeräten und vielem mehr. Um bei Assembler zu bleiben: Der Assembler (man bezeichnet nicht nur die Sprache, sondern auch die Software, das Programm als Assembler!) übersetzt den Assembler-Code - welcher in Textform vorliegt - in Maschinensprache. Soll das Programm auch unter einem bestimmten Betriebssystem wie z.B. unter DOS ausführbar sein, muss dieses vom sog. Linker (von engl. to link = verbinden) zu einer ausführbaren Datei (.exe- bzw. .com-Datei unter DOS; .exe unter Windows) gelinkt werden.

Kurz zusammengefasst: Assembler wird zur maschinennahen Programmierung verwendet. Wo es notwendig ist, direkt mit der Hardware zu kommunizieren, bietet sich Assembler an.

Assembler ist auf Tutorials.at kein Thema, wir beschäftigen uns ausschließlich mit den sog. Hochsprachen (bzw. Höheren Programmiersprachen). Anweisungen werden ähnlich wie in Assembler in Textform vorgelegt. Textform bedeutet, dass einzelne Anweisungen in einer Textdatei stehen, die der (ein) Programmierer zuvor geschrieben hat. Damit der Computer etwas mit den Anweisungen anfangen kann, muss ein Programm her, das den Text so "aufbereitet", dass der Computer ihn verstehen kann. Ein solches Programm nennt man Compiler (von engl. to compile = übersetzen). Ein Compiler ist also ein Übersetzer. Ein Compiler übersetzt Ihren Quellcode in Maschinencode. Ausnahme: Es ist auch eine übersetzung in "Zwischencode" (z.B. Bytecode in Java) möglich. Da Ihr Betriebssystem mit dem Maschinencode (Binärcode) nichts anfangen kann, muss auch hier ein Linker her, der den Code in eine ausführbare Form verwandelt (.exe-Dateien unter Windows, Binärdateien unter Linux/UNIX).

Mit dem Compiler verwandt ist der sog. Interpreter. Mit dem Unterschied: Er übersetzt den Code nicht, sondern führt ihn direkt aus. Interpretierte Sprachen (z.B. server- und clientseitige Skriptsprachen wie PHP und JavaScript) haben in den letzten Jahren an Bedeutung zugenommen. Näheres dazu erfahren Sie in Kapitel 2.

Generationen der Programmiersprachen:

  1. Maschinensprachen: Binärcode muss geschrieben werden.
  2. Assemblersprachen: Assemblerbefehle werden geschrieben und ein Assembler wandelt diese in Binärcode um.
  3. Höhere Programmiersprachen (Hochsprachen): Anweisungen werden in für Menschen leicht verständlicher und lesbarer Form gegeben.
  4. Makrosprachen und Skriptsprachen: Makrosprachen wurden dazu entwickelt, um Programme steuern zu können. Z.B. können Sie mit VBA (= Visual Basic for Applications) Microsoft Office an Ihre Wünsche anpassen; mit Ihrem Skript steuern Sie MS Office; "Große" Programme beinhalten häufig eigene Makrosprachen; andere Beispiele sind etwa OpenOffice und viele Grafikprogramme wie GIMP. In einem Bildbearbeitungs-/Grafikprogramm wie GIMP könnte ein von Ihnen geschriebenes Makro etwa ein Bild auf eine bestimmte Art und Weise (Algorithmus!) verändern bzw. bearbeiten, die dazu nötigen Befehle liefert GIMP mit.
  5. KI-Sprachen: KI = künstliche Intelligenz; diese Sprachen wurden dazu entwickelt, um Programme schreiben zu können, die menschliches Denken nachahmen; solche Programme sollen beispielsweise genauso handeln und denken können wie es Menschen tun.

Insbesondere Skriptsprachen spielen eine immer größere Rolle. Das gilt ganz besonders - aber nicht ausschließlich - für Webanwendungen ("Web 2.0"), in denen Interaktivität eine besondere Bedeutung hat. Solche Lösungen lassen sich je nach Aufgabe und Anwendungszweck serverseitig (das Skript läuft am Server, der "Benutzer" bekommt davon dann gar nichts mit) und/oder clientseitig (das Skript läuft am Rechner des Anwenders) realisieren. Neben PHP sei hier auch PERL als mögliche Alternative und serverseitige Skriptsprache genannt.

Auch wenn PHP und PERL häufig für Internetprojekte zum Einsatz kommen: Technisch kann diese Aufgabe auch jedes compilierte Programm (das heißt, es liegt als Binärdatei vor; der "Output" des Compilers, eigentlich des Linkers; eine .exe-Datei unter Windows) übernehmen. In welcher Programmiersprache dieses zuvor geschrieben wurde, ist dabei egal. Um das möglich zu machen, sei hier der Vollständigkeit halber auf CGI (Abk. für common gateway interface) hingewiesen. CGI ist ein Standard, eine Schnittstelle (interface) für den Datenaustausch zwischen einem Webserver (z.B. Apache) und einer anderen Software.

Unter den clientseitigen Skriptsprachen hat JavaScript besondere Bedeutung erlangt. JavaScript wird vom Webbrowser ausgeführt. Mit JavaScript lassen sich Inhalte, die der Browser darstellt, durch Nutzerinteraktion verändern. Beispiele sind z.B. Tabellen, die sich ohne Neuladen der Seite sortieren lassen oder Menüs wie sie aus grafischen Benutzeroberflächen bekannt sind. Negativbeispiele und "Spielereien" gibt es auch genug: Popup-Fenster, Deaktivieren des Kontextmenüs, Größenänderungen von Fenstern und (leider) vieles mehr. In den letzten Jahren hat eine JavaScript-Erweiterung für besonderes Aufsehen gesorgt: AJAX, Abk. für Asynchronous JavaScript and XML. Mit AJAX wird es möglich, dass ein JavaScript eine (HTTP-)Anfrage an einen Webserver schickt und dieses Ergebnis verarbeitet. Und das, ohne dass die Seite neu geladen werden muss! Eine "Kleinigkeit" eigentlich, aber mit zahlreichen Anwendungsmöglichkeiten. Sie kennen das vielleicht: Sie geben in einer Suchmaschine die ersten paar Zeichen des Suchbegriffs ein und bekommen nach wenigen (Milli-)Sekunden mehrere Suchbegriffe vorgeschlagen. Doch woher kommen diese Daten? Nach den vorgeschlagenen Begriffen haben Sie nie gesucht (es war also nicht die Auto-Vervollständigen-Funktion Ihres Browsers). Während Sie tippen, schickt Ihr Webbrowser im Hintergrund den Text an den Server (von dem das JavaScript stammt). Dieser vergleicht Ihren Begriff mit anderen Suchabfragen und schickt ein paar Vorschläge zurück.

1.4. Entwicklungsumgebung

Also was benötige ich zum Programmieren?
Zunächst einen Programmierer. Der ist schon da.
(Eine Programmiererin ist natürlich genauso gut; der Einfachheit halber verzichte ich auf diese Unterscheidung im Text.)

Ok, etwas konkreter. Im oberen Text wurden die einzelnen "Komponenten" bereits genannt.

Minimal benötigt man an Software: (abgesehen vom Betriebssystem)

  • Texteditor
  • Compiler (bzw. Interpreter)

Gleich die gute Nachricht: Beides ist häufig kostenlos verfügbar. Es ist also nicht unbedingt notwendig, finanzielle Investitionen für Software zu tätigen, wenn Sie Ihre ersten Programme schreiben wollen. Aber wie so oft im Leben (und generell eine gute Antwort auf viele Fragen ;-) ), gilt auch hier: Kommt drauf an. Und zwar u.a. darauf, a) in welcher Programmiersprache Sie programmieren wollen und b) für welche Plattform (d.h. für welches Betriebssystem) Sie entwickeln möchten. Als Beispiel für eine kommerzielle Entwicklungsumgebung sei Microsoft Visual Studio genannt, das für Windows-Entwickler interessant ist. Auf Tutorials.at verweise ich aber immer auf kostenlos verfügbare Compiler in den jeweiligen Tutorials.

Aber einmal der Reihe nach: 1. Texteditor. Jedes mir bekannte Betriebssystem liefert standardmäßig einen Editor mit. Der ist also mit hoher Wahrscheinlichkeit bereits vorhanden. Windows liefert mit Notepad einen einfach gehaltenen Editor mit. Diesen können Sie über Start->Programme->Zubehör->Editor aufrufen (je nach Windows-Version geringfügig anders). Um einfache Programme zu schreiben, zum Lernen, ist Notepad sicher geeignet. Linux-/UNIX-User können beispielsweise vi (bzw. vim) zum Schreiben der Quellcodes verwenden.

2. Compiler/Interpeter: Sie müssen zumindest ein Programm installieren: Einen Compiler bzw. Interpreter, der den von Ihnen geschriebenen Quelltext übersetzt (Compiler) bzw. interpretiert und ausführt (Interpreter). Auch hier sei wieder auf das jeweilige Tutorial verwiesen. Am Anfang wird jeweils erklärt, wie Sie die nötige Software installieren und verwenden.

Doch es geht noch besser: Wie Sie sich wahrscheinlich jetzt schon vorstellen können, werden Quelltexte, wenn sie einige hundert Zeilen umfassen, in Notepad schnell mal unübersichtlich. Es geht also besser und komfortabler. Der naheliegendste Schritt: Verwenden Sie einen Editor, der für Programmierer gedacht ist. Linux-Benutzern kann ich hier ganz besonders Quanta Plus empfehlen. Für Windows gibt es viele Alternativen, hier sei als ein geeigneter Editor Notepad++ genannt.

Einen Schritt weiter gehen (integrierte) Entwicklungsumgebungen, auch als IDE (Abk. für Integrated Development Environment) bezeichnet. Eine Entwicklungsumgebung integriert - wie der Name schon sagt - Editor, Compiler, Linker, Debugger (hilft beim Fehlersuchen) und einige andere (Einzel-)Programme unter einer Benutzeroberfläche. Microsoft Visual Studio (oben bereits einmal genannt) ist ein Beispiel für eine Entwicklungsumgebung (nicht "bloß" ein Compiler).

Nächstes Kapitel