Computerprogramm
Ein Computerprogramm ist die Umsetzung eines Algorithmus in eine Form, die von einem Computer verarbeitet werden kann. Dieser Prozess wird als Implementierung bezeichnet.Der Begriff Programm wird sowohl für den in einer Programmiersprache verfassten Quelltext, als auch für den von einem Computer ausführbaren Maschinencode verwendet. Um aus dem Quelltext den Maschinencode zu generieren, wird ein Assembler, Compiler oder Interpreter benötigt. Diese übersetzen die Befehle der Programmiersprache, die für menschliche Benutzer verständlich und bearbeitbar sein sollen, in die semantisch entsprechenden Befehle der Maschinensprache des verwendeten Computers.
Geschichte
Als weltweit erstes Computerprogramm gilt eine Vorschrift für die Berechnung von Bernoulli-Zahlen, die Ada Lovelace in den Jahren 1842/1843 für die mechanische Analytical Engine von Charles Babbage erstellte. Dieses Programm konnte zu ihrer Zeit nur von Hand ausgeführt werden, denn wegen Fertigungsproblemen gab es im 19. Jahrhundert keine funktionsfähige Maschine.
In den Jahren 1936 bis 1941 entwarf Konrad Zuse die Rechner Z1 und Z3, die lange Befehlsfolgen auf einem Lochstreifen ausführen konnten, die ersten Computerprogramme, die auf realen Maschinen ausgeführt werden konnten. Die Rechner beherrschten die vier Grundrechenarten und Quadratwurzelberechnungen auf binären Gleitkommazahlen, der Lochstreifen enthielt jeweils eine Rechenoperation und eine Speicheradresse.
Auf Zuse geht auch die erste höhere Programmiersprache, Plankalkül, zurück. Damit lassen sich Probleme maschinenunabhängig formulieren und später in eine maschinenlesbare Form überführen.
Der EDVAC-Rechner, der auf einem Entwurf von John von Neumann aus dem Jahre 1945 basiert, hatte einen Quecksilber-Verzögerungsspeicher für 1024 Fest- oder Gleitkommazahlen mit jeweils 44 Bits. Jede Speicherzelle konnte statt einer Zahl auch einen Befehl aufnehmen. Bei diesem Rechner war es möglich, die Befehle eines Computerprogramms vor der Ausführung erstmals in den Arbeitsspeicher übertragen. Dies ist noch heute üblich.
Ende der 1950er Jahre wurden Computer so leistungsfähig, dass spezielle Programme, Compiler, Quelltexte in höheren Programmiersprachen automatisch in Maschinenbefehle, also ausführbare Programme, übersetzen konnten. Ausführbare Programme können dann, wie beim EDVAC, in den Speicher geladen und abgearbeitet werden.
Mit Fortran, ALGOL und LISP entstanden in den späten 1950er Jahren die ersten standardisierten höheren Programmiersprachen. Programme in diesen Sprachen laufen durch einen entsprechenden Compiler übersetzt auf unterschiedlichen Rechnern. Sie können teilweise auch noch auf modernen Computern eingesetzt werden.
Es soll ein Programm zur Bestimmung des größten gemeinsamen Teilers (ggT) zweier Zahlen erstellt werden. Zunächst muss ein geeigneter Algorithmus gefunden werden.
Der euklidische Algorithmus, der bereits um 300 v. Chr beschrieben wurde, ermittelt den größten gemeinsamen Teilers (ggT) zweier natürlicher Zahlen A und B:
Sobald eine formale Beschreibung eines Algorithmus, also eine genau definierte Verarbeitungsvorschrift, vorliegt, kann der Algorithmus umgesetzt (implementiert) werden. Dazu wird eine geeignete Programmiersprache ausgewählt.
Zur Umsetzung wird heute meist eine höhere Programmiersprache verwendet, die von einem Computer eventuell nicht direkt ausgeführt werden kann, sondern zuerst compiliert oder interpretiert werden muss. In Sprachen wie Pascal dienen Variablen, Ausdrücke, Vergleiche, Zuweisungen und Kontrollstrukturen zur Umsetzung des ggT-Algorithmus:
Bei der Umsetzung wird mit der Prüfung von Schritt 3 begonnen. Der ursprüngliche Algorithmus berücksichtigt nicht den Fall, dass A und B bereits zu Beginn gleich sein können. Wäre die Aufgabe, den größten Teiler von 103 und 103 zu finden, würde ein Mensch sofort das Ergebnis 103 nennen, er würde den Algorithmus gar nicht bemühen. Der originale Algorithmus würde aber null ergeben. Die Umsetzung auf einem Rechner muss auch alle Sonderfälle berücksichtigen. Durch das Vorziehen von Schritt 3 wird der Sonderfall hier korrekt behandelt.
Pascal und andere Programmiersprachen besitzen keine Operation zum Vertauschen von Zahlen. Dies muss daher in elementarere Schritte umgesetzt werden. Eine zusätzliche Variable H, eine so genannte Hilfsvariable, erlaubt die Vertauschung mit Hilfe von drei Zuweisungen:
Damit hieraus ein korrektes Programm wird, muss der Algorithmus noch um Ein- bzw. Ausgabeanweisungen, oft jedoch auch um Variablen und eine Programmstruktur ergänzt werden. Diese sind nicht Teil des eigentlichen Algorithmus:
Erst dieses Programm kann mit einem Texteditor in eine Datei geschrieben werden, die dann übersetzt und ausgeführt werden kann. Hierzu ist ein Compiler erforderlich, der den Code in der Programmiersprache in Maschinensprache übersetzt und das Ergebnis in eine ausführbare Datei schreibt. Diese kann dann über ein Betriebssystem gestartet werden. Das Programm muss dabei nur einmal übersetzt werden. Es kann danach beliebig oft gestartet werden. (Siehe auch Kompilierung).
Einige Programmiersprachen benötigen keinen Compiler, aber statt dessen einen Interpreter, der Programme ohne vorherige Übersetzung ausführen kann. Der Interpreter selbst ist dann ein ausführbares Programm in Maschinensprache.
Eine weitere Möglichkeit besteht in der Verwendung von Zwischencode (Bytecode), der vom Compiler an Stelle des Maschinencodes generiert wird.
Vom Algorithmus zum Programm
Berechnung des größten gemeinsamen Teilers
Verwendung einer Programmiersprache
(* Schritt3: *)
WHILE A <> B DO BEGIN (* Solange A ungleich B *)
(* Schritt1: *)
IF B > A THEN BEGIN (* Falls B größer als A *)
H := A; A := B; B := H; (* A und B vertauschen *)
END; (* Schritt2: *)
A := A-B; (* A durch A-B ersetzen *)
END;
Berücksichtigung aller Sonderfälle
Elementare Schritte
H := A; (* Wert von A in der Hilfsvariablen H retten *)
A := B; (* A mit dem Wert von B überschreiben *)
B := A; (* B mit dem Wert von H (=A) überschreiben *)
Dies ist auch ein kleiner Algorithmus.Ein vollständiges Programm
PROGRAM Ggt(Input,Output); (* Programmkopf *)
VAR A,B,H: Integer; (* Variablendefinition *)
BEGIN
ReadLn(A,B); (* Eingabe von A und B *)
WHILE A <> B DO BEGIN (* Euklidischer *)
IF B > A THEN BEGIN (* Algorithmus *)
H := A; A := B; B := H;
END;
A := A-B;
END;
WriteLn(A); (* Ausgabe von A *)
END. (* Programmende *)
Übersetzung und Ausführung
Literatur
Siehe auch:
Software, Anwendungsprogramm, Dienstprogramm, Betriebssystem