563 Shares 3062 views

Transmisor – es … Tipos de compiladores. Convertir y programas de emisión

Programas, así como las personas a traducir de un idioma a otro necesita un intérprete o traductor.

conceptos básicos

El programa es una representación lingüística de cálculos: i → P → P (i). Un intérprete es un programa que se suministra al programa de entrada P y algunos de entrada x. Se lleva a cabo en P x: I (P, x) = P (x). El hecho de que sólo hay un traductor es capaz de realizar todos los programas posibles (que se pueden representar en el sistema formal) es una Turing descubrimiento muy profunda y significativa.

El procesador es un intérprete de programas en lenguaje de máquina. Por lo general demasiado caro para escribir intérpretes para lenguajes de alto nivel, por lo que se traducen en una forma que es más fácil de interpretar.

Algunos tipos de traductores tienen nombres muy extraños:

  • El ensamblador traduce los programas en lenguaje ensamblador a lenguaje de máquina.
  • El compilador traduce un lenguaje de alto nivel a un lenguaje más baja.

Transmisor – es un programa que toma como datos de entrada del programa en un lenguaje S y produce el programa T de tal manera que ambos tienen la misma semántica: P → → X P. Es decir, ∀ x. P (x) = Q (x).

Si transmitido todo el programa en algo interpretable, se llama una compilación antes de la compilación de ejecución, o AOT. AOT compilador se puede utilizar en serie, el último de los cuales es a menudo el ensamblador, por ejemplo:

El código fuente compilador → (traductor) → → conjunto de código ensamblador (compilador) código → → máquina CPU (intérprete).

compilación de funcionamiento o dinámica se produce si el programa se emite, cuando es ejecutado por otra parte previamente compilado. JIT-compiladores recuerdan lo que ya lo han hecho para que no se repita el código fuente y otra vez. Incluso pueden producir compilación y recompilación de adaptación basado en el comportamiento del entorno de ejecución del programa.

Muchos lenguajes permiten ejecutar código en tiempo de compilación y compilar el nuevo código en tiempo de ejecución.

etapa de traducción

Emisión comprende las etapas de análisis y síntesis:

El analizador de código fuente → → → generador de representación conceptual (sintetizador) → código de destino.

Esto se debe a las siguientes razones:

  • Cualquier otro método no es adecuado. traducción de palabras, simplemente no funciona.
  • Buena solución de ingeniería: si desea escribir los traductores de idiomas de origen M y N específicas es preciso escribir sólo los programas simples (M + N) en lugar de polukompilyatorov compleja M x N (total de los traductores).

Sin embargo, en la práctica, una vista conceptual de un muy rara vez lo suficientemente expresivo y lo suficientemente potente como para cubrir todos los idiomas imaginables origen y de destino. Mientras que algunos eran capaces de acercarse a este.

compiladores reales pasan por muchas etapas. Al crear su propio compilador no tenga que repetir todo el trabajo duro que la gente ha hecho para crear representaciones y generadores. Puede traducir su idioma directamente en JavaScript o C y aprovecharse de JavaScript del motor existente y el compilador de C para hacer el resto. También puede utilizar la representación intermedia existente y las máquinas virtuales.

Traductor registro

Transmisor – es un programa o hardware, que involucró a tres idiomas: el origen, el destino y la base. Ellos pueden ser escritos en una forma de T, la colocación de la base del original izquierda, derecha y de destino a continuación.

Hay tres tipos de compiladores:

  • Transmisor – es samokompilyator si se corresponde con el idioma fuente básica.
  • Compilador cual el lenguaje es la línea de base, denominado samorezidentnym.
  • Transmisor – un compilador cruzado, si él dirige y varios idiomas básicos.

¿Por qué es esto importante?

Incluso si usted nunca hacer un compilador real, un buen conocimiento de la tecnología de su creación, ya que el concepto que se utiliza para este propósito se utilizan ampliamente, por ejemplo:

  • el formato de texto;
  • consultas en lenguaje de bases de datos;
  • arquitectura informática avanzada;
  • problemas de optimización generalizadas;
  • interfaces gráficas de usuario;
  • lenguajes de script;
  • controladores;
  • máquinas virtuales;
  • Traducción automática.

Además, si desea escribir preprocesadores, enlazadores, cargadores, depuradores y perfiladores, debe pasar por los mismos pasos que al escribir un compilador.

También puede aprender a escribir mejores programas, desde la creación del traductor de la lengua significa una mejor comprensión de sus complejidades y ambigüedades. El estudio de los principios generales de la radiodifusión también le permite convertirse en un buen lenguaje de diseño. Así que qué importa cuán aguda es la lengua si no se puede implementar de manera efectiva?

La tecnología integral

tecnología de compilación abarca muchas áreas diferentes de la informática:

  • teoría formal del idioma: gramática, análisis sintáctico, la computabilidad;
  • arquitectura de ordenador:. conjuntos de instrucciones, RISC o CISC, los ciclos de reloj de núcleo de procesamiento encauzado, etc;
  • conceptos de lenguajes de programación, por ejemplo, la realización de un control de secuencia, ejecución condicional, iteración, recursión, descomposición funcional, la modularidad, la sincronización, meta-programación, alcance, constantes sub-tipos, plantillas, tipo de salida, prototipos, anotaciones, flujo, mónadas, buzones, continúan , comodines, expresiones regulares, memoria transaccional, herencia, polimorfismo, los ajustes de modo, etc., etc..;
  • lenguajes abstractos y máquinas virtuales;
  • algoritmos y estructuras de datos: expresiones regulares, algoritmos de análisis sintáctico, algoritmos gráficos, programación dinámica, de formación;
  • lenguajes de programación: sintaxis, semántica (estática y dinámica), los paradigmas de apoyo (estructural, programación orientada a objetos, funcional, lógico, pila, paralelismo, meta-programación);
  • software de creación (compiladores, por lo general grandes y complejas): localización, el almacenamiento en caché, componentizar, API-interfaces, nuevo uso, la sincronización.

