de turbo pascal para free pascal
Este documento contém algumas informações sobre as diferenças existentes entre o compilador Free Pascal e o compilador Turbo Pascal 7.0 da Borland. A lista a seguir não está completa, mas apresenta alguns detalhes importantes.
- Assembly
O padrão assembly utilizado pelo FPC possui sintaxe diferente do padrão TP7,
mas você poderá vir a utilizar o estilo assembly Intel (semelhante ao modo
utilizado pelo Turbo Pascal da Borland) usando o comando -Rintel nas opções
de linha de comando adicionando os parâmetros {intel de $asmmode} no programa fonte.
Possui um modelo de memória de 32 bits que requer um recoding completo de seus
blocos de assembler.
- Biblioteca de Run-Time
Para usar o PORT array, adicione a unidade Ports junto com a cláusula USES
(disponível apenas para Dos/Go32v2 e Linux).
Você pode ter acesso ao modo real de memória usando MEM[seg:ofs] (como também
MemW e MemL) somente sob Go32v2.
Ofs() retorna longint em vez de word.
A unidade (unit) OVERLAY não está disponível.
Turbo Vision não está ainda disponível (problemas com copyright).
O suporte aos recursos do pacote Turbo Vision será fornecido pelo pacote
Free Vision, ainda não disponível, pois o copyright do Turbo Vision ainda
não foi liberado pela Borland.
- Preprocessador/Sintaxe
Se você usar o parâmetro -So na linha de comando (ou adicionar a diretiva {$mode TP}
em seu programa fonte), o compilador FPC será colocado em modo Turbo Pascal tornado-se
compatível. Esta opção quando ativada incapacitará algumas das características
avançadas do FPC.
São permitidos comentários aninhados (em modo TP desabilitado).
- Sintaxe
FAR e NEAR são ignorados.
Para adquirir o endereço de uma procedure e então associá-lo a uma variável do tipo
procedure é necessário utilizar o operador “@” arroba (em modo TP, procedure variável pode
ser trabalhada em TP):
procedure p; begin {....} end; var proc : procedure; begin proc:=@p; end;
INLINE é suportado pelo compilador, porém é usado em modo inline no código pascal e
não em modo bytecode.
Os cabeçalhos declarados de functions/procedures deverão ser reescritos na definição,
caso contrário o compilador pensará que eles serão executados em overloaded (não
requer o uso do parâmetro -So).
Possui um conjunto maior de palavras reservadas.
Algumas extensões Delphi são parcialmente suportadas.
- Semântica
O tamanho máximo de parâmetros que pode ser passado em uma sequência de dados é de
64K para a versão Intel e 32K para a versão Motorola.
Records são sempre alinhados como word; use 'packed record' ou {$PACKRECORDS 1} para
conseguir records compatíveis com TP. Observação: utilize o recurso de package somente
em casos onde seu uso é necessário, pois poderá não trabalhar adequadamente com os
campos (de um registro) em processadores de não Intel (além do fato de reduzir a
velocidade de acesso da estrutura de dados do registro):
type r1 = record a : byte; b : word; end; r2 = packed record a : byte; b : word; end; begin writeln(sizeof(r1)); { outputs 4 } writeln(sizeof(r2)); { outputs 3 } end.
Atenção: atualmente todos os conjuntos de dados utilizados no FPC são do tipo
longint ou do tipo 32 byte de acordo com seu tamanho, no TP o conjunto de dados são
do tipo byte ou do tipo word e são classificadas segundo o tamanho. Um trabalho de
desenvolvimento atual está declarando o conjunto de dados para os tipos byte/word.
Claro que, esta informação torna-se necessária caso você precisa utilizar registros
compatíveis com TP, caso contrário poderá ser utilizado sem nenhum problema o conjunto
de dados para o padrão FPC.
Resultados de funções poderão ser tipos complexos como arrays ou records (não em modo TP).
Possui um conjunto maior de palavras reservadas.
É possível direcionar o resultado de função em uma função como uma variável
(isto não se aplica em modo TP):
function a : longint; begin a := 12; while a > 4 do begin {...} end; end;
O exemplo anterior trabalha em modo TP, porém o compilador assumiria que a condição a > 4 é uma chamada recursiva. Para fazer uma chamada recursiva em FPC é necessário anexar () logo atrás do nome de função (isto não se aplica em modo TP):
function a : longint; begin a := 12; { *** esta e uma chamada recursiva *** } while a() > 4 do begin {...} end; end;
O comando exit da procedure também utiliza o resultado da função como seu parâmetro:
function a : longint; begin a:=12; if a>4 then exit(a*67); end;
Funções como as a seguir sempre deverão sempre ser definidas com o cabeçalho completo (isto não se aplica em modo TP):
procedure x(v : longint); forward; procedure x; { this overloads the procedure x !!!!} begin { ... } end; { write instead: } procedure x(v : longint); begin { ... } end;
- Outros
Os parâmetros de linha de comando são diferentes.
Não são implementadas todas as diretivas de compilação.
As units não são compatíveis em modo binário.