Free Pascal (também conhecido pela sigla FPC) é um compilador 32 bits/64 bits para a linguagem Pascal (dialetos: Borland Pascal, Delphi Object Pascal e algumas extensões do Mac-Pascal), escrito em Pascal e distribuído sob a licença GPL. Ele possui alto grau de compatibilidade com o antigo Turbo Pascal, bem como com versões recentes do Delphi (até a versão 7) e roda em várias arquiteturas (x86, x86-64, PowerPC, SPARC, ARM) e sistemas operacionais (Linux, FreeBSD, Mac OS X/Darwin, Mac OS Classic, DOS, Win32, OS/2, Netware (libc e classic) e MorphOS). Sua RTL (RunTime Library - biblioteca de tempo de execução) é extensa, disponibilizando uma grande quantidade de funções, rotinas e classes prontas para o programador. O projeto atualmente é liderado por Florian Klaëmpfl, mas conta com vários desenvolvedores, espalhados principalmente pela Europa.
Características do Free Pascal Linguagem limpa e com sintaxe clara; Não é necessário o uso de makefiles, embora seja suportado através da ferramenta fpcmake; Compilador rápido; Cada unit tem seus próprios identificadores, o que ajuda a evitar a poluição do namespace; Possui uma IDE escrita usando a biblioteca FreeVision, que é um clone gratuito da famosa biblioteca TurboVision, distribuída com os compiladores Turbo Pascal e Turbo C++ da Borland; Excelente integração com assembly, pois é possível misturar código assembly com código Pascal nos programas; Suporte a cross-compiling, onde é possível escrever o código Pascal numa plataforma e compilar para outra, usando os utilitários da série binutils apropriados; Suporte ao paradigma de orientação a objetos; Smartlinking, onde somente o código realmente utilizado de cada unit incluída é ligado (estaticamente) ao executável; Compatibilidade: o Free Pascal tem alto grau de compatibilidade com códigos já existentes, legados da época do Turbo Pascal, bem como com códigos recentes, das versões 6 e 7 do Borland Delphi.
História O Free Pascal começou em meados da década de 1990, quando a Borland descontinuou os compiladores Turbo Pascal e Borland Pascal, deixando para trás uma grande comunidade de programadores. O Turbo Pascal e o Borland Pascal eram o topo de linha de compiladores da Borland e ainda custavam bem menos que os concorrentes (o Turbo Pascal era vendido por US$49,99). Nessa época vários projetos foram iniciados para produzir um compilador Pascal que amparasse essa comunidade. Um deles foi o FPK-Pascal, que depois se tornaria o Free Pascal e se mostrou exatamente o que a comunidade queria: um compilador Pascal de 32bits moderno, robusto, estável e confiável. Com isso, o Free Pascal começou a ganhar mais e mais adeptos e os gurus da programação em Pascal começaram a escrever seus programas com ele.
Com o advento do Delphi, o sucessor da linha de compiladores Pascal da Borland, que era o carro-chefe da Borland no desenvolvimento de aplicações comerciais para Windows 32bits, o Free Pascal acabou passando de um substituto para o Turbo Pascal a um compilador compativel com Delphi porém de código-fonte aberto, licenciado sob a GPL. A partir daí, o FPC ganhou uma comunidade ainda maior, com os servidores de download chegando a marca de aproximadamente 512GB/mês.
Inicialmente, o FPC foi escrito pelo estudante Florian Paul Klaempfl e daí vem a sigla FPK-Pascal, que em 1997 se tornou Free Pascal. Nos primeiros estágios, o FPC era escrito em Pascal com o compilador Turbo Pascal, que é de 16bits, mas já produzia código 32bits para o estender go32v1, oriundo do DJGPP. Dois anos depois, o compilador já era capaz de compilar a si próprio, no processo conhecido como bootstraping, e que é utilizado até hoje para compilar o FPC.
O projeto foi publicado na internet na mesma época em que usava o go32v1 para produzir código 32 bit e outros desenvolvedores começaram a trabalhar nele. Um deles, Michael van Canneyt, foi o responsável por portar o FPC para Linux, conseguindo uma versão 100% funcional 5 anos antes da Borland lançar o Kylix. Enquanto isso, a versão para DOS apresentava muitos progressos e foi migrada para o go32v2, um estender mais moderno do DJGPP. Nessa época, a compatibilidade com o Turbo Pascal foi abandonada em favor de um novo modo de compatibilidade com o Delphi para as próximas versões, onde também foi incluído suporte para compilar binários nativos Win32 que usa o formato PE (Portable Executable) da Microsoft.
Atualmente, a versão estável é a 2.0.4 lançada em 28 de agosto de 2006. Essa versão é, basicamente, uma versão de correções para a versão 2.0.0, lançada em maio de 2005. Trata-se de um compilador moderno e de código-fonte aberto, com uma ampla, multi-plataforma e bem documentada RTL (o FPC vem com mais de 1.800 páginas de documentação), compatível com Delphi (7 até o momento) e que, de fato, não fica devendo em nada nem para linguagem C nem para os outros compiladores Pascal.
Nessa versão, o FPC faz inlining corretamente, gera código melhor e ainda pode usar várias convenções de chamada, o que abre as portas para a programação visual em ambientes Windows. Existe um gerenciador melhor para o heap e tanto o compilador como a RTL tem suporte a multithreading e a internacionalização ajuda a traduzir sua aplicação para outras linguagens, sendo que o suporte a WideStrings (UNICODE) permite o uso dos conjuntos de caracteres mais incomuns. Além disso, a compatibilidade com o Delphi também foi melhorada, com o uso de alguns hacks para emular certas funcionalidades. O FPC também possui algumas extensões próprias, como parsing de constantes de 64 bits, interfaces e arrays dinâmicos.
Design O FPC passou por duas grandes mudancas em seu design: quando da migração para a versão 1.0. x e para a versão 2.0. x. Na versao 1.0. x o FPC ganhou um gerador de código melhor, um novo alocador de registradores e um novo parser. Nessa versão, o scanner converte o código em tokens que depois passam pelo processo de parsing. Depois o compilador faz o primeiro passo para avaliar expressões constantes e coletar informações para o gerador de código. O segundo passo consiste em gerar o código de fato e passá-lo por um otimizador dependente de CPU. Nessa versão o FPC é dito ser um compilador de dois passos.
A versão 2.0. x tem uma arquitetura nova, de três passos: avaliação de constantes, coleta de informações e otimizações de alto nível e geração de código que é separada em front-end e back-end. Todos os passos são construídos em cima de uma arquitetura de classes e componentes reutilizáveis. Dessa forma, fica mais simples adicionar suporte a novos processadores, por exemplo. Basta sobrescrever os métodos necessários do gerador de código, o que facilita também a reescrita do compilador para outros sistemas operacionais. A arquitetura de classes também permite cada gerador de código poder aproveitar as vantagens de cada processador sem reescrever muito código, pois qualquer parte do gerador pode ser sobrescrita. Por exemplo, a linha x86 tem modos de endereçamento poderosos que podem ser utilizados para melhorar o desempenho para os índices dos arrays. Assim, basta sobrescrever a parte do gerador que gera os índices dos arrays para tirar vantagem desses modos e o desempenho aumenta. Processadores que fazem muito uso dessas vantagens são os da linha x86 e ARM.
figura compilador 2.0. x
Por último, tem-se um novo alocador de registradores. Fazendo a alocação dos registradores depois da geração do código, o compilador pode tomar decisões muito mais inteligentes a respeito da alocação dos registradores da CPU
Quanto as bibliotecas, o grande progresso foi na versão para UNIX onde é possível compartilhar código entre os diferentes sistemas operacionais dessa família.
Versões O FPC evoluiu muito ao longo dos mais de 10 anos de desenvolvimento (o projeto começou em junho de 1993). Versões anteriores a 0.99.5 são consideradas muito obsoletas pelos desenvolvedores e, apenas após essa versão, foi introduzido um sistema de numeração de versões. Nesse sistema, versões com último número par eram versões de lançamento para os usuários e versões com último número ímpar eram versões de desenvolvimento. A partir das versões 1.0. x, o sistema de numeração de versões mudou para um sistema novo que lembrava o do núcleo Linux. Nesse novo sistema, a versões diferem no segundo número(ex: 1.0. x para 1.1. x) e o terceiro número fica para correções. Com a arquitetura antiga das versões 1.0.x era muito difícil reescrever o compilador para outras plataformas, mesmo assim existe um port dele para microprocessadores 68000, da Motorola (usado em microcomputadores Macintosh antigos e os Amiga).
Geralmente, os programadores usam a versão de lançamento, pois ela é considerada estável. Nessas versões, os problemas são revelados após curto período de tempo e existem maneiras de contorná-los. Pacotes para desenvolvedores são gerados diariamente e refletem o estado atual do compilador. Essas versões de desenvolvimento tem novas características e novos bugs. Para uso corrente, recomenda-se usar as versões de lançamento (preferencialmente a série estável 2.0.x).
Logo, vemos que a versão estável (2.0.x) deriva da série 0.99.x (entre 0.99.12b e 0.99.14). A partir desse ponto, foi criada a série 1.1.x, que deu origem à versão 1.9.x, que, por fim, chegou a estável atual, que é a 2.0.2. Nota-se também que já foi criada a série 2.1.x (a partir da série 2.0.x) mas ela ainda tem uma versão estável.
A versão mais atual é a versão 2.4.4.
Linguagem A linguagem Pascal foi criada pelo professor Niklaus Wirth, do ETH de Zurique, em 1970, baseando-se no ALGOL. Ela foi criada inicialmente com o intuito de ensinar programação, mas depois revelou-se uma linguagem de propósito geral, que pode ser usada para qualquer tarefa em desenvolvimento de software. A Borland, por sua vez, criou a variante mais conhecida do Pascal, o Turbo Pascal, em 1983, vendendo por correspondência uma solução integrada (editor + compilador + linker) por US$ 49,95, apenas 10% do preço de outros compiladores comerciais. O Turbo Pascal foi desenvolvido até a versão 7.0, sendo substituído no plano de negócios da Borland pelo Delphi.
Apesar do Pascal ser originalmente uma linguagem estruturada, a Borland introduziu no Pascal o paradigma de orientação a objetos a partir do Turbo Pascal 5.5 (que hoje é de livre distribuição).
O FPC suporta a imensa maioria das construções usadas no Delphi e no Turbo Pascal. Ele implementa os dialetos Borland Pascal e Object Pascal (utilizado no Delphi) mais algumas extensões extra do Mac-Pascal e alguns patches para garantir compatibilidade com os dialetos padronizados (ISO/IEC 7185). É notável a grande comunidade de programadores que Pascal possui entre usuários de Macs, tanto que os primeiros Macintosh e o Apple Lisa dependiam muito de Pascal e as APIs em C do MacOS tem que lidar com tipos de dados do Pascal. A linguagem Pascal tem uma sintaxe muito clara e simples, porém poderosa, suportando o uso de ponteiros, enumerações e tipos de dados packed. Pascal foi criticada por muito tempo sob a alegação de que não servia para outro nicho que não fosse o acadêmico. Brian Kernigham, um dos desenvolvedores da linguagem C, em seu artigo "Por que Pascal não é a minha linguagem favorita" aponta vários problemas com a linguagem Pascal, os quais felizmente, hoje em dia, não estão mais presentes nas implementações mais atuais. Apesar disso, Kernigham acabou por acertar prevendo que o Pascal teria problemas por causa da incompatiblidade entre compiladores e padrões, com a Borland de um lado e o padrão ISO do outro. Felizmente, o FPC está vindo para derrubar essas incompatibilidades.