Early years Free Pascal was created when Borland clarified that Borland Pascal development for
MS-DOS would stop with version 7. Student Florian Paul Klämpfl began developing his own compiler written in the Turbo Pascal dialect which produced
32-bit code for the GO32v1
DOS extender, (developed and used by the
DJ's GNU Programming Platform project). Originally, the compiler was a 16-bit executable compiled by
Turbo Pascal. After two years, the compiler was able to
compile itself into a 32-bit executable.
Expansion The initial 32-bit compiler was published on the
Internet, and the first contributors joined the project. Later, a
Linux port was created by Michael van Canneyt, five years before the
Borland Kylix Pascal compiler for Linux became available. The DOS port was adapted for use in
OS/2 using the
Eberhard Mattes eXtender (EMX) which made OS/2 the second supported compiling target. As well as Florian Klämpfl the original author, Daniël Mantione also contributed significantly to make this happen, providing the original port of the run-time library to OS/2 and EMX. The compiler improved gradually, and the DOS version migrated to the GO32v2 extender. This culminated in release 0.99.5, which was much more widely used than prior versions, and was the last release aiming only for Borland Pascal compliance; later releases added a Delphi compatibility mode. This release was also ported to systems using
Motorola 68000 family (m68k) processors. With release 0.99.8 the
Win32 target was added, and a start was made with incorporating some Delphi features. Stabilizing for a non-
beta release began, and version 1.0 was released in July 2000. The 1.0.
x series was widely used, in business and education. For the 1.0.
x releases, the port to 68k CPU was redone, and the compiler produced stable code for several 68k
Unix-like and
AmigaOS operating systems.
Version 2 During the stabilization of what would become 1.0.
x, and also when porting to the
Motorola 68k systems, it was clear that the design of the code generator was far too limited in many aspects. The principal problems were that adding processors meant rewriting the code generator, and that the register allocation was based on the principle of always keeping three free registers between building blocks, which was inflexible and difficult to maintain. For these reasons, the 1.1.
x series
branched off from the 1.0.
x main branch in December 1999. At first, changes were mostly clean-ups and rewrite-redesigns to all parts of the compiler. The code generator and register allocator were also rewritten. Any remaining missing Delphi compatibility was added. The work on 1.1.x continued slowly but steadily. In late 2003, a working
PowerPC port became available, followed by an
ARM port in summer 2004, a
SPARC port in fall 2004, and an
x86-64-AMD64 port in early 2004, which made the compiler available for a 64-bit platform. In November 2003, a first
beta release of the 1.1.
x branch was packaged and numbered 1.9.0. These were quickly followed by versions 1.9.2 and 1.9.4; the latter introduced OS X support. The work continued with version 1.9.6 (January 2005), 1.9.8 (late February 2005), 2.0.0 (May 2005), 2.0.2 (December 2005), and 2.0.4 (August 2006).
Version 2.2.x In 2006, some of the major reworks planned for 2.2, such as the rewrite of the unit system, had still not begun, and it was decided to instead start stabilizing the already implemented features. Some of the motives for this
roadmap change were the needs of the Lazarus integrated development environment project, particularly the internal linker, support for
Win64,
Windows CE, and OS X on
x86, and related features like
DWARF. After betas 2.1.2 and 2.1.4, version 2.2.0 was released in September 2007, followed by version 2.2.2 in August 2008 and version 2.2.4 in March 2009. The 2.2.
x series vastly improved support for the
ActiveX and
Component Object Model (COM)
interface, and
Object Linking and Embedding (OLE), though bugs were still being found. The delegation to interface using the implements keyword was partly implemented, but was not complete . Library support for ActiveX was also improved. Another major feature was the internal linker for Win32, Win64, and Windows CE, which greatly improved linking time and memory use, and make the compile-link-run cycle in Lazarus much faster. The efficiency for smart-linking, or
dead code elimination, was also improved. Minor new features included improved DWARF (2/3) debug format support, and optimizations such as
tail recursion, omission of unneeded
stack frames and register-based
common subexpression elimination (CSE) optimization. A first implementation of
generic programming (generics) support also became available, but only experimentally.
Version 2.4.x The 2.4.x release series had a less clear set of goals than earlier releases. The unit system rewrite was postponed again, and the branch that became 2.4 was created to keep risky commits from 2.2 to stabilize it. Mostly these risky commits were more involved improvements to the new platforms, Mac PowerPC 64, Mac x86-64, iPhone, and many fixes to the ARM and x86-64 architectures in general, as well as DWARF. Other compiler improvements included
whole program optimization (WPO) and
devirtualization and ARM
embedded-application binary interface (EABI) support. Later, during the 2.2 cycle, a more
Delphi-like resource support (based on special sections in the binary instead of Pascal constants) was added. This feature, direly needed by Lazarus, became the main highlight of the branch. Other more minor additions were a
memory manager that improved
heap manager performance in
threaded environments, small improvements in Delphi compatibility such as OleVariant, and improvements in
interface delegation. On January 1, 2010, Free Pascal 2.4.0 was released, followed on November 13, 2010, by bug fix release 2.4.2, with support for for..in loops, sealed and abstract classes, and other changes.
Version 2.6.x In January 2012, Free Pascal 2.6 was released. This first version from the 2.6 release series also supported
Objective Pascal on OS X and
iOS targets and implemented many small improvements and bug fixes. In February 2013, FPC 2.6.2 was released. It contained
NetBSD and
OpenBSD releases for the first time since 1.0.10, based on fresh ports. In March 2014, the last point release in the 2.6 series, 2.6.4, was launched, featuring mostly database (fcl-db) updates.
Version 3.0.x Version 3.0.0 was released on November 25, 2015, and was the first major release since January 1, 2012. It introduced many new language features. Version 3.0.2 was released on February 15, 2017, and includes bug fixes and minor compiler updates. Version 3.0.4 was released on November 28, 2017. It includes many language improvements over previous versions, including an internal linker for
Executable and Linkable Format (ELF), Arm AARCH64 for iOS and Linux, a revived i8086 platform, extended libraries and much more.
Version 3.2.x The next major release, version 3.2.0, was published on June 19, 2020. It introduced many new language features, including generic routines, standard namespaces, managed records and expanded functionality for dynamic arrays, in addition to the advent of new standard units and the support of additional platforms. Version 3.2.2 was released on May 20, 2021, and supports macOS on
AArch64 and naming of threads. Additionally it includes bug fixes and minor compiler updates. A release candidate, FPC 3.2.4-rc1, was available for test in June 2025.
Version 3.3.x development version 3.3.1 was available for download as file fpc.zip. The most recent member of the archive (excepting a file stating the date the members of ftp.zip were extracted) was dated 15 September 2023. == Targets ==