Подтвердить что ты не робот

Сколько пропусков над кодом использует gcc?

  • В частности, для C и С++, сколько проходов используется по умолчанию?
  • Изменяется ли это число в зависимости от используемого уровня оптимизации? (он должен)
  • Можно ли его изменить напрямую?

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

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


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

4b9b3361

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Class A {
   B* b; 
}

Class B {
   A* a;
}

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

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

Ответ 6

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

Если этот ответ вас не удовлетворяет, вы должны, вероятно, предоставить более точное объяснение того, что вы определяете как "проход" по исходному коду.

Ответ 7

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

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

Multi-пасс-компилятор

Bei diesem Compilertyp wird der Quellcode в mehreren Шрифты в den Zielcode übersetzt. В ден Anfangszeiten des Compilerbaus wurde der Übersetzungsprozess hauptsächlich deshalb в mehrere Durchläufe zerlegt, weil die Kapazität der Computer oft nicht ausreichte, um den vollständigen Компилятор и das zu übersetzende Программа 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.

Ответ 8

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

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

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

Концепция прохода действительно не так полезна в плане обсуждения компиляторов как концепции фазы.