Erstes Computerprogramm !?
02.06.2005 um 02:14
Hier ist ein Bericht zum Thema das erste Computerprogramm....
Ein Computerprogramm ist die Umsetzung eines Algorithmus in eine Form, die von einem Computer verarbeitet werden kann. Dieser Prozess wird als Implementierung bezeichnet.
Im Sprachgebrauch wird Computerprogramm meist zu Programm verkürzt oder der engl. Begriff Software (für Ein- und Mehrzahl) synonym verwendet.
Sowohl der in einer Programmiersprache verfasste Quelltext als auch der von einem Computer ausführbare Maschinencode werden als Programm bezeichnet. 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
Das erste Computerprogramm von Ada Lovelace
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.
Erste Programme auf Lochstreifen
In den Jahren 1936 bis 1941 entwarf Konrad Zuse die Rechner Z1 und Z3, die lange Befehlsfolgen auf einem Lochstreifen verarbeiteten, 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.
Programme im Arbeitsspeicher
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 Rechnerkonzept war es möglich, die Befehle eines Computerprogramms vor der Ausführung erstmals in den Arbeitsspeicher übertragen. Dies ist noch heute üblich. EDVAC wurde jedoch erst im Jahre 1951 teilweise fertiggestellt. Der Demonstrationsrechner Manchester SSE und der auf dem EDVAC aufbauende EDSAC-Rechner hatten schon vorher Programme aus dem Arbeitsspeicher ausgegeführt.
Höhere Programmiersprachen und Compiler
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, COBOL, 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.
Vom Algorithmus zum Programm
Berechnung des größten gemeinsamen Teilers
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:
Sei A die größere der beiden Zahlen A und B (gegenenfalls vertauschen).
Setze A = A – B.
Wenn A und B ungleich sind, dann mit Schritt 1 fortfahren, wenn sie gleich sind, dann den Algorithmus beenden: Diese Zahl ist der größte gemeinsame Teiler.
Verwendung einer Programmiersprache
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:
(* 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
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.
Elementare Schritte
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:
H := A; (* Wert von A in der Hilfsvariablen H retten *)
A := B; (* A mit dem Wert von B überschreiben *)
B := H; (* B mit dem Wert von H (=A) überschreiben *)
Dies ist auch ein kleiner Algorithmus.
Ein vollständiges Programm
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:
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
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.
Zusätzlich bieten einige moderne Programmiersprachen wie Java mit Hilfe von Decompiler-Programmen aus einer fertig kompilierten Anwendung den ursprünglichen Sourcecode wieder zu rekonstruieren. Um dies zu verhindern gibt es wiederum Obfuscator-Software, die dafür sorgt, dass der Sourcecode nicht mehr lesbar ist.
.....gruß Cyberspion.....