Unidades (Units)

A Unidade (Unit) agrupa declarações compartilhadas de tipos, funções, procedimentos, constantes e variáveis para serem invocadas por outras unidades ou pelo programa principal, equivalente aos módulos / pacotes de outras linguagens de programação.

Criar uma unidade

A unidade é dividida em duas seções centrais:

Seção interface (interface): Conteúdo exposto externamente, acessível diretamente após ser importado por outros arquivos;

Seção implementation (implementação): Código privado interno, visível apenas na unidade atual e impossível de ser invocado externamente.

Exemplo

Crie um arquivo chamado MyUnit.pas para implementar uma unidade.

unit MyUnit;

{$ifdef FPC}
{$mode objfpc}{$H+}{$J-}
{$endif}

// Seção de interface: declarações públicas
interface

procedure MyProcedure(const A: Integer);
function MyFunction(const S: string): string;

// Seção de implementação: código privado
implementation

procedure MyProcedure(const A: Integer);
begin
  WriteLn('A + 10 is: ', A + 10);
end;

function MyFunction(const S: string): string;
begin
  Result := S + 'strings are automatically managed';
end;

end.Code language: JavaScript (javascript)

Leitores atentos perceberão que o end. no final não tem um begin correspondente?

A estrutura sintática de uma unit (unidade) Pascal é diferente da estrutura de um program (programa)

program Programa principal: é obrigatório ter o bloco begin ... end. como ponto de entrada de execução

unit Unidade: não precisa de um begin global

Toda unidade termina com end. (o ponto marca o fim do arquivo, sem um begin global correspondente)

  • Dentro de interface são declarados protótipos de funções/procedimentos, tipos, constantes e variáveis globais; arquivos externos conseguem chamá-los após usarem a diretiva uses;
  • Em implementation fica apenas a implementação completa das funções; procedimentos locais e variáveis privadas definidos aqui não são visíveis para outras unidades;
  • Arquivos de unidade iniciam com unit Nome; e terminam com end..

Importar unidades no programa principal

Nosso arquivo de programa principal é o mydemo.pas

Carregue unidades personalizadas com a palavra-chave uses

{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}

program MyProgram;

// Importar a unidade personalizada MyUnit
uses
  MyUnit;

begin
  WriteLn(MyFunction('Note: '));
  MyProcedure(5);
  ReadLn;
end.Code language: PHP (php)

O MyUnit; abaixo de uses é o nome da unidade, não o nome do arquivo .pas.

Esse nome é o definido na primeira linha do MyUnit.pas: unit MyUnit;

Apesar de ser possível deixar o nome do arquivo diferente do nome da unidade, é recomendável mantê-los iguais. Se forem diferentes, o comando uses sempre usa o nome da unidade, não o nome do arquivo.

Agora compile e execute; o programa principal chamará as funções da unidade.

Agora compile e execute

Após a compilação, dois novos arquivos aparecerão na pasta do projeto

.ppu (Pascal Unit File, arquivo de metadados de compilação da unidade)

Só é gerado ao compilar arquivos do tipo unit; o programa principal program não cria arquivos .ppu

  • Armazena os metadados compilados da seção interface da unidade: protótipos de funções, tipos, constantes, símbolos exportados;
  • Quando outros arquivos executam uses MyUnit, o compilador não reanalisa todo o código-fonte do MyUnit.pas, lê diretamente o arquivo .ppu para validar a interface rapidamente;
  • Aumenta drasticamente a velocidade de compilação em projetos grandes; é o arquivo principal da compilação incremental do FPC.

MyUnit.o: Instruções binárias de máquina compiladas do MyUnit.pas (todo o código da seção implementation)

mydemo.o: Código de máquina binário do programa principal mydemo.pas

O compilador converte cada arquivo .pas em arquivos objeto binários independentes .o; depois o ligador mescla todos os arquivos .o para gerar o executável .exe.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *