Zum Inhalt springen

Programmcode

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 4. Februar 2015 um 14:29 Uhr durch Plankton314 (Diskussion | Beiträge) (+QSI). Sie kann sich erheblich von der aktuellen Version unterscheiden.
QS-Informatik
Beteilige dich an der Diskussion!
Dieser Artikel wurde wegen inhaltlicher Mängel auf der Qualitätssicherungsseite der Redaktion Informatik eingetragen. Dies geschieht, um die Qualität der Artikel aus dem Themengebiet Informatik auf ein akzeptables Niveau zu bringen. Hilf mit, die inhaltlichen Mängel dieses Artikels zu beseitigen, und beteilige dich an der Diskussion! (+)
'Programmcode', Begriffszusammenhänge und im Sprachgebrauch auftretende Synonyme

Als Programmcode bezeichnet man die Folge/Menge der Anweisungen eines Computerprogramms. Man unterscheidet verschiedene Arten von Programmcode:

  • Quelltext – ein für Menschen lesbarer, in einer Programmiersprache geschriebener Text eines Computerprogrammes.
  • Zwischencode - ein Programmcode, der als Zwischenschritt im Kompiliervorgang auftritt und weiter übersetzt oder interpretiert wird.
  • Maschinencode - Anweisungen in codierter Form, die von einer Maschine direkt ausgeführt werden können.

Abhängig von der verwendeten Entwicklungsumgebung weisen die Varianten von Programmcode erhebliche Unterschiede auf, die in erster Linie die verwendete Sprache betreffen. Weitere Unterschiede können zum Beispiel sein, ob sie aus imperativen Befehlstexten oder deklarativen Anweisungen bestehen, ob sie von den Werkzeugen automatisch erzeugt und verwaltet oder im Entwicklungsprozess gezielt hergestellt werden, ob sie typbezogen als getrennte Datenobjekte (als Dateien oder in Programmbibliotheken) oder in einem gemeinsamen Datenbestand geführt werden, ob sie überhaupt auftreten (z. B. bei Zwischencode) oder wie sie bezeichnet werden (etwa „Pseudocode“ oder „Bytecode“). Zusammenfassend lässt sich feststellen: Die Entwicklung auf dem Gebiet der Programmiersprachen und Programmierparadigmen führte zu vielen unterschiedlichen Formen von Programmcode – die in der Praxis auch entsprechend anzutreffen sind.

Unterschiedliche Bedeutungen und Synonyme:
Der Ausdruck 'Programmcode' und seine Unterarten werden auch für „Code“ im Sinn von Syntax bzw. Sprache benutzt, in der die Anweisungen formuliert sind. Beispiel: ‚Maschinencode‘ als Synonym für Maschinenprogramm oder i. S. von Maschinensprache[1].
Im Sprachgebrauch werden sie auch mit unterschiedlichen Synonymen bezeichnet, im Besonderen wird die allgemeine Bezeichnung ‚Programmcode‘ häufig für ‚Quelltext‘ verwendet. Weitere Synonyme siehe nebenstehende Grafik.

Abgrenzung:
Bei Anwendungen, die mithilfe von Formular- oder Reportgeneratoren oder z. B. mit Datenbank-Auswertungssprachen erzeugt (und oft auch ausgeführt) werden, sind die dazu erstellten Anweisungen zwar in syntaktischer Hinsicht ebenfalls "Code", und sie beschreiben auch den Inhalt eines „Programms“. Werden diese ‚Angaben‘ nicht als Befehlstexte, sondern z. B. über eine Grafische Programmiersprache als Parameter oder objekt-/ereignisbezogene Attribute erstellt, so lassen sich keine Belege dafür finden, dass diese Angaben als „Programmcode“ bezeichnet werden. Zum Teil gelten derartige Spezifikationen sogar als Gegenstück zu Programmcode.[2]

Werkzeuge zur Programmcode-Verarbeitung (Überblick)

Die Varianten von Programmcode sind Zwischen- oder Endergebnisse bei der Entwicklung von Software, deren Zweck es letztlich ist, von ihren Anwendern genutzt, d. h. von einem Computer 'ausgeführt' zu werden. Die nachfolgenden Abschnitten geben einen Überblick über Werkzeuge, die zum Erzeugen und Bearbeiten von Programmcode eingesetzt werden können. Mit Links wird auf die jeweiligen Hauptartikel verwiesen.

