Conceito

Compiladores são programas utilizados em programação que tem o papel de receber o código feito em uma determinada linguagem de programação (alto nível) e traduzir (compilar) para a linguagem de máquina (baixo nível), deixando-o pronto para ser executado a qualquer momento sem a necessidade de outro programa para isso, ou seja, cria um programa executável, tornado a execução do arquivo mais rápida, diferente dos interpretadores que leem o código e o executam imediatamente.

Os primeiros compiladores foram escritos em linguagem assembly, também conhecido como linguagem de montagem, e com o avanço da complexidade das arquiteturas dos computadores também houve uma crescente necessidade de linguagens de alto nível, para facilitar a programação, consequentemente os compiladores tornaram-se cada vez mais complexos. Hoje novos compiladores são feitos com relativa facilidade atualmente devido ao desenvolvimento de ferramentas para esse fim.

Um compilador pode ser escrito na mesma linguagem que ele compila, mas isso gera um problema chamado de “bootstraping”, que significa algo como “levantar-se pelas próprias botas”, ou seja, ele “se usa” para se construir. Isto leva a algumas opções na hora de programar um compilador: o primeiro compilador para uma determinada linguagem deve ser um código de máquina escrito à mão ou compilado por um compilador escrito em outra linguagem ou executando o compilador em um interpretador.

Softwares

Basicamente qualquer compilador pode ser usado para programar outro.

Código

<syntaxhighlight lang="python3"> /*

* Simple Test program for libtcc
*
* libtcc can be useful to use tcc as a "backend" for a code generator.
*/
  1. include <stdlib.h>
  2. include <stdio.h>
  3. include <string.h>
  1. include "libtcc.h"

/* this function is called by the generated code */ int add(int a, int b) {

   return a + b;

}

char my_program[] = "int fib(int n)\n" "{\n" " if (n <= 2)\n" " return 1;\n" " else\n" " return fib(n-1) + fib(n-2);\n" "}\n" "\n" "int foo(int n)\n" "{\n" " printf(\"Hello World!\\n\");\n" " printf(\"fib(%d) = %d\\n\", n, fib(n));\n" " printf(\"add(%d, %d) = %d\\n\", n, 2 * n, add(n, 2 * n));\n" " return 0;\n" "}\n";

int main(int argc, char **argv) {

   TCCState *s;
   int (*func)(int);
   s = tcc_new();
   if (!s) {
       fprintf(stderr, "Could not create tcc state\n");
       exit(1);
   }
   /* if tcclib.h and libtcc1.a are not installed, where can we find them */
   if (argc == 2 && !memcmp(argv[1], "lib_path=",9))
       tcc_set_lib_path(s, argv[1]+9);
   /* MUST BE CALLED before any compilation */
   tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
   if (tcc_compile_string(s, my_program) == -1)
       return 1;
   /* as a test, we add a symbol that the compiled program can use.
      You may also open a dll with tcc_add_dll() and use symbols from that */
   tcc_add_symbol(s, "add", add);
   /* relocate the code */
   if (tcc_relocate(s, TCC_RELOCATE_AUTO) < 0)
       return 1;
   /* get entry symbol */
   func = tcc_get_symbol(s, "foo");
   if (!func)
       return 1;
   /* run the code */
   func(32);
   /* delete the state */
   tcc_delete(s);
   return 0;

} </syntaxhighlight> Código em linguagem C que faz um pequeno teste para libtcc, que pertence ao compilador TCC.

Diagrama de Casos de Uso

Interações com as tecnologias

Referências bibliográficas