Wie viele Durchgänge über den Code verwendet gcc?

Lesezeit: 5 Minuten

Benutzer-Avatar
Laser

  • Wie viele Durchläufe werden speziell für C und C++ standardmäßig verwendet?
  • Ändert sich diese Zahl je nach verwendeter Optimierungsstufe? (es sollte)
  • Kann es direkt geändert werden?

Ich suchte nach diesen Informationen in http://gcc.gnu.org/aber googeln mit site:http://gcc.gnu.org/ hat nichts gebracht.

Alle Hinweise auf Dokumentationen zu diesem Thema sind ebenfalls hilfreich.


Mit pass meinte ich a übergehen nur die ursprüngliche Darstellung des Quellcodes und nicht die von vorgeschlagene Multiple-Pass-Definition Wikipedia.

  • +1, obwohl ich mich frage, warum es einen Grund geben sollte, den Code mehr als zweimal zu übergeben. Ein Durchgang für den Vorprozessor und ein weiterer, um den Code zur weiteren Analyse in einen abstrakten Syntaxbaum zu laden.

    – Justin Ethier

    24. Juni 2010 um 16:40 Uhr

  • Ich stimme zu, es sollte nicht nötig sein, mehr als zweimal zu bestehen. Einmal für den Präprozessor und einmal für den Compiler. Allerdings vermute ich, dass der Compiler den Syntaxbaum dann mehrfach übergehen wird!

    – Matthias M.

    24. Juni 2010 um 16:44 Uhr

  • @Justin Ethier, also wird Code nicht mehr “übersprungen”, sobald er eine AST oder eine andere Zwischendarstellung getroffen hat? (Die Frage scheint in dieser Hinsicht etwas unklar) 🙂

    Benutzer166390

    24. Juni 2010 um 16:44 Uhr


  • @Matthieu – Einverstanden, der AST würde mit ziemlicher Sicherheit mehrmals übergangen werden. Ich stelle mir vor, dass die genaue Anzahl von so vielen Faktoren (fraglicher Code, Compileroptionen, Zielarchitektur usw.) abhängt, dass sie an und für sich nicht wirklich aussagekräftig ist. Was nützlicher wäre, wäre eine allgemeine Beschreibung, wie der Compiler intern arbeitet, oder um den Code zu lesen 🙂

    – Justin Ethier

    24. Juni 2010 um 16:52 Uhr

  • Die Vorverarbeitung muss nicht unbedingt in einem separaten Durchlauf erfolgen.

    – James McNellis

    24. Juni 2010 um 17:05 Uhr

Pässe und Dateien des Compilers könnte dem, was Sie suchen, am nächsten kommen.

Wie bereits oben erwähnt, führen moderne Compiler nur einen einzigen Durchgang in der Parsing-Phase und dann mehrere in späteren Phasen durch, indem sie eine interne Darstellung verwenden (normalerweise Bäume oder andere graphenähnliche Datenstrukturen im Arbeitsspeicher).

Konkret verwendet GCC diesen Ansatz. Sehen: https://gcc.gnu.org/onlinedocs/gccint/Parsing-pass.html#Parsing-pass

Benutzer-Avatar
Neel

In gcc gibt es grundsätzlich zwei Arten von Pässen, nämlich: gimple, rtl. In gcc 4.6.2 beträgt die Gesamtzahl eindeutiger Durchläufe 207. Ja, die Gesamtzahl der Durchläufe für ein bestimmtes Programm hängt von der Optimierungsstufe ab. Und einige dieser Pässe werden mehr als einmal genommen. Wenn jemand diese Pässe durchlaufen möchte, gehen Sie die Datei “passes.c” im gcc-Quellcode durch. Pfad für passs.c in gcc 4.6.2: gcc source -> gcc -> passs.c

Ja, Sie können die Anzahl der Durchgänge ändern, indem Sie Ihre Durchgänge als dynamisches Plugin in gcc hinzufügen.

  • Sie werden den automatischen Postban auslösen, indem Sie so viele Ihrer Antworten löschen.

    Benutzer1228

    13. August 2012 um 10:36 Uhr

Ich habe noch nie von einem Compiler gehört, der die Textdarstellung mehrmals übergibt (außer wenn Sie den Präprozessor als einen Durchgang zählen). Selbst wenn Compiler mehrere Durchgänge hatten, die über Dateien kommunizierten, enthielten die Dateien eine Zwischendarstellung (serialisierte AST + Symboltabelle).

Assembler hingegen führten routinemäßig zwei (oder mehr) Durchgänge über den Quellcode durch. Ihr Präprozessor erlaubt es oft, bestimmte Dinge in einem Durchgang zu tun, wodurch ein mehr oder weniger schmutziger Trick gespielt werden kann.

