Zum Inhalt springen

„Programmcode“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][ungesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K +QSI
siehe QS-Diskussion
Zeile 1: Zeile 1:
{{Begriffsklärung}}
{{QS-Informatik}}
Als ''Programmcode'' bezeichnet man die Menge der [[Anweisung (Programmierung)|Anweisungen]] eines [[Computerprogramm|Computerprogramms]].
[[Datei:Programmcode.png|miniatur|'Programmcode', Begriffszusammenhänge und im Sprachgebrauch auftretende Synonyme]]
In folgenden Arten von Programmcode wird unterschieden:
Als '''Programmcode''' bezeichnet man die Folge/Menge der [[Anweisung (Programmierung)|Anweisungen]] eines [[Computerprogramm]]s.
* ''[[Quelltext]]'' ist die für Menschen lesbare Form eines Computerprogramms.
Man unterscheidet verschiedene Arten von Programmcode:
* ''[[Zwischencode]]'' wird beim [[Compiler|Kompiliervorgang]] erzeugt und anschließend [[Interpreter|interpretiert]] oder in andere [[Formale Sprache|formale Sprachen]], z.B. Maschinencode, übersetzt.
* ''[[Quelltext]]'' – ein für Menschen lesbarer, in einer Programmiersprache geschriebener Text eines Computerprogrammes.
* ''[[Zwischencode]]'' - ein Programmcode, der als Zwischenschritt im [[Compiler|Kompiliervorgang]] auftritt und weiter übersetzt oder [[Interpreter|interpretiert]] wird.
** [[Bytecode]] ist ein ''Zwischencode'', der zur [[Laufzeitumgebung|Laufzeit]] in ''Maschinencode'' übersetzt wird.
* ''[[Maschinencode]]'' - Anweisungen in codierter Form, die von einer Maschine direkt ausgeführt werden können.
* ''[[Maschinencode]]'' kann von der Maschine direkt ausgeführt werden, ist für Menschen jedoch nicht oder nur schwer lesbar.

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 [[Imperative Programmierung|imperativen]] ''Befehlstexten'' oder [[Deklarative Programmierung|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 [[Programmbibliothek]]en) 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 [[Programmiersprache]]n und [[Programmierparadigma|Programmierparadigmen]] führte zu vielen unterschiedlichen Formen von Programmcode – die in der Praxis auch entsprechend anzutreffen sind.

''Unterschiedliche Bedeutungen und Synonyme:'' <br />
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 [[Maschinensprache#Maschinenprogramm|Maschinenprogramm]] oder i.&nbsp;S. von [[Maschinensprache]]<ref>Online Enzyklopädie [http://www.enzyklo.de/Begriff/Maschinencode] 'Maschinencode'</ref>. <br />
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.<!--evtl. wäre es nützlich/besser, die jeweiligen Synonyme HIER oder OBEN aufzuzählen-->

''Abgrenzung:'' <br />
Bei [[Anwendungssoftware|Anwendungen]], die mithilfe von Formular- oder [[Reportgenerator]]en oder z.&nbsp;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.&nbsp;B. über eine [[Grafische Programmiersprache]] als [[Parameter (Informatik)|Parameter]] oder objekt-/ereignisbezogene [[Attribut (Objekt)|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.<ref>Jürgen Bayer ''Visual C# 2008''[http://books.google.de/books?id=LFMhNmBx8RgC&pg=PA899&lpg=PA899&dq=programmcode+deklarativ&source=bl&ots=S7rbfuI4kK&sig=f6jIrMG9kK0gXoCQAVqFkJ3Azzg&hl=de&sa=X&ei=TOwMUuaUHczwhQeX74D4BQ&ved=0CEIQ6AEwBDge#v=onepage&q=programmcode%20deklarativ&f=false] ''Kapitel 14.3 Triffer''</ref>
== Werkzeuge zur Programmcode-Verarbeitung (Überblick) ==
Die Varianten von Programmcode sind Zwischen- oder Endergebnisse bei der [[Softwaretechnik|Entwicklung]] von [[Software]], deren Zweck es letztlich ist, von ihren [[Anwender]]n genutzt, d.&nbsp;h. von einem Computer [[Prozessor#Funktionsweise|'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.&nbsp;B. [[UML]]-Modellen oder [[Struktogramm]]en) Quelltext für eine gewählte Programmiersprache. Siehe Hauptartikel [[Codegenerator]].

=== Programmcode-Konvertierung ===
[[Datei:Quellcode zur Ausführung.png|miniatur|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 [[Maschinensprache#Maschinenprogramm|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. <!-- keine Details! Diese finden sich in den jeweils per Link angesprochenen Hauptartikeln! -->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.<ref name="TUWien">TU Wien [http://www.complang.tuwien.ac.at/lehre/ubvo/Kap01.pdf] (PDF; 74&nbsp;kB)</ref> Siehe Hauptartikel [[Compiler]].
:Compiler erzeugen entweder [[Maschinencode]] (auch [[Objektcode|Objektprogramm]] genannt<ref Name="UniGi">Uni Giessen [http://www.uni-giessen.de/~gc1079/compiler/compiler.pdf] (PDF; 276&nbsp;kB)</ref>) oder aus Gründen der Hardwareunabhängigkeit sog. [[Zwischencode]] (z.&nbsp;B. [[Bytecode]] oder auch [[Assemblersprache|Assemblercode]]), der durch weitere Transformationsschritte zu ausführbarem Code wird.
:Beim Übersetzen durch einen Compiler werden grundsätzlich zwei Varianten unterschieden: Die [[AOT-Compiler|„Ahead-of-time-Kompilierung“]] (der Programmcode wird nur einmalig in einen ausführbaren Code übersetzt und mehrfach zur Ausführung verwendet) und die [[JIT-Compiler|„Just-in-Time-Kompilierung“]] (der Programmtext wird direkt vor jedem Programmlauf übersetzt).
:Um den Compiler herum <!--bessere, genauere Formulierung?-->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<ref name="TUWien"/> oder [[Compiler#Sonderformen|„Compreter“]] – zur Laufzeit des Programms einlesen, analysieren und einzeln in Anweisungen konvertieren, die der Prozessor jeweils sofort ausführt. Siehe Hauptartikel [[Interpreter]].

=== Hilfswerkzeuge i.&nbsp;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 [[Modul (Software)|Programmmodule]] zu einer ausführbaren Datei zusammenstellt (verbindet), wodurch zum Beispiel [[Unterprogramm]]en 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 [[Unterprogramm]]e 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 ===
*'''[[Debugger]]''' sind Computerprogramme, die Programmierer zum Prüfen oder zum Finden und Analysieren von Fehlern verwenden können.
*'''[[Decompiler]]''' können die Anweisungen aus der [[Maschinensprache]] wieder lesbaren [[Quellcode]] in einer [[Höhere Programmiersprache|Hochsprache]] erzeugen.
* Ähnlich verfahren '''[[Disassembler]]''', die Anweisungen aus der Maschinensprache in die [[Assemblersprache]] rückübersetzen.
* [[Systemsoftware]] zur '''Verwaltung von Programmcode''' in [[Programmbibliothek]]en

== Beispiele für Szenarien zur Code-Übersetzung/-Umwandlung ==
Zur Transformation (Umwandlung, Übersetzung, Konvertierung) der von Programmierern erstellten [[Anweisung (Programmierung)|Anweisungen]] in die zur physischen Ausführung im [[Prozessor]] erforderlichen Maschinenbefehle werden in den verschiedenen [[Entwicklungsumgebung]]en und Programmiersprachen unterschiedliche Verfahren angewendet. Die nachfolgenden Abschnitte zeigen dafür Beispiele.

===Szenario IBM-Großrechner mit 3GL===
[[Datei:Compilerszenario Großrechner.png|miniatur||Ablaufbeispiel IBM-Großrechner / 3GL-Sprache]]
<!--Beispiel Cobol 1980er Jahre)-->Der Compiler übersetzt den evtl. durch einen Precompiler vorverarbeiteten [[Quellcode]] eines Programms und erzeugt dabei in prozessorspezifischem [[Objektcode]] ein ‚Objektmodul‘. Dieses wird mit dem [[Linker (Computerprogramm)|'Linkage Editor']] verarbeitet, wobei die Objektmodule evtl. aufgerufener [[Unterprogramm]]e und sprachspezifische Systemmodule, optionsabhängig [[Linker (Computerprogramm)#Statisches Linken|statisch oder dynamisch]] „hinzugebunden“ werden. Ergebnis ist ein [[Lademodul]], das zur Ausführung durch ein EXEC-Kommando in den [[Job Control Language|Job-Steueranweisungen]] oder (bei dynamisch gebundenen Unterprogrammen) erst bei deren erstem Aufruf vom [[Lader (Programmierung)|Lader]] des Betriebssystems in den Hauptspeicher geladen und gestartet wird.

Analog zu diesem Schema werden auch [[Assemblersprache|Assemblerprogramme]] übersetzt: Statt dem 3GL-Compiler kommt ein [[Assembler (Informatik)|Assembler]] zum Erzeugen des Objektcodes zum Einsatz.

<!--===Szenario Interpreter aus Quellcode===
...offen, noch texten - bis dahin ausblenden.

===Szenario Interpreter mit Zwischencode===
...offen, noch texten - bis dahin ausblenden.
-->
===Szenario MS Access (IDE) ===
[[Datei:Compilerszenario_Access.png|miniatur||Kompilierung nur bei VBA-Code, sonst Interpretertechnik]]
Bei Anwendungen, die zum Beispiel mit [[Microsoft Access|MS Access]] (einer [[Integrierte Entwicklungsumgebung|'IDE']]) erstellt wurden, werden die programmierten Anweisungen wie folgt zur Ausführung gebracht: Vom [[Softwareentwickler]] wird vorwiegend [[Deklarative Programmierung|deklarativ]] nur spezifiziert, ''was'' entstehen soll (z.&nbsp;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 [[Spezifikation]]en beim Eintritt bestimmter Ereignisse bestimmungsgemäß verarbeitet – und diese damit konkret ‚ausführt‘. Nach ähnlichem Prinzip arbeiten auch [[Reportgenerator]]en wenn sie Berichte erzeugen.<br />
''Ausnahme VBA:'' Falls in der Anwendung [[Visual Basic for Applications|VBA-Anweisungen]] [[Implementierung|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.<ref>Microsoft Support [http://support.microsoft.com/kb/209176/de]</ref><br />
Alle Daten der Anwendung werden in einer [[Datei]] mit der Dateiendung [[Microsoft Access Database|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 [[Daten|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.
<!--====Szenario Internet-Browser====
''Anmerkung:'' Ausgeführt wird optional zB Java-Code. Sonst noch was?<br />
... offen -->

== Einzelnachweise ==
<references />

[[Kategorie:Programmiersprache]]
[[Kategorie:Programmierwerkzeug| ]]

Version vom 8. Februar 2015, 21:15 Uhr

Als Programmcode bezeichnet man die Menge der Anweisungen eines Computerprogramms. In folgenden Arten von Programmcode wird unterschieden: