La Página de DriverOp

Portar fuentes Turbo Pascal a Free Pascal.

Algunas cosas que se deben saber cuando se quieren portar códigos fuentes de Turbo Pascal hacia el compilador Free Pascal (FPC).
Original en: http://www.freepascal.org/port.var

Este documento contiene información acerca de las diferencias entre los compiladores Turbo Pascal 7.0 y Free Pascal. La lista no es exaustiva.

Assembler.

El assembler por omisión usa una sintaxis diferente, pero se puede habilitar el lector de assembler estilo Intel (que es el que usa Turbo Pascal) usando la opción -Rintel desde la línea de comandos al invocar el compilador Free Pascal, o bién poniendo la directiva de compilación {$asmmode intel} al inicio del fuente.

El modelo de memoria de 32 bits requiere que se reescriba todos los bloques en código assembler.

Bibliotecas en tiempo de ejecución.

Para usar el array PORT[] agregar la biblioteca Ports a la cláusula uses (solo disponible en DOS/Go32v2 y Linux).

Se puede acceder a la memoria en modo real usando MEM:[seg:ofs] (así como MemW y MemL) solamente bajo Go32v2.

Ofs() devuelve un Longint en vez de un Word.

La unidad OVERLAY no está disponible.

El soporte para Turbo Vision está disponible usando Free Vision; es un clon debido a que Turbo Vision no está disponible como código libre (Borland mantiene el copyright).

Preprocesador / Sintaxis.

Si se usa la opción -So desde la línea de comandos (o se agrega la directiva {$mode TP} al fuente) el compilador pasará al modo de compatibilidad con Turbo Pascal, el cual deshabilita ciertas características avanzadas de FPC (por ejemplo sobrecarga de procedimientos) para posibilitar una mejor compatibilidad con Turbo Pascal.

Se permiten comentarios anidados pero se genera una Note cuando se les encuentra (deshabilitado en modo TP).

Sintaxis.

Las cláusulas FAR y NEAR se ignoran.

Para obtener la dirección de un procedimiento para ser asignada a una variable se debe usar el operador @ (en modo Turbo Pascal, variables tipo procedimiento son iguales que en TP).

procedure p;
begin
end;

var
  proc : procedure;
begin
  proc:=@p;
end;

El compilador soporta INLINE, pero se usa para código pascal en línea, no para codebyte.

Los encabezados de los procedimiento o funciones declarados como forward deben ser reescritos en su totalidad siempre en la definición de los mismos, de otra forma el compilador piensa que se trata de una sobrecarga (no se requiere si se usa la opción -So).

Hay más palabras reservadas.

Algunas extensiones de Delphi están soportadas.

Semántica.

El tamaño máximo de los parámetros que se pueden pasar a una subrutina es de 64KB para la versión Intel y 32KB para la versión Motorola.

Los registros siempre se alinean a una palabra (Word); usar 'packed record' o {$PACKRECORDS 1} para obtener registros compatibles con Turbo Pascal. Una advertencia: usar packed record solamente si se está absolutamente seguro de que se necesitan, puesto que campos de registros no alineados pueden no funcionar en procesadores diferentes de los Intel (e incrementará enormemente los tiempos de accesos en todos los casos).

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.

Aviso: todos los conjuntos (set) en FPC son Longint o bién de 32 bytes de tamaño, mientras que los conjuntos (set) de Turbo Pascal usualmente se almacenan en Byte o Word. La solución alternativa actual para esto es declarar los conjuntos como byte o word y luego usar la unidad de manipulación de bits que está disponible en la página de los contribuyentes para excluir o incluir elementos manualmente. Por supuesto esto es solamente necesario si se necesitan registros compatibles con Turbo Pascal, de otra manera se pueden usar conjuntos de FPC sin problemas.

El tipo de retorno de las funciones (function) puede ser un tipo complejo tal como array o registro (no en modo TP).

Es posible manipular el resultado de una función en una función como si fuera una variable (no en modo TP).

function a : longint;
begin
  a:=12;
  while a>4 do
    begin
    {...}
    end;
end;

El ejemplo precedente funcionará en Turbo Pascal, pero el compilador asume que a>4 es una llamada recursiva de a. Para hacer una llamada recursiva de a en Free Pascal se debe agregar () luego del nombre de la función (no en modo TP):

function a : longint;
begin
  a:=12;
  {    v---- Esta es una llamada recursiva }
  if a()>4 then
    begin
    {...}
    end;
end;

El procedimiento exit() se puede usar también con el resultado de una función como si fueran parámetros:

function a : longint;
begin
  a:=12;
  if a>4 then exit(a*67);
end;

Funciones definidas como forward tienen que ser definidas con su cabecera completa siempre (no en modo TP):

procedure x(v : longint);forward;
  procedure x; { esto sobrecarga el procedimiento x !!!!} 
	 begin 
	   { ... } 
	 end; 
	 { en lugar de eso escribir: } 
procedure x(v : longint); 
begin
	   { ... }
end;

Siempre se usa la evaluación booleana corta (incluso en modo TP!).

Otros.

Los parámetros en la línea de comandos son diferentes.

No todas las opciones del compilador están completamente implementadas.

Las unidades (units) son incompatibles a nivel de binarios.

Por Traducido por Diego Romero,