# Free Pascal

Free Pascal (chiamato anche FPK Pascal od ancora FPC Pascal) è un compilatore Pascal multipiattaforma. È un software libero.

## Introduzione

Free Pascal è un compilatore multipiattaforma per processori a 32/64 bits. Il compilatore implementa il linguaggio Pascal della Borland: Turbo Pascal e Delphi (Object Pascal). Inoltre possiede alcune caratteristiche tipiche del MacPascal ed è disponibile per i più comuni sistemi operativi.
Free Pascal era conosciuto con il nome di FPK Pascal, poiché le lettere FPK erano le iniziali del suo autore, Florian Paul Klämpfl. FPK non ha mai significato "Free Pascal Kompiler" anche se molte persone pensavano ciò. Inoltre, scrivere "Compiler" con la "K" non è molto comune in Tedesco. Alla fine del 1997, il nome del progetto fu cambiato in Free Pascal Compiler (FPC) per evitare confusioni e perché sempre più persone stavano contribuendo al progetto.
FPC è un progetto ragionevolmente ben documentato, con manuali per un totale di 1800 pagine. Le parti visuali delle librerie di Delphi (la VCL) e la creazione d'un IDE e di un RAD visuali fanno parte di un progetto separato, Lazarus.
Free Pascal è distribuito con un IDE in modalità testuale somigliante a quello del Turbo Pascal. Questo IDE si è deteriorato per un certo periodo di tempo per la mancanza di un manutentore, ma con uno sforzo comune tra la seconda metà del 2005 e i primi mesi del 2006, la maggior parte dei bug maggiori sono stati risolti e l'IDE è tornato di nuovo ad essere pronto per le release.
Come il Turbo Pascal e Delphi, Free Pascal ha un eccellente supporto per l'integrazione del linguaggio Assembly all'interno del codice Pascal. FPC supporta perfino architetture e notazioni multiple nell'assembler interno.
Free Pascal è stato eletto 'progetto del mese' nel dicembre 2018 su SourceForge.

## Dialetto del linguaggio

Necessita di un aggiornamento FPC adottava il dialetto standard dei programmatori Pascal: quello Borland (nello specifico: Borland Pascal 7 e Delphi 2 nella versione 1.0.x; nella versione 2.0.x si è avuto il passaggio a Delphi 6/7 per compatibilità).
Comunque sia, il progetto utilizza il concetto di modalità di compilazione e il team ha chiarito che è disponibile ad incorporare delle patch per i dialetti standardizzati ANSI/ISO per creare una modalità di compilazione conforme agli standard.
Inoltre è stato fatto un piccolo sforzo per supportare una parte della sintassi del Pascal Apple per facilitare l'interfacciamento con il Mac OS (X). Poiché il dialetto Apple implementa alcune caratteristiche del Pascal Standard che mancano in TP/Delphi, FPC è leggermente più compatibile con gli standard ISO rispetto a questi ultimi, con ulteriori caratteristiche supportate in arrivo.

### Funzionalità di Delphi mancanti

Nonostante goda di una buona compatibilità, ci sono alcune funzionalità di Delphi non supportate da Free Pascal:
* Delegazione tramite l'utilizzo della parola chiave "implements" (2.0.x, corretta in 2.1+);
* Automatic COM IDispatch dual interfaces (dispinterfaces);
* dispid in normal interfaces (2.0.x, corretta in 2.1+);
* packages: supporto nel compilatore di importazione/esportazione di classi da/verso librerie condivise (utile, per esempio, per Lazarus, che implementa package di componenti);
* set types possono avere dimensioni differenti. (2.0.x, corretta in 2.1+);

## Storia
### Primi anni