el diseño del compilador

Algunos de los problemas encontrados en el desarrollo del traductor real:

  • Los problemas con el idioma de origen. ¿Es fácil para su compilación? ¿Hay un preprocesador? ¿Cómo son los tipos? ¿Hay una biblioteca?
  • La agrupación de pases del compilador: una o varias vías?
  • El grado de optimización deseada. programas de difusión rápidos y sucios con poca o ninguna optimización pueden ser normales. El exceso de optimización del compilador será lento, pero mejor código en tiempo de ejecución puede valer la pena.
  • El grado requerido de detección de errores. ¿Puede un traductor sólo se detienen en el primer error? Cuando debería parar? Si se debe confiar en la corrección de errores del compilador?
  • La disponibilidad de herramientas. Si el idioma original no es muy pequeño, se requiere que los analizadores de escáner y del generador. También hay generadores, generadores de código, pero no son tan comunes.
  • Tipo de código de destino que se genere. Debe seleccionarse de código completaron o virtual pura máquina. O simplemente escribir una parte de entrada que crea una representación intermedia populares, tales como LLVM, RTL, o JVM. O hacer una traducción del original en el código fuente en C o JavaScript.
  • El formato del código de destino. Se puede elegir un lenguaje ensamblador, imagen de memoria de código de máquina un código de máquina portátil,.
  • Cambio de destino. Cuando el conjunto de generadores es bueno tener una porción de entrada común. Por esta razón, es mejor tener un generador para la entrada de muchas partes.

compilador de Arquitectura: componentes

Estos son los principales componentes funcionales de un compilador que genera código nativo (si el programa de salida es un programa en C o una máquina virtual, no necesita tantas etapas):

  • El programa de entrada (marcas de flujo) se alimenta en el escáner (analizador léxico), que la convierte en una corriente de tokens.
  • Analizador (parser) la construcción de un árbol de sintaxis abstracta.
  • analizador semántico descompone la información semántica y comprueba los nodos del árbol de errores. Como resultado, construida semántica gráfica – árbol de sintaxis abstracta con propiedades adicionales y los vínculos establecidos.
  • generador de código intermedio construye un gráfico de flujo (tuplas se agrupan en bloques principales).
  • Independiente de la máquina optimizador de código lleva a cabo tanto en la optimización local (dentro de la unidad base) y global (para todos los bloques), básicamente, permaneciendo dentro de las rutinas. Reduce el código redundante y simplifica los cálculos. El resultado es un gráfico de flujo modificada.
  • Generador une código objetivo bloques básicos en un código de control de transmisión rectilínea, la creación de un archivo de objeto de ensamblador registros virtuales (posiblemente ineficaz).
  • Dependiente de la máquina optimizador, enlazador asigna memoria entre registros y hace equipos de planificación. Se lleva a cabo el programa de conversión en lenguaje ensamblador en esta asamblea con un buen uso de la canalización.

Además, el uso de gestor de subsistema de detección de errores y tablas de símbolos.

Análisis léxico (escaneo)

El escáner convierte los caracteres fuente corriente en una corriente de fichas, la eliminación de espacios en blanco, comentarios y macros en expansión.

Escáneres menudo se encuentran con problemas, como si o no tener en cuenta el caso, los márgenes, los saltos de línea y los comentarios incrustados.

Errores que pueden ocurrir durante la exploración, llamados léxica e incluyen:

  • caracteres que no están en el alfabeto;
  • exceso del número de caracteres de una palabra o de la línea;
  • no una señal cerrada o una cadena literal;
  • final del archivo en el comentario.

Analizar (análisis sintáctico)

El analizador convierte la secuencia de símbolos en un árbol de sintaxis abstracta. Cada nodo del árbol se almacena como un objeto con campos denominados, muchos de los cuales son a su vez los nodos del árbol. En esta etapa no hay ciclos. Cuando se crea un programa de análisis es necesario prestar atención al nivel de complejidad de la gramática (LL o LR) y averiguar si existe alguna regla de desambiguación. Algunos idiomas requieren análisis semántico.

Los errores encontrados en esta etapa se denominan sintaxis. Por ejemplo:

  • k = 5 * (7 – y;
  • j = / 5;
  • 56 = x * 4.

análisis semántico

Durante el análisis semántico para comprobar la validez de las reglas y partes asociados de la árbol de análisis sintáctico (permitiendo nombres de referencia operación de inserción para las conversiones de tipo implícitas, y así sucesivamente. D.) para formar el gráfico semántica.

Obviamente, el conjunto de admisibilidad de las normas en diferentes idiomas diferentes. Si compila los lenguajes Java similar, los compiladores pueden encontrar:

  • declaración de variables múltiples dentro de su alcance;
  • una referencia a una variable antes de su declaración;
  • las referencias al nombre del no declarado;
  • infracción de los derechos de patente;
  • número excesivo o insuficiente de argumentos en una llamada de método;
  • Tipo de falta de coincidencia.

generación

generación de código intermedio produce gráfico de flujo de compuesto de tuplas, agrupados en bloques básicos.

generación de código produce un código de máquina real. En los compiladores tradicionales para los RISC-máquinas en el primer paso, se crea un ensamblador con un número infinito de registros virtuales. Para CISC-máquinas probablemente no sucederá.