<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Zwischencode</id>
	<title>Zwischencode - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Zwischencode"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Zwischencode&amp;action=history"/>
	<updated>2026-05-20T11:55:30Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Zwischencode&amp;diff=152294&amp;oldid=prev</id>
		<title>imported&gt;Trustable: wikilinks</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Zwischencode&amp;diff=152294&amp;oldid=prev"/>
		<updated>2025-09-19T13:42:16Z</updated>

		<summary type="html">&lt;p&gt;wikilinks&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Ein &amp;#039;&amp;#039;&amp;#039;Zwischencode&amp;#039;&amp;#039;&amp;#039; – im weitesten Sinne auch &amp;#039;&amp;#039;&amp;#039;Zwischensprache&amp;#039;&amp;#039;&amp;#039; genannt – ist der [[Programmcode]], der im Verlauf eines [[Compiler|Übersetzungsprozesses]] auf einer [[Abstraktion]]sebene zwischen der höheren Ausgangs[[Programmiersprache|sprache]] und der in der Regel maschinennahen Zielsprache generiert wird. Es handelt sich in erster Linie um einen im [[Compilerbau]] etablierten konzeptionellen Zwischenschritt, der nicht immer mit der Erzeugung von Produkten verbunden ist.&lt;br /&gt;
&lt;br /&gt;
== Geschichte ==&lt;br /&gt;
[[Martin Richards (Informatiker)|Martin Richards]] entwickelte in den späten&amp;amp;nbsp;1960er&amp;amp;nbsp;Jahren für seine Programmiersprache&amp;amp;nbsp;[[Basic Combined Programming Language|BCPL]], den Vorläufer von&amp;amp;nbsp;[[C (Programmiersprache)|C]] und&amp;amp;nbsp;[[C++]], einen Zwischencode namens&amp;amp;nbsp;O-Code (O für [[Objektcode]]), der den eigentlichen [[Compiler]] maschinenunabhängig machte. Dies ermöglichte die leichte [[Portierung (Software)|Portierung]] dieses Compilers auf unterschiedliche [[Prozessor]]en. Der&amp;amp;nbsp;O-Code konnte dann [[interpreter|interpretiert]] oder in maschinenspezifischen Code übersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Die&amp;amp;nbsp;[[UCSD Pascal|UCSD-Pascal]]-Umgebungen aus den späten&amp;amp;nbsp;1970er&amp;amp;nbsp;Jahren verwendeten [[p-Code]]. Der Versuch, vollständig [[Plattformunabhängigkeit|portable]] [[Computerprogramm]]e auf Basis eines interpretierten [[Bytecode]]s zu ermöglichen, scheiterte jedoch weitgehend aufgrund der geringen Geschwindigkeit der damaligen [[Computer]]systeme – man konnte und wollte sich zu dieser Zeit Verlangsamung durch die zusätzliche Indirektion nicht leisten.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
Es kann vorteilhaft sein, nicht direkt Code für den Prozessor des [[Laufzeitsystem]]s zu erzeugen, sondern zunächst nur Zwischencode für einen idealen (bzw. virtuellen) Prozessor, der oft nur durch [[Software]] simuliert wird. Gründe können u.&amp;amp;nbsp;a. sein:&lt;br /&gt;
* Portabilität bzw. Plattformunabhängigkeit (siehe auch [[Java VM]])&lt;br /&gt;
* Vereinfachung des Übersetzungsprozesses (siehe auch [[p-Code]]),&lt;br /&gt;
* allgemeine Optimierungen ([[Effizienz (Informatik)|effizienz]]&amp;lt;nowiki&amp;gt;&amp;lt;/nowiki&amp;gt;steigernde Codetransformationen) können bereits auf dem Zwischencode vorgenommen werden,&lt;br /&gt;
* der Zielprozessor ist noch nicht bequem genug zu programmieren, z.&amp;amp;nbsp;B. weil man gerne [[Gleitkommaoperation|Gleitkommabefehle]] hätte, der Prozessor aber keine&amp;amp;nbsp;[[Gleitkommaeinheit|FPU]] besitzt – ein weiterer Übersetzungsschritt fügt dann Code ein, der diese Befehle mit den vorhandenen Ganzzahlbefehlen simuliert.&lt;br /&gt;
&lt;br /&gt;
== Static Single Assignment ==&lt;br /&gt;
Eine spezielle Klasse von Zwischencode ist die {{lang|en|&amp;#039;&amp;#039;&amp;#039;Static-Single-Assignment&amp;#039;&amp;#039;&amp;#039;}}-Darstellung (auch &amp;#039;&amp;#039;Static Single Assignment Form&amp;#039;&amp;#039;, abgekürzt&amp;amp;nbsp;&amp;#039;&amp;#039;SSA&amp;#039;&amp;#039;). Sie zeichnet sich dadurch aus, dass im Zwischencode jeder [[Variable (Programmierung)|Variable]]n nur einmal ein Wert [[Zuweisung|zugewiesen]] wird. Dadurch werden [[Datenabhängigkeit]]en zwischen Befehlen explizit dargestellt, was für viele Optimierungen von Vorteil ist. Die&amp;amp;nbsp;SSA-Darstellung ist im Allgemeinen nur mit Hilfe von [[Phi-Funktion (Compilerbau)|Phi-Funktionen]] möglich. Die Quellprogramme vieler Programmiersprachen lassen sich ohne größeren Aufwand in eine&amp;amp;nbsp;SSA-Darstellung transformieren. Viele moderne Compiler –&amp;amp;nbsp;darunter die Compiler der&amp;amp;nbsp;[[GNU Compiler Collection]]&amp;amp;nbsp;– verwenden daher SSA-basierten Zwischencode.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Originalcode:&lt;br /&gt;
&lt;br /&gt;
 y:= 1&lt;br /&gt;
 y:= 2&lt;br /&gt;
 x:= y&lt;br /&gt;
&lt;br /&gt;
Zwischencode:&lt;br /&gt;
&lt;br /&gt;
 y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; := 1&lt;br /&gt;
 y&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; := 2&lt;br /&gt;
 x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; := y&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sprachen ==&lt;br /&gt;
Obwohl&amp;amp;nbsp;C nicht als Zwischencode gedacht war, wurde es eine populäre Zwischensprache, da es eine Abstraktion von [[Assemblersprache|Assembler]] und wegen seiner allgemeinen Verfügbarkeit auch die De-facto-Systemsprache von [[Unixoides System|unixartigen]] und anderen [[Betriebssystem]]en ist. So wird&amp;amp;nbsp;C u.&amp;amp;nbsp;a. von folgenden Sprachen als Zwischencode benutzt: [[Eiffel (Programmiersprache)|Eiffel]], [[Sather]], [[Esterel (Programmiersprache)|Esterel]], einige [[Lisp]]-Dialekte ([[Lush (Programmiersprache)|Lush]], [[Scheme#Implementierungen und Entwicklungswerkzeuge|Gambit]]), [[Haskell (Programmiersprache)|Haskell]] ([[Haskell (Programmiersprache)#Implementierungen|Glasgow Haskell Compiler]]), [[Squeak|Squeaks]] Smalltalk-subset Slang, [[Cython]], [[Seed7]], [[Vala (Programmiersprache)|Vala]]. Einige Varianten von&amp;amp;nbsp;C wurden entwickelt, um aus&amp;amp;nbsp;C eine bessere portable [[Assemblersprache]] zu machen: [[C−−]] und [[C Intermediate Language]].&lt;br /&gt;
&lt;br /&gt;
[[Microsoft]]s [[Common Intermediate Language]] ist ein Zwischencode, der von allen [[.Net-Framework]]-Compilern benutzt wird, bevor er statisch oder dynamisch weiter zu [[Maschinencode]] kompiliert wird.&lt;br /&gt;
&lt;br /&gt;
Die&amp;amp;nbsp;[[GNU Compiler Collection]] &amp;amp;nbsp;(GCC) benutzt intern mehrere Zwischencodes, um die Portabilität und [[Cross-Compiler|Cross-Compilation]] zu unterstützen. Zu diesen Sprachen gehören&lt;br /&gt;
* die historische [[GNU Compiler Collection #Backend|Register Transfer Language]]&amp;amp;nbsp;(RTL)&lt;br /&gt;
* das sprachunabhängige Baumformat [[GNU Compiler Collection #Frontends|GENERIC]]&lt;br /&gt;
* das&amp;amp;nbsp;[[#Static Single Assignment|SSA]]-basierte [[GNU Compiler Collection#Frontends|GIMPLE]].&lt;br /&gt;
&lt;br /&gt;
Die meisten Zwischencodesprachen wurden für [[Statische Typisierung|statisch typisiert]]e Sprachen entwickelt. Im Unterschied dazu wurde [[Parrot]] zur Unterstützung der [[Dynamische Typisierung|dynamisch typisierten]] Sprachen [[Perl (Programmiersprache)|Perl]] und [[Python (Programmiersprache)|Python]] entwickelt.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Warren’s Abstract Machine]], eine virtuelle Maschine für Prolog&lt;br /&gt;
* [[Virtualisierung (Informatik)|Virtualisierung]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Compilerbau]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Trustable</name></author>
	</entry>
</feed>