Nach dem, was mir jemand in meiner Compiler-Designklasse gesagt hat, führt gcc einen einzigen Durchgang aus, während andere Compiler, wie die von Visual Studio (Standard), zwei Durchgänge verwenden. Aus diesem Grund müssen Sie Klassen in C++ vorwärts deklarieren, wenn Sie sie in einer zirkulären Form verwenden.

Class A {
   B* b; 
}

Class B {
   A* a;
}

C# und andere Sprachen erfordern dies nicht, da der erste Durchlauf die Referenzen erstellt und der zweite Durchlauf kompiliert.

Aber andererseits bin ich kein Experte für Compiler.

  • Die Forward-Deklaration ist eine Eigenschaft der Sprache und hat nichts mit gcc zu tun. Es kann mit der Implementierung des ursprünglichen C-Compilers von K&R zusammenhängen.

    – David Thornley

    24. Juni 2010 um 17:07 Uhr

  • Dies hängt mehr mit dem Begriff der unabhängigen Übersetzungseinheiten und der Verknüpfung zusammen. Dies ist wohl ein separater Compiler-Pass, aber kein GCC-Pass.

    – MSalter

    25. Juni 2010 um 9:23 Uhr

Benutzer-Avatar
AnT steht zu Russland

Genau eine. Ich sehe keinen sinnvollen Grund für einen modernen Compiler, den Quellcode mehr als einmal zu übergehen, wenn Sie mit “Code” die ursprüngliche Textdarstellung der Programmquelle meinen. Der ganze Sinn dieses einzelnen Durchgangs besteht darin, den Quellcode in eine interne Darstellung umzuwandeln, die für weitere Analysen verwendet wird. Diese interne Repräsentation muss keine lineare Struktur mehr haben und/oder sich nicht mehr nur auf eine sequentielle Verarbeitung beschränken, was bedeutet, dass der Begriff des „Übergehens“ einfach nicht mehr anwendbar ist.

Wenn diese Antwort Sie nicht zufriedenstellt, sollten Sie wahrscheinlich eine genauere Erklärung dessen geben, was Sie als “Übergang” des Quellcodes definieren.

  • Die Forward-Deklaration ist eine Eigenschaft der Sprache und hat nichts mit gcc zu tun. Es kann mit der Implementierung des ursprünglichen C-Compilers von K&R zusammenhängen.

    – David Thornley

    24. Juni 2010 um 17:07 Uhr

  • Dies hängt mehr mit dem Begriff der unabhängigen Übersetzungseinheiten und der Verknüpfung zusammen. Dies ist wohl ein separater Compiler-Pass, aber kein GCC-Pass.

    – MSalter

    25. Juni 2010 um 9:23 Uhr

Ihre Definition von Multi-Pass scheint alt zu sein und stammt aus Zeiten, in denen (eine Darstellung) ganzer Programmquellen einfach nicht in den verfügbaren Speicher passte. Diese Zeiten sind nun vorbei und ich kenne keinen einzigen, aktuellen Multi-Pass (alte Definition) Compiler.

Im deutschen Wikipedia-Eintrag für Compiler sind beide Definitionen angegeben: http://de.wikipedia.org/wiki/Compiler

Multi-Pass-Compiler

Bei diesem Compilertyp wird der Quellcode in mehreren Schritten in den Zielcode übersetzt. In den Anfangszeiten des Compilerbaus wurde der Übersetzungsprozess hauptsächlich in mehreren Durchläufen zerlegt, weil die Kapazität des Computers oft nicht ausreichte, um den vollständigen Compiler und das zu übersetzende Programm gleichzeitig im Hauptspeicher zu halten. Heutzutage dient ein Multi-Pass-Compiler vor allem dazu, Vorwärtsreferenzen (Deklaration eines Bezeichners nach dessen erster Verwendung) aufzulösen und aufwendige Optimierungen durchzuführen.

  • Vielleicht bin ich zu voreingenommen, aber ich verstehe, dass Zitate aus der englischen Wikipedia im Allgemeinen nützlicher sind. Vielen Dank.

    – Iskander Scharipow

    8. Juli 2017 um 8:58 Uhr

  • @IskanderSharipov Ich stimme voll und ganz zu. Leider habe ich keinen entsprechenden Eintrag in der englischen Wikipedia gefunden. Der mit dem Namen “Multi-Pass-Compiler” wurde vom Autor der Frage abgelehnt, da er andere Darstellungen als den ursprünglichen Quellcode übergibt.

    – Peter g.

    9. Juli 2017 um 14:50 Uhr

1333150cookie-checkWie viele Durchgänge über den Code verwendet gcc?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy