Informática, Programación
Broadcaster - é ... Tipos de compiladores. Converter e programas de transmisión
Programas, así como as persoas a traducir dunha lingua a outra precisa dun intérprete ou tradutor.
conceptos básicos
O programa é unha representación lingüística de cálculos: I P → P (i). Un intérprete é un programa que se inclúe para o programa de entrada P e algunha entrada x. El executa a P x: Eu (P, x) = P (x). O feito de que hai só un tradutor é capaz de realizar todos os programas posibles (que poden ser representadas no sistema formal) é un Turing descubrimento moi profundo e significativo.
O procesador é un intérprete de programas en linguaxe de máquina. Xeralmente moi caro para escribir intérpretes para linguaxes de alto nivel, para que se traducen nunha forma que é máis fácil de interpretar.
Algúns tipos de tradutores teñen nomes moi estraños:
- O montador traduce programas en assembly en linguaxe de máquina.
- O compilador traduce nunha linguaxe de alto nivel para unha linguaxe máis baixo.
Broadcaster - é un programa que ten como datos de entrada do programa nalgunha linguaxe S e produce programa de T, de tal forma que ambos teñen o mesmo semántica: P → X → Q. Isto é, ∀x. P (x) = Q (X).
Transmitir o programa completo en algo interpretável, é chamado dunha compilación antes da compilación execución, ou AOT. compilador AOT se pode usar en serie, o último dos cales é frecuentemente o montador, por exemplo:
O código fonte do compilador → (tradutor) → → assembly de código ensamblador (compilador) Código → → máquina de CPU (intérprete).
compilación operativo ou dinámico ocorre se o programa é transmitido, cando se executa por outra banda compilada anteriormente. JIT-compiladores lembrar o que xa fixeron, para non repetir o código fonte de novo e de novo. Poden incluso producir compilación adaptable e recompilación con base no comportamento do ámbito de aplicación do programa.
Moitas linguas permitir a execución de código en tempo de compilación e compilar o seu código en tempo de execución.
fase de tradución
Transmisión comprende as etapas de análise e síntese:
O analizador de código fonte → → → xerador representación conceptual (sintetizador) → código de destino.
Isto é debido a estas razóns:
- Calquera outro método non é adecuado. a tradución da palabra simplemente non funciona.
- Boa solución de enxeñaría: se quere escribir tradutores para idiomas M e N de orixe dirixidos que escribir só programas simples M N (polukompilyatorov) en vez de complexo M N (total de tradutores).
Con todo, na práctica, unha visión conceptual dunha moi raramente expresiva abondo e poderoso o suficiente para cubrir todos os posibles idiomas de orixe e de destino. Mentres algúns foron capaces de chegar preto desta.
compiladores reais pasar por moitas etapas. Ao crear o seu propio compilador non precisa repetir todo o traballo duro que as persoas teñen feito para crear representacións e xeradores. Pode traducir o idioma directamente JavaScript ou C e aproveitar JavaScript-motor existente eo compilador C para facer o resto. Tamén pode usar a representación intermedia existente e máquinas virtuais.
tradutor marca
Broadcaster - é un programa ou hardware, que implica tres linguas: a fonte, o destino ea base. Poden ser escritos nunha T-forma, poñendo de base do orixinal esquerda, dereita e branco a continuación.
Existen tres tipos de compiladores:
- Broadcaster - é samokompilyator se corresponde ao idioma de orixe básica.
- Compiler que teñen como obxectivo a linguaxe é a liña de fondo, chamada samorezidentnym.
- Broadcaster - un cross-compilador, se alvejado e varias linguas básicas.
Por que iso é importante?
Aínda que nunca facer un compilador real, un bo coñecemento da tecnoloxía da súa creación, xa que o concepto utilizado para este fin son amplamente utilizados, por exemplo:
- formato de texto;
- consultas en linguaxe para bases de datos;
- arquitectura avanzada de ordenador;
- problemas de optimización xeneralizadas;
- GUIs;
- linguaxes de script,
- controladores;
- máquinas virtuais;
- tradución automática.
Ademais, se quere escribir condición procesadores, adaptadores, cargadores, depuradores e profilers, ten que seguir os mesmos pasos como cando se escribe un compilador.
Tamén pode aprender a escribir programas mellores, desde a creación do tradutor para a lingua significa unha mellor comprensión dos seus meandros e ambigüidades. O estudo dos principios xerais de transmisión tamén permite que facer unha boa linguaxe deseñador. Así que iso importa como íngreme a linguaxe non pode ser aplicado de forma eficaz?
tecnoloxía ampla
tecnoloxía de compilación abrangue moitas áreas diferentes da ciencia da computación:
- teoría formal da lingua: gramática, análise, computability;
- arquitectura de computadores :. conxuntos de instrucións, RISC ou CISC, ciclos de reloxo de procesamento de núcleo pipeline, etc;
- conceptos de linguaxes de programación, por exemplo, realizar un control secuencial, a execución condicional, iteración, recursão, descomposición funcional, a modularidade, a sincronización, meta-programación, alcance, constantes sub-tipos, modelos, o tipo de saída, prototipos, notas, fluxo, mônades, caixas de correo, continuar , comodíns, expresión regular, memoria transacional, herdanza, polimorfismo, opcións de modo, etc. etc ..;
- linguaxes abstractas e máquinas virtuais;
- algoritmos e estruturas de datos: expresións regulares algoritmos de análise, algoritmos gráficos, programación dinámica, de formación;
- linguaxes de programación: sintaxe, semántica (estáticos e dinámicos), paradigmas de apoio (estrutural, OOP, funcional, lóxico, pila, paralelismo, meta-programación);
- software de creación (compiladores, xeralmente grandes e complexos): localización, caching, inserir compoñentes, API-interfaces, reutilización, a sincronización.
proxecto de compiladores
Algúns dos problemas atopados no desenvolvemento do tradutor real:
- Problemas co idioma de orixe. É doado de recompila-lo? Existe un pre-procesador? Como son os tipos? Existe unha biblioteca?
- Agrupación pases compilador: single ou multi-modo?
- O grao de optimización que desexe. programas rápidos e impuros de transmisión con pouca ou ningunha optimización pode ser normal. compilador Over-optimización pode diminuír, pero mellor código en tempo de execución pode valer a pena.
- O grao esixido de detección de erro. Pode un tradutor simplemente deixar o primeiro erro? Cando debe parar? Se confía na corrección de erros do compilador?
- A dispoñibilidade de ferramentas. Se o idioma orixinal non é moi pequena, os análise de escáner e xeradores son necesarios. Tamén xeradores, xeradores de código, pero eles non son tan comúns.
- Tipo de código obxecto de aprendizaxe a ser xerado. Ser seleccionado a partir do código máquina completaron ou virtual pura. Ou simplemente escribir unha porción de entrada que se crea unha representación intermedia populares, como LLVM, RTL, ou JVM. Ou facer unha tradución do orixinal no código fonte en C ou JavaScript.
- O formato do código obxecto de aprendizaxe. Pode escoller unha linguaxe de montaxe, imaxe de memoria código de máquina un código de máquina portátil ,.
- Retargeting. Cando o conxunto de xeradores é boa para ter unha porción de entrada común. Por esta razón, é mellor ter un xerador para a entrada de moitas partes.
Arquitectura do compilador: compoñentes
Estes son os principais compoñentes funcionais dun compilador que xera código nativo (se o programa de saída é un programa en C ou unha máquina virtual, non tantas etapas):
- O programa de entrada (sinais de fluxo) é alimento para dentro do escáner (analizador léxico), que o converte nunha corrente de fichas.
- Analizador (parser) construíndo unha árbore de sintaxis abstracta.
- analizador semántico descomponse a información semántica e comproba os nós da árbore para erros. Como resultado, construído gráfico semántica - árbore de sintaxis abstracta con propiedades adicionais e as conexións establecidas.
- Xerador de código intermedio constrúe un grafo de fluxo (tuplos son agrupados en bloques principais).
- óptimo de código independente de máquina realiza tanto local (dentro da unidade base) e global (para todos os bloques) optimización basicamente permanecendo dentro rutinas. Reduce código redundante e simplifica os cálculos. O resultado é un grafo de fluxo modificado.
- Generator liga código obxectivo bloques básicos nun código de control de transmisión retilínea, creando un arquivo obxecto ensamblador rexistros virtuais (posiblemente ineficaz).
- dependente da máquina óptimo, vínculo aloca memoria entre rexistros e fai que os equipos de planificación. El executa o programa de conversión en linguaxe assembly neste montaxe cun bo uso paralelismo.
Ademais, o uso de director subsistema de detección de erros e táboas de símbolos.
análise léxica (dixitalización)
O escáner converte os carácteres fonte de fluxo en un fluxo de tokens, eliminando espazos en branco, comentarios e macros de expansión.
Escáneres miúdo atopan problemas, como se debe ou non ter en conta o caso, marxes, saltos de liña e comentarios embutidos.
Erros que poden ocorrer durante a dixitalización, chamado lexical e inclúen:
- caracteres que non están no alfabeto;
- exceso do número de caracteres dunha palabra ou unha liña;
- non un sinal pechado ou unha cadea literal;
- fin de ficheiro no comentario.
Analizando (análise)
O analizador converte a secuencia de símbolos nunha árbore de sintaxe abstracto. Cada nó na árbore é almacenado como un obxecto con campos nomeados, dos que son eles mesmos os nós da árbore. Nesta fase non hai ciclos. Cando se crea un analizador é necesario prestar atención ao nivel de complexidade da gramática (LL ou LR) e descubrir se hai calquera disambiguation regras. Algúns idiomas esixen análise semántica.
Erros atopados nesta fase son chamados de sintaxe. Por exemplo:
- k = 5 * (7 - y;
- J = / 5;
- 56 = X * 4.
análise semántica
Durante a análise semántica para comprobar a permissibilidade de regras e partes asociadas da árbore de análise (que permite a inserción de nomes de referencia operación para as conversións de tipo implícito, e así por diante. D.) para formar a gráfica semántica.
Obviamente, o conxunto de admisibilidade de regras en distintos idiomas diferentes. Se compilar as linguaxes Java-like, compiladores podes atopar:
- declaración de variable múltiple no seu ámbito;
- unha referencia a unha variable antes da súa declaración;
- as referencias ao nome do non declarado,
- violación de dereitos de patente;
- número excesivo ou insuficiente de argumentos dunha chamada de método;
- incompatibilidade de tipo.
xeración
xeración de código intermedio produce gráfico do fluxo composto de tuplos, agrupados en bloques básicos.
xeración de código produce un código de máquina real. En compiladores tradicionais para os RISC-máquinas no primeiro paso, se crea un montador cun número infinito de rexistros virtuais. Para CISC-máquinas probablemente non vai ocorrer.
Similar articles
Trending Now