[generics] Perché niente farmaci generici in Go?


0 Answers

Russ Cox, uno dei veterani del Go, ha scritto un post sul blog intitolato The Generic Dilemma , in cui chiede

... vuoi programmatori lenti, compilatori lenti e binari gonfiati, o tempi di esecuzione lenti?

I programmatori lenti sono il risultato di no generici, i compilatori lenti sono causati da generici come C ++ e tempi di esecuzione lenti derivano dall'approccio boxing-unboxing utilizzato da Java.

La quarta possibilità non menzionata nel blog sta andando al percorso C #. Generazione del codice specializzato come in C ++, ma in fase di esecuzione quando è necessario. Mi piace molto, ma Go è molto diverso da C # quindi probabilmente non è applicabile a tutti ...

Devo dire che l'uso della popolare tecnica Java 1.4 di programmazione generica in go that cast a interface{} soffre esattamente degli stessi problemi di boxing-unboxing (perché è quello che stiamo facendo), oltre alla perdita di sicurezza del tipo a tempo di compilazione. Per i tipi piccoli (come ints) Go ottimizza il tipo di interface{} modo che un elenco di interi che sono stati trasmessi all'interfaccia {} occupi un'area contigua di memoria e occupa solo il doppio dello spazio dei normali inti. C'è ancora il sovraccarico dei controlli di runtime durante la trasmissione interface{} , però. Reference

Tutti i progetti che aggiungono supporto generico per andare (ce ne sono molti e tutti sono interessanti) vanno uniformemente nella rotta C ++ della generazione del codice di tempo compilato.

Question

Disclaimer: ho giocato con Go per un solo giorno ora, quindi ci sono buone probabilità che mi sia mancato molto.

Qualcuno sa perché non c'è un vero supporto per generici / modelli / whatsInAName in Go? Quindi c'è una map generica, ma fornita dal compilatore, mentre un programmatore Go non può scrivere la propria implementazione. Con tutti i discorsi su come rendere Go il più ortogonale possibile, perché posso UTILIZZARE un tipo generico ma non CREARE uno nuovo?

Soprattutto quando si tratta di programmazione funzionale, ci sono lambda, anche chiusure, ma con un sistema di tipo statico privo di generici, come faccio a scrivere, bene, funzioni generiche di ordine superiore come filter(predicate, list) ? OK, le liste collegate e simili possono essere fatte con l' interface{} sacrifica la sicurezza del tipo.

Come una rapida ricerca su SO / Google non ha rivelato alcun approfondimento, sembra che i generici, se non del tutto, saranno aggiunti a Go in un secondo momento. Mi fido di Thompson per fare meglio dei ragazzi Java, ma perché tenere fuori i farmaci generici? O sono pianificati e non ancora implementati?




Related