Erzeugung und Verarbeitung von Quelltext

  • Texteditor: Nur aus Text bestehender Quellcode wird meist mit einem Standard-Texteditor, zum Teil auch mit programmiersprachen-spezifischen Editoren erstellt und bearbeitet. Siehe Hauptartikel Texteditor.
  • Codegeneratoren erzeugen aus in der Regel grafisch erstellten Modellen (wie z. B. UML-Modellen oder Struktogrammen) Quelltext für eine gewählte Programmiersprache. Siehe Hauptartikel Codegenerator.

Programmcode-Konvertierung

Der Prozessor kann nur Maschinenbefehle ausführen

Da Programme heutzutage nicht mehr in Maschinencode programmiert werden, jede Art von Software aber letztlich nur vom Prozessor und nur durch Verarbeitung von Maschinenbefehlen ausgeführt wird (denn Anweisungen wie z.B. „A = B + 100 * C“ 'versteht' der Prozessor nicht), müssen die Anweisungen des Quellcodes auf irgendeine Art und Weise in Maschinenanweisungen umgesetzt werden. Umgekehrt resultiert jede Ausführung eines Programms/Befehls aus ursprünglich programmierten (Primär- oder Quell-) Anweisungen.

Je nach Programmierparadigma, Programmiersprache und verwendeter Entwicklungsumgebung wird die Codetransformation auf unterschiedliche Art und Weise, mit unterschiedlichen Zwischenformaten und ggf. in mehreren Stufen praktiziert. Sie ist die wichtigste der auf den Programmcode wirkenden Bearbeitungsfunktionen. Dabei werden folgende Werkzeuge eingesetzt:

  • Compiler: Ein Compiler ist ein Programm, das Programme einer Quellsprache Q in semantisch äquivalente Programme einer Zielsprache Z übersetzt.[3] Siehe Hauptartikel Compiler.
Compiler erzeugen entweder Maschinencode (auch Objektprogramm genannt[4]) oder aus Gründen der Hardwareunabhängigkeit sog. Zwischencode (z. B. Bytecode oder auch Assemblercode), der durch weitere Transformationsschritte zu ausführbarem Code wird.
Beim Übersetzen durch einen Compiler werden grundsätzlich zwei Varianten unterschieden: Die „Ahead-of-time-Kompilierung“ (der Programmcode wird nur einmalig in einen ausführbaren Code übersetzt und mehrfach zur Ausführung verwendet) und die „Just-in-Time-Kompilierung“ (der Programmtext wird direkt vor jedem Programmlauf übersetzt).
Um den Compiler herum gibt es weitere Werkzeuge, die integriert oder separat spezielle Aufgaben wahrnehmen: Minimierer, Präprozessor, Precompiler, Optimierer, Parallelisierer, Obfuscator.
  • Assembler zählen zur Familie der Compiler und übersetzen ein in maschinennaher Assemblersprache vorliegendes Computerprogramm in die Maschinensprache. Siehe Hauptartikel Assembler (Informatik).
  • Precompiler kommen zum Einsatz, wenn spezielle, in der Programmiersprache selbst nicht vorgesehene Syntax-Konstrukte (zum Beispiel SQL-Code) verarbeitet werden sollen. Sie erzeugen daraus Anweisungen in der gewählten Programmiersprache, die in der anschließenden Übersetzung verarbeitet werden können. Siehe Hauptartikel Precompiler.
  • Interpreter sind Computerprogramme, die einen Programmcode nicht in eine ausführbare Datei übersetzen, sondern ihn – oder einen Zwischencode, man nennt dies dann ein Compiler-Interpreter System[3] oder „Compreter“ – zur Laufzeit des Programms einlesen, analysieren und einzeln in Anweisungen konvertieren, die der Prozessor jeweils sofort ausführt. Siehe Hauptartikel Interpreter.

Hilfswerkzeuge i. Z. mit dem Kompilieren

  • In manchen Systemumgebungen wird der von einem Compiler erzeugte Maschinencode noch von einem Linker („Binder“, „Bindelader“) nachbearbeitet. Das ist ein Computerprogramm, das einzelne Programmmodule zu einer ausführbaren Datei zusammenstellt (verbindet), wodurch zum Beispiel Unterprogrammen im Hauptprogramm nutzbar sind. Siehe Hauptartikel Linker (Computerprogramm).
  • Ein Lader lädt den Maschinencode eines Programms aus einer ausführbaren Datei in den Arbeitsspeicher und startet dessen Ausführung. Siehe Hauptartikel Lader (Programmierung).

Komponenten des Laufzeitsystems

