Pascal-to-C, o P2c, è una sorta di compilatore che permette di convertire un sorgente Pascal in un sorgente C. I problemi che possono sorgere da questo tipo di conversione sono nella definizione precisa del tipo di dialetto Pascal e del tipo di dialetto C. Utilizzando P2c con GNU/Linux, non si dovrebbero avere difficoltà con il compilatore C. Quello che resta da sistemare è la definizione del dialetto Pascal che si vuole usare, dal momento che ne esistono di diversi, che alle volte sono incompatibili.
Questi dettagli possono essere controllati e configurati; quello che conta è esserne consapevoli, e approfondire l'uso di P2c attraverso lo studio della documentazione originale, quando se ne presenta la necessità, ovvero quando si intende programmare seriamente attraverso questo strumento.
Il codice C generato da P2c contiene sempre l'inclusione del file p2c/p2c.h
, che poi, a sua volta, provvede a includere il solito stdio.h
.
Il link del file generato dalla compilazione del sorgente C che si ottiene, deve essere fatto includendo la libreria libp2c.a
, cosa che si traduce generalmente nell'uso dell'opzione
.
-
lp2c
In pratica, le fasi necessarie a ottenere un programma eseguibile si riassumono nei due comandi seguenti.
p2c <sorgente-pascal> |
cc
|
L'eseguibile che si ottiene, richiede la presenza della libreria dinamica libp2c.so
.
Il funzionamento predefinito di p2c
può essere configurato attraverso una serie di file di configurazione:
/usr/lib/p2c/p2crc
, $P2CRC
~/p2crc
~/.p2crc
Il primo file dell'elenco è quello usato per definire la configurazione generale. Eventualmente, si può usare la variabile di ambiente P2CRC
, contenente il percorso completo per raggiungere un file analogo, sostituendosi in tal modo a quello generale.
Dopo il file di configurazione generale, viene cercato il file p2crc
nella directory personale dell'utente, oppure, in sua mancanza, il file .p2crc
. Questo file serve a definire una personalizzazione della configurazione di p2c
.
Le direttive di questo file di configurazione sono rappresentate da assegnamenti, espressi in una delle due forme seguenti.
<nome> = <valore> |
<nome> <valore> |
I commenti si rappresentano come di consueto facendoli precedere dal simbolo #
, e le righe vuote o bianche vengono semplicemente ignorate.
Il file di configurazione che accompagna P2c, cioè /usr/lib/p2c/p2crc
, contiene l'elenco completo di tutte le direttive utilizzabili, tutte impostate nel modo più conveniente per l'uso normale, e tutte debitamente commentate in modo da sapere come può essere modificato ogni valore.
Language Turbo |
Definisce l'utilizzo di un sorgente TURBO Pascal.
Le direttive di configurazione possono anche essere incorporate all'interno dello stesso sorgente Pascal, permettendo così una definizione dinamica, riferita a porzioni di codice. Per farlo, si utilizza una forma speciale dei commenti Pascal.
{<nome>=<valore>} |
In tal caso, come si può vedere, il simbolo =
è obbligatorio, e l'uso di spazi bianchi è generalmente inammissibile. È possibile l'utilizzo di commenti anche all'interno di direttive espresse in questo modo. Per farlo, occorre usare la sequenza ##
.
La configurazione dinamica all'interno del sorgente, permette di utilizzare anche altre modalità di assegnamento e di eliminazione automatica delle definizioni alla fine del sorgente. Per approfondirle, conviene consultare la documentazione originale, cosa che si riduce in pratica alla lettura di p2c(1).
{Language=Turbo} |
Definisce l'utilizzo di un sorgente TURBO Pascal.
{Language=Turbo ## utilizza una codifica TURBO Pascal} |
Definisce l'utilizzo di un sorgente TURBO Pascal, e vi aggiunge un commento interno.
Le direttive della configurazione di P2c sono numerose, e anche se l'impostazione predefinita si adatta alle situazioni più comuni, potrebbe essere conveniente modificarne alcune, già le prime volte che si utilizza P2c.
AnsiC [0|1] |
Permette di definire il tipo di dialetto C da utilizzare. Se si attiva la modalità, utilizzando il valore 1, si fa in modo di generare codice C ANSI; se invece non si inserisce, o si utilizza il valore 0, si ottiene un codice compatibile con il C K&R originale.
Come accennato, se non si definisce diversamente, si ottiene un codice C tradizionale, mentre potrebbe essere desiderabile di generare codice C ANSI.
Language [HP|HP-UX|Turbo|UCSD|VAX|Oregon|Berk|Modula] |
Permette di definire il dialetto Pascal utilizzato come sorgente per la conversione. Le varie parole chiave usate per distinguere i dialetti hanno il valore seguente:
È la codifica usata in modo predefinito e si riferisce precisamente al Pascal HP, compatibile con il Pascal dello standard ISO. | |
È il Pascal HP del sistema HP-UX, praticamente identico al Pascal HP normale. | |
TURBO Pascal 5.0, quello usato nei PC. La differenza rispetto al tipo HP è minima, tanto che generalmente non è necessario richiedere esplicitamente questo tipo di codifica, quando si usano sorgenti TURBO Pascal. | |
UCSD Pascal. Si tratta di un dialetto molto simile al TURBO Pascal. | |
Macintosh Programmer's Workshop Pascal 2.0, senza le estensioni Object Pascal. | |
VAX/VMS Pascal 3.5. Non tutte le funzionalità sono disponibili. | |
Oregon Software Pascal/2. | |
Berkeley Pascal con le estensioni Sun. | |
Modula-2. Basato sul libro Programming in Modula-2 di Wirth, terza edizione. La conversione in C a partire da questo formato, non è ancora completa. |
ShortOpt [0|1] |
Permette di definire il modo con cui devono essere valutate le espressioni logiche: 1 abilita il «cortocircuito» attraverso cui si valutano effettivamente solo le condizioni strettamente necessarie a determinare il risultato finale; 0 lo disabilita, in modo che tutte le condizioni vengano valutate in ogni caso.
La conversione del sorgente Pascal in linguaggio C avviene per mezzo del programma p2c
, configurato come descritto nelle sezioni precedenti.
p2c
è effettivamente un compilatore, il cui risultato è un programma C. Questo significa che genera da solo la segnalazione di errori di sintassi nel sorgente Pascal, e alla fine, il sorgente C che si ottiene dovrebbe essere corretto (dal punto di vista del C).
p2c [<opzioni>] [<file>] |
p2c
legge il file indicato come argomento, oppure lo standard input in sua mancanza. In base alle opzioni e alla configurazione definita, genera da quel file una trasformazione in linguaggio C.
Il nome del file generato si ottiene togliendo l'eventuale estensione precedente, e aggiungendo .c
.
|
Definisce esplicitamente il nome del file del sorgente C da generare.
|
Definisce il nome di un file di configurazione da utilizzare al posto di quelli standard.
|
Genera codice C ANSI. Questa opzione permette di sostituirsi agevolmente alla configurazione standard secondo cui si il sorgente generato dovrebbe essere di tipo tradizionale (K&R).
|
Permette di definire il tipo di Pascal nel sorgente. Le caratteristiche abbinate alle varie parole chiave sono state descritte in occasione della descrizione dei file di configurazione.
$
p2c mio_programma.pas
Genera il file mio_programma.c
convertendo il contenuto di mio_programma.pas
.
$
p2c
-
a mio_programma.pas
Come nell'esempio precedente, ma genere un programma C secondo lo standard ANSI.
$
p2c
-
a -
o mio.c mio_programma.pas
Come nell'esempio precedente, ma il file generato è mio.c
.
Si suppone di volere compilare il programma seguente:
{ CiaoMondo.pas Programma elementare di visualizzazione di un messaggio attraverso lo standard output. } program CiaoMondo; begin Writeln('Ciao Mondo!'); end. |
Se il file si chiama CiaoMondo.pas
, si può trasformare in C con il comando seguente:
$
p2c CiaoMondo.pas
[Invio]
CiaoMondo Translation completed |
Si ottiene così il file CiaoMondo.c
, mostrato di seguito.
/* Output from p2c, the Pascal-to-C translator */ /* From input file "CiaoMondo.pas" */ /* CiaoMondo.pas Programma elementare di visualizzazione di un messaggio attraverso lo standard output. */ #include <p2c/p2c.h> main(argc, argv) int argc; Char *argv[]; { PASCAL_MAIN(argc, argv); printf("Ciao Mondo!\n"); exit(EXIT_SUCCESS); } /* End. */ |
Questo file può essere compilato a sua volta.
$
cc
[Invio]-
lp2c -o CiaoMondo CiaoMondo.c
Se tutto funziona correttamente, si ottiene il file CiaoMondo
eseguibile.
$
./CiaoMondo
[Invio]
Ciao Mondo! |
Se si desidera generare un sorgente C ANSI, si può usare l'opzione
di -
ap2c
. Nel caso dell'esempio, il corpo del programma C sarebbe stato il seguente:
main(int argc, Char *argv[]) { PASCAL_MAIN(argc, argv); printf("Ciao Mondo!\n"); exit(EXIT_SUCCESS); } |
---------------------------
Appunti Linux 1999.07.12 --- Copyright © 1997-1999 Daniele Giacomini -- daniele @ evo.it
[indice generale] [precedente] [successivo] [indice analitico] [note introduttive]