Compilando o código fonte#

O primeiro passo no processo de build é compilar o código fonte. A saída nesse passo é geralmente conhecida como código objeto - um conjunto de instruções para o computador gerado a partir de código fonte legível por humanos. Compiladores diferentes irão produzir códigos objeto diferentes a partir do mesmo código fonte e as convenções de nomeação são diferentes.

As consequências:

  • If you use a particular compiler for one source file, you need to use that same compiler (or a compatible one) for all other pieces. After all, a program may be built from many different source files and the compiled pieces have to cooperate.

  • Cada arquivo fonte será compilador e o resultado é armazenado em um arquivo com a extensão «.o» ou «.obj». Esse é os arquivos objeto que são a entrada para o próximo passo: o processo de link.

Compilers are complex pieces of software: they have to understand the language in much more detail and depth than the average programmer. They also need to understand the inner workings of the computer. And then, over the years they have been extended with numerous options to customise the compilation process and the final program that will be built.

But the basics are simple enough. Take the gfortran compiler, part of the GNU compiler collection. To compile a simple program like the one above, that consists of one source file, you run the following command, assuming the source code is stored in the file «hello.f90»:

$ gfortran -c hello.f90

Isso resultado em um arquivo «hello.o» (o compilador gfortran usa «.o» como extensão dos arquivos objeto).

A opção «-c» significa: apenas compile os arquivos fonte. Se você não usar, a ação padrão do compilador é compilar o arquivo fonte e iniciar o linker para gerar a build do programa executável presente. O comando:

$ gfortran hello.f90

resulta em um arquivo executável, «a.out» no Linux our «a.exe» no Windows.

Algumas observações:

  • O compilador pode reclamar do conteúdo no arquivo fonte, se achar algo de errado com ele - um erro de digitação ou uma palavra chave não conhecida. Nesse caso, oo processo de compilação quebrará e você não conseguirá o arquivo objeto ou o programa executável. Por exemplo, se a palavra «program» for digitada erroneamente como «prgoram»:

$ gfortran hello3.f90
hello.f90:1:0:

    1 | prgoram hello
      |
Error: Unclassifiable statement at (1)
hello3.f90:3:17:

    3 | end program hello
      |                 1
Error: Syntax error in END PROGRAM statement at (1)
f951: Error: Unexpected end of file in 'hello.f90'

Usando o relatório de compilação você pode corrigir o código fonte e tentar novamente.

  • O passo sem «-c» só será sucedido se o código fonte contiver o programa principal - caracterizado pela declaração program no Fortran. Caso contrário o passo de link irá reclamar de um «símbolo» faltante, algo entre essas linhas:

$ gfortran hello2.f90
/usr/lib/../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

O arquivo «hello2.f90» é quase igual ao arquivo «hello.f90», com exceção que a palavra chave program foi substituída pela palavra-chave subrotina.

Os exemplos acima de saída do compilador irão ser de diferentes de acordo com o compilador e a plataforma que roda. Esses exemplos vem do compilador gfortran executando em um ambiente Cygwin no Windows.

Compiladores irão diferir também nas opções que tem suporte, mas em geral:

  • Opções para otimizar o código - resultando em programas mais rápidos ou com menor espaço em memória;

  • Opções para checar o código fonte - checa se a variável não é usada antes de dá-la um valor, ou checa se alguma extensão é usada;

  • Opções para a locação de arquivo de inclusão ou módulos, veja abaixo;

  • Opções de depuração.