Stringa null-terminata: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Creata dalla traduzione della pagina "Null-terminated string" |
sistemate le note |
||
Riga 1:
In [[Programmazione (informatica)|programmazione]], una '''stringa null-terminata''' è una [[Stringa (informatica)|stringa di caratteri]] memorizzata come un [[Array|vettore]] contenente i caratteri e terminata con un carattere null (un carattere con valore zero, chiamato NUL in questo articolo). I nomi alternativi sono '''stringa C''', che si riferisce al [[C (linguaggio)|linguaggio di programmazione C]] e '''ASCIIZ''' (sebbene C possa usare codifiche diverse da ASCII).
Line 7 ⟶ 6:
Le stringhe null-terminate sono state introdotte dalla direttiva <code>.</code> <code>ASCIZ</code> dei [[Linguaggio assembly|linguaggi assembly]] [[PDP-11]] e dalla direttiva <code>ASCIZ</code> del linguaggio assembly macro MACRO-10 per il [[PDP-10]]. Questi precedono lo sviluppo del linguaggio di programmazione C, ma sono state spesso utilizzate altre forme di stringhe.
Al momento dello sviluppo del C (e dei linguaggi da cui deriva), la memoria era estremamente limitata, quindi l'utilizzo di un solo byte di sovraccarico per memorizzare la lunghezza di una stringa era interessante. L'unica alternativa popolare a quel tempo, solitamente chiamata "stringa Pascal" (un termine più moderno è "[[Stringa (informatica)|lunghezza prefissata]]"), utilizzava un ''byte iniziale'' per memorizzare la lunghezza della stringa. Ciò consente alla stringa di contenere NUL e la ricerca della lunghezza di una stringa già memorizzata richiede solo un accesso alla memoria in [[Complessità temporale|tempo costante]] O(1), ma la lunghezza della stringa è limitata a 255 caratteri (su una macchina che utilizza byte a 8 bit). Il progettista del linguaggio C [[Dennis Ritchie]] ha scelto di seguire la convenzione della terminazione con carattere nullo per evitare la limitazione della lunghezza di una stringa e perché mantenere il conteggio sembrava, nella sua esperienza, meno conveniente rispetto all'utilizzo di un terminatore.<ref>{{Cita conferenza|titolo=The development of the C language|conferenza=Second History of Programming Languages conference|autore=Dennis M. Ritchie|data=Aprile 1993|città=Cambridge (MA)|wkautore=Dennis Ritchie|url=https://www.bell-labs.com/usr/dmr/www/chist.html|lingua=EN}}</ref>
Ciò ha avuto una certa influenza sulla progettazione del [[Instruction set|set di istruzioni]] della CPU. Alcune CPU negli anni '70 e '80, come [[Zilog Z80]] e [[Digital Equipment Corporation|DEC]] [[Virtual Address eXtension|VAX]], avevano istruzioni dedicate per la gestione delle stringhe con prefisso di lunghezza. Tuttavia, quando la stringhe null-terminate hanno guadagnato trazione, i progettisti delle CPU hanno iniziato a tenerne conto, come si è visto ad esempio nella decisione di IBM di aggiungere le istruzioni "Logical String Assist" all'ES/9000 520 nel 1992.
Lo sviluppatore [[FreeBSD]] [[Poul-Henning Kamp]], scrivendo in ''ACM Queue'', ha definito la vittoria delle stringhe null-terminate su una lunghezza di 2 byte (non un byte) come "l'errore di un byte più costoso" di sempre.<ref>{{Cita testo|lingua=EN|autore=Poul-Henning Kamp|titolo=The Most Expensive One-byte Mistake|pubblicazione=ACM Queue|data=25 luglio 2011|url=http://queue.acm.org/detail.cfm?id=2010365|vol=9|numero=7|accesso=2 agosto 2011|issn=1542-7730}}</ref>
== Limitazioni ==
Sebbene semplice da implementare, questa rappresentazione è stata soggetta a errori e problemi di prestazione.
La terminazione nulla ha storicamente creato [[Sicurezza informatica|problemi di sicurezza]].<ref>{{Cita pubblicazione|autore=Rain Forest Puppy|data=9
L'impossibilità di memorizzare uno zero richiede che testo e dati binari siano mantenuti distinti e gestiti da funzioni diverse (quest'ultima richiede che venga fornita anche la lunghezza dei dati). Ciò può portare a ridondanza del codice ed errori quando viene utilizzata la funzione sbagliata.
Line 23 ⟶ 22:
== Codifiche dei caratteri ==
Le stringhe null-terminate richiedono che la codifica non utilizzi un byte zero (0x00) da nessuna parte, quindi non è possibile memorizzare tutte le possibili [[ASCII|stringhe ASCII]] o [[UTF-8]].<ref>{{Cita web|url=http://tools.ietf.org/html/rfc3629#section-3|titolo=UTF-8, a transformation format of ISO 10646|dataaccesso=19
[[UTF-16]] utilizza numeri interi a 2 byte e poiché entrambi i byte possono essere zero (e infatti ''ogni altro'' byte lo è, quando si rappresenta testo ASCII), non può essere archiviato in una stringa di byte con terminazione null. Tuttavia, alcuni linguaggi implementano una stringa di caratteri [[UTF-16]] a 16 bit, terminata da un NUL a 16 bit.
Line 30 ⟶ 29:
Sono stati fatti molti tentativi per rendere la gestione delle stringhe C meno soggetta a errori. Una strategia consiste nell'aggiungere funzioni più sicure come <code>strdup</code> e <code>strlcpy</code>, [[Libreria standard del C|deprecando al contempo l'uso di funzioni non sicure]] come <code>gets</code>. Un altro è aggiungere un wrapper orientato agli oggetti attorno alle stringhe C in modo che possano essere eseguite solo chiamate sicure. Tuttavia anche così facendo risulta comunque possibile chiamare le funzioni non sicure.
La maggior parte delle librerie moderne sostituisce le stringhe C con una struttura contenente un valore di lunghezza pari o superiore a 32 bit (molto più di quanto non sia mai stato considerato per le stringhe di lunghezza prefissata) e spesso aggiunge un altro puntatore, un conteggio dei riferimenti e persino un NUL per accelerare la
== Voci correlate ==
* [[Stringa vuota]]
* [[Valore sentinella]]
== Note ==
<references />
{{Portale|informatica}}
[[Categoria:Stringhe]]
|