[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


161. Pascal: preparazione di Pascal-to-C

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.

161.1 Librerie e compilazione

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 -lp2c <sorgente-c>

L'eseguibile che si ottiene, richiede la presenza della libreria dinamica `libp2c.so'.

161.2 Configurazione

Il funzionamento predefinito di `p2c' può essere configurato attraverso una serie di file di configurazione:

  1. `/usr/lib/p2c/p2crc', `$P2CRC'

  2. `~/p2crc'

  3. `~/.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 assoluto 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'.

161.2.1 Direttive dei file

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.

Esempi

Language Turbo

Definisce l'utilizzo di un sorgente TURBO Pascal.

161.2.2 Direttive incorporate nel sorgente 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).

Esempi

{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.

161.2.3 Alcune direttive importanti

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 uno, si fa in modo di generare codice C ANSI; se invece non si inserisce, o si utilizza il valore zero, 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:

ShortOpt [0|1]

Permette di definire il modo con cui devono essere valutate le espressioni logiche: uno abilita il «cortocircuito» attraverso cui si valutano effettivamente solo le condizioni strettamente necessarie a determinare il risultato finale; zero lo disabilita, in modo che tutte le condizioni vengano valutate in ogni caso.

161.3 Uso di P2c

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).

161.3.1 $ p2c

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'.

Alcune opzioni

-o <file>

Definisce esplicitamente il nome del file del sorgente C da generare.

-c <file-di-configurazione>

Definisce il nome di un file di configurazione da utilizzare al posto di quelli standard.

-a

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).

-l {HP|HP-UX|Turbo|UCSD|VAX|Oregon|Berk|Modula}

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.

Esempi

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'.

161.3.2 Esempio di compilazione

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 -lp2c -o CiaoMondo CiaoMondo.c[Invio]

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 `-a' di `p2c'. 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 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]