Я искал эту информацию в http://gcc.gnu.org/, но гуглил использование site:http://gcc.gnu.org/
ни к чему не привел.
Любые указатели на любую документацию об этом также будут полезны.
Передачей я подразумевал, что передача по исходному представлению исходного кода только а не нескольких передает определение, предложенное Википедией.
Проходы и файлы компилятора могут быть наиболее близки к тому, что вы ищете.
Я никогда не слышал, чтобы компилятор несколько раз передавал текстовое представление (за исключением, если вы считаете препроцессор за один проход). Даже когда у компиляторов было несколько проходов, обменивающихся файлами, файлы содержали промежуточное представление (сериализованную таблицу символов AST +).
Ассемблеры, с другой стороны, обычно выполняли два (или более) прохода над исходным кодом. Их препроцессор часто позволяет делать что-то конкретно за один проход, позволяя сыграть более или менее пакость.
Из того, что мне сказал кто-то в моем классе разработки компилятора, gcc выполняет один проход, тогда как другие компиляторы, подобные тем, которые используются в Visual Studio (по умолчанию), используют два прохода. Вот почему вы должны объявлять классы в C ++, если вы используете их циклически.
Class A {
B* b;
}
Class B {
A* a;
}
C # и другие языки этого не требуют, поскольку первый проход создает ссылки, а второй - компилируется.
Но опять же, я не разбираюсь в компиляторах.
Ровно одно. Я не вижу никакой значимой причины для любого современного компилятора делать более одного прохода по исходному коду, если под "кодом" вы подразумеваете оригинальное текстовое представление исходного текста программы. Весь смысл этого единственного прохода заключается в преобразовании исходного кода в некоторое внутреннее представление, которое будет использоваться для дальнейшего анализа. Это внутреннее представление больше не обязано иметь какую-либо линейную структуру и/или не обязано ограничиваться только последовательной обработкой, что означает, что понятие "сделать проход" над ним просто неприменимо.
Если этот ответ вас не удовлетворяет, вам, вероятно, следует дать более точное объяснение того, что вы определяете как "проход" над исходным кодом.
Ваше определение многопроходности кажется старым, восходящим к тем временам, когда (представление) целых программных источников просто не помещалось в доступную память. Эти времена прошли, и я не знаю ни одного текущего многопроходного компилятора (старое определение).
В немецкой статье Википедии для компилятора даны оба определения: 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.
Вы имеете в виду передает исходный код ? Только раз. Это называется фазой «токенизации» или «лексического анализа» или, в более широком смысле, «синтаксическим анализом».
Вы имеете в виду этапов в компиляторе? Есть несколько. В наши дни термин «проход» - это скорее концепция старого ассемблера, чем концепция компилятора, и даже тогда он используется лишь приблизительно. Термин «проход» не имеет единого определения.
Компиляторы разбиты на «фазы». Прочтите введение к любому учебнику по компилятору. Он объяснит фазы (есть около дюжины логических фаз), и GCC довольно точно следует моделям из учебника. Некоторые фазы обычно объединяются в один «проход», другие - в отдельные «проходы».
Концепция прохода на самом деле не так полезна с точки зрения обсуждения компиляторов, как концепция фазы .