Free Pascal Compiler ( FPC ) es un compilador para los dialectos de lenguaje de programación Pascal y Object Pascal , estrechamente relacionados . Es software libre publicado bajo la Licencia Pública General de GNU , con cláusulas de excepción que permiten la vinculación estática con sus bibliotecas y paquetes de tiempo de ejecución para cualquier propósito en combinación con cualquier otra licencia de software.
Admite su propio dialecto Object Pascal, así como los dialectos de varios otros compiladores de la familia Pascal hasta cierto punto, incluidos los de Borland Pascal (llamado "Turbo Pascal" hasta la versión 6 de 1990), Borland (más tarde Embarcadero) , Delphi y algunos compiladores históricos de Macintosh . El dialecto se selecciona por unidad (módulo) y se puede utilizar más de un dialecto por programa.
Sigue la filosofía de escribir una vez y compilar en cualquier lugar y está disponible para muchas arquitecturas de CPU y sistemas operativos (consulte Objetivos). Admite lenguaje ensamblador en línea e incluye un ensamblador interno capaz de analizar varios dialectos, como los de estilo AT&T e Intel.
Existen proyectos separados para facilitar el desarrollo de aplicaciones de interfaz gráfica de usuario (GUI) multiplataforma , siendo el más destacado el entorno de desarrollo integrado (IDE) Lazarus .
Inicialmente, Free Pascal adoptó el dialecto estándar de facto de los programadores de Pascal, Borland Pascal, pero luego adoptó Object Pascal de Delphi. A partir de la versión 2.0, la compatibilidad con Delphi se ha implementado y mejorado continuamente.
El proyecto tiene un concepto de modo de compilación , y los desarrolladores dejaron en claro que incorporarían parches de trabajo para los dialectos estandarizados del Instituto Nacional Estadounidense de Estándares (ANSI) y la Organización Internacional de Normalización (ISO) para crear un modo compatible con los estándares.
Se ha hecho un pequeño esfuerzo para admitir parte de la sintaxis de Apple Pascal para facilitar la interacción con el sistema operativo Mac OS y macOS clásico . El dialecto de Apple implementa algunas características estándar de Pascal que Turbo Pascal y Delphi omiten.
La serie de versiones 2.2.x no modificó significativamente los objetivos del dialecto más allá de la sintaxis de nivel 7 de Delphi, sino que apuntó a una compatibilidad más estrecha. Una excepción notable a esto fue la incorporación de compatibilidad con genéricos a Free Pascal en la versión 2.2.0, varios años antes de que Delphi los admitiera de alguna manera.
En 2011 se añadieron varias características específicas de Delphi 2006 en la rama de desarrollo y UnicodeString
se completó parte del trabajo inicial para las características nuevas de Delphi 2009 (en particular, la incorporación del tipo). La rama de desarrollo también tiene una extensión Objective-Pascal para la interfaz Objective-C ( Cocoa ).
A partir de la versión 2.7.1, Free Pascal implementó el modo ISO Pascal básico, aunque muchas cosas como los Get
procedimientos Put
y y el concepto de variable de búfer de archivo para el manejo de archivos aún estaban ausentes.
A partir de la versión 3.0.0, el modo ISO Pascal está bastante completo. Ha sido capaz de compilar el compilador ISO Pascal P5 de standardpascal.org sin cambios.
Free Pascal fue creado cuando Borland aclaró que el desarrollo de Borland Pascal para DOS se detendría con la versión 7, para ser reemplazado por un producto exclusivo para Windows , que luego se convirtió en Delphi.
El estudiante Florian Paul Klämpfl comenzó a desarrollar su propio compilador escrito en el dialecto Turbo Pascal y produjo código de 32 bits para el extensor DOS GO32v1 , que fue utilizado y desarrollado por el proyecto DJ's GNU Programming Platform ( DJGPP ) en ese momento.
Originalmente, el compilador era un ejecutable DOS de 16 bits compilado por Turbo Pascal . Después de dos años, el compilador pudo compilarse a sí mismo y se convirtió en un ejecutable de 32 bits.
El compilador inicial de 32 bits se publicó en Internet y los primeros colaboradores se unieron al proyecto. Más tarde, Michael van Canneyt creó un port para Linux , cinco años antes de que estuviera disponible el compilador Borland Kylix Pascal para Linux.
El puerto DOS fue adaptado para su uso en OS/2 utilizando el Eberhard Mattes eXtender (EMX), que convirtió a OS/2 en el segundo objetivo de compilación compatible. Además de Florian Klämpfl, el autor original, Daniël Mantione también contribuyó significativamente a que esto sucediera, proporcionando el puerto original de la biblioteca de tiempo de ejecución para OS/2 y EMX. El compilador mejoró gradualmente y la versión DOS migró al extensor GO32v2. Esto culminó en la versión 0.99.5, que fue mucho más utilizada que las versiones anteriores y fue la última versión que apuntaba únicamente a la compatibilidad con Borland Pascal; las versiones posteriores agregaron un modo de compatibilidad con Delphi. Esta versión también fue portada a sistemas que utilizan procesadores de la familia Motorola 68000 (m68k).
Con la versión 0.99.8 se agregó el objetivo Win32 y se comenzó a incorporar algunas características de Delphi. Comenzó la estabilización para una versión no beta y la versión 1.0 se lanzó en julio de 2000. La serie 1.0. x se usó ampliamente en empresas y educación. Para las versiones 1.0. x , se rehizo el puerto a la CPU de 68k y el compilador produjo código estable para varios sistemas operativos tipo Unix y AmigaOS de 68k .
Durante la estabilización de lo que se convertiría en la versión 1.0. x , y también durante la migración a los sistemas Motorola 68k, quedó claro que el diseño del generador de código era demasiado limitado en muchos aspectos. Los principales problemas eran que añadir procesadores significaba reescribir el generador de código, y que la asignación de registros se basaba en el principio de mantener siempre tres registros libres entre los bloques de construcción, lo que era inflexible y difícil de mantener.
Por estas razones, la serie 1.1. x se separó de la rama principal 1.0. x en diciembre de 1999. Al principio, los cambios consistieron principalmente en limpiezas y rediseños de todas las partes del compilador. También se reescribieron el generador de código y el asignador de registros. Se agregó toda la compatibilidad faltante con Delphi.
El trabajo en 1.1.x continuó de forma lenta pero constante. A fines de 2003, se puso a disposición un puerto PowerPC funcional, seguido por un puerto ARM en el verano de 2004, un puerto SPARC en el otoño de 2004 y un puerto x86-64 -AMD64 a principios de 2004, que hizo que el compilador estuviera disponible para una plataforma de 64 bits.
En noviembre de 2003 se publicó una primera versión beta de la rama 1.1. x , que recibió el número 1.9.0. A éstas le siguieron rápidamente las versiones 1.9.2 y 1.9.4; esta última introdujo la compatibilidad con OS X. El trabajo continuó con las versiones 1.9.6 (enero de 2005), 1.9.8 (finales de febrero de 2005), 2.0.0 (mayo de 2005), 2.0.2 (diciembre de 2005) y 2.0.4 (agosto de 2006).
En 2006, algunas de las principales modificaciones planificadas para la versión 2.2, como la reescritura del sistema de unidades, aún no habían comenzado, y se decidió en su lugar empezar a estabilizar las características ya implementadas.
Algunos de los motivos de este cambio de hoja de ruta fueron las necesidades del proyecto del entorno de desarrollo integrado Lazarus, en particular el enlazador interno, la compatibilidad con Win64 , Windows CE y OS X en x86 , y características relacionadas como DWARF . Después de las versiones beta 2.1.2 y 2.1.4, se lanzó la versión 2.2.0 en septiembre de 2007, seguida de la versión 2.2.2 en agosto de 2008 y la versión 2.2.4 en marzo de 2009.
La serie 2.2. x mejoró enormemente el soporte para ActiveX y la interfaz del Modelo de objetos componentes (COM) , y el Enlace e incrustación de objetos (OLE), aunque todavía se encontraban errores. La delegación a la interfaz mediante la palabra clave se implementó parcialmente, pero no estaba completa a marzo de 2011. [1] También se mejoró el soporte de la biblioteca para ActiveX .implements
[actualizar]
Otra característica importante fue el enlazador interno para Win32, Win64 y Windows CE, que mejoró enormemente el tiempo de enlace y el uso de memoria, y aceleró mucho el ciclo de compilación-enlace-ejecución en Lazarus. También se mejoró la eficiencia del enlace inteligente o eliminación de código muerto .
Entre las nuevas características menores se incluyen la compatibilidad mejorada con el formato de depuración DWARF (2/3) y optimizaciones como la recursión de cola , la omisión de marcos de pila innecesarios y la optimización de eliminación de subexpresiones comunes (CSE) basada en registros . También se puso a disposición una primera implementación de compatibilidad con programación genérica (genéricos), pero solo de manera experimental.
La serie de versiones 2.4.x tenía un conjunto de objetivos menos claro que las versiones anteriores. La reescritura del sistema de unidades se pospuso nuevamente y la rama que se convirtió en 2.4 se creó para mantener las actualizaciones riesgosas de la versión 2.2 para estabilizarla. La mayoría de estas actualizaciones riesgosas implicaban mejoras más importantes para las nuevas plataformas, Mac PowerPC 64, Mac x86-64, iPhone y muchas correcciones para las arquitecturas ARM y x86-64 en general, así como para DWARF.
Otras mejoras del compilador incluyen la optimización de todo el programa (WPO) y la desvirtualización , así como el soporte de la interfaz binaria de aplicaciones integradas ARM (EABI).
Más tarde, durante el ciclo 2.2, se agregó un soporte de recursos más parecido a Delphi (basado en secciones especiales en el binario en lugar de constantes de Pascal). Esta característica, que Lazarus necesitaba con urgencia, se convirtió en el punto destacado de la rama.
Otras adiciones menores fueron un administrador de memoria que mejoró el rendimiento del administrador de montón en entornos con subprocesos , pequeñas mejoras en la compatibilidad con Delphi como OleVariant
y mejoras en la delegación de interfaz .
El 1 de enero de 2010 se lanzó Free Pascal 2.4.0, seguido el 13 de noviembre de 2010 por la versión 2.4.2 de corrección de errores, con soporte para for..in
bucles, sealed
clases abstract
y otros cambios. [2]
En enero de 2012 se publicó Free Pascal 2.6. Esta primera versión de la serie de versiones 2.6 también era compatible con Objective Pascal en los sistemas operativos OS X e iOS e implementaba muchas pequeñas mejoras y correcciones de errores. En febrero de 2013 se publicó FPC 2.6.2. Incluía versiones de NetBSD y OpenBSD por primera vez desde la versión 1.0.10, basadas en nuevas versiones. En marzo de 2014 se lanzó la última versión de la serie 2.6, la 2.6.4, que incluía principalmente actualizaciones de bases de datos (fcl-db).
La versión 3.0.0 se lanzó el 25 de noviembre de 2015 y fue el primer lanzamiento importante desde el 1 de enero de 2012. Introdujo muchas características nuevas del lenguaje. [3]
La versión 3.0.2 se lanzó el 15 de febrero de 2017 e incluye correcciones de errores y actualizaciones menores del compilador.
La versión 3.0.4 se lanzó el 28 de noviembre de 2017.
Incluye muchas mejoras del lenguaje con respecto a las versiones anteriores, incluido un enlazador interno para el formato ejecutable y enlazable (ELF), Arm AARCH64 para iOS y Linux, una plataforma i8086 renovada, bibliotecas extendidas y mucho más.
La siguiente versión importante, la 3.2.0, se publicó el 19 de junio de 2020. Introdujo muchas características nuevas del lenguaje, incluidas rutinas genéricas, espacios de nombres estándar, registros administrados y funcionalidad expandida para matrices dinámicas, además de la llegada de nuevas unidades estándar y el soporte de plataformas adicionales. [4]
La versión 3.2.2 se lanzó el 20 de mayo de 2021 y es compatible con macOS en AArch64 y con la denominación de subprocesos. Además, incluye correcciones de errores y actualizaciones menores del compilador. [5]
Free Pascal también soporta la generación de bytecode para la Java Virtual Machine a partir de la versión 3.0.0 y apunta tanto a Java de Oracle como a Android JVM de Google, [6] aunque la sintaxis de Object Pascal no es totalmente compatible. Free Pascal 3.0.0 también soporta plataformas ARMHF como Raspberry Pi , incluyendo ARMV6-EABIHF ejecutándose en Raspbian. El trabajo en ARM de 64 bits ha resultado en soporte para iOS en 3.0.0 también. Se ha añadido un objetivo ARM Android nativo, terminando con el objetivo ARM Linux anteriormente hackeado para generar bibliotecas ARM nativas para Android. Esto hace que portar aplicaciones Lazarus a Android (usando Custom Drawn Interface [7] ) sea más fácil. Desde FPC 2.6.2, OpenBSD y NetBSD son soportados en arquitecturas IA32 y X86_64. Se ha añadido un nuevo objetivo integrado para uso sin SO (ARM Cortex M y MIPS principalmente). Con InstantFPC es posible ejecutar programas Pascal, que se traducen justo a tiempo, como scripts Unix o back-end CGI .
Ultibo core es un entorno de desarrollo integrado o de hardware para Raspberry Pi. [8] Ultibo se basa en Free Pascal y se desarrolló bajo una versión modificada de Lazarus. El IDE está basado en PC, pero también se ha adaptado a Linux y Mac. Ultibo es un entorno de ejecución sin sistema operativo y tiene soporte para la mayoría de las funciones y permite al programador un control total sobre el hardware a través de las unidades RTL. El entorno de ejecución implementa multitarea preventiva y multiproceso. El programador puede colocar subprocesos en una CPU específica o dejar que el entorno de ejecución divida la carga automáticamente o una mezcla de los dos. La mayoría de los modelos de Raspberry Pi son compatibles, incluidos A, B, A+ y B+, así como Raspberry Pi 2B, 3B, 4B/400/CM4 y Zero. [9]
Al igual que la mayoría de los compiladores modernos, Free Pascal se puede utilizar con un entorno de desarrollo integrado (IDE). Además de los IDE independientes, también hay complementos para varios IDE existentes.
Además de un compilador y un IDE, Free Pascal proporciona las siguientes bibliotecas: