2010-06-24 16 views
19
  • Específicamente para C y C++, ¿cuántos pases se utilizan por defecto?
  • ¿Este número cambia dependiendo del nivel de optimización utilizado? (debería)
  • ¿Se puede cambiar directamente?

que estaba buscando esta información en http://gcc.gnu.org/, pero buscando en Google usando site:http://gcc.gnu.org/ no dió nada.¿Cuántos pases sobre el código usa gcc?

Cualquier apunta a cualquier documentación sobre esto también será útil.


Por pase que significaba un pase sobre la representación original del código fuente única y no la definición de múltiples pasadas sugerido por Wikipedia.

+3

+1, aunque me hace preguntarme por qué habría alguna razón para pasar el código más de dos veces. Una pasada para el preprocesador y otra para cargar el código en un Árbol de sintaxis abstracto para su posterior análisis. –

+1

Acepto, no debería haber necesidad de aprobar más de dos veces. Una vez para el preprocesador y una vez para el compilador. Sin embargo, sospecho que el compilador puede pasar el Árbol de sintaxis más de una vez. –

+0

@Justin Ethier ¿Entonces el código ya no se "pasa por alto" una vez que ha alcanzado un AST o alguna otra representación intermedia?(La pregunta parece un poco confusa en este aspecto) :-) –

Respuesta

0

Según lo que me dijo alguien en mi clase de diseño de compilación, gcc hace una sola pasada, mientras que otros compiladores como los utilizados por Visual Studio (por defecto) usan dos pasadas. Es por eso que debe reenviar-declarar clases en C++ si las está usando en un fasion circular.

Class A { 
    B* b; 
} 

Class B { 
    A* a; 
} 

C# y otros lenguajes no requieren esto, desde el primer pase construye las referencias y el segundo paso compila.

Pero, de nuevo, no soy experto en compiladores.

+10

La declaración directa es una propiedad del idioma y no tiene nada que ver con gcc. Puede estar relacionado con la implementación del compilador de C original de K & R. –

+2

Esto se relaciona más con la noción de Unidades de traducción independientes y enlaces. Podría decirse que es un pase de compilación independiente, pero no un pase de GCC. – MSalters

-3

¿Se refiere a pasa sobre el código fuente? Sólo una vez. A eso se le llama fase de "tokenización" o "análisis léxico" o, más ampliamente, "análisis sintáctico".

¿Quieres decir fases en el compilador? Hay varios. El término "pase" en realidad es más un viejo concepto de ensamblador que un concepto de compilador en la actualidad, e incluso entonces solo se usa de forma aproximada. El término "pase" no tiene una definición única.

Los compiladores se dividen en "fases". Lea la introducción a cualquier libro de texto del compilador. Explicará las fases (hay alrededor de una docena de fases lógicas), y GCC sigue los modelos de libros de texto con bastante fidelidad. Algunas fases se combinan típicamente en un solo "pase", otras son "pases" separados.

El pase concepto no es realmente tan útil en términos de discutir los compiladores como la fase concepto es.

+0

http://en.wikipedia.org/wiki/One-pass_compiler http://en.wikipedia.org/wiki/Multi-pass_compiler –

0

Exactamente una. No veo ninguna razón significativa para que un compilador moderno haga más de una pasada sobre el código fuente, si por "código" se refiere a la representación textual original de la fuente del programa. El objetivo de esa única pasada es convertir el código fuente en alguna representación interna, que se utilizará para un análisis posterior. Ya no se requiere que la representación interna tenga ninguna estructura lineal y/o ya no se requiera que se restrinja al procesamiento secuencial solamente, lo que significa que la noción de "hacer un pase" sobre ella simplemente ya no es aplicable.

Si esta respuesta no le satisface, probablemente debería proporcionar una explicación más precisa de lo que define como un "pase" sobre el código fuente.

+0

por pase me refería a pasar "solo la representación textual original de la fuente del programa". Lo que podría hacer un compilador de doble pasada es hacer una primera pasada buscando errores de sintaxis y recopilando información útil que le permita "compilar" mejor con la segunda pasada. – Lazer

