Während seiner Lebenszeit besteht ein Computer Programm aus mehreren Dateien – der Datei mit dem Quelltext und die Datei mit dem ausführbaren Programm. Der Programmierer entwickelt den Quelltext in der lesbaren Programmiersprache. Soll da Programm aufgerufen (gestartet) werden, muss es zunächst in maschinenlesbaren Code transformiert werden. Bei Programmaufruf durch den Anwender wird das in Maschinensprache übersetzte Programm ausgeführt. Der vom Entwickler erstellte Quelltext, der auch als Quellcode oder Programmcode bezeichnet wird (englisch: „Source Code“), enthält die Befehle der Programmiersprache und ist die Basis für Änderungen und Erweiterungen des Programms. Aus dem Quelltext wird das ausführbare Computer Programm generiert, das den Benutzern zur Verfügung gestellt wird.
Eine abstrakte Betrachtung des Quelltextes ist das „Software Dokument“, welches das formale Programm beschreibt. Dieses Software Dokument wird mittels anderer Tools, die selbst wiederum ausführbare Programme sind, in eine Maschinensprache übersetzt. Vereinfacht formuliert, ist der Quelltext (allgemein von Softwareprogrammen, von Webseiten / HTML etc.) die von Menschen lesbare und erstellte Sammlung von Anweisungen, die eine bestimmte Aufgabe ausführen. Um einen ersten Eindruck einer Programmiersprache zu gewinnen, werden oft „Hallo Welt“-Quelltexte erstellt. Dieses Mini-Programm gibt lediglich die Worte „Hallo Welt“ auf dem Bildschirm aus. Erfunden wurde „Hallo Welt“ bzw. „Hello World“ in den amerikanischen Bell Laboratories. Berühmt wurde das Mini-Programm jedoch erst durch ein zur Programmiersprache C veröffentlichtes Buch der Bell-Entwickler Brian Kernighan und Dennis Ritchie.
Vom Quelltext zum Programmaufruf – für Dummies
Schreibt der Programmierer ein Programm, so verfasst er den Quelltext. Der Quelltext ist die Sammlung der Befehle, die das Programm während seiner Laufzeit ausführt. Meist liegen die Befehle der Programmiersprache in englischer Sprache vor, doch ist ihre Schreibweise in den verschiedenen Programmiersprachen oft unterschiedlich. Wenn beispielsweise auch jede Programmiersprache Daten in eine Datei schreiben kann, so weichen die Befehle bzw. Befehlssequenzen zum Schreiben der Datei in den verschiedenen Programmiersprachen teilweise stark voneinander ab. Ebenso können die Befehle der Programmiersprachen unterschiedlich mächtig sein. Während Programmiersprache „A“ etwa drei verschiedene Befehle verwendet, um eine Datei zu beschreiben, so kann eine Programmiersprache „B“ die Aufgabe unter Umständen mit nur einem Befehl, einer Funktion oder einem Methodenaufruf erledigen. Ein Programm enthält eine Sammlung von Anweisungen, die nach dem Aufruf des ausführbaren Programms ausgeführt werden oder zur Verfügung stehen und auf die Interaktion des Programmbenutzers warten. Somit kann ein Programm oft wie ein sequentieller Text gelesen werden. Dies ist jedoch bei bei objektorientierten Programmiersprachen, die nicht „Top-Down“ aufgebaut sind, anders. Die Summe aller verwendeten Befehle der verwendeten Programmiersprachen ergibt den Quelltext. Ruft der Benutzer das ausführbare Programm (zum Beispiel mit der Dateiextension .exe) auf, so wird zwar der vom Programmierer erstellte Quelltext ausgeführt, jedoch nicht in seiner vom Programmierer erstellten lesbaren Form. Nach der Fertigstellung des Quelltextes, wird dieser mit einem Compiler kompiliert und in einen maschinenabhängigen Programmcode umgesetzt. Dieser Maschinencode, der aus Bit-Sequenzen besteht, ist für Menschen nicht nicht mehr lesbar. Startet ein Benutzer das ausführbare Programm auf seinem PC, so wird der aus dem Quelltext kompilierte Programmcode ausgeführt. Muss der Programmierer eine Änderung am Programm vornehmen, so greift er auf den Quelltext zurück, ändert diesen und erstellt ein neues, kompiliertes Programmfile.
In manchen Fällen ist das Sourcefile auch das ausführbare Programm. In den Anfängen der Programmierung wurden zur Übersetzung der Quellcodes anstatt der Compiler häufig reine Interpreter eingesetzt. Die ersten mit der Programmiersprache BASIC entwickelten Programme wurden meist mit einem Interpreter übersetzt. Der Quelltext lag bei seiner Ausführung nicht als kompiliertes Programm vor, sondern wurde während der Programmlaufzeit Zeile für Zeile ausgeführt. Computerintern fand natürlich die Konvertierung in einen maschinenabhängigen Code statt, doch ein Compiler zum Erstellen der „.com“ oder „.exe“ Dateien wurde bei der Interpretation von Quelltext nicht eingesetzt. Ein Nachteil dieser Interpreter und ihrer Programmiersprachen war, dass selbst erstellte Programme nicht wirklich verkauft werden konnten. Der Quellcode war von jedem Käufer einsehbar, lesbar und damit kopierbar. Reine Interpreter finden inzwischen kaum noch Verwendung. Eine übliche Anwendung ist jedoch das Erstellen von maschinennahem Code mit einem Interpreter. Dieser maschinennahe Code wird erst auf der Zielplattform in den tatsächlichen Maschinencode umgesetzt. Einige Programmiersprachen ermöglichen auch das Erstellen von Quellcode in nicht-textueller Form. Bei diesen Sprachen sind die vom Programmierer in seinem Programm verwendeten Funktionen oder Objekte meist grafisch miteinander verknüpft und können so per Mausklick in den Quelltext übernommen werden. Beispiele sind die Programmiersprache Simulink sowie UML-Diagramme, welche die verwendbaren „Objekte“ der Entwicklungsumgebung grafisch aufbereiten. Eine der ältesten Programmiersprachen, Assembler war sehr maschinennah und daher schwierig zu lesen, wodurch die Programme fehleranfällig und schnell undurchschaubar wurden. Höhere Programmiersprachen wie COBOL, „C“ oder PHP sind dagegen gut lesbar und damit auch relativ einfach zu warten.
Der Quellcode in der Entwicklungsumgebung
Unter Quelltext versteht man auch die lesbaren Versionen von gerenderten Medien, wie etwa dem HTML-Code (Hypertext Markup Language). Der Quelltext (allgemein von Softwareprogrammen, von Webseiten / HTML etc.) ist jedoch immer Voraussetzung für die Erstellung und spätere Änderung des Programms. Für die Anwender der Computerprogramm ist der Quelltext jedoch nur bei einer Open Source-Software sichtbar. In der Programmierung werden meist integrierte Entwicklungsumgebungen oder Texteditoren zur Erstellung des Quellcodes verwendet. Die vorgenannten grafischen Entwicklungsumgebungen generieren den Quelltext aus den vom Programmierer erstellten Entwurfsdokumenten, wie etwa UML (Unified Modeling Language) oder Struktogrammen. Einer der Vorteile von Entwicklungsumgebungen ist das „Beautifying“ oder der „Pretty Print“ des Programmcodes. Dabei enthält die Entwicklungsumgebung eine Funktion, mit der Einrückungen und Syntaxhervorhebungen im Quelltext durchgeführt werden. Die Funktion erkennt die Befehle der Programmiersprache und kennzeichnet sie beispielsweise in einer anderen Farbe als die „Variablen“ des Programmes. Auch Einrückungen der Befehle (Einzüge) werden vom „Pretty Print“ durchgeführt. In den Programmiersprachen Fortran-77 und Python ist eine Quelltextformatierung Voraussetzung für eine Kompilierung. In den meisten Entwicklungsumgebungen ist zusätzlich ein „Syntaxcheck“ integriert. Damit lassen sich beispielsweise fehlerhafte Befehlsformate, Tippfehler und fehlende Klammern, Punkte oder Kommas, die zur syntaktischen Richtigkeit des Codings erforderlich sind, sichtbar machen. Nur syntaktisch einwandfreie Quelltexte können kompiliert werden. Ein Programm kann aus mehreren Quelltext-Dateien bestehen. Zum Kompilieren solcher umfangreicher Programmprojekte und ihrer Abhängigkeiten können Makefiles eingesetzt werden. Die Entwicklungsumgebung kann auch eine Software-Versionsverwaltung anbieten, mit der die von den Entwicklern geänderten Quelltexte beim Speichern automatisch versioniert werden.
Das Ausführbare Programm und die Lizenzierung von Software
Vor Programmausführung wird der Quellcode in die Maschinensprache übersetzt. Die Folge von Bits (ein Bit kann nur die Werte „1“ oder „0“ annehmen) wird von einem Compiler erstellt oder von einem Interpreter (bzw. JIT-Compiler) zur Programmlaufzeit erzeugt. Oft wird das ausführbare Programm durch eine Kombination der Varianten erzeugt: Der Quelltext in der Programmiersprache wird zunächst in einen abstrakten Zwischencode übersetzt, der dann zur Programmlaufzeit von der Laufzeitumgebung mittels eines Interpreters (oder JIT-Compilers) in den Maschinencode übersetzt wird. Damit ist das Programm multiplattformfähig, denn der Zwischencode wird erst auf seiner „Zielplattform“ in den plattformabhängigen Maschinencode übersetzt. Der generierte Zwischencode ist dabei plattformunabhängig. Beispiele für den Zwischencode sind die Common Intermediate Language oder auch der Java-Bytecode.
Der Quelltext der Software unterliegt dem Urheberrecht. Wurde der Quelltext von einer privaten Person erstellt, so hält sie das Urheberrecht an dem Programm. Ist die Software jedoch auf der Arbeitsstelle oder bei einem selbstständigen Entwickler gegen Entgelt erstellt worden, so gehen die Urheberrechte an den Auftraggeber über. Neben dieser proprietären Software existiert eine zweite Kategorie – die der Open-Source-Software. Steht ein Programm unter einer Open-Source-Lizenz, wird sein Quelltext ausgeliefert. Viele der downloadbaren Onlineshops sind etwa Open-Source-Software und können frei von der Webseite des Herstellers heruntergeladen und verwendet werden. Die Änderung und Weitergabe der Open-Source-Programme ist mit der Open-Source-Lizenz ausdrücklich gestattet. Die ERP Systeme der deutschen SAP AG – die Systeme R/2 und R/3 – die seit den 70er Jahren entwickelt wurden, gehören zu den ersten Open-Source-Systemen der Welt. Die Auslieferung des Open Source Warenwirtschaftssystems der SAP schaffte bei den von den marktbeherrschenden IT-Herstellern finanziell stark beanspruchten Unternehmen Vertrauen. Mit der Open-Source-Software war der Kunde unabhängig vom Hersteller und konnte die Software jederzeit seinen eigenen Anforderungen anpassen. Da die SAP mit ihrem System gleich eine eigene Programmiersprache mitlieferte – „ABAP/4“ – ergaben sich aus dem innovativen Konzept weitere Geschäftsfehler: Schulungen für die Programmierer und „Poweruser“ der Kunden wurden angeboten, um das System zu verstehen und modifizieren zu können.