Entiendo la estructura de un compilador en lo que respecta a front-end y back-end. Sin embargo, no estoy seguro de por qué se elaboran a menudo se divide en front-end y back-end. Estoy seguro de que hay muchas razones me puedes dar un par? porque, la mayoría de los libros o sitios web de decir lo que son, pero no le dirá por qué!

Gracias.

InformationsquelleAutor | 2012-03-19

3 Comentarios

  1. 62

    El front-end se aborda el idioma en sí: la exploración, el análisis, el análisis del árbol. La parte final se aborda el sistema de destino: objeto de formatos de código, el código de la máquina en sí, … Las dos cosas no tienen mucho que ver unos con otros, y para un portátil compilador es muy conveniente utilizar el mismo front-end con varios motores, uno por cada objetivo.

    Usted puede tomar y que además, como gcc hace, y tiene un frontal/interfaz de backend que es independiente del lenguaje, por lo que puede usar un idioma diferente front-end con el mismo backend. En los viejos tiempos, esto se llama la MxN problema: no quiero tener que escribir MxN compiladores donde tienes M idiomas y N en los sistemas de destino. La idea es que sólo tiene que escribir M+N compiladores.

    • Puede usted por favor decirme cómo es M + N compiladores ? Creo que tenemos M front-ends para convertir a ICG y N de los generadores de código para convertir a Destino en código de máquina. Estás pensando en cada uno de front end y back-end como un compilador ?
    • Sin FE/SER combinación necesitaríamos muchas permutaciones que es innecesario/difícil de manejar.
    • Sí, un front-end/back-end combinación es un compilador. Sin duda, esto es obvio?
  2. 8

    Si usted está hablando sobre el front-end de ser el analizador que tokenises el código fuente, y back-end de ser el bit que genera el código ejecutable basado en la tokenised código, a continuación, una muy buena razón es esta: la portabilidad.

    Separar el analizador del código ejecutable generación hace que sea mucho más fácil para el puerto de un compilador de una arquitectura de procesador a otro.

  3. 5

    Porque desea utilizar algún tipo de internos pseudo código o de tablas y estructuras de datos. Por ejemplo, si usted tiene alguna línea de código:

    a = b + c;
    

    Usted quiere tomar eso y lo rompen en un lenguaje intermedio o IR (representación Intermedia):

    load b
    load c
    add b + c
    store a
    

    como un ejemplo, hay muchas soluciones. El lenguaje intermedio es mejor que ir directamente a la asamblea para un destino determinado por una serie de razones:

    • Por una abstracción del hardware y proporcionando una «lógica» número de registros que somos independientes de la final de la «física» de los registros y del diseño del hardware. Por ejemplo, el nativo ADD la instrucción puede ser la pila de base, tomar 1-operando, tomar de 2 operandos, o incluso 3 operandos. En este nivel superior no necesitamos saber, o la atención, sobre el bajo nivel de implementación de hardware.
    • El lenguaje interno puede ser optimizado si usted tiene un optimizador, y
    • Es lo suficientemente genérica como para ser usado en múltiples objetivos, si usted tiene un deseo de centrarse en distintos procesadores.

    No sé lo suficiente acerca de él, pero creo que también tienen en común la utilizan analizadores de bisonte/flex, hervir abajo en una especie de código intermedio/conjunto de instrucciones y, a continuación, escribir un backend para que.

    También de los beneficios que puede tener, por ejemplo, un C y C++ y otros idiomas front-end, sin afectar el backend.

    También se beneficiará de romper el compilador en la lógica de los bloques de módulos, puede desarrollar y probar el front-end de forma independiente de la parte final. llvm por ejemplo, permite la exportación e importación del lenguaje intermedio, que podría, si usted realmente quería escribir código utilizando el lenguaje intermedio y tienen la ventaja de múltiples objetivos en el backend.

Dejar respuesta

Please enter your comment!
Please enter your name here