Programmazione generica: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Tradotta sezione "In object-oriented languages"
FrescoBot (discussione | contributi)
m Bot: numeri di pagina nei template citazione
 
(18 versioni intermedie di 6 utenti non mostrate)
Riga 1:
<!-- {{Tradotto da|en|Generic programming}} -->
{{T|inglese|informatica|marzo 2024}}
 
In [[informatica]], la '''programmazione generica''' è un [[paradigma di programmazione]] in cui gli [[algoritmo|algoritmi]] accettano come parametri le [[tipo di dato|tipologie di dati]] da trattare, oltre ai [[dato|dati]] veri e propri. Questo approccio, introdotto nel [[ML (linguaggio di programmazione)|linguaggio ML]] nel 1973,<ref name="Lee2008">
{{cita libro| autore = Kent D. Lee| titolo = Programming Languages: An Active Learning Approach| url = https://books.google.com/books?id=OuW5dC2O99AC&pg=PA9|data=15 dicembre 2008| editore = Springer Science & Business Media| ISBN = 978-0-387-79422-8| pp = 9-10| lingua = en}}
{{cita libro
| autore = Kent D. Lee
| titolo = Programming Languages: An Active Learning Approach
| url = https://books.google.com/books?id=OuW5dC2O99AC&pg=PA9
| data = 2008-12-15
| editore = Springer Science & Business Media
| ISBN = 978-0-387-79422-8
| pp = 9–10
| lingua = en
}}
</ref><ref>
{{cita conferenza|autore = R. Milner|autore2 = L. Morris|autore3 = M. Newey|anno = 1975|titolo = A Logic for Computable Functions with Reflexive and Polymorphic Types|conferenza = Proceedings of the Conference on Proving and Improving Programs|lingua = en}}
{{cita conferenza
|autore = R. Milner
|autore2 = L. Morris
|autore3 = M. Newey
|anno = 1975
|titolo = A Logic for Computable Functions with Reflexive and Polymorphic Types
|titolo-libro = Proceedings of the Conference on Proving and Improving Programs
|lingua = en
}}
</ref>
permette di scrivere codice generico, del quale possono essere auto-generate multiple versioni specializzate che differiscono solo per i tipi di dati trattati, riducendo così la necessità di scrivere codici essenzialmente duplicati.
 
== Storia ==
 
La programmazione generica venne introdotta al pubblico generale con la sua implementazione in [[Ada (linguaggio di programmazione)|Ada]] nel 1977. Con l'introduzione dei ''[[template (programmazione)|template]]'' in [[C++]], le tecniche di programmazione generica sono diventate parte del repertorio professionale dei [[architetto (informatica)|progettisti]] di [[libreria (software)|librerie]]. Queste tecniche vennero ulteriormente sviluppate e i "tipi parametrizzati" vennero introdotti nell'influente libro ''[[Design Patterns]]'' del 1994.<ref name="cita GoF 1994">{{cita|GoF 1994}}.</ref>
Riga 30 ⟶ 14:
Nuove tecniche vennero introdotte da [[Andrei Alexandrescu]] nel suo libro ''[[Modern C++ Design: Generic Programming and Design Patterns Applied]]'' del 2001. Successivamente il [[D (linguaggio di programmazione)|linguaggio D]] implementò le stesse idee.
 
Le funzionalità di programmazione generica sono conosciute come ''generics'' in [[Ada (linguaggio di programmazione)|Ada]], [[C sharp|C#]], [[Delphi]], [[Eiffel (linguaggio di programmazione)|Eiffel]], [[Java (linguaggio di programmazione)|Java]], [[Nim (linguaggio di programmazione)|Nim]], [[Python]], [[Go (linguaggio di programmazione)|Go]], [[Rust (linguaggio di programmazione)|Rust]], [[Swift (linguaggio di programmazione)|Swift]], [[TypeScript]], e [[Visual Basic .NET]]. Sono conosciute come "polimorfismo parametrico" in [[ML (linguaggio di programmazione)|ML]], [[Scala (linguaggio di programmazione)|Scala]], [[Julia (linguaggio di programmazione)|Julia]] e [[Haskell (linguaggio di programazione)|Haskell]].
 
Il termine "programmazione generica" fu coniato originariamente da [[David Musser]] e [[Alexander Stepanov]]<ref name="cita Musser & Stepanov 1989">{{cita|Musser & Stepanov 1989}}.</ref> in un senso più specifico di quello descritto sopra, per descrivere un paradigma di programmazione in cui i requisiti fondamentali sui tipi sono astratti dagli esempi concreti di algoritmi e [[struttura dati|strutture dati]], e formalizzati come "[[concetti (programmazione)|concetti]]", con [[funzione (programmazione)|funzioni generiche]] implementate in termini di questi concetti, tipicamente utilizzando i meccanismi di generalizzazione dei linguaggi come descritti sopra.
Riga 80 ⟶ 64:
</syntaxhighlight>
 
Il costrutto <code>template</code> del C++ utilizzato sopra è largamente citato come il costrutto di programmazione generica che ha popolarizzato la nozione tra programmatori e progettisti di linguaggi, e supporta molti [[idioma|idiomi]] di programmazione generica. Il linguaggio D offre template basati su quelli del C++ ma con una sintassi semplificata.<ref Javaname="dlang offretemplates">{{cita funzionalità di programmazione generica, sintatticamente basate su quelle del C++, a partire da J2SE 5web|url=https://dlang.0org/articles/templates-revisited.html|titolo=Templates Revisited|accesso=2024-03-30|lingua=en}}</ref>
Java offre funzionalità di programmazione generica, sintatticamente basate su quelle del C++, a partire da J2SE 5.0.<ref name="JDK8 Generics">{{cita web|url=https://docs.oracle.com/javase/tutorial/java/generics/|titolo=Java Generics|accesso=2024-03-30|lingua=en}}</ref>
 
[[C sharp|C#]] 2.0, [[Oxygene (linguaggio di programmazione)|Oxygene]] 1.5 e [[Visual Basic .NET]] 2005 hanno costrutti che sfruttano il supporto per i ''generic'' presenti nel [[.NET Framework]] dalla versione 2.0.<ref name=".NET Generics">{{cita web|url=https://learn.microsoft.com/it-it/dotnet/standard/generics/|titolo=Generics in .NET|data=2024-01-27|accesso=2024-03-30}}</ref>
 
==== Template (C++) ====
-----
{{vedi anche|C++#Template}}
 
C++ usa i ''template'' per abilitare le tecniche di programmazione generica.<ref>{{cita web|url=https://en.cppreference.com/w/cpp/language/templates|titolo=C++ templates|accesso=2024-03-30|lingua=en}}</ref>
La [[libreria standard C++|libreria standard del C++]] include la ''[[Standard Template Library]]'' (STL) che offre un [[framework]] di ''template'' per strutture dati e algoritmi comuni.<ref>{{cita web|url=https://en.cppreference.com/w/cpp|titolo=C++ Standard Template Library index|accesso=2024-03-30|lingua=en}}</ref>
 
I ''template'' in C++ possono anche essere usati per la [[metaprogrammazione]], costruendo delle espressioni che vengono valutate durante la [[compilazione]], piuttosto che in fase di [[esecuzione (informatica)|esecuzione]]; Si parla in questo caso di ''[[template metaprogramming]]''. Attraverso l'uso della "specializzazione dei template" i ''template'' del C++ costituiscono un sistema ''[[turing complete]]''.<ref>
{{cita web
|url = https://en.cppreference.com/w/cpp/language/template_metaprogramming
|titolo = Template metaprogramming
|accesso = 2024-03-30
|lingua = en
}}
</ref>
 
A partire da [[C++11]] il linguaggio supporta i ''template'' variadici, ovvero ''template'' che accettano un numero variabile di parametri.<ref>
{{Cita web|url=http://www.jot.fm/issues/issue_2008_02/article2/|titolo=Variadic Templates for C++0x|autore=Douglas Gregor e Jaakko Järvi|lingua=en}}
</ref>
Questa funzionalità permette di gestire in maniera ''type-safe'' tutte quelle situazioni che classicamente avrebbero richiesto una "semplice" [[funzione variadica]], con tutte le restrizioni e i compromessi del caso.<ref>
{{Cita libro|autore=[[Bjarne Stroustrup]]|titolo=C++ Linguaggio, libreria standard, principi di programmazione|edizione=4|capitolo=28.6 Template Variadici|anno=2015|editore=Pearson Italia|isbn=9788865184486}}
</ref>
 
== Note ==
Riga 94 ⟶ 98:
; Libri
 
* {{cita libro|autore = Joseph Albahari|titolo = C# 10 in a Nutshell|editore = O'Reilly|ISBN= 978-1-098-12195-2|edizione = 1|anno = 2022|lingua = en}}
* {{cita libro
* {{cita libro|autore = Joshua Bloch|titolo = Effective Java: Programming Language Guide|editore = Addison-Wesley|edizione = 3|ISBN = 978-0134685991|anno = 2018|lingua = en}}
|autore = Joseph Albahari
* {{cita libro|autore = [[David Musser]]|autore2 = [[Alexander Stepanov]]|titolo = Symbolic and Algebraic Computation: International symposium ISSAC 1988|capitolo = Generic programming|serie = Lecture Notes in Computer Science|volume = 358|pp = 13-25|anno = 1989|lingua = en|doi = 10.1007/3-540-51084-2_2|ISBN = 978-3-540-51084-0|cid = Musser & Stepanov 1989}}
|titolo = C# 10 in a Nutshell
* {{cita libro|autore = Erich Gamma|autore2 = Richard Helm|autore3 = Ralph Johnson|autore4 = John Vlissides|data = 1994|titolo = Design Patterns|editore = Addison-Wesley|lingua = en|ISBN = 0-201-63361-2|url = https://archive.org/details/designpatternsel00gamm|cid = GoF 1994}}
|editore = O'Reilly
|iSBN = 978-1-098-12195-2
|edizione = 1
|anno = 2022
|lingua = en
}}
* {{cita libro
|autore = Joshua Bloch
|titolo = Effective Java: Programming Language Guide
|editore = Addison-Wesley
|edizione = 3
|ISBN = 978-0134685991
|anno = 2018
|lingua = en
}}
* {{cita libro
|autore = [[David Musser]]
|autore2 = [[Alexander Stepanov]]
|titolo = Symbolic and Algebraic Computation: International symposium ISSAC 1988
|capitolo = Generic programming
|serie = Lecture Notes in Computer Science
|volume = 358
|pp = 13–25
|anno = 1989
|lingua = en
|DOI = 10.1007/3-540-51084-2_2
|ISBN = 978-3-540-51084-0
|cid = Musser & Stepanov 1989
}}
* {{cita libro
|autore = Erich Gamma
|autore2 = Richard Helm
|autore3 = Ralph Johnson
|autore4 = John Vlissides
|data = 1994
|titolo = Design Patterns
|editore = Addison-Wesley
|lingua = en
|ISBN = 0-201-63361-2
|url = https://archive.org/details/designpatternsel00gamm
|cid = GoF 1994
}}
 
; Conferenze
 
* {{cita conferenza|autore = [[Bjarne Stroustrup]]|titolo = Evolving a language in and for the real world: C++ 1991-2006|conferenza = ACM HOPL 2007|url = https://www.research.att.com/~bs/hopl-almost-final.pdf|organizzazione = [[Association for Computing Machinery]]|anno = 2007|lingua = en}}
* {{cita conferenza
|autore = [[Bjarne Stroustrup]]
|titolo = Evolving a language in and for the real world: C++ 1991-2006
|conferenza = ACM HOPL 2007
|url = https://www.research.att.com/~bs/hopl-almost-final.pdf
|organizzazione = [[Association for Computing Machinery]]
|anno = 2007
|lingua = en
}}
 
; Pubblicazioni
 
* {{cita pubblicazione|autore = R. Garcia|autore2 = J. Ja ̈rvi|autore3 = A. Lumsdaine|autore4 = J. Siek|autore5 = J. Willcock|titolo = An extended comparative study of language support for generic programming|rivista = Journal of Functional Programming|volume = 17|numero = 2|editore = Cambridge University Press|data = marzo 2007|lingua = en|doi = 10.1017/S0956796806006198|cid = Garcia 2007}}
* {{cita pubblicazione
|autore = R. Garcia
|autore2 = J. Ja ̈rvi
|autore3 = A. Lumsdaine
|autore4 = J. Siek
|autore5 = J. Willcock
|titolo = An extended comparative study of language support for generic programming
|rivista = Journal of Functional Programming
|volume = 17
|numero = 2
|editore = Cambridge University Press
|data = marzo 2007
|DOI = 10.1017/S0956796806006198
|cid = Garcia 2007
}}
 
== Voci correlate ==
 
* [[Paradigma di programmazione]]
* [[Polimorfismo (informatica)]]
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC|generic programming|generic programming}}
* {{cita web|url=https://www.generic-programming.org|titolo=Generic programming|editore=The Trustees of Indiana University|lingua=en}}
* {{cita web|url=http://www.stepanovpapers.com/|urlarchivio=https://web.archive.org/web/20240309092114/http://www.stepanovpapers.com/|titolo=Raccolta delle pubblicazioni di Alexander A. Stepanov|lingua=en}}
 
{{Controllo di autorità}}
* [https://www.generic-programming.org generic-programming.org]
{{Portale|informatica}}
* Alexander A. Stepanov, [https://www.stepanovpapers.com/ Collected Papers of Alexander A. Stepanov] (autore della [[Standard Template Library]] del [[C++]])
 
[[Categoria:Programmazione generica]]
{{Portale|Informatica}}
------