Linguaggio in forma libera
Un linguaggio in forma libera è un linguaggio di programmazione la cui sintassi non è influenzata dal particolare posizionamento dei caratteri nel codice sorgente. Nei moderni linguaggi in forma libera infatti il codice tipicamente non è costretto a particolari regole d'incolonnamento (come avveniva invece per i programmi scritti su schede perforate) e l'uso dei caratteri di whitespace (spazio, ritorno a capo e tabulazione) è libero da particolari vincoli.[1]
Molti linguaggi discendenti da ALGOL sono in forma libera, tra i quali C, Pascal e Perl. Anche il Lisp e i linguaggi da esso derivati sono in forma libera. Rexx è in buona parte in forma libera, tranne alcuni casi nei quali gli spazi fungono da operatore di concatenazione. Anche il linguaggio SQL, utilizzato per le basi di dati, è in forma libera. Molti linguaggi in forma libera sono anche strutturati, anche se ad esempio il Fortran 77 riserva delle colonne ai numeri di riga. Esistono anche linguaggi strutturati che non sono in forma libera, come ad esempio COBOL, Ruby, ABC, Curry, Haskell e Python, molti dei quali usano l'indentazione per determinare i blocchi di codice.[2][3]
In alcuni linguaggi in forma libera, come il C, esistono comunque dei casi particolari nei quali l'uso del whitespace è limitato o può alterare la semantica. Ad esempio, in C, le macro dichiarate con #define
devono essere contenute in un'unica riga, che può essere eventualmente spezzata effettuando l'escape dei ritorni a capo. Un altro esempio è legato al maximal munch nel parsing degli operatori: la separazione con whitespace è usualmente facoltativa, ma in alcuni casi particolari è fondamentale per conservare la sintassi e la semantica. Ad esempio la riga
z = x++ + ++y;
è sintatticamente valida, ma togliendo gli spazi tra gli operatori diventa invalida in quanto il parser, per via del maximal munch, la interpreterà come
z = x++ ++ + y
che non è valida in quanto il valore di ritorno del primo operatore ++
non è un operando valido per il secondo operatore ++
. Un esempio analogo accade quando si effettua una divisione dove il divisore è ottenuto dereferenziando un puntatore:
z = x / *y;
Anche in questo caso, se si rimuove lo spazio tra l'operatore di divisione e l'operatore di dereferenziazione la sintassi cambia, in quanto /*
viene interpretato dal parser come l'apertura di un commento.[4]
Note
[modifica | modifica wikitesto]- ^ David Mark e James Bucanek, Learn C on the Mac, Apress, 2012, p. 68, ISBN 978-1-4302-4533-9.
- ^ D. Aspinall e William Allan Clark, The Microprocessor and Its Application: An Advanced Course, CUP Archive, 1978, p. 179, ISBN 978-0-5212-2241-9.
- ^ Udayakumar G Kulkarni, Notes on C Language 1st Edition, 2014, p. 27.
- ^ Peter Van der Linden, Expert C Programming: Deep C Secrets, Prentice Hall, 1994, pp. 53-54, ISBN 978-0-1317-7429-2.