Сколько проходов по коду использует gcc? - PullRequest
19 голосов
/ 24 июня 2010
  • В частности, для C и C ++, сколько проходов используется по умолчанию?
  • Меняется ли это число в зависимости от используемого уровня оптимизации?(это должно быть)
  • Можно ли изменить это напрямую?

Я искал эту информацию в http://gcc.gnu.org/,, но поиск в Google с использованием site:http://gcc.gnu.org/ не далчто угодно.

Любые указатели на любую документацию по этому вопросу также будут полезны.


Под проходом я подразумевал пропуск исходного кода исходного кода только а не определение множественного прохода, предложенное Wikipedia .

Ответы [ 8 ]

6 голосов
/ 24 июня 2010

Проходы и файлы компилятора , возможно, ближе всего к тому, что вы ищете.

2 голосов
/ 05 августа 2017

Как уже указывалось выше, современные компиляторы выполняют только один проход на этапе синтаксического анализа, а затем несколько проходов на более поздних этапах с использованием внутреннего представления (обычно это деревья или другая структура данных в виде графа в памяти).

Конкретно GCC использует этот подход. Смотри: https://gcc.gnu.org/onlinedocs/gccint/Parsing-pass.html#Parsing-pass

1 голос
/ 10 июля 2012

В gcc, в основном, есть два типа проходов, а именно: gimple, rtl. В gcc 4.6.2 общее количество уникальных проходов равно 207. Да, общее количество проходов в данной программе зависит от уровня оптимизации. И некоторые из этих пропусков принимаются более одного раза. Если кто-то хочет пройти через эти проходы, просмотрите файл pass.c в исходном коде gcc. Путь для pass.c в gcc 4.6.2: gcc source -> gcc -> pass.c

Да, вы можете изменить количество проходов, добавив свои проходы как динамический плагин в gcc.

1 голос
/ 24 июня 2010

Я никогда не слышал о том, чтобы компилятор проходил несколько раз по текстовому представлению (исключая, если вы считаете препроцессор одним проходом).Даже когда компиляторы имели несколько проходов, обменивающихся файлами, файлы содержали промежуточное представление (сериализованная таблица символов AST +).

С другой стороны, ассемблеры обычно делали два (или более) прохода по исходному коду.Их препроцессор часто позволяет делать что-то определенно за один проход, позволяя разыграть более-менее подвох.

0 голосов
/ 24 июня 2010

Ваше определение многопроходности кажется старым, вытекающим из того времени, когда (представление) целых исходных программ просто не помещалось в доступную память. Сейчас это время прошло, и я не знаю ни одного текущего многопроходного (старого определения) компилятора.

В немецкой статье Википедии для компилятора даны оба определения: http://de.wikipedia.org/wiki/Compiler

многоходовой-Compiler

Bei diesem Compilertyp wird der Quellcode в mehreren Schritten in den Zielcode übersetzt. В ден Anfangszeiten des Compilerbaus wurde der Übersetzungsprozess hauptsächlich deshalb in mehrere Durchläufe zerlegt, weil die Kapazität der Computer oft Ничто не изменится, ум ден Vollständigen Compiler und das zu übersetzende Программа gleichzeitig im Hauptspeicher Зу Халтен. Heutzutage Dient Ein Multi-Pass-Compiler vor allem dazu, Vorwärtsreferenzen (Декларация Эйнс Bezeichners nach dessen erster Verwendung) aufzulösen und aufwendige Optimierungen durchzuführen.

0 голосов
/ 24 июня 2010

Точно один.Я не вижу какой-либо значимой причины для какого-либо современного компилятора делать более одного прохода над исходным кодом, если под «кодом» вы подразумеваете исходное текстовое представление исходного кода программы.Весь смысл этого единственного прохода состоит в том, чтобы преобразовать исходный код в некоторое внутреннее представление, которое будет использоваться для дальнейшего анализа.Это внутреннее представление больше не должно иметь какой-либо линейной структуры и / или больше не должно быть ограничено только последовательной обработкой, что означает, что понятие «проход» над ним просто больше не применимо.* Если этот ответ вас не устраивает, вам, вероятно, следует дать более точное объяснение того, что вы определяете как «пропуск» исходного кода.

0 голосов
/ 24 июня 2010

Вы имеете в виду проходы по исходному коду ?Только раз.Это называется фазой «токенизации» или «лексического анализа», или, в более широком смысле, «синтаксическим анализом».Есть несколько.Термин «pass» в действительности является скорее старой концепцией ассемблера, чем концепцией компилятора, и даже тогда он используется только приблизительно.Термин «пройти» не имеет единого определения.

Компиляторы разбиты на «фазы».Прочитайте вступление к любому учебнику по компилятору.Это объяснит фазы (есть приблизительно дюжина логических фаз), и GCC довольно точно следует моделям учебника.Некоторые фазы обычно объединяются в один «проход», другие - отдельные «проходы».

Концепция pass на самом деле не так полезна для обсуждения компиляторов, как концепция phase .

0 голосов
/ 24 июня 2010

Из того, что мне сказал кто-то из моего класса разработки компиляторов, gcc делает один проход, тогда как другие компиляторы, такие как используемые Visual Studio (по умолчанию), используют два прохода. Вот почему вы должны заранее объявить классы в c ++, если вы используете их в циклическом режиме.

Class A {
   B* b; 
}

Class B {
   A* a;
}

C # и другие языки не требуют этого, так как первый проход строит ссылки, а второй проход компилируется.

Но опять же я не эксперт в компиляторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...