quando Borland annunciò che non ci sarebbe stato nessun Borland Pascal 8 e le successive versioni sarebbero state solo per Windows (che sarebbe divenuto Delphi in seguito), uno studente (Florian Paul Klämpfl) iniziò a lavorare sul suo compilatore. Il compilatore inizialmente era scritto nel dialetto (Borland) Turbo Pascal e produceva codice a 32-Bit per il DOS extender go32v1, utilizzato e sviluppato dal progetto DJGPP. Originariamente lo stesso compilatore era un eseguibile DOS a 16-bit compilato con il Turbo Pascal. Dopo due anni, il compilatore fu capace di compilarsi e diventò anche a 32-bit.

### Espansione

L'iniziale compilatore a 32-bit fu pubblicato in rete e i primi contributori si unirono al progetto. Negli anni successivi alla pubblicazione in Internet, il compilatore venne portato verso Linux da Michael van Canneyt (5 anni prima di Kylix) e la versione per DOS venne adattata per l'utilizzo in OS/2 tramite l'EMX extender. Anche la versione per DOS venne migliorata gradualmente e migrata verso l'extender go32v2. Questo processo culminò nella release 0.99.5 che fu molto più utilizzata delle versioni precedenti, e che fu l'ultima release mirata soltanto alla conformità con il Turbo Pascal: le release successive aggiungeranno anche una modalità compatibile con Delphi. La release 0.99.5 fu anche portata verso i sistemi dotati di CPU 680x0.
Con la 0.99.8 venne aggiunto il target Wii32 e si cominciò ad aggiungere alcune caratteristiche di Delphi no. La pietra miliare della release 1.0 stabile fu raggiunta nel luglio 2000. La serie 1.0.x (e le release con bug-fix/stabilizzazioni che seguirono, l'ultima, la 1.0.10, nel luglio 2003) fu usata largamente, sia a fini commerciali che educativi. Per le release 1.0.x venne rifatto il porting verso le CPU 680x0 e il compilatore fu in grado di produrre codice stabile per i sistemi Unix dotati di CPU 68k e per l'AmigOS.

### La generazione successiva

Durante il processo di stabilizzazione di quella che sarebbe diventata la release 1.0.x, in particolar modo durante il porting verso i sistemi m68k, risultò chiaro che il design del generatore di codice era troppo limitato sotto diversi aspetti. I problemi principali riguardavano l'aggiunta di un nuovo processore, che significava fondamentalmente riscrivere il generatore di codice, e l'allocazione del registro, che si basava sul principio di mantenere sempre 3 registri liberi tra i building blocks, cosa poco flessibile e difficile da mantenere.
Per questi motivi, nel dicembre 1999 venne ramificato il ramo FPC 1.1.x dal ramo principale 1.0.x. All'inizio, i cambiamenti riguardarono principalmente la pulizia e la riscrittura di tutte le parti del compilatore; vennero quindi riscritti il generatore di codice e l'allocatore del register. Come bonus vennero aggiunte le caratteristiche che mancavano alla compatibilità con Delphi.
Il lavoro sul 1.1.x continuò lentamente ma costantemente, e verso la fine del 2003 cominciò a funzionare il porting per PowerPC, seguito da quello per ARM e SPARC verso l'estate/inverno del 2004 a cui seguì il porting per AMD64. Il porting per AMD64 rese il compilatore per 32/64-bit.
Nel novembre 2003, una prima release beta del ramo 1.1.x venne distribuita e, per l'occasione, il numero di versione venne modificato in 1.9.0. Seguirono rapidamente la 1.9.2 e la 1.9.4. La versione 1.9.4 risultò speciale perché fu la prima con il supporto per Mac OS X.
Il lavoro continuò con la versione 1.9.6 (gennaio 2005), 1.9.8 (fine febbraio 2005), 2.0.0 (maggio 2005), 2.0.2 (dicembre 2005), 2.0.4 (agosto 2006) e 2.2.0 (settembre 2007).

### Sviluppi successivi

Le seguenti caratteristiche mancano nella versione 2.0.x e sono richieste. Quelle segnate con † sono attualmente in lavorazione nel ramo 2.1.x/2.3.1.
* Creare/migliorare il supporto per COM/OLE. Questo compito ha diverse sfaccettature:
** Interfacce/vmt compatibili con COM
** (OLE)Variants (richiesto per OLE)
** † delegazione tramite implements
* Linking/debug/formato di file:
** † Migliorare lo smart linking (eliminare i file .a, minor uso di memoria), al momento solo per wince/32/64.
** Migliorare i "package" e in generale il supporto per le librerie dinamiche (PIC!).
** † Migliorare il cross linking.
** † Stabs->dwarf crossover. (da implementare prima le piattaforme a 64-bit)
** Creare una sorta di compatibilità per le risorse di Kylix. (Ancora in discussione)
* Apple Pascal:
** Possibilità di passare una sotto procedura ad una differente procedura come procvar.
** † Bitpacking dei record
* Ottimizzazione:
** Tail recursion
** Stackframe omission
** Ottimizzazione CSE basata su temp (register)
Alcune di queste caratteristiche, in particolar modo quelle nella sezione relativa al linking, possono richiedere alcune modifiche:
* † Introduzione di un linker interno per alcune piattaforme. (rimozione del linker esterno, LD) (da implementare solo per wince/32/64)
* Riscrittura della gestione dei moduli (unit), rimandato a dopo la versione 2.2

## Target

La disponibilità del compilatore FPC dipende dalle versioni maggiori.

### Versione 2.4.x

In questa versione sono state aggiunte ed ultimate diverse piattaforme:
* Migliorato il target macOS 64-bit (x86_64/ppc64)
* iPhone (Mac OS X/Arm)
* Haiku (dalla famiglia BeOS)
* Migliorato il supporto ad ARM EABI

### Versione 2.3.x

Oltre a tutti i target supportati dalla versione 2.2, questa versione supporta:
* Symbian OS - con il toolkit UIQ
* Mac OS X 64-bit (Darwin/x86_64)

### Versione 2.2.x

La versione stabile corrente 2.2.0 aggiunge il supporto per:
* Win64
* macOS (su Intel, i386)
* PowerPC 64-bit
* Windows CE (Windows Mobile)
* Nintendo Game Boy Advance (standard ARM only)
* Nintendo DS (standard ARM only)

### Versione 2.0.x

Processore:
* iA-32: Intel 80386, processori compatibili e successivi processori Intel della stessa famiglia (80486 e Pentium).
** AMD64: x86_64
* PowerPC
* ARM
* SPARC v8 e v9
Sistemi operativi:
* Linux: tutte le CPU
* BSD e famiglia
** FreeBSD
** macOS e Darwin (PowerPC)
* Mac OS
* DOS; Go32V2 extender. PMode extender utilizzato talvolta nei sistemi embedded
* Win32 (Microsoft Windows 95 e tutte le versioni successive)
* OS/2: EMX e nativo
* Novell NetWare
* MorphOS

### Versione 1.0.x

La precedente versione stabile 1.0.x era disponibile per Processore
* Intel 80386 e compatibili
* Motorola 680x0
e supportava i seguenti sistemi operativi
* Linux: x86/m68k
* BSDs
** FreeBSD
** NetBSD: x86/m68k
* DOS: Go32V2 extender. PMode extender utilizzato talvolta nei sistemi embedded
* Win32
* OS/2: EMX
* Amiga Classic, m68k
e le piattaforme beta:
* BeOS, beta
* Una versione beta per OpenBSD/x86 è esistita per un determinato periodo.
* SunOS, Solaris
* QNX
* Windows CE

## Software applicativi prodotti con Free Pascal

* Pixel image editor Archiviato il 28 settembre 2007 in Internet Archive.: Editor di immagini simile a Photoshop
* Peazip: Programma di archiviazione a sorgente aperto, prodotto con Lazarus/FPC
* Morfik: Morfik WebOS AppBuilder utilizza Free Pascal per produrre binari CGI