Fenner
Começando

Primeiro programa

Escreva, compile e rode um programa; veja como são as mensagens do compilador.

O que você precisa#

Do fc.exe e da pasta rtl ao lado dele (a RTL, escrita em Fenner). Não há mais nada a instalar: o LLVM e o ligador vêm dentro do próprio fc.exe. Sem nenhum arquivo de configuração, o fc procura a RTL em ..\rtl, relativa à pasta dele, e os módulos do seu programa ao lado do .fxp.

Escreva#

Crie hello.fxp:

hello.fxp
program Hello;

begin
  WriteLn('Olá, mundo!');
end.
Saída
Olá, mundo!

Compile e rode#

terminal
fc hello.fxp

O fc grava o executável ao lado do fonte e diz onde:

texto
Executável gerado: Hello.exe

O nome do executável sai do program do fonte (program Hello; gera Hello.exe), não do nome do arquivo. Para escolher o nome, use -o:

terminal
fc hello.fxp -o ola.exe

Um programa com um pouco mais#

fib.fxp
program Fib;

function Fib(N: Int32): Int32;
begin
  if N < 2 then
    Result := N
  else
    Result := Fib(N - 1) + Fib(N - 2);
end function;

var
  I: Int32;
begin
  for I := 0 to 10 do
    WriteLn('Fib(', I, ') = ', Fib(I));
end.
Saída
Fib(0) = 0
Fib(1) = 1
Fib(2) = 1
Fib(3) = 2
Fib(4) = 3
Fib(5) = 5
Fib(6) = 8
Fib(7) = 13
Fib(8) = 21
Fib(9) = 34
Fib(10) = 55

Dois detalhes que já aparecem aqui:

  • Result é a variável de retorno da função, e Exit(valor) sai devolvendo um valor (como em Exit(A + B)).
  • Os fechos podem ser qualificados: end function;, end procedure;, end class;. São opcionais e ajudam a ler blocos longos, porque o compilador confere se o fecho combina com a abertura.

O compilador ensina#

As mensagens de erro têm o formato arquivo(linha,coluna): Erro: texto e, quando o erro é um nome que existia no Delphi, apontam o nome novo. Alguns exemplos reais:

texto
p.fxp(2,15): Erro: tipo desconhecido ou não suportado: "Integer"

Não existe Integer: os tipos dizem a largura. Use Int32.

texto
T2.fxp(10,11): Erro: "IntToStr" nao existe: diga QUAL cadeia voce quer -- "IntToLStr" (bytes),
"IntToUStr" (UTF-16) ou "IntToU8Str" (UTF-8). Para inteiro sem sinal, a familia "UIntTo...Str"

Como há quatro cadeias, a conversão diz qual você quer. A família ...ToUStr é a do dia a dia.

texto
p.fxp(2,1): Erro: esperado 'begin', mas encontrado identificador "Begin"

A linguagem diferencia maiúsculas. Begin é um identificador qualquer, não a palavra reservada.

texto
p.fxp(5,8): Erro: identificador não declarado: "Red"

Um enumerado exige o escopo: TColor.Red, não Red (veja Tipos).

Além de Erro, o compilador emite Aviso e Dica. Os três têm a mesma forma, e a extensão do VS Code os separa por severidade no painel de Problemas.

Opções que você vai usar#

OpçãoEfeito
-o <arquivo>nome do executável de saída
-O0 … -O3nível de otimização (padrão -O3)
-ginformação de depuração (grava um .pdb)
-D<símbolo>define um símbolo de compilação condicional
-PMSWin64 / -PMSWin32 / -PLinux64plataforma de destino
-M<modo>modo de compilação (-MDebug, -MRelease…)

A lista completa está em Linha de comando; o que não é plataforma nem modo mora num arquivo de configuração.

Próximos passos#

  • Projetos e arquivos: como um programa cresce para vários módulos.
  • Léxico: comentários, números, cadeias e palavras reservadas.
  • Tipos: a família de tipos numéricos e as quatro cadeias.