113 Shares 7751 views

Broadcaster – é … Tipos de compiladores. Converter e programas de transmissão

Programas, bem como as pessoas a traduzir de uma língua para outra precisar de um intérprete ou tradutor.

conceitos básicos

O programa é uma representação linguística de cálculos: i P → P (i). Um intérprete é um programa que é fornecido para o programa de entrada P e alguma entrada x. Ele executa a P x: Eu (P, x) = P (x). O fato de que há apenas um tradutor é capaz de executar todos os programas possíveis (que podem ser representadas no sistema formal) é um Turing descoberta muito profundo e significativo.

O processador é um intérprete de programas em linguagem de máquina. Geralmente muito caro para escrever intérpretes para linguagens de alto nível, para que eles se traduzem em uma forma que é mais fácil de interpretar.

Alguns tipos de tradutores têm nomes muito estranhos:

  • O montador traduz programas em assembly em linguagem de máquina.
  • O compilador traduz uma linguagem de alto nível para uma linguagem mais baixo.

Broadcaster – é um programa que tem como dados de entrada do programa em alguma linguagem S e produz programa de T, de tal forma que ambos têm a mesma semântica: P → X → Q. Isto é, ∀x. P (x) = Q (X).

Se transmitir o programa inteiro em algo interpretável, ele é chamado de uma compilação antes da compilação execução, ou AOT. compilador AOT pode ser usado em série, o último dos quais é frequentemente o montador, por exemplo:

O código fonte do compilador → (tradutor) → → assembly de código assembler (compilador) Código → → máquina de CPU (intérprete).

compilação operacional ou dinâmico ocorre se o programa é transmitido, quando executado por outra parte compilada anteriormente. JIT-compiladores lembrar o que eles já fizeram, de modo a não repetir o código fonte novamente e novamente. Eles podem até mesmo produzir compilação adaptável e recompilação com base no comportamento do ambiente de execução do programa.

Muitas línguas permitir a execução de código em tempo de compilação e compilar o novo código em tempo de execução.

fase de tradução

Transmissão compreende as etapas de análise e síntese:

O analisador de código fonte → → → gerador representação conceptual (sintetizador) → código de destino.

Isto é devido a estas razões:

  • Qualquer outro método não é adequado. a tradução da palavra simplesmente não funciona.
  • Boa solução de engenharia: se você quer escrever tradutores para idiomas M e N de origem direcionados precisa escrever apenas programas simples M + N (polukompilyatorov) ao invés de complexo M × N (total de tradutores).

No entanto, na prática, uma visão conceitual de uma muito raramente expressiva o suficiente e poderoso o suficiente para cobrir todos os possíveis idiomas de origem e de destino. Enquanto alguns foram capazes de chegar perto desta.

compiladores reais passar por muitas etapas. Ao criar o seu próprio compilador não precisa repetir todo o trabalho duro que as pessoas têm feito para criar representações e geradores. Você pode traduzir o idioma diretamente em JavaScript ou C e tirar proveito de JavaScript-motor existente eo compilador C para fazer o resto. Você também pode usar a representação intermediária existente e máquinas virtuais.

tradutor recorde

Broadcaster – é um programa ou hardware, que envolveu três línguas: a fonte, o destino ea base. Eles podem ser escritos em uma T-forma, colocando de base do original esquerda, direita e alvo abaixo.

Existem três tipos de compiladores:

  • Broadcaster – é samokompilyator se ele corresponde ao idioma de origem básica.
  • Compiler que têm como alvo a linguagem é a linha de base, chamada samorezidentnym.
  • Broadcaster – um cross-compilador, se ele alvejado e várias línguas básicas.

Por que isso é importante?

Mesmo que você nunca fazer um compilador real, um bom conhecimento da tecnologia de sua criação, porque o conceito utilizado para este fim são amplamente utilizados, por exemplo:

  • formatação de texto;
  • consultas em linguagem para bancos de dados;
  • arquitetura avançada de computador;
  • problemas de otimização generalizadas;
  • GUIs;
  • linguagens de script;
  • controladores;
  • máquinas virtuais;
  • tradução automática.

Além disso, se você quiser escrever pré-processadores, adaptadores, carregadores, depuradores e profilers, você deve seguir os mesmos passos como quando se escreve um compilador.

Você também pode aprender a escrever programas melhores, desde a criação do tradutor para a língua significa uma melhor compreensão dos seus meandros e ambigüidades. O estudo dos princípios gerais de transmissão também permite que você se tornar uma boa linguagem designer. Assim que isso importa como íngreme a linguagem se não pode ser implementado de forma eficaz?

tecnologia abrangente

tecnologia de compilação abrange muitas áreas diferentes da ciência da computação:

  • teoria formal da língua: gramática, análise, computability;
  • arquitetura de computadores:. conjuntos de instruções, RISC ou CISC, ciclos de relógio de processamento de núcleo pipeline, etc;
  • conceitos de linguagens de programação, por exemplo, realizando um controlo sequencial, a execução condicional, iteração, recursão, decomposição funcional, a modularidade, a sincronização, meta-programação, alcance, constantes sub-tipos, modelos, o tipo de saída, protótipos, anotações, fluxo, mônades, caixas de correio, continuar , wildcards, expressão regular, memória transacional, herança, polimorfismo, configurações de modo, e assim por diante etc..;
  • linguagens abstratas e máquinas virtuais;
  • algoritmos e estruturas de dados: expressões regulares, algoritmos de análise, algoritmos gráficos, programação dinâmica, de formação;
  • linguagens de programação: sintaxe, semântica (estáticos e dinâmicos), paradigmas de apoio (estrutural, OOP, funcional, lógico, pilha, paralelismo, meta-programação);
  • software de criação (compiladores, geralmente grandes e complexos): localização, caching, inserir componentes, API-interfaces, reutilização, a sincronização.

projeto de compiladores

Alguns dos problemas encontrados no desenvolvimento do tradutor real:

  • Problemas com o idioma de origem. É fácil de compilá-lo? Existe um pré-processador? Como são os tipos? Existe uma biblioteca?
  • Agrupamento passes compilador: single ou multi-modo?
  • O grau de optimização desejada. programas rápidos e impuros de transmissão com pouca ou nenhuma otimização pode ser normal. compilador Over-otimização irá diminuir, mas melhor código em tempo de execução pode valer a pena.
  • O grau exigido de detecção de erro. Pode um tradutor simplesmente parar no primeiro erro? Quando deve parar? Se confia na correção de erros do compilador?
  • A disponibilidade de ferramentas. Se o idioma original não é muito pequena, os analisadores de scanner e geradores são necessários. Há também geradores, geradores de código, mas eles não são tão comuns.
  • Tipo de código-alvo a ser gerado. Ser selecionado a partir do código máquina completaram ou virtual pura. Ou simplesmente escrever uma porção de entrada que cria uma representação intermediária populares, como LLVM, RTL, ou JVM. Ou fazer uma tradução do original no código fonte em C ou JavaScript.
  • O formato do código-alvo. Você pode escolher uma linguagem de montagem, imagem de memória código de máquina um código de máquina portátil,.
  • Retargeting. Quando o conjunto de geradores é boa para ter uma porção de entrada comum. Por esta razão, é melhor ter um gerador para a entrada de muitas partes.

Arquitetura do compilador: componentes

Estes são os principais componentes funcionais de um compilador que gera código nativo (se o programa de saída é um programa em C ou uma máquina virtual, você não precisa tantas etapas):

  • O programa de entrada (sinais de fluxo) é alimentado para dentro do scanner (analisador lexical), que o converte em uma corrente de fichas.
  • Analisador (parser) construindo uma árvore de sintaxe abstrata.
  • analisador semântico decompõe a informação semântica e verifica os nós da árvore para erros. Como resultado, construído gráfico semântica – árvore de sintaxe abstrata com propriedades adicionais e as ligações estabelecidas.
  • gerador de código intermediário constrói um grafo de fluxo (tuplos são agrupados em blocos principais).
  • otimizador de código independente de máquina realiza tanto local (dentro da unidade base) e global (para todos os blocos) otimização basicamente permanecendo dentro rotinas. Reduz código redundante e simplifica os cálculos. O resultado é um grafo de fluxo modificado.
  • Generator liga código-alvo blocos básicos em um código de controle de transmissão retilínea, criando um arquivo objeto assembler registros virtuais (possivelmente ineficaz).
  • dependente da máquina otimizador, vinculador aloca memória entre registos e faz com que as equipes de planejamento. Ele executa o programa de conversão em linguagem assembly neste montagem com um bom uso de pipelining.

Além disso, o uso de gerente subsistema de detecção de erros e tabelas de símbolos.

análise léxica (digitalização)

O scanner converte os caracteres fonte de fluxo em um fluxo de tokens, removendo espaços em branco, comentários e macros de expansão.

Scanners muitas vezes encontram problemas, como se deve ou não ter em conta o caso, margens, quebras de linha e comentários embutidos.

Erros que podem ocorrer durante a digitalização, chamado lexical e incluem:

  • caracteres que não estão no alfabeto;
  • excesso do número de caracteres de uma palavra ou uma linha;
  • não um sinal fechado ou uma string literal;
  • fim de arquivo no comentário.

Analisando (análise)

O analisador converte a sequência de símbolos em uma árvore de sintaxe abstrato. Cada nó na árvore é armazenado como um objeto com campos nomeados, muitos dos quais são eles próprios os nós da árvore. Nesta fase não há ciclos. Quando você cria um analisador é necessário prestar atenção ao nível de complexidade da gramática (LL ou LR) e descobrir se há qualquer disambiguation regras. Alguns idiomas exigem análise semântica.

Erros encontrados nesta fase são 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 verificar a permissibilidade de regras e partes associadas da árvore de análise (que permite a inserção de nomes de referência operação para as conversões do tipo implícito, e assim por diante. D.) para formar o gráfico semântica.

Obviamente, o conjunto de admissibilidade de regras em diferentes idiomas diferentes. Se você compilar as linguagens Java-like, compiladores pode encontrar:

  • declaração de variável múltipla no seu âmbito;
  • uma referência a uma variável antes da sua declaração;
  • as referências ao nome do não declarado;
  • violação de direitos de patente;
  • número excessivo ou insuficiente de argumentos de uma chamada de método;
  • incompatibilidade de tipo.

geração

geração de código intermediário produz gráfico do fluxo composto de tuplos, agrupados em blocos básicos.

geração de código produz um código de máquina real. Em compiladores tradicionais para os RISC-máquinas no primeiro passo, você cria um montador com um número infinito de registros virtuais. Para CISC-máquinas provavelmente não vai acontecer.