+0

Lazer, un buen compilador ha recopilado información muy útil en el primer pase, que el segundo pase no agrega nada. Después de todo, el texto no cambia, entonces, ¿qué hay para el segundo pase para encontrar que el primero no pudo? – MSalters

+0

@Nathan Adams: Eso es completamente falso. El lenguaje C no requiere prototipos. El lenguaje C++ permite usar una declaración completa de la clase dentro del cuerpo de la función en línea definida al comienzo de la clase. Entonces, el concepto de "mirar hacia el futuro" obviamente está presente en C++, que es lo que a menudo se conoce como "compilación de pasos múltiples". Las afirmaciones de que C++ es "un pase" desde ese punto de vista son evidentemente incorrectas. – AnT

1

Nunca he oído hablar de un compilador que pase varias veces sobre la representación de texto (excepto si cuenta el preprocesador como una pasada). Incluso cuando los compiladores tenían múltiples pases comunicando por archivos, los archivos contenían una representación intermedia (tabla serializada de símbolos AST +).

Los ensambladores, por otro lado, rutinariamente hacían dos (o más) pases sobre el código fuente. Su preprocesador a menudo permite hacer cosas específicamente en una pasada, lo que permite jugar un truco más o menos sucio.

0

Su definición de multipaso parece ser la anterior, que proviene de los tiempos en que (una representación de) las fuentes de todo el programa simplemente no encajaban en la memoria disponible. Estos tiempos ya no existen y no conozco ni un solo compilador actual de múltiples pasadas (definición antigua).

En la entrada de la Wikipedia alemana para el compilador, se dan ambas definiciones: http://de.wikipedia.org/wiki/Compiler

multi-pass-Compilador

Bei diesem Compilertyp wird der Quellcode en mehreren Schritten en el foso Zielcode übersetzt. In den Anfangszeiten des Compilerbaus wurde der Übersetzungsprozess hauptsächlich deshalb en ausgewählt Durchläufe zerlegt, Weil der morir Kapazität ordenador menudo ausreichte nicht, um den vollständigen Compilador und das zu übersetzende Programm im gleichzeitig Hauptspeicher zu halten. Heutzutage dient ein multi-pass-Compilador dazu vor allem, Vorwärtsreferenzen (Deklaration eines Bezeichners nach dessen erster Verwendung) aufzulösen und aufwendige Optimizaciones durchzuführen.

+1

Quizás soy demasiado parcial, pero mi entendimiento es que las citas de la wikipedia en inglés son, en general, más útiles. Gracias. –

+0

@IskanderSharipov Estoy totalmente de acuerdo. Desafortunadamente, encontré que no hay una entrada equivalente en la Wikipedia en inglés. El autor de la pregunta descartó el que se llama "compilador de varias pasadas" porque incluye pases sobre otras representaciones además del código fuente original. –

1

En gcc, básicamente, hay dos tipos de pases, a saber: gimple, rtl. En gcc 4.6.2 el total de pases únicos es 207. Sí, el número total de pases en un programa determinado depende del nivel de optimización. Y algunos de estos pases se toman más de una vez. Si alguien quiere pasar por estos pases, revise el archivo passes.c en el código fuente de gcc. Ruta para pases.c en gcc 4.6.2: fuente gcc -> gcc -> pases.c

Sí, puede cambiar el número de pases al agregar sus pases como un complemento dinámico en gcc.

+0

Vas a activar el postban automático al eliminar tantas de tus respuestas. – Will

2

Como se señaló anteriormente, los compiladores modernos hacen una sola pasada en la etapa de análisis sintáctico y luego varias en etapas posteriores utilizando una representación interna (generalmente árboles u otra estructura de datos tipo gráfico en memoria).

Concretamente, GCC utiliza este enfoque. Ver: https://gcc.gnu.org/onlinedocs/gccint/Parsing-pass.html#Parsing-pass

Cuestiones relacionadas