Object Pascal (1/2)

Un linguaggio completo

Jilani Khaldi (Marzo 2023)

Questo articolo è stato scritto e pubblicato quasi ventanni fa, ma ora lo pubblico di nuovo, perché com qualche piccola modifica lo trovo ancora attuale.

"Uno dei miei obiettivi nello studio delle tecniche di collaudo dei programmi è la progettazione di linguaggio migliori che rendono semplice scrivere programmi corretti e difficile quelli incorretti... Con grande dispiacere vedo che solo pochi linguaggi sono stati progettati con quel obiettivo o addirittura andare in modo significativo in quella direzione. Per esempio, il linguaggio C è stato progettato per scrivere un sistema operativo per singolo utente (UNIX) per un computer real-time (PDP 11), ora fortunatamente obsoleto. Per quel scopo, il suo basso livello di astrazione e la possibilità di avvicinarsi all'hardware erano caratteristiche molto appropriate. Per tutte le altre cose il suo utilizzo è solo una seccatura. Il successo e la diffusione del linguaggio possono essere spiegati da fattori casuali, commerciali, storiche e politiche; sono difficilmente attribuibili alle sue inerenti qualità di linguaggio adatto a scrivere programmi sofisticati e sicuri..." C. A. R. Hoare(1), 1994

Il linguaggio Pascal rappresenta una pietra miliare nella storia dell'informatica moderna ed è universalmente considerato uno dei linguaggi di programmazione più riusciti.

Secondo Wirth, il suo ideatore, i linguaggi allora usati, siamo alla fine dei mitici anni '60, erano, a suo parere, troppo primitivi, o troppo complicati, o basati su principi poco chiari, o tutte queste cose messe insieme. Quindi, il Pascal fu concepito come una sovversione, in senso bonario, degli stili di programmazione fino allora adoperati. Il Pascal, oltre ad essere un linguaggio di programmazione, era soprattutto considerato una sistematica disciplina per scrivere del buon software, obbligando, in un certo senso, il programmatore a scrivere codice ordinato e rispettare rigide ed inviolabili regole. In più, il Pascal è l'unico linguaggio di alto livello a poter competere col C quando si tratta di efficienza, compattezza degli eseguibili e di accedere direttamente a funzioni del sistema operativo e all'hardware. Sarebbe, senz'altro, stato possibile scrivere il sistema operativo UNIX in Pascal senza rilevanti problemi.

Gli anni '80 rappresentarono il periodo d'oro del Pascal, soprattutto quando fu scelto, unanimamente, dalle università di mezzo mondo come linguaggio principali per l'insegnamento della programmazione strutturata. Questa ragionevole scelta fu approvata prevalentemente per due ragioni. La prima era per la semplicità, la chiarezza e la leggibilità del linguaggio. La seconda fu l'apparizione di un fenomeno informatico che ha condizionato, forse per sempre, il futuro di questo linguaggio: il Turbo Pascal (TP). Un editor, un compilatore ed un linker in un unico prodotto che funzionava sul serio e aveva un prezzo accessibile per tutti. Il Turbo Pascal compilava i sorgenti dei programmi quasi istantaneamente con un singolo comando producendo eseguibili compatti ed estremamente veloci. Il TP era distribuito in un singolo dischetto nel formato di allora (5,25") che oltre all'editor, al compilatore ed al linker conteneva anche una serie di esempi tra i quali la nota tartaruga grafica che metteva in grande evidenza la potenza e la versatilità del linguaggio. Così, il TP divenne subito lo standard di fatto emarginando gli standard l'ISO e l'ANSI Pascal usati fino allora.

Anche se il Pascal standard era considerato da sempre un linguaggio di alto livello e limitato a scrivere programmi rimanendo ad una certa distanza dal sistema operativo e dall'hardware, con il TP era molto facile accedere a tutte le funzioni del sistema operativo (DOS) e quindi all'hardware. Questa, secondo me, fu la mossa vincente della Borland per farlo accettare da parte dei programmatori professionisti. Non era più necessario utilizzare l'Assembly per accedere direttamente alla scheda grafica, alle porte seriali e parallele, ma direttamente da semplice codice Pascal. Il TP era interamente scritto nel linguaggio Assembly e da ciò derivava in gran parte la sua compattezza e velocità.

Oggi il Pascal è un linguaggio estremamente robusto, maturo e completo, esteso alla programmazione ad oggetti e, come vedremo, rimane tuttora uno dei migliori linguaggi general purpose. In questo articolo si fa riferimento all'Object Pascal e alla sua implementazione in Delphi e al Free Pascal (FP). Il FP è un discendente diretto del Turbo Pascal (versione 7.0) portato sui sistemi operativi a 32 bit, o meglio ancora, un clone di Delphi 5, senza la VCL (Visual Component Library), con qualche estensione e reso multipiattaforma, freeware ed open source.

Un linguaggio Completo

Se definiamo un linguaggio completo come linguaggio con il quale possiamo scrivere qualsiasi genere di applicazione senza ricorrere all'utilizzo di un altro linguaggio, allora l'Object Pascal è, senza dubbio, uno dei pochissimi linguaggi completi oggi disponibili. Grazie alla sua natura ibrida, procedurale e ad oggetti, l'Object Pascal è praticamente adatto per lo sviluppo di una larga gamma di applicazioni, in modo particolare quelle di tipo scientifico e di grafica avanzata. Ma come vedremo, in questo articolo, l'Object Pascal è adatto anche per lo sviluppo di applicazioni client/server e web, soprattutto quando si cercano alte prestazioni, efficienza e compattezza.

Una delle prove per controllare la validità di un linguaggio è quella di utilizzarlo per scrivere un compilatore. Il Free Pascal Compiler (FPC) è interamente scritto in Object Pascal, comprese tutte le librerie, tranne una piccolissima parte scritta in Assembly dove è necessario raggiungere un'assoluta efficienza. Lo stesso discorso è valido per l'intero ambiente Delphi. Il FPC e Delphi compilano codice sorgente Object Pascal di un migliaio di linee, quasi istantaneamente, producendo, in un'unica operazione, eseguibili compatti e veloci secondo la tradizione Turbo.

Interfacce Grafiche

Dobbiamo girare in lungo ed in largo per tutti gli ambienti visuali di sviluppo oggi disponibili per trovare qualcosa che assomigli a Delphi. Semplicità, eleganza, completezza, robustezza, compattezza ed integrazioni sono attributi nativi di questo formidabile ambiente. Oltre all'ottimo design, Delphi è interamente scritto in Object Pascal secondo il paradigma ad oggetti e componenti.

Un'altra cosa estremamente gradita di Delphi è che il codice della VCL è disponibile in codice sorgente. Ciò permette al programmatore esperto di andare a qualsiasi profondità dentro il codice di Delphi per comprendere il funzionamento e l'implementazione dell'intero ambiente.

La presenza sul mercato di migliaia di componenti, molti dei quali freeware ed open source, è una mera conseguenza della semplicità con la quale si possono sviluppare nuovi componenti, o estendere quelli esistenti. Infatti, il programmatore Delphi ha a disposizione un'immensa quantità di componenti che gli permettono di affrontare lo sviluppo di applicazioni difficilmente realizzabili da una singola persona utilizzando altri strumenti.

La versione di Delphi sulla piattaforma Linux si chiama Kylix ed è apparentemente simile alla versione per Windows. Dico apparentemente perché in realtà, oltre all'impatto puramente visuale, si avvicina solo in minima parte, in termini di integrazione e completezza, a quella offerta da Delphi su Windows.

Per quanto riguarda il FPC che in realtà è solo un compilatore di un dialetto del linguaggio Object Pascal, la situazione è molto diversa rispetto a quella riscontrabile in Delphi. Per lo sviluppo delle parti visuali, o interfacce grafiche, il compito è affidato a librerie esterne. Tra le più note e più mature di queste librerie troviamo la GTK e la QT. Possiamo, per esempio, scrivere la stessa applicazione in Free Pascal con oggetti grafici della GTK, della QT o chiamare direttamente quelle di Windows tramite API.

La GTK è, molto probabilmente, la libreria grafica più utilizzata con il FPC e perciò è inclusa in tutte le distribuzioni ufficiali del compilatore insieme ad una serie di esempi illustrativi per il suo utilizzo. La sua popolarità tra gli sviluppatori è dovuta in parte anche alla sua licenza GPL e di essere multipiattaforma. La presenza di un tutorial composto da otto esercizi ben commentati che guidano l'utente passo-passo all'utilizzo della GTK è di grande aiuto per chi non conosce questa libreria e vuole diventare subito produttivo.

Per lo sviluppo di applicazion in Free Pascal per quelli che preferiscono un'interfaccia grafica, abbiamo l'ottimo Lazarus che è multipiattaforma e gratuito.

Applicazioni Scientifiche ed Ingegneristiche

Il Pascal è, con tutta certezza, uno dei pochissimi linguaggi di alto livello che possano competere alla pari col C/C++ ed il Fortran per lo sviluppo di tale genere di applicazioni. I programmatori Pascal dispongono di un vasto numero di librerie di pubblico dominio, complete e ben collaudate, frutto di oltre trent'anni di sviluppo, oltre a tutte quelle sviluppate per Turbo Pascal e Delphi.

Un'applicazione Pascal si interfaccia molto facilmente alla nota libreria grafica OpenGL senza utilizzare codice scritto nel linguaggio C. Grazie a questa libreria si possono scrivere utili applicazioni scientifiche, tecniche e di simulazioni, ad alto contenuto grafico. In questa categoria di applicazioni, i linguaggi interpretati, o di scripting, non possono minimamente competere, a meno che non si tratta di visualizzare una semplice primitiva OpenGL. Ma anche in questo caso bisogna sempre usare un po' di C per potersi interfacciare alla libreria.

Chiunque abbia scritto in precedenza un'applicazione grafica, anche minima, utilizzando il C, non trova particolari difficoltà a svilupparle in Pascal, perché tutte le funzioni nonché i loro parametri sono dello stesso tipo e hanno lo stesso nome. Per il resto, tra i due linguaggi, l'unica differenza è solo di sintassi.

Applicazioni Gestionali e Client/Server

Per quanto riguarda la parte client, non esiste ancora nulla che possa sostituire il Pascal/Object Pascal o il C/C++ per scrivere questo genere di applicazioni in termini di interfaccia grafica, controllo, efficienza e compattezza.

Come è stato già detto, le parti grafiche delle applicazioni client possono essere sviluppate in Delphi oppure, nel caso del FPC, accedendo direttamente agli oggetti della libreria GTK o direttamente alle API di Windows. Optando per questa ultima possibilità, si possono sviluppare snellissime e velocissime applicazioni grafiche sotto Windows.

Lato server, Delphi e il FPC accedono direttamente alle API dei motori database più noti. Questa modalità garantisce una grande flessibilità e performance per le applicazioni. Nulla impedisce poi di scrivere middleware in Pascal visto che ci sono già tutti gli strumenti a disposizione forniti dalle diverse librerie a corredo.

Per chi utilizza InterBase o Firebird come RDBMS, troviamo di serie, sia per Delphi che per il FPC diversi strumenti nativi, di ottima fattura e quasi tutti forniti di codice sorgente.

Applicazioni Web

Forse nello sviluppo di questo genere di applicazioni che, storicamente, il Pascal viene maggiormente a mancare. Ma come vediamo presto, si tratta di una falsa convinzione. L'autore del PHP, Rasmus Lerdorf, sosteneva, diversi anni fa, che la principale ragione di aver sviluppato il PHP è che non poteva aspettare tutto quel tempo che il compilatore (GCC) impiegava per creare gli eseguibili (applicazioni CGI) da codice C. Cioè, il ciclo editing-compilazione-debugging era troppo lungo. Quindi, un linguaggio interpretato era l'ideale visto che il codice per essere eseguito non necessita di nessuna compilazione.

Un codice interpretato è mediamente venti volte più lento nell'esecuzione di un codice compilato, e più un'applicazione è grande più questo divario cresce. Sarebbe come avere un computer di ultima generazione dalle prestazioni paragonabili con quelli di una decina di anni fa. Ma nelle piccole applicazioni web, questa differenza potrebbe essere ignorata a favore di una facile ed immediata implementazione. Così, il PHP, insieme a tutti gli altri linguaggi di scripting, ha avuto terreno fertile per crescere. In più, grazie alla potenza dei computer di ultima generazione, la velocità di esecuzione non rappresenta più un problema per la maggior parte delle applicazioni interpretate, in particolare quelle web per modesti servizi e funzionalità.

Come presto vedremo, anche per scrivere applicazioni web, il Pascal è un valido linguaggio soprattutto se si considera il FPC. La preferenza del FPC rispetto a Delphi in questa area è giustificata da un paio di fattori. La prima è che il FPC è multipiattaforma; cioè, la stessa applicazione gira senza nessuna modifica su tutti i sistemi operativi sui quali gira il FPC. La seconda è che il GNU/Linux è il sistema operativo di riferimento del FPC. Come le applicazioni web sono prevalentemente applicazioni server e con la predominanza di Linux su quel lato, il FPC potrebbe rappresentare un'ottima scelta per lo scriverle per i server Linux e FreeBSD.

Il FPC, che è nato col turbo, compila un programma di 10.000 linee di codice sorgente in un paio di secondi su un PC di 10 anni fa! Tutto questo in un singolo passaggio e senza nessun utilizzo di un file make esterno. Il risultato è un unico file eseguibile compatto ed estremamente veloce. Un noto vantaggio dell'unico programma eseguibile è la totale assenza di qualsiasi file esterno di supporto per l'applicazione e, quindi, senza la presenza di quella miriade di file script da includere con i loro tipici e noti problemi.

Un altro aspetto molto importante per lo sviluppo di applicazioni web è che il FP ha eccellenti capacità di gestione delle stringhe e di conversione tra tipi di dati diversi. La unit "cgiapp.pp" della libreria a corredo del compilatore è di facilissimo utilizzo ed offre tutto il necessario per scrivere performanti applicazioni web con una minima occupazione di memoria.

C'è un altro pacchetto freeware ed open source, interamente scritto in Object Pascal per lo sviluppo serio di applicazioni web: il PSP (Pascal Server Page). Qui abbiamo la possibilità di gestire sessioni, cookie, upload di file, e molte altre cose, con estrema semplicità ed efficienza. Nella distribuzione del FPC, c'è un piccolo esempio di un'applicazione daemon scritta in Free Pascal con una cinquantina di linee di codice che dimostra, con i fatti, la validità di questo linguaggio per lo sviluppo web più spinto.

Per quanto riguarda la sicurezza e tutti quei problemi legati al buffer overflow, il Free Pascal possiede, nativamente, degli ottimi antidoti. Il controllo della lunghezza delle stringhe che vengono automaticamente stroncate se superano la lunghezza prestabilita, la convalida dei tipi di dati e l'utilizzo sofisticato delle eccezioni permettono di raggiungere facilmente notevoli livelli di sicurezza con minimi sforzi.

Quindi, chi ha l'intenzione di scrivere applicazioni web di una certa complessità senza essere penalizzato dalla lentezza e dall'occupazione di memoria degli interpreti, il FPC rappresenta una scelta valida da non sottovalutare.

Programmazione ad Oggetti

Anche se la programmazione ad oggetti è un modo di concepire e sviluppare il software, il linguaggio Object Pascal rimane, secondo me, uno dei linguaggi più facili per impararla. Infatti, il record, cioè quella struttura dati che contiene campi con i loro tipi e valori, è una parola chiave del linguaggio Pascal. Se a questa struttura vengono aggiunte le procedure e le funzioni che manipolano i suoi dati e le viene dato un nuovo nome (class), allora abbiamo esteso il linguaggio alla programmazione ad oggetti. In realtà le cose sono molto più complicate di come sono state descritte, ma in fondo, questo è il risultato.

Alla classica programmazione strutturata e procedurale sono state aggiunte poche parole chiavi per poter sviluppare applicazioni object oriented nel vero senso della parola. C'è da sottolineare che il modello di implementazione degli oggetti in Object Pascal è quasi del tutto simile a quello di Java e del C++, escludendo da quest'ultimo l'ereditarietà multipla ritenuta inutilmente complessa.

In breve, la programmazione ad oggetti si basa sull'incapsulamento dei dati in una classe, sull'ereditarietà ed il polimorfisimo.

L'incapsulamento dei dati permette ad una classe di contenere al suo interno campi e metodi con una certa visibilità, o meno, dall'esterno. Questa visibilità viene regolata dagli attributi public, private, protected e published.

Una campo o un metodo public è visibile ed accessibile da qualsiasi parte del programma. Private è visibile ed accessibile solo dai membri appartenenti alla stessa classe. Protected è visibile ed accessibile solo dai membri appartenenti alla stessa classe o ad una sua discendente.

Published è simile a public ma permette lo streaming delle classi. Property, invece, provvede un'interfaccia per accedere, in lettura e scrittura, ai campi di una classe senza la necessità di utilizzare i metodi della stessa classe per farlo. Per lo sviluppo di un ambiente di sviluppo visuale, come Delphi, questa caratteristica è fondamentale e viene ampiamente sfruttata.

La programmazione ad oggetti è molto utile e spesso semplifica notevolmente la risoluzione di diversi problemi, ma non è sempre l'approccio più adeguato a tutti i tipi di problemi. A volte, è molto più semplice, e quindi più conveniente, il classico approccio procedurale.

Applicazioni Complesse

Sicuramente questo è il punto più importante per fare una graduatoria tra i linguaggi di programmazione. In poche parole, si possono scrivere applicazioni da un milione di linee in Object Pascal? La risposta potrebbe essere affermativa. Ecco qualche prova anche se, che io sappia, nessuno le ha finora scritte.

Una risposta fredda e secca potrebbe essere la seguente: se si possono scrivere in C++, allora si possono scrivere anche in Object Pascal, vista la grande similitudine tra i due linguaggi. Ma qui si possono dare altre prove ancora più convincenti.

I programmi scritti in Object Pascal possono essere suddivisi in diversi moduli (unit) compilabili separatamente. Una unit può contenere classi, funzioni, procedure, variabili locali e globali... e può chiamare altre unit. Il problema del namespace, noto in C++, ossia come evitare collisioni tra variabili con lo stesso nome ma appartenenti a unit diverse è praticamente inesistenti in Object Pascal. Variabili, funzioni, procedure e classi vengono identificate automaticamente in base alla unit d'appartenenza. In più, la suddivisione di una unit in una parte dichiarativa di procedure, funzioni e classi e in un'altra separata per la loro implementazione permette di modificare a piacimento quest'ultima a condizione di mantenere le stesse intestazioni.

Dietro a tutto ciò, c'è anche una serie di eccellenti lavori svolti dal compilatore. Troviamo, per esempio, il rigido controllo sui tipi di dati, sulla compatibilità delle operazioni tra gli stessi, nonché sugli indici degli array e l'eliminazione automatica dall'eseguibile finale di tutte le procedure, funzioni e variabili non utilizzate. Tutte queste caratteristiche, ed altre minori non citate, sono ingredienti necessari per realizzare software di una certa complessità senza ricorrere ad ulteriori strumenti.

Unit Object Pascal

L'utilizzo delle unit è stato introdotto dalla Borland a partire della versione Turbo Pascal 4.0, e fu una grandissima novità che spalancava le porte per lo sviluppo di software complesso in Pascal. Secondo qualche indiscrezione di allora, la Borland voleva sviluppare Turbo Ada, una versione semplificata del mastodontico linguaggio, ampiamente utilizzato oggi dalla NASA nelle sue missioni spaziali e dal Pentagono. In quelli anni la famiglia Turbo è iniziata a crescere con la nascita di Turbo C e Turbo Prolog. Il comitato Ada non permise alla Borland una versione semplificata del linguaggio. In poche parole la regola è la seguente: chi vuole sviluppare una versione del linguaggio Ada è libero di farlo, ma la devi sviluppare completa e senza nessuna omissione. Così la Borland si è limitata a copiare solo alcune caratteristiche di Ada e le ha introdotte in Turbo Pascal.

Una unit è un modulo autonomo di codice Object Pascal e compilabile separatamente. Non sono imposti particolari limiti su quello che potrebbe contenere, o fare, e può chiamare procedure e funzioni contenute in altre unit. Le unit, oltre a strutturare meglio un ampio programma, risolvono anche il problema del namespace, ossia, la confusione tra variabili, procedure e funzioni contenute in un unico programma e con lo stesso nome.

Costi e Tempi di Sviluppo

Per chi svolge l'attività di programmatore professionista, i costi del software di base ed il tempo impiegato per scrivere il software, comunemente chiamato time to market, rappresentano i più importanti parametri del quadro economico.

Delphi, è sicuramente, oggi, uno degli strumenti più produttivi in assoluto per produrre software di qualità, mediamente complesso, rispettando tempi e budget impiegando un numero eseguo di programmatori.

Nel caso di sviluppo di applicazioni client/server professionali ed aziendali, Delphi in combinazione con Firebird costituiscono una sinergia veramente difficile da battere impiegando qualsiasi altra combinazione di strumenti.

Quando si tratta invece di applicazioni grafiche bidimensionali e tridimensionali, le librerie G32 e GLScene, che tra l'altro sono freeware ed open source, sono veramente eccezionali per qualità e semplicità di utilizzo per scrivere applicazioni grafiche complesse ed interattive. Quando si tratta di scrivere applicazioni web altamente performanti e snelle, solo il C/C++ può fornire gli stessi risultati dell'Object Pascal, ma a costi decisamente più alti.

Conclusione

Il successo di un linguaggio di programmazione è strettamente legato alle finalità per le quali è stato realizzato ed al contesto nel quale viene comunemente utilizzato. Personalmente, credo che il linguaggio Pascal sia tuttora un valido linguaggi general purpose con una certa predilezione per applicazioni scientifico-tecniche, ma senza nemmeno escludere quelle gestionali o di sistema. E' doveroso qui ricordare che le prime versioni di Windows furono scritte in Turbo Pascal! La fortuna del Pascal deriva, forse, dall'accattivante nome dato in onore al grande Blaise Pascal, oppure, per il fatto che è stato creato da una istituzione accademica di grande rilievo (il Politecnico di Zurico) che viene da sempre considerato la culla dell'informatica d'avanguardia, o molto più semplicemente, solo dalle qualità intrinseche del linguaggio.

Spesso si sente gridare che il Pascal è morto e addirittura si sconsiglia vivamente a chi vuole imparare l'arte magica della programmazione. Queste grida rimangono solo cattiva informazione e potrebbero solo allontanare qualche malinformato da uno dei migliori linguaggi di programmazione finora realizzati.

Molte volte, erroneamente, vengono citati il C ed il C++ come linguaggi di programmazione moderni da utilizzare per lo sviluppo del software complesso e di ultima generazione. Per quanto riguarda il C, sotto troverete quello che pensa di questo linguaggio uno dei massimi esperti e fondatori dell'informatica moderni. Il C++, invece, è stato solo l'aggiunta di inutili complessità e un'infinità di nuovi problemi a quelli già esistente in C. Personalmente credo che uno dei massimi problemi cronici che affligge il software di oggi è proprio il fatto che questi sono stati prevalentemente scritti in C, sistemi operativi compresi.

Io credo che un programmatore professionista non deve cercare di salire a tutti i costi sul carro del vincitore, o del presunto vincitore, leggasi C/C++, Java o C#, ma di utilizzare il miglior strumento adatto al vero scopo che rimane sempre quello di scrivere programmi belli, performanti, stabili, robus

Sito ufficiale del Free Pascal


(1): Tony Hoare (o Charles Antony Richard Hoare) (Colombo, 11 gennaio 1934) è un informatico britannico. Ha trovato larga fama grazie all'invenzione, nel 1960, del quicksort, l'algoritmo di ordinamento più usato al mondo. Egli ha anche sviluppato le logiche di Hoare, atte a verificare la correttezza dei programmi, e il linguaggio formale Communicating Sequential Processes (CSP) usato per specificare interazioni tra processi concorrenti.

Ultima modifica: 21 Marzo 2023