Digrammi e trigrammi

In programmazione, digrammi e trigrammi sono sequenze di due o tre caratteri, rispettivamente, che appaiono nel codice sorgente e, secondo le specifiche di un linguaggio di programmazione, dovrebbero essere trattati come se fossero caratteri singoli.

Esistono vari motivi per utilizzare digrammi e trigrammi. Ad esempio: le tastiere potrebbero non avere tasti per coprire l'intero set di caratteri della lingua, l'inserimento di caratteri speciali potrebbe essere difficile, gli editor di testo potrebbero riservare alcuni caratteri per usi speciali e così via. I trigrammi potrebbero essere usati anche per alcun sistemi di codifica EBCDIC che mancano di caratteri come { e }.

Storia modifica

Il set di caratteri di base del linguaggio di programmazione C è un sottoinsieme del set di caratteri ASCII che include nove caratteri che si trovano al di fuori del set di caratteri invarianti ISO 646. Ciò può rappresentare un problema per la scrittura del codice sorgente quando la codifica (e possibilmente la tastiera) utilizzata non supporta nessuno di questi nove caratteri. Il comitato ANSI C ha inventato i trigrammi come modo per inserire il codice sorgente utilizzando tastiere che non supportano alcuna versione del set di caratteri ISO 646.

Implementazioni modifica

I trigrammi non si incontrano comunemente al di fuori delle suite di test del compilatore.[1] Alcuni compilatori supportano un'opzione per disattivare il riconoscimento dei trigrammi o disabilitarli per impostazione predefinita e richiedono un'opzione per attivarli. Alcuni possono emettere avvisi quando incontrano trigrammi nei file sorgente. Borland ha fornito un programma separato, il preprocessore trigraph (TRIGRAPH.EXE), da utilizzare solo quando si desidera l'elaborazione dei trigrammi (la logica era massimizzare la velocità di compilazione).

Supporto dei linguaggi di programmazione modifica

Sistemi diversi definiscono diversi set di digrammi e trigrammi, come descritto di seguito.

ALGOL modifica

Le prime versioni di ALGOL erano antecedenti ai set standardizzati di caratteri ASCII ed EBCDIC e venivano tipicamente implementate utilizzando un codice di caratteri a sei bit specifico del produttore. Un certo numero di operazioni ALGOL mancava di codepoint nel set di caratteri disponibile o non erano supportate dalle periferiche, portando a un numero di sostituzioni tra cui := per (assegnazione) e >= per (maggiore o uguale).

Pascal modifica

Il linguaggio di programmazione Pascal supporta i digrammi (., .), (* e *) per [, ], { e }. A differenza di tutti gli altri casi qui menzionati, (* e *) erano e sono ancora ampiamente utilizzati. Tuttavia, molti compilatori li trattano come un diverso tipo di blocco dei commenti piuttosto che come dei veri e propri digrammi, cioè un commento che inizia con (* non può essere chiuso con } e viceversa.

J modifica

Il linguaggio di programmazione J è un discendente di APL ma utilizza il set di caratteri ASCII anziché i simboli APL. Poiché l'insieme di caratteri stampabili ASCII è più piccolo dell'insieme specializzato di simboli APL, i caratteri . (punto) e : (due punti) vengono utilizzati per declinare i simboli ASCII, interpretando efficacemente unigrammi, digrammi o raramente trigrammi come "simboli" autonomi.[2]

A differenza dell'uso di digrammi e trigrammi in C e C++, non ci sono singoli caratteri equivalenti a questi in J.

C modifica

Il preprocessore C sostituisce tutte le occorrenze delle seguenti nove sequenze di trigrammi con i loro equivalenti a carattere singolo prima di qualsiasi altra elaborazione.[3][4]

Trigramma Equivalente
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~

Un programmatore potrebbe voler mettere insieme due punti interrogativi ma non farli trattare dal compilatore come se introducessero una sequenza trigramma. La grammatica C non consente due token ? consecutivi, quindi gli unici punti in un file C in cui è possibile utilizzare due punti interrogativi in una riga sono costanti a più caratteri, stringhe letterali e commenti. Questo è un problema soprattutto per il classic Mac OS, dove la costante '????' può essere utilizzata come tipo di file o creatore. Per posizionare in modo sicuro due punti interrogativi consecutivi all'interno di una stringa letterale, il programmatore può utilizzare la concatenazione di stringhe "...?""?..." o una sequenza di escape ". . . ? \? . . .".

??? non è di per sé una sequenza trigramma, ma quando è seguita da un carattere come - sarà interpretata come ? + ??-, come nell'esempio sotto che ha 16 ? s prima di /.

Il trigramma ??/ può essere utilizzato per introdurre una nuova riga con un carattere di escape per la giunzione di linea; questo deve essere tenuto in considerazione per una corretta ed efficiente gestione dei trigrammi all'interno del preprocessore. Può anche causare sorprese, in particolare nei commenti. Per esempio:

 // Verrà eseguita la prossima linea????????????????/
 a++;

che è una singola riga di commento logico (utilizzata in C++ e C99) e

 /??/
 * Un commento *??/
 /

il quale è un commento di blocco sintatticamente corretto. Il concetto può essere utilizzato per verificare la presenza di trigrammi come nel seguente esempio C99, dove verrà eseguita solo un'istruzione return.

int trigrammi_disponibili() // Ritorna 0 or 1; Standard C99 o successivo { // ci sono i trigrammi??/ return 0; return 1; }

Digrammi alternativi introdotti nel 1994
Digramma Equivalente
<: [
:> ]
<% {
%> }
%: #

Nel 1994, una modifica normativa allo standard C[senza fonte], inclusa nello standard C99, ha fornito i digrammi come alternativa più leggibile a cinque dei trigrammi.

A differenza dei trigrammi, i digrammi vengono gestiti durante la tokenizzazione e qualsiasi digramma deve sempre rappresentare un token completo da solo o comporre il token %:%: sostituendo il token di concatenazione del preprocessore ##. Se una sequenza di digrammi si verifica all'interno di un altro token, ad esempio una stringa tra virgolette o una costante di carattere, non verrà sostituita.

C++ modifica

  Lo stesso argomento in dettaglio: iso646.h.

Il linguaggio C++ (fino alla versione C++14, vedi sotto) si comporta come il C, incluse le aggiunte dello standard C99, però con i token aggiuntivi presenti nella tabella seguente.[5]

Token Equivalente
compl ~
not !
bitand &
bitor |
and &&
or ||
xor ^
and_eq &=
or_eq |=
xor_eq ^=
not_eq !=

Si può notare che %:%: viene considerato come un singolo token, anziché due occorrenze di %:

Lo standard C++ fa questo commento riguardo al termine "digraph":[6]

(EN)

«The term "digraph" (token consisting of two characters) is not perfectly descriptive, since one of the alternative preprocessing-tokens is %:%: and of course several primary tokens contain two characters. Nonetheless, those alternative tokens that aren't lexical keywords are colloquially known as "digraphs".»

(IT)

«Il termine "digramma" (token formato da due caratteri), non descrive perfettamente questi token, poiché uno dei token di pre-elaborazione alternativi è %:%: e ovviamente diversi token primari contengono due caratteri. Tuttavia, quei token alternativi che non sono parole chiave lessicali sono conosciuti colloquialmente come "digrammi".»

I trigrammi sono stati proposti per la deprecazione in C++ 0x, che è stato rilasciato come C++ 11[7]. A questo l'azienda IBM si è opposta, parlando a nome di se stessa e di altri utenti di C++[8], e di conseguenza i trigrammi sono stati mantenuti in C++ 11. I trigrammi però sono stati quindi proposti di nuovo per la rimozione (non solo per la deprecazione) in C++ 17 [9]. La votazione della commissione stavolta è passata e i trigrammi (ma non i token aggiuntivi) sono stati rimossi da C++ 17 nonostante l'opposizione di IBM.[10] Il codice esistente che utilizza i trigrammi può essere supportato effettuando la traduzione dei file sorgente (effettuando il parsing dei trigrammi) ottenendo file che contengono solo caratteri di base e non più trigrammi.[9]

RPL modifica

Le calcolatrici Hewlett-Packard che supportano il linguaggio RPL e il metodo di immissione forniscono supporto per un gran numero di trigrammi (chiamati anche codici TIO) per trascrivere in modo affidabile i caratteri ASCII non a sette bit del set di caratteri estesi[11][12][13] su piattaforme straniere e per facilitare l'input da tastiera senza utilizzare l'applicazione CHARS.[12][13][14][15]

Il primo carattere di tutti i codici TIO è \, seguito da altri due caratteri ASCII che somigliano vagamente al glifo da sostituire.[12][13][14][15][16] Tutti gli altri caratteri possono essere inseriti utilizzando la speciale sintassi TIO\nnncon nnn un numero decimale a tre cifre (con zeri iniziali se necessario) del punto di codice corrispondente (quindi rappresenta formalmente un tetragrammo).[12][13][14]

Supporto delle applicazioni modifica

Vim modifica

L'editor di testo Vim supporta i digrammi per l'immissione effettiva di caratteri di testo, a seguito della RFC 1345[17]. L'immissione dei digrammi è associata a Ctrl+K per impostazione predefinita.[18] L'elenco di tutti i possibili digrammi in Vim può essere visualizzato digitando :dig.

Schermo GNU modifica

GNU Screen ha un comando con un digramma, associato a Ctrl+A Ctrl+V per impostazione predefinita.[19]

Lotus modifica

Lotus 1-2-3 per DOS utilizza Alt+F1 come tasto di composizione per consentire l'immissione più semplice di molti caratteri speciali di Lotus International Character Set (LICS)[20] e Lotus Multi-Byte Character Set (LMBCS).

Note modifica

  1. ^ (EN) Derek M. Jones, Frase 117, in The New C Standard: An Economic and Cultural Commentary.
  2. ^ (EN) Roger Hui, Vocabulary, su jsoftware.com. URL consultato il 16 aprile 2015 (archiviato dall'url originale il 2 aprile 2019).
  3. ^ (EN) British Standards Institute, The C Standard - Incorporating TC1 - BS ISO/IEC 9899:1999, [John Wiley & Sons], 2003, ISBN 0-470-84573-2.
  4. ^ (EN) Rationale for International Standard - Programming Languages - C (PDF), su open-std.org, 5.10, aprile 2003. URL consultato il 17 ottobre 2010 (archiviato il 6 giugno 2016).
  5. ^ (EN) Bjarne Stroustrup, Design and Evolution of C++, 1ª ed., Addison-Wesley Publishing Company, 29 marzo 1994, ISBN 0-201-54330-3.
  6. ^ (EN) Stefanus Du Toit (a cura di), Working Draft, Standard for Programming Language C++ (PDF), su open-std.org, 16 gennaio 2012, N3337. URL consultato l'8 maggio 2019 (archiviato l'8 maggio 2019).
  7. ^ (EN) C++0X, CD 1, National Body Comments (PDF), su open-std.org, 30 gennaio 2009, SC22/WG21 N2837 comment UK 11. URL consultato il 12 maggio 2019 (archiviato il 1º agosto 2017).
  8. ^ (EN) Michael Wong, Hubert Tong, Robert Klarer, Ian McIntosh, Raymond Mak, Christopher Cambly e Alain LaBonté, Comment on Proposed Trigraph Deprecation (PDF), su open-std.org, 19 giugno 2009, N2910. URL consultato il 12 maggio 2019 (archiviato il 1º agosto 2017).
  9. ^ a b (EN) Richard Smith, Removing trigraphs??!, su open-std.org, 6 maggio 2014, N3981. URL consultato il 12 maggio 2019 (archiviato il 9 luglio 2018).
  10. ^ (EN) Michael Wong, Hubert Tong, Rajan Bhakta e Derek Inglis, IBM comment on preparing for a Trigraph-adverse future in C++17 (PDF), su open-std.org, 10 ottobre 2014, IBM paper N4210. URL consultato il 12 maggio 2019 (archiviato l'11 settembre 2018).
  11. ^ (EN) HP 82240B Infrared Printer, 1ª ed., Corvallis, OR, USA, Hewlett-Packard, agosto 1989, HP reorder number 82240-90014. URL consultato il 1º agosto 2016 (archiviato dall'url originale il 14 agosto 2016).
  12. ^ a b c d (EN) HP 48G Series – User's Guide (UG), 8ª ed., Hewlett-Packard, dicembre 1994 [1993], pp. 2-5, 27-16, HP 00048-90126, (00048-90104). URL consultato il 6 settembre 2015 (archiviato il 6 agosto 2016). [1]
  13. ^ a b c d (EN) HP 50g / 49g+ / 48gII graphing calculator advanced user’s reference manual (AUR), 2ª ed., Hewlett-Packard, 14 luglio 2009 [2005], pp. J-1, J-2, HP F2228-90010. URL consultato il 10 ottobre 2015 (archiviato dall'url originale l'8 luglio 2018).Searchable PDF
  14. ^ a b c (EN) HP RPL TIO Table, su holyjoe.org, 28 ottobre 2013. URL consultato il 23 gennaio 2015 (archiviato il 23 maggio 2016).
  15. ^ a b (EN) Michael W. Heinz, Sr., HP-ASCII and Trigraphs, su hpconnect.sourceforge.net, 2005, Heinz_2005. URL consultato il 2 agosto 2016 (archiviato il 2 agosto 2016).
  16. ^ (EN) Craig A. Finseth, chars, su finseth.com, 25 febbraio 2012. URL consultato il 21 dicembre 2017 (archiviato il 21 dicembre 2017).
  17. ^ (EN) RFC 1345, su Internet Engineering Task Force.
  18. ^ (EN) Vim documentation: *digraphs-default*, su vimdoc.sourceforge.net, 15 gennaio 2011. URL consultato il 12 maggio 2019 (archiviato il 20 dicembre 2018).
  19. ^ (EN) http://www.retroisle.com/others/hp95lx/OriginalDocs/95LX_UsersGuide_F1000-90001_826pages_Jun91.pdf, Appendix F (PDF), in HP 95LX User's Guide, 2ª ed., Corvallis, OR, USA, Hewlett-Packard Company, Corvallis Division, giugno 1991 [Marzo 1991], HP F0001-90003. URL consultato il 27 novembre 2016 (archiviato il 28 novembre 2016).
  20. ^ (EN) [=https://www.gnu.org/software/screen/manual/html_node/Digraph.html Digraph - Screen User's Manual], su gnu.org. URL consultato il 12 maggio 2019 (archiviato il 31 dicembre 2018).

Voci correlate modifica

Collegamenti esterni modifica