Ein Programm kann in einer Vielzahl von Sprachen formuliert sein:
Erstens: Kontrolliere, ob Du mindestens 50.-- DM hast. Zweitens: Wenn Du weniger als 50.-- hast, dann hole 100.-- vom Automaten Drittens: gehe bis spätestens 20:00 Uhr in die Destille. Viertens: Versuche, aufrecht nach Hause zu kommen
Weiteres Beispiel des selben Programms in einer anderen Sprache:
erschd amohl schaust noch, obbsd gnuuch Gäld hast; mindestens an Fuufzichä wäärsd woscheinli braung. Wenns nedd langd, dann holst Der halt an Hunderder vom Ahtomahdn. Bis achda schaust, dassd in dä Disdilln bisd. Kumm obba mit Anstand haam, und versumbf nedd.
Beispiel (aus[Lit. Knuth: Fundamental Algorithms], Seite 141):
Program M (Find the maximum).
Register assignments:
,
,
,
,
.
Line no. | LOC | OP | ADDRESS | Times | Remarks |
01 | X |
EQU |
1000 |
||
02 | |
ORIG |
3000 |
||
03 | MAXIMUM |
STJ |
EXIT |
![]() |
Subroutine linkage |
04 | INIT |
ENT3 |
0,1 |
![]() |
M1. Initialize. ![]() |
05 | |
JMP |
CHANGEM |
![]() |
![]() ![]() ![]() |
06 | LOOP |
CMPA |
X,3 |
![]() |
M3. Compare. |
07 | |
JGE |
*+3 |
![]() |
|
08 | CHANGEM |
ENT2 |
0,3 |
![]() |
M4. Change m. ![]() |
09 | |
LDA |
X,3 |
![]() |
![]() |
10 | |
DEC3 |
1 |
![]() |
M5. Decrease k. |
11 | |
J3P |
LOOP |
![]() |
M2. All tested? |
12 | EXIT |
JMP |
* |
![]() |
Return to main program. |
Ein Programm in dieser Sprache besteht aus einer Folge der möglichen Befehle des Prozessors. Dabei ist für jeden Befehl eine genaue Bitfolge definiert. Die Aneinanderreihung der passenden Bitfolgen ergibt das Programm. Bei der späteren Abarbeitung eines solchen Programms als Prozeß erscheinen die Werte dieser Bits als Spannung an den Eingangsleitungen des Prozessors und bewirken so die Ausführung der gewünschten Programmbefehle.
Teilweise kann ein Programm automatisch (von einem Konvertierprogramm) von einer Sprache in eine andere überführt werden. Beispiele hierfür sind zuvorderst natürlich Compiler, die einen Quelltext in Maschinensprache übersetzen. Es gibt aber auch Programme wie f2c (konvertiert einen FORTRAN 77-Quelltext nach C) oder p2c (konvertiert Pascal nach C).
Bei der Ausführung eines Programms gibt es zwei grundsätzliche Möglichkeiten:
Um ein solches Programm zu erstellen, wird üblicherweise der Quelltext des Programms in einer geeigneten Programmiersprache geschrieben, und dann von einem speziellen Programm, dem Compiler, in die Maschinensprache übersetzt.
Eine Variante hiervon sind die sogenannten Assemblersprachen. Diese
sind eine Klarschriftversion jeweils einer bestimmten
Maschinensprache. Anstatt eines bestimmten Bitmusters um
beispielsweise den Wert 2 zum Prozessorregister D0 zu addieren,
wird in einer solchen Sprache ein sogenanntes mnemonic des
Befehls als Text hingeschrieben, etwa ADD #2,D0
. Jede
Assembleranweisung entspricht dabei genau einem Maschinenbefehl. Um
ein Programm aus dieser Form in die wirkliche Maschinensprache zu
übersetzen, wird ein sogenannter Assembler benötigt.
Die Programme einiger Programmiersprachen werden (zumindest fast) ausschließlich von einem Compiler in Maschinensprache übersetzt (FORTRAN, C, C++, Pascal) und als Maschinenprogramme ausgeführt.
Programme einiger anderer Sprachen dagegen werden fast ausschließlich interpretiert (Shellskripte, die meisten BASIC-Dialekte).
Für einige Programmiersprachen sind sowohl Interpreter als auch Compiler verfügbar (beispielsweise einige BASIC-Versionen).
Dazwischen gibt es auch noch eine Mischform. Dabei wird das Programm aus dem Quelltext von einem Compiler in sogenannten Pseudocode (p-Code) übersetzt. Dieser Pseudocode ist einer Maschinensprache ähnlich, dafür ist aber tatsächlich kein Prozessor verfügbar. Stattdessen wird dieser Pseudocode auf einer realen Maschine wiederum von einem Interpreter ausgeführt. Dies wird bei der Sprache Java dazu genutzt, Programme unabhängig von dem verwendeten Zielsystem zu machen: Der Ersteller eines Programms übersetzt seinen Quelltext in den Pseudocode (ohne wissen zu müssen, auf welchem konkreten System das Programm laufen wird), und gibt das Programm in dieser Form an den Anwender weiter. Der Anwender benötigt auf seinen System einen Interpreter für den Pseudocode (dieser ist Teil der run time-Umgebung von Java, und ist abhängig von der Maschine, aber unabhängig vom konkreten Programm).
Eine andere Mischform wird von der Sprache Perl benutzt: Das Programm wird im Quelltext erstellt und gegebenenfalls an die Endanwender verteilt. Ähnlich wie bei einem wirklich interpretierten Programm wird zum Ausführen ein Hilfsprogramm benötigt. Dieses interpretiert aber nicht Anweisung für Anweisung während das gewünschte Programm ausgeführt wird, sondern übersetzt erst alle Anweisungen in Maschinencode, und startet diesen dann.
Noch eine andere Variante wird von VisualBASIC umgesetzt: Das erstellte Programm wird (in kompakter Form, beispielsweise mit verkürzten Variablennamen und ohne Kommentare) im Anschluß an einen kompletten Interpreter abgespeichert, und kann in dieser Form als ausführbares Programm verteilt werden. Die so erstellten Programme sind dabei größer als bei nur interpretierte Sprachen, weil in jedem erstellten Programm ein kompletter Interpreter enthalten ist.
Einige grundsätzliche Eigenschaften der möglichen Varianten im Überblick:
Compiler | Interpreter | p-Code | Kompilieren bei Start | Interpreter enthalten | |
Beispiel | C, C++, Fortran, Pascal, | BASIC, Shellskripte, LISP | Java | Perl | VisualBASIC |
lauffähig auf verschiedenen Systemen | nein | ja | ja | ja | nein |
effiziente (schnelle) Programme | ja | nein | nein | ja | nein |
ohne weitere Programme lauffähig | ja | nein | nein | nein | ja |
Quelltext vom Anwender sichtbar/änderbar | nein | ja | nein | ja | nein |
Dazu folgende Anmerkungen:
Programme, die ohne erneutes Kompilieren auf vielen Systemen lauffähig sind, haben besondere Vorteile bei einem großen Kundenkreis. Beispiel: eine Bank möchte ihren Kunden Onlinebanking anbieten. Dann ist es ungeschickt, ein Programm nur für ein bestimmtes Betriebssystem anzubieten (wie es beispielsweise die Sparkassen versuchen), indem man es beispielsweise für Windows95/98 erstellt und verteilt. Selbst bei der starken Verbreitung dieser beiden Varianten treten Probleme auf, weil 60% Marktanteil eines Systems umgekehrt 40% der potentiellen Kunden ausschließt, die entweder gar kein Windows95/98 haben, oder intelligenterweise nicht gerade für sensiblen Datenverkehr verwenden wollen. Zudem kommen nach Windows95/98 irgendwann andere Versionen, für die das Programm wieder neu erstellt werden müßte. In einem solchen Fall kann man vielleicht besser ein Javaprogramm erstellen und verteilen; dann kann es jeder Kunde verwenden (so geschehen beispielsweise bei Consors).
Kommerzielle Anbieter lassen sich nicht gerne über die Schulter gucken, denn wenn ein Programm im Quelltext abgegeben wird, kann es von jedermann unkontrolliert übernommen werden (und komplett oder in Teilen als Raubkopie verwendet werden); man gibt das gesamte investierte know how preis. Zudem kann der Ersteller beim Auftreten von Problemen nicht mehr sicher davon ausgehen, daß wirklich das ausgelieferte Programm die Fehler verursacht; denn möglicherweise hat der Endkunde das Programm manipuliert und versehentlich Fehler eingebracht7.1.
Dies ist besonders problematisch bei aufwendigen Projekten, wie sie beispielsweise in AutoCAD auftreten. Viele Anbieter von AutoCAD-Erweiterungen erstellen ihre Programme zumindest in wesentlichen Teilen in LISP, und haben keine Möglichkeit, den Quelltext zu schützen, da diese auf dem Rechner des Endkunden liegen und dort kopiert oder geändert werden können.
Andererseits kann unter Umständen der Endanwender auch kleinere Fehler selbstständig beheben, möglicherweise im Rahmen einer Telefonseelsorge.