Unidades (Units)

Una Unidad agrupa declaraciones compartidas de tipos, funciones, procedimientos, constantes y variables para ser invocada por otras unidades o el programa principal, equivalente a los módulos / paquetes de otros lenguajes de programación.

Crear una unidad

La unidad se divide en dos bloques principales:

Zona interface (interfaz): Contenido expuesto al exterior, accesible directamente tras importarse desde otros archivos;

Zona implementation (implementación): Código privado interno, solo visible para la unidad actual y no invocable desde fuera.

Ejemplo

Crea un archivo llamado MyUnit.pas para alojar una unidad.

unit MyUnit;

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

// Zona de interfaz: declaraciones públicas
interface

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

// Zona de implementación: 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.Lenguaje del código: JavaScript (javascript)

Los lectores atentos notarán que el end. final no tiene un begin correspondiente.

La estructura sintáctica de una unit (unidad) de Pascal es distinta a la de un program (programa)

program Programa principal: requiere el bloque begin ... end. como punto de entrada de ejecución

unit Unidad: no requiere un begin global

Toda unidad finaliza con end. (el punto indica el fin del archivo, sin un begin global asociado)

  • Dentro de interface se escriben prototipos de funciones/procedimientos, tipos, constantes y variables globales; otros archivos pueden llamarlos tras usar la sentencia uses;
  • En implementation solo va la implementación completa de las funciones; los procedimientos locales y variables privadas definidos aquí son invisibles para otras unidades;
  • Los archivos de unidad empiezan con unit Nombre; y terminan con end..

Importar unidades en el programa principal

Nuestro archivo de programa principal es mydemo.pas

Carga unidades personalizadas con la palabra clave uses

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

program MyProgram;

// Importar la unidad personalizada MyUnit
uses
  MyUnit;

begin
  WriteLn(MyFunction('Note: '));
  MyProcedure(5);
  ReadLn;
end.Lenguaje del código: PHP (php)

El MyUnit; debajo de uses hace referencia al nombre de la unidad, no al nombre del archivo .pas.

Se trata del nombre definido en la primera línea de MyUnit.pas: unit MyUnit;

Aunque el nombre del archivo y el nombre de la unidad pueden ser diferentes, se recomienda que coincidan. Si difieren, en uses siempre se usa el nombre de la unidad, no el del archivo.

Ahora compila y ejecuta; el programa principal invocará las funciones de la unidad.

Ahora compila y ejecuta

Tras la compilación, aparecerán dos archivos nuevos en el directorio del proyecto

.ppu (Pascal Unit File, archivo de metadatos de compilación de unidad)

Solo se genera al compilar archivos de tipo unit; el programa principal program no crea archivos .ppu

  • Almacena los metadatos compilados de la zona interface de la unidad: prototipos de funciones, tipos, constantes, símbolos exportados;
  • Cuando otros archivos usan uses MyUnit, el compilador no vuelve a analizar todo el código fuente de MyUnit.pas, lee directamente el archivo .ppu para validar la interfaz rápidamente;
  • Acelera notablemente la compilación en proyectos grandes; es el archivo central de la compilación incremental de FPC.

MyUnit.o: Instrucciones binarias en lenguaje máquina generadas al compilar MyUnit.pas (todo el código de la zona implementation)

mydemo.o: Código máquina binario del programa principal mydemo.pas

El compilador traduce primero cada archivo .pas a archivos objeto binarios independientes .o; luego el enlazador fusiona todos los archivos .o para generar el ejecutable .exe.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *