Phase vs. Pass im Compiler
Im Allgemeinen ist ein Compiler ein Computerprogramm, das ein Programm liest, das in einer Sprache geschrieben ist, die als Ausgangssprache bezeichnet wird, und es in eine andere Sprache übersetzt, die als Zielsprache bezeichnet wird. Traditionell war die Quellsprache eine Hochsprache wie C++ und die Zielsprache eine Niedrigsprache wie die Assemblersprache. Im Allgemeinen können Compiler also als Übersetzer angesehen werden, die von einer Sprache in eine andere übersetzen. Pass und Phase sind zwei Begriffe, die häufig bei Compilern verwendet werden. Die Anzahl der Durchgänge eines Compilers ist die Anzahl der Male, die er über die Quelle (oder eine Form der Darstellung davon) geht. Ein Compiler ist zur einfacheren Konstruktion in Teile zerlegt. Phase wird oft verwendet, um einen solchen einzelnen unabhängigen Teil eines Compilers aufzurufen.
Was ist ein Pass in einem Compiler?
Compiler werden standardmäßig nach der Anzahl der „Durchgänge“klassifiziert. Normalerweise ist das Kompilieren ein relativ ressourcenintensiver Prozess, und anfangs verfügten Computer nicht über genügend Speicher, um ein solches Programm zu speichern, das die gesamte Arbeit erledigte. Aufgrund dieser Beschränkung der Hardwareressourcen in frühen Computern wurden Compiler in kleinere Unterprogramme zerlegt, die ihre Teilaufgabe erledigten, indem sie den Quellcode durchgingen (einen „Durchgang“über die Quelle oder eine andere Form davon machten) und Analysen durchführten, Transformationen und Übersetzungsaufgaben getrennt. Abhängig von dieser Klassifizierung werden Compiler also als One-Pass- oder Multi-Pass-Compiler identifiziert.
Wie der Name schon sagt, kompilieren One-Pass-Compiler in einem einzigen Durchgang. Es ist einfacher, einen One-Pass-Compiler zu schreiben, und sie arbeiten auch schneller als Multi-Pass-Compiler. Daher wurden schon zu Zeiten der Ressourcenknappheit Sprachen so konzipiert, dass sie in einem Durchgang kompiliert werden konnten (z. B. Pascal). Andererseits besteht ein typischer Multi-Pass-Compiler aus mehreren Hauptstufen. Die erste Stufe ist der Scanner (auch bekannt als lexikalischer Analysator). Der Scanner liest das Programm und wandelt es in eine Zeichenfolge von Tokens um. Die zweite Stufe ist der Parser. Es wandelt die Zeichenkette in einen Analysebaum (oder einen abstrakten Syntaxbaum) um, der die syntaktische Struktur des Programms erfasst. Die nächste Stufe ist die, die die Semantik der syntaktischen Struktur interpretiert. Darauf folgen die Phasen der Codeoptimierung und die abschließende Phase der Codegenerierung.
Was ist eine Phase in einem Compiler?
Der Begriff Phase fällt oft, wenn es um den Compilerbau geht. Ursprünglich waren Compiler alle einfachen Teile einer einzelnen, monolithischen Software, die von einer Person für die Kompilierung einer einfachen Sprache geschrieben wurde. Wenn der Quellcode der zu übersetzenden Sprache jedoch komplex und umfangreich wird, wurde der Compiler in mehrere (relativ unabhängige) Phasen zerlegt. Der Vorteil der unterschiedlichen Phasen besteht darin, dass die Entwicklung des Compilers auf ein Team von Entwicklern verteilt werden kann. Darüber hinaus verbessert es die Modularität und Wiederverwendung, indem es ermöglicht wird, Phasen durch verbesserte zu ersetzen oder zusätzliche Phasen (z. B. weitere Optimierungen) dem Compiler hinzuzufügen. Der Prozess der Aufteilung der Kompilierung in Phasen wurde vom PQCC (Production Quality Compiler-Compiler Project) an der Carnegie Melon University eingeführt. Sie führten die Begriffe Frontend, Middleend und Backend ein. Die meisten Compiler haben mindestens zwei Phasen. Aber normalerweise kapseln Backend und Frontend diese Phasen.
Was ist der Unterschied zwischen Phase und Pass im Compiler?
Phase und Pass sind zwei Begriffe aus dem Compilerbereich. Ein Durchgang ist ein einmaliges Übergehen (Durchlaufen) des Quellcodes oder einer anderen Darstellung davon durch den Compiler. Typischerweise haben die meisten Compiler mindestens zwei Phasen, die als Front-End und Back-End bezeichnet werden, wobei sie entweder One-Pass- oder Multi-Pass-Phasen sein können. Phase wird verwendet, um Compiler nach ihrer Konstruktion zu klassifizieren, während pass verwendet wird, um Compiler nach ihrer Arbeitsweise zu klassifizieren.