Gewisse Arten/Teile von Programmcode werden nicht per Compiler oder Interpreter in äquivalente Maschinenbefehle umgesetzt, sondern von spezialisierten, als Unterprogramme verwendete Komponenten zur Laufzeit des Programms ‚verarbeitet‘. Ein Beispiel sind SQL-Statements – die als deklarative Anweisungen (das Was, nicht das Wie beschreibend) erstellt werden und zur Laufzeit des Programms von SQL-Subfunktionen des DBMS geprüft und verarbeitet werden, um die spezifizierte Datenaktion auszuführen.

Sonstige den Programmcode verarbeitende Programme

Beispiele für Szenarien zur Code-Übersetzung/-Umwandlung

Zur Transformation (Umwandlung, Übersetzung, Konvertierung) der von Programmierern erstellten Anweisungen in die zur physischen Ausführung im Prozessor erforderlichen Maschinenbefehle werden in den verschiedenen Entwicklungsumgebungen und Programmiersprachen unterschiedliche Verfahren angewendet. Die nachfolgenden Abschnitte zeigen dafür Beispiele.

Szenario IBM-Großrechner mit 3GL

Ablaufbeispiel IBM-Großrechner / 3GL-Sprache

Der Compiler übersetzt den evtl. durch einen Precompiler vorverarbeiteten Quellcode eines Programms und erzeugt dabei in prozessorspezifischem Objektcode ein ‚Objektmodul‘. Dieses wird mit dem 'Linkage Editor' verarbeitet, wobei die Objektmodule evtl. aufgerufener Unterprogramme und sprachspezifische Systemmodule, optionsabhängig statisch oder dynamisch „hinzugebunden“ werden. Ergebnis ist ein Lademodul, das zur Ausführung durch ein EXEC-Kommando in den Job-Steueranweisungen oder (bei dynamisch gebundenen Unterprogrammen) erst bei deren erstem Aufruf vom Lader des Betriebssystems in den Hauptspeicher geladen und gestartet wird.

Analog zu diesem Schema werden auch Assemblerprogramme übersetzt: Statt dem 3GL-Compiler kommt ein Assembler zum Erzeugen des Objektcodes zum Einsatz.

Szenario MS Access (IDE)

Kompilierung nur bei VBA-Code, sonst Interpretertechnik

Bei Anwendungen, die zum Beispiel mit MS Access (einer 'IDE') erstellt wurden, werden die programmierten Anweisungen wie folgt zur Ausführung gebracht: Vom Softwareentwickler wird vorwiegend deklarativ nur spezifiziert, was entstehen soll (z. B. Formulare, Reports, SQL-Datenzugriffe, Makros etc.), also keine Befehle im imperativen Sinn. Daraus erzeugen die (Grafik-) Editoren beim Programmieren „Objektproperties“ oder ein SQL-Codegenerator SQL-Kommandos. Zum Ablauf der so entwickelten Anwendung wird die Datenbanksoftware als Laufzeitumgebung nach objekt-/ereignisorientierten Prizinpien ausgeführt, wobei diese die programmierten Spezifikationen beim Eintritt bestimmter Ereignisse bestimmungsgemäß verarbeitet – und diese damit konkret ‚ausführt‘. Nach ähnlichem Prinzip arbeiten auch Reportgeneratoren wenn sie Berichte erzeugen.
Ausnahme VBA: Falls in der Anwendung VBA-Anweisungen implementiert wurden, werden diese bei der ersten Ausführung der Anwendung automatisch und einmalig kompiliert, wobei ein optimierter Zwischencode entsteht, hier „P-Code“ genannt. Dieser wird in der MDB gespeichert und über einen Interpreter 'Befehl für Befehl' ausgeführt.[5]
Alle Daten der Anwendung werden in einer Datei mit der Dateiendung MDB gespeichert. Diese ist somit gleichzeitig eine Ausführbare Datei und sie enthält alle Anweisungen aus allen Stufen der ‚Programmierung‘, also Daten-, Formular- und Berichtsdefinitionen, Datenzugriffe, VBA-Befehle, Makros und auch den ggf. erzeugten P-Code. Optional können in der MDB auch die Anwendungsdaten selbst gespeichert werden.

Fazit: Alle definierten Anweisungen und Festlegungen werden ausnahmslos durch Teilkomponenten von MS Access verarbeitet. Sie kommen durch entsprechend modifizierte Maschinenbefehle der Access-Ablaufumgebung zur Ausführung; aus VBA-Zwischencode erzeugt ein Interpreter die entsprechenden Befehle.

Einzelnachweise

  1. Online Enzyklopädie [1] 'Maschinencode'
  2. Jürgen Bayer Visual C# 2008[2] Kapitel 14.3 Triffer
  3. a b TU Wien [3] (PDF; 74 kB)
  4. Uni Giessen [4] (PDF; 276 kB)
  5. Microsoft Support [5]