c++ - nativos - ¿Cuántas pasadas sobre el código usa gcc?
metodos nativos en java (8)
- Específicamente para C y C ++, ¿cuántos pases se usan por defecto?
- ¿Cambia este número dependiendo del nivel de optimización utilizado? (debería)
- ¿Se puede cambiar directamente?
Estaba buscando esta información en http://gcc.gnu.org/ , pero buscar en Google usando el site:http://gcc.gnu.org/
no produjo nada.
Cualquier puntero a cualquier documentación sobre esto también será útil.
Por paso me refiero a un pase sobre la representación original del código fuente y no la definición de pase múltiple sugerida por Wikipedia .
¿Quieres decir que pasa sobre el código fuente ? Sólo una vez. Esto se llama fase de "tokenización" o "análisis léxico" o, más ampliamente, "análisis".
¿Te refieres a las fases en el compilador? Hay varios. El término "pasar" es realmente más un concepto de ensamblador antiguo que un concepto de compilador en estos días, e incluso entonces solo se usa de manera aproximada. El término "pasar" no tiene una sola definición.
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 fielmente los modelos de los libros de texto. Algunas fases normalmente se combinan en un solo "paso", otras son "pases" separados.
El concepto de pase no es realmente tan útil en términos de discutir compiladores como lo es el concepto de fase .
Como han señalado otros, los compiladores modernos hacen solo una pasada en la etapa de análisis y luego varias en etapas posteriores utilizando una representación interna (generalmente árboles u otra estructura de datos similar a un gráfico en memoria).
Concretamente GCC utiliza este enfoque. Consulte: https://gcc.gnu.org/onlinedocs/gccint/Parsing-pass.html#Parsing-pass
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, vaya a través del archivo pass.c en el código fuente de gcc. Ruta para pass.c en gcc 4.6.2: fuente gcc -> gcc -> pass.c
Sí, puede cambiar la cantidad de pases agregando sus pases como complemento dinámico en gcc.
Exactamente uno. No veo ninguna razón significativa para que un compilador moderno haga más de un pase sobre el código fuente, si por "código" se refiere a la representación textual original de la fuente del programa. El punto central de ese paso único es convertir el código fuente en una representación interna, que se utilizará para un análisis más detallado. Ya no se requiere que la representación interna tenga una estructura lineal y / o ya no se restrinja solo al procesamiento secuencial, lo que significa que la noción de "hacer un pase" 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.
Nunca he oído hablar de un compilador que pase varias veces sobre la representación textual (excepto si cuenta el preprocesador como una pasada). Incluso cuando los compiladores tenían varias pasadas que se comunicaban por archivos, los archivos contenían una representación intermedia (tabla de símbolos AST + serializada).
Los ensambladores, por otro lado, de manera rutinaria hicieron dos (o más) pases sobre el código fuente. Su preprocesador a menudo permite hacer cosas específicamente en una sola pasada, lo que permite jugar un truco más o menos sucio.
Según lo que me dijo alguien en la clase de diseño de mi compilador, gcc hace una sola pasada, mientras que otros compiladores como los que usa Visual Studio (por defecto) usan dos pasadas. Esta es la razón por la que debe reenviar las clases en c ++ si las está utilizando de forma circular.
Class A {
B* b;
}
Class B {
A* a;
}
C # y otros idiomas no requieren esto, ya que el primer paso construye las referencias y el segundo paso se compila.
Pero, de nuevo, no soy experto en compiladores.
Su definición de paso múltiple parece ser la antigua, derivada de los tiempos en que (una representación de) fuentes de programas completas simplemente no cabían en la memoria disponible. Estos tiempos ya no existen y no conozco un compilador único de pases múltiples (definición antigua) actual.
En la entrada de Wikipedia en alemán para el compilador, se dan ambas definiciones: http://de.wikipedia.org/wiki/Compiler
Multi-pass-compilador
Bei diesem Compilertyp wird der Quellcode in mehreren Schritten in den Zielcode übersetzt. In den Anfangszeiten des Compilerbaus wurde der Übersetzungsprozess hauptsächlich deshalb in mehrere Durchläufe zerlegt, weil die Kapazität der Computer oft nicht auscichucusválgale de las cosas en el lugar de trabajo. 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.
Los pases y archivos del compilador pueden ser lo más cercano a lo que estás buscando.