# Free Pascal

El Free Pascal es un compilador Pascal portable, libre y de código abierto, que representa una alternativa a los productos comerciales Turbo Pascal y Delphi.

## Introducción

Free Pascal es un compilador tanto de 32 como de 64 bits para múltiples arquitecturas de CPU y múltiples sistemas operativos. El compilador implementa los dialectos de Pascal de Borland Turbo Pascal y Delphi, además de algunas construcciones de MacPascal. Está disponible para la mayoría de los sistemas operativos populares.
Free Pascal se conocía inicialmente como FPK Pascal. Debido a que FPK son las iniciales del autor, Florian Paul Klämpfl, el FPK Pascal nunca significó "Free Pascal Kompiler", aunque mucha gente pensaba eso; de todos modos, escribir el "Compilador" con "K" es infrecuente en Alemania. A finales de 1997, el nombre del proyecto fue cambiado a Free Pascal Compiler (FPC) (Compilador Free Pascal) para evitar esta confusión y por la cantidad cada vez mayor de gente que contribuía.
FPC es un proyecto razonablemente bien documentado, con manuales que alcanzan las 1800 páginas en total.
Las partes visuales de las bibliotecas de Delphi (el VCL) y la creación de un IDE y un RAD visuales son parte de un proyecto separado, denominado Lazarus.
La distribución de Free Pascal incluye un IDE en modo de texto semejante al de Turbo Pascal. Aunque este IDE se estuvo deteriorando por algún tiempo debido a una falta de mantenimiento, en un esfuerzo común la mayoría de los bugs fueron corregidos, así que ahora está en una muy buena forma.
De manera similar a Turbo Pascal y Delphi, Free Pascal tiene excelente soporte para la integración del lenguaje ensamblador en el código Pascal. Además, soporta múltiples arquitecturas y notaciones.

## Dialecto del lenguaje

El FPC adoptó los dialectos estándar de facto de los programadores Pascal, los dialectos de Borland, específicamente Borland Pascal 7 y Delphi 2 para la versión 1.0.x del FPC, y Delphi 6/7 para la versión 2.0.x del FPC.
Sin embargo el proyecto tiene un concepto de "modo de compilación", y el equipo hizo claro que incorporaría los parches para los dialectos estandarizados ANSI/ISO para crear un modo conforme con el estándar.
También, se ha hecho un pequeño esfuerzo de soportar algo de la sintaxis del Apple Pascal, para la fácil interconexión con el Mac OS (X).
Funcionalidad de Delphi faltante en Free Pascal:
* Delegación usando la palabra clave "implements"
* Interfaces duales COM IDispatch automáticas (dispinterfaces)
* dispid en interfaces normales
* Paquetes:el compilador soporta importación y exportación de clases desde y hacia librerías compartidas (útil, por ejemplo, para Lazarus, el cual implementa el empaquetado de componentes)
* set types pueden tener diferentes tamaños

## Historia
### Primeros años

Free Pascal emergió cuando Borland dejó claro que no habría un Borland Pascal 8, y que la versión siguiente sería un producto solamente para Windows (que posteriormente resultó convertirse en Delphi). Un estudiante, Florian Paul Klämpfl, comenzó a trabajar en su propio compilador. El compilador fue escrito desde el principio en el dialecto de Turbo Pascal de Borland y producía código de 32 bits para el DOS extender go32v1, desarrollado en ese tiempo por el proyecto DJGPP. Originalmente el compilador en sí mismo era un ejecutable DOS de 16 bits compilado por Turbo Pascal. Después de dos años, el compilador podía compilarse a sí mismo, así que también llegó a ser de 32 bits.

### Expansión

El compilador inicial de 32 bits fue publicado en la red, y los primeros contribuidores se unieron el proyecto. En los años siguientes a publicarse en Internet, Michael van Canneyt hizo un traslado al Linux, 5 años completos antes de Kylix. El traslado al DOS fue adaptado para el uso en el OS/2 a través del EMX extender. La versión del DOS también mejoró gradualmente, y emigró al go32v2 extender. Esto culminó en el lanzamiento de la versión 0.99.5 que fue usada mucho más extensamente que las versiones anteriores, y el último lanzamiento que apuntaba solamente a la conformidad con el Turbo Pascal. Lanzamientos posteriores agregarían un modo de compatibilidad con Delphi. El 0.99.5 también fue trasladado a sistemas que usaban los CPU de la serie 680x0.
En la versión 0.99.8, fue agregado como destino la compilación para el Win32, y se inició la incorporación de algunas características de Delphi. Fue iniciada la estabilización para el lanzamiento de la versión 1.0, y este hito fue alcanzado en julio de 2000. La serie 1.0.x, y los lanzamientos para estabilización y corrección de errores que siguieron hasta la versión 1.0.10 en julio de 2003 fueron ampliamente usadas como una herramienta tanto empresarial como educativa. Para los lanzamientos de esta serie, el traslado a los CPUs 680x0 fue hecho de nuevo, con lo cual el compilador pudo producir código estable para un número de computadores con procesadores 68k, como sistemas UNIX y AmigaOS.

### La siguiente generación

Durante la estabilización de lo que se convirtió en la versión 1.0.x, y especialmente cuando se transportaba a los sistemas m68k, estaba claro que el diseño del generador de código estaba muy limitado de muchas maneras. Los dos problemas más importantes eran que (1) agregar procesadores significaba básicamente que había que reescribir el generador de código, y (2) la asignación de registros estaba basada en un principio que era difícil de mantener e inflexible, obligando a tener 3 registros entre los bloques de construcción.
Por estas razones, FPC 1.1.x se separó de la rama principal del 1.0.x, en diciembre de 1999. Al principio, los cambios eran sobre todo limpieza, reescritura de código, en todas las partes del compilador; entonces se reescribieron el generador de código y la asignación de registros. Como un bono, se agregó la compatibilidad que faltaba con Delphi.
El trabajo sobre 1.1.x continuó lentamente pero con constancia, y a finales de 2003 el traslado al PowerPC comenzó trabajar, seguido por los traslados al ARM y al Sparc en el verano y otoño de 2004. Continuó luego el traslado al AMD64 a principios de 2004. Este último efectivamente convirtió al compilador en uno de 32 y 64 bits.
En noviembre de 2003, un primer lanzamiento beta de la rama del 1.1.x fue empaquetado, y para la ocasión, el número de versión fue subido a 1.9.0. Estos fueron seguidos rápidamente por 1.9.2 y 1.9.4. La versión 1.9.4 fue especial porque fue la primera versión con soporte para Mac OS X.
El trabajo continuó con la versión 1.9.6 en enero de 2005, 1.9.8 a finales de febrero de 2005, 2.0.0 en mayo de 2005, 2.0.2 en diciembre de 2005 y 2.0.4 en agosto de 2006. Actualmente la última versión estable es la 3.2.2.

### El futuro

Mapa de camino a corto plazo (2.1.x)
* crear y mejorar el soporte para COM y OLE. Esto tiene múltiples facetas:
** interfaces/vmt compatible con COM
** Variants, (necesario para OLE)
** delegación al estilo de implements
* cambios y mejoras en los formatos de enlazado/depuración/archivo
** mejora de enlazado inteligente (elimina los archivos .a, menos uso de memoria
** mejora de "paquetes" y librerías dinámicas soporte PIC! en general
** enlazado cruzado (cross linking) (actualmente el 2.0 ya tiene bastante capacidad de enlazado cruzado)
** crossover stabs -> dwarf
** Algún soporte para resources compatibles con Kylix (todavía bajo discusión)
* soporte para tipos de archivo nativo de tamaño de 64 bits (hecho)
* cambios en relación con Apple Pascal
** tener la capacidad de pasar un subprocedimiento, como un procvar, a un diferente proc;
Algunas de las funcionalidades de destino (especialmente en la sección enlazadora) pudieron requerir reestructuras relacionadas con
* introducción de un linker interno para algunas plataformas principales (no más LD)
* reescritura del manejo del módulo (unit)

## Plataformas disponibles

La disponibilidad del compilador FPC depende de la versión principal.

### Versión 2.4.0, 2.4.2, 2.4.4, 2.6.0

* ARM
** Game Boy Advance
** Nintendo DS
** linux
** Windows CE
* intel/i386
** DOS (GO32v2 extender)
** FreeBSD (FreeBSD 6.x and 7.x)
** linux
** Mac OS X
** OS/2
** Win32 and Windows CE (Windows 98, Windows ME, Windows NT, Windows 2000, Windows XP, Windows Vista)
* Power PC
** linux
** Mac OS X
* Power PC 64 bit
** linux
** Mac OS X
* sparc
** linux
* amd64/x86 64
** linux
** Win64

### Versión 2.2.4

* ARM
** linux
** Windows CE
* intel/i386
** DOS (GO32v2 extender)
** FreeBSD (FreeBSD 6.x and 7.x)
** linux
** Mac OS X
** OS/2
** Win32 and Windows CE (Windows 95, Windows 98, Windows ME, Windows NT, Windows 2000, Windows XP, Windows Vista)
* Power PC
** linux
** Mac OS X
* Power PC 64 bit
** linux
* sparc
** linux
* amd64/x86 64
** linux
** Win64

### Versión 2.1.x

* Win64
* Mac OS X (en la plataforma Intel)
* PowerPC de 64 bits

### Versión 2.0.x

La versión estable actual 2.0.4 soporta lo siguiente
* Procesadores:
** iA-32: Intel 80386 y compatibles
*** AMD64: x86_64
** PowerPC
** ARM
** Sparc v8 y v9
* sistemas operativos:
** Linux: todos los CPUs
** FreeBSD
*** Mac OS X y Darwin (PowerPC)
** Mac OS
** DOS: Go32V2 extender. PMode extender usado a veces para sistemas empotrados
** Win32
** OS/2: EMX y nativo
** Novell Netware
** WinCE

### Versión 1.0.x

El previo lanzamiento estable 1.0.x estaba disponible para:
* procesadores:
** Intel 80386 y compatibles
** Motorola 680x0
* sistemas operativos:
** Linux: x86/m68k
** FreeBSD
*** NetBSD: x86/m68k
** DOS: Go32V2 extender. PMode extender a veces usado para proyectos embebidos
** Win32
** OS/2: EMX
** Amiga Classic, m68k
* plataformas beta:
** BeOS, beta
** SunOS, Solaris
** QNX
** Windows CE