Digrammi e trigrammi
In programmazione, i digrammi e trigrammi sono sequenze di due o tre caratteri, rispettivamente, che appaiono nel codice sorgente e che, in base alle specifiche di un linguaggio, vengono trattate come se fossero un singolo carattere.
L'uso di digrammi e trigrammi è dettato da diverse esigenze. Ad esempio, le tastiere potrebbero non avere dei tasti necessari per coprire l'intero repertorio di caratteri di una lingua, l'inserimento di caratteri speciali potrebbe risultare complicato, o gli editor di testo potrebbero riservare certi caratteri per usi specifici. I trigrammi, inoltre, trovano impiego in alcuni sistemi di codifica come EBCDIC, i quali non includono caratteri fondamentali come le parentesi graffe { e }.
Storia
[modifica | modifica wikitesto]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) scelta non accetta nessuno di questi nove caratteri. Il comitato ANSI C ha inventato i trigrammi come modo per inserire il codice sorgente utilizzando tastiere che non accettano alcuna versione del set di caratteri ISO 646.
Implementazioni
[modifica | modifica wikitesto]I trigrammi non si incontrano comunemente al di fuori delle suite di test del compilatore.[1] Alcuni compilatori forniscono un'opzione per disattivare il riconoscimento dei trigrammi oppure li preimpostano già disabilitati 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 | modifica wikitesto]Sistemi diversi definiscono diversi set di digrammi e trigrammi, come descritto di seguito.
ALGOL
[modifica | modifica wikitesto]Le prime versioni di ALGOL erano antecedenti ai set normati di caratteri ASCII ed EBCDIC e venivano tipicamente implementate usando 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 presenti nelle periferiche, portando a un numero di sostituzioni tra cui := per ← (assegnazione) e >= per ≥ (maggiore o uguale).
Pascal
[modifica | modifica wikitesto]Il linguaggio di programmazione Pascal accetta i digrammi (., .), (* e *) per [, ], { e }. A differenza di tutti gli altri casi qui menzionati, (* e *) erano e sono ancora ampiamente usati. 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.
Il linguaggio di programmazione J è un discendente di APL ma adopera 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.
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 usare due punti interrogativi in una riga sono nelle 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ò usare 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 usato 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;
}
| 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 | modifica wikitesto]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 "digramma":[6]
%:%: and of course several primary tokens contain two characters. Nonetheless, those alternative tokens that aren't lexical keywords are colloquially known as "digraphs".»«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 sé 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 usa i trigrammi può essere riconosciuto dalle versioni più moderne traducendo il file sorgente (effettuando il parsing dei trigrammi), ottenendo un file che contenga solamente caratteri di base e non più trigrammi.[9]
RPL
[modifica | modifica wikitesto]Le calcolatrici Hewlett-Packard che accettano il linguaggio RPL e il metodo di immissione, riconoscono 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'immissione da tastiera senza usare 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]
Accettazione dalle applicazioni
[modifica | modifica wikitesto]Vim
[modifica | modifica wikitesto]L'editor di testo Vim accetta 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 | modifica wikitesto]GNU Screen ha un comando con un digramma, associato a Ctrl+A Ctrl+V per impostazione predefinita.[19]
Lotus
[modifica | modifica wikitesto]Lotus 1-2-3 per DOS usa 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 | modifica wikitesto]- ↑ (EN) Derek M. Jones, Frase 117, in The New C Standard: An Economic and Cultural Commentary.
- ↑ (EN) Roger Hui, Vocabulary, su jsoftware.com. URL consultato il 16 aprile 2015 (archiviato dall'url originale il 2 aprile 2019).
- ↑ (EN) British Standards Institute, The C Standard - Incorporating TC1 - BS ISO/IEC 9899:1999, [John Wiley & Sons], 2003, ISBN 0-470-84573-2.
- ↑ (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).
- ↑ (EN) Bjarne Stroustrup, Design and Evolution of C++, 1ª ed., Addison-Wesley Publishing Company, 29 marzo 1994, ISBN 0-201-54330-3.
- ↑ (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).
- ↑ (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).
- ↑ (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).
- 1 2 (EN) Richard Smith, Removing trigraphs??!, su open-std.org, 6 maggio 2014, N3981. URL consultato il 12 maggio 2019 (archiviato il 9 luglio 2018).
- ↑ (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).
- ↑ (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).
- 1 2 3 4 (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 2 3 4 (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
- 1 2 3 (EN) HP RPL TIO Table, su holyjoe.org, 28 ottobre 2013. URL consultato il 23 gennaio 2015 (archiviato il 23 maggio 2016).
- 1 2 (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).
- ↑ (EN) Craig A. Finseth, chars, su finseth.com, 25 febbraio 2012. URL consultato il 21 dicembre 2017 (archiviato il 21 dicembre 2017).
- ↑ (EN) RFC 1345, su datatracker.ietf.org, Internet Engineering Task Force.
- ↑ (EN) Vim documentation: *digraphs-default*, su vimdoc.sourceforge.net, 15 gennaio 2011. URL consultato il 12 maggio 2019 (archiviato il 20 dicembre 2018).
- ↑ (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).
- ↑ (EN) Digraph - Screen User's Manual, su gnu.org. URL consultato il 12 maggio 2019 (archiviato il 31 dicembre 2018).
Voci correlate
[modifica | modifica wikitesto]Collegamenti esterni
[modifica | modifica wikitesto]- (EN) RFC 1345, su datatracker.ietf.org, Internet Engineering Task Force.