Void safety
Void safety (anche nota come null safety) è una garanzia che viene posta nei linguaggi orientati agli oggetti per garantire che nessun riferimento a oggetto abbia un puntatore nullo (o void).
Nei linguaggi orientati agli oggetti, l'accesso agli oggetti è ottenuto tramite riferimenti (o, in modo equivalente, puntatori). Una chiamata tipica è qualcosa nella forma:
x.f(a, ...)
dove f denota un'operazione e x denota un riferimento a qualche oggetto. Durante l'esecuzione, tuttavia, un riferimento può essere void o null ("nullo" in italiano). In questi casi, la chiamata diventa una void call (chiamata "vuota" o "null"), portando a un'eccezione a run-time, causando spesso una terminazione inattesa del programma.
Void (o null) safety è una garanzia (a compile-time) che permette di verificare che una chiamata nulla (o void) non venga mai effettuata.
Storia
[modifica | modifica wikitesto]In un talk del 2009, Tony Hoare ha definito l'invenzione del puntatore null un "errore" quando ha disegnato il linguaggio ALGOL W:
«Lo definisco il mio errore da un miliario di dollari. È stata l'invenzione del riferimento nullo nel 1965. A quel tempo, stavo definendo il primo sistema completo di tipi per riferimenti in un linguaggio orientato agli oggetti (ALGOL W). Il mio obiettivo era assicurare che tutti gli usi dei riferimenti dovessero essere assolutamente sicuri, con controlli effettuati automaticamente dal compilatore. Tuttavia, non ho potuto resistere alla tentazione di creare il puntatore nullo, semplicemente perché era così semplice da implementare. Questo ha portato a innumerevoli errori, vulnerabilità, crash di sistema, cosa che ha probabilmente causato miliardi di dollari di dolore e danni negli ultimi 40 anni. [1]»
Bertrand Meyer ha introdotto il termine "void safety".[2]
Nei linguaggi di programmazione
[modifica | modifica wikitesto]Un tentativo iniziale per garantire la void safety è stato fatto durante il design del linguaggio di programmazione Self.
Il linguaggio Eiffel è void-safe secondo i suoi standard ISO-ECMA; il meccanismo di void-safety è implementato in EiffelStudio dalla versione 6.1 e utilizzando una sintassi moderna dalla versione 6.4.
Il linguaggio Spec#, un linguaggio di ricerca creato da Microsoft Research, ha la nozione di "non-nullable type" per rispondere alla void safety. Il linguaggio F#, un linguaggio funzionale creato da Microsoft Research che gira sul framework .NET, è void-safe ad eccezione quando deve interfacciarsi con altri linguaggi .NET.[3]
La null safety basata sugli union types
[modifica | modifica wikitesto]Dal 2011 vari linguaggi supportano gli union type e gli intersection type, che possono essere utilizzati per trovare possibili puntatori nulli a compile-time, utilizzando una classe speciale Null dove il valore null è la sua unica istanza.
La null safety basata sui tipi è apparsa per la prima volta nel linguaggio di programmazione Ceylon, seguita subito dopo da TypeScript.
Il linguaggio C# implementa i controlli di null-safety a compile-time dalla versione 8. Tuttavia, per rimanere compatibile con le versioni precedenti del linguaggio, è possibile attivare la funzionalità su uno specifico progetto o anche solo su un file.[4]
Nel linguaggio Dart la null safety è implementata dalla versione 2.0, da agosto 2018.[5][6]
Altri linguaggi che usano tipi null-safe di default includono Kotlin sviluppato da JetBrains,[7] Rust,[8] e Swift prodotto da Apple.
Note
[modifica | modifica wikitesto]- ^ C.A.R. Hoare: Null References: The Billion Dollar Mistake, abstract of a talk at QCon London, 9–12 March 2009, available online
- ^ Bertrand Meyer: Attached Types and their Application to Three Open Problems of Object-Oriented Programming, in ECOOP 2005 (Proceedings of European Conference on Object-Oriented Programming, Edinburgh, 25–29 July 2005), ed. Andrew Black, Lecture Notes in Computer Science 3586, Springer Verlag, 2005, pages 1-32, also available online
- ^ Don Syme, Quote of the Week: "What can C# do that F# cannot?", su blogs.msdn.microsoft.com. URL consultato il 7 settembre 2018.
- ^ Nullable reference types | Microsoft Docs, su docs.microsoft.com. URL consultato il 12 marzo 2021.
- ^ Kevin Moore, Announcing Dart 2 Stable and the Dart Web Platform, su Dart, 7 agosto 2018. URL consultato l'8 agosto 2018.
- ^ Sound null safety | Dart, su dart.dev. URL consultato il 12 marzo 2021.
- ^ Null safety—Kotlin, su kotlinlang.org. URL consultato il 12 marzo 2021.
- ^ Defining an Enum - The Rust Programming Language, su doc.rust-lang.org. URL consultato il 26 giugno 2021.