То, сколько передает по коду gcc, использует?

  • Специально для C и C++, сколько передач используется по умолчанию?
  • Это число изменяется в зависимости от уровня используемой оптимизации? (это должно),
  • Это может быть изменено непосредственно?
  • Я искал эту информацию в http://gcc.gnu.org/, но гуглил использование site:http://gcc.gnu.org/ ни к чему не привел.

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


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

20
задан Lazer 24 June 2010 в 17:27
поделиться

6 ответов

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

6
ответ дан 30 November 2019 в 01:34
поделиться

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

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

1
ответ дан 30 November 2019 в 01:34
поделиться

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

Class A {
   B* b; 
}

Class B {
   A* a;
}

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

Но опять же, я не разбираюсь в компиляторах.

0
ответ дан 30 November 2019 в 01:34
поделиться

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

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

0
ответ дан 30 November 2019 в 01:34
поделиться

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

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

Многопроходный компилятор

Bei diesem Compilertyp wird der Quellcode in Mehreren Schritten в логове 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 Компилятор und das zu übersetzende Programm gleichzeitig im Hauptspeicher zu halten. Heutzutage dient ein Многопроходный компилятор для всех, Vorwärtsreferenzen (Deklaration eines Bezeichners nach dessen erster Verwendung) aufzulösen und aufwendige Optimierungen durchzuführen.

0
ответ дан 30 November 2019 в 01:34
поделиться

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

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

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

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

-3
ответ дан 30 November 2019 в 01:34
поделиться