|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
John Carmack on Haskell, Scheme, and game engine architecture.
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Interessante l'idea di Carmack spiegata verso la fine del video. Forse, al riguardo, potrebbe farsi un giro su Erlang...
+1 per Haskell comunque. La purezza ha mietuto un'altra vittima e +1 pure per i Garbage Collector ![]() P.S.: Certo che se uno non ha mai neanche fatto un tutorial con uno dei linguaggi di cui parla, è difficile afferrare/apprezzare l'essenza di quello che dice, anche se si è programmatori. P.P.S.:ah, e dimenticavo... +1 pure per lo Static Typing @shinya: A proposito di linguaggi esotici, hai già provato Rust?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 30-08-2013 alle 14:02. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Se uno non capisce quel che dice Carmack in questo video, a maggior ragione dovrebbe almeno provare per un po' i linguaggi menzionati.
giustamente Haskell viene criticato piu' per la laziness che la funzionalita'... e in effetti prevedere le latenze e tempi di esecuzione diventa problematico. Io sono in attesa ancora di un linguaggio con l'immutabilita' di Haskell, le macro di un Lisp e una maggior facilita' di interfacciamento con le librerie C/C++... Rust sembra avvicinarsi un po', ma me lo devo prima guardare per bene. (D non e' male in tal senso, anche se ancora lontano).
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Sembra promettente, ma è ancora crudo. Sicuramente da tenere d'occhio. Cmq, a proposito di Carmack: è bello vedere che nonostante l'esperienza ha ancora voglia di sperimentare e mettersi in gioco.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Le idee pero' sono buone (o meglio, sono quelle che piacciono a me Mi sono sempre chiesto perche' gran pochi linguaggi implementino il concetto di immutabilita' o perlomeno di const-correctness. E' una di quelle cose che rende pure qualcosa come il C++ piu' usabile da un un essere unmano.. Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
||
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Poi alla fine bisogna anche capire qual è l'obiettivo di un'applicazione. Se, ad esempio, ho a che fare con thread et similia, certamente un programma const-corrected (? ) aiuta nello gestire la condivisione delle risorse in maniera più safe e più scalabile.Diversamente da casi come questi, però, devi spendere risorse (umane) per qualcosa di cui magari non hai strettamente bisogno. Certamente questo strumento può aiutare nell'indivuazione di problematiche relative alla modifica accidentale o scorretta di dati, ma usando TDD e unit testing mi chiedo quanto possa essere utile se alla fine dovrei comunque scrivere dei test che formalizzino il comportamento desiderato (e quindi individuino questi problemi), e ciò a prescindere che il linguaggio metta a disposizione o meno strumenti per la const-correctness. Tornando al concetto di immutabilità, in Python è presente, per cui spesso ne faccio uso. Ma quando ho a che fare con problematiche intrinsecamente mutabili, beh, non posso fare altro che di ricorrere a oggetti come liste o set, tanto per citare i più noti, o gli usatissimi dizionari (elemento chiave / fondante del linguaggio). Di questi ultimi, peraltro, non esistono versioni immutabili (per lo meno nella libreria standard, che io ricordi), ma in ogni caso avrei difficoltà a immaginare l'utilità di un dizionario immutabile (se non negli stessi termini di un frozenset, che è l'equivalente immutabile di un set). Sottolineo, comunque, che parlo da programmatore NON avvezzo alla programmazione funzionale, dove il concetto di immutabilità è molto caro. C'è da dire, per concludere, che certe a problematiche difficili o troppo costose da gestire a livello software, è possibile che provvederanno i processori, mettendo a disposizione nuovi strumenti. Penso al modello transazionale della memoria, che è arrivato di recente. Altro magari ci sarà in futuro... Quote:
Se si vuole essere utili al proprio team, bisogna essere i primi utenti / programmatori del progetto... P.S. Il video non ho avuto tempo di vederlo, e dubito che ne troverò. Al momento mi sto smazzando altro e ho tante cose da fare...
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
E sì, so che tu non hai il lusso di poter spendere del tempo per seguire il primo grillo che ti salta in testa, ma davvero: prima o poi prova a farti un tutorial su Haskell. Sono quasi certo che ti piacerà molto
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
E via, vediamoci il nostro Carmack post-risveglio-alle-13-del-sabato
L'autodocumentazione del codice tipo assert, const, strong/static typing, pureness etc mi convince, e mi piace come la pensa Carmack. Segnalo anche questo qua che per chi fa i giochetti e' un bel ripassone. Ultima modifica di Tommo : 31-08-2013 alle 14:03. |
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Haskell è molto lontano dai miei canoni. D'altra parte ogni programmatore ha un proprio background e propri gusti, ed è abbastanza difficile che li cambi se è da un bel pezzo che programma. Ad esempio C e, soprattutto, C++ continuo a non digerirli anche se sono anni che li conosco (specialmente il primo) e ho a che farci tutti i giorni...
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Visto. Sbaglio o parla perlopiu' dei cavoli suoi?
Non ne ho tratto granche' di utile, pero' era comunque interessante ![]() Probabilmente lo spunto migliore e' quello sulla purity/static and strong typing. |
|
|
|
|
|
#11 | |||
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Quote:
Un caso particolarmente rilevante e' quello in cui il valore di ritorno e' costante, ovvero non dovrebbe essere cabiato dal chiamate. E' piu' difficile da testare perche' non riguarda il codice del metodo in questione, ma il codice chiamante, questo vuol dire che dovrei scrivere un test per ogni chiamante, ricordarmi di farlo se aggiungo del nuovo codice e soprattutto farlo tenendo conto del resto del codice. In pratica la soluzione piu' semplice e' quella di fare una copia dei dati per andare sul sicuro, e quindi scrivere piu' codice (lasciando stare il fatto che questo vuol dire duplicare le informazioni e magari in alcuni casi non e' quello che voglio). Poi chiaro, a differenza dell'immutabilita' si tratta di una proprieta' statica che non ha senso in un linguaggio dinamico come puo' essere Python, ma nel momento in cui ho un linguaggio con tipizzazione statica, come puo' essere Java o C#, secondo me e' una mancanza che si sente. Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|||
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
) nel senso che tutti gli oggetti dovrebbero essere intrinsecamente mutabili ma solo scopes che lo richiedono esplicitamente dovrebbero avere il "privilegio" di scriverci sopra, mentre il resto dovrebbe essere read-only di default.const ref in C++ ci si avvicina, ma la maggior parte degli altri ha sta distinzione mostruosa tra oggetti mutabili/immutabili copincollati (NSString e NSMutableString, NSDictionary e NSMutableDictionary, String e StringBuffer, ma che davero?) e per me e' dovuto al guardare al problema nel modo sbagliato. Altrimenti hai roba orrenda tipo Java, dove per essere sicuro che chi chiama un getter non ti modifica un membro della classe devi tornargli una copia Per me il problema sarebbe risolvibile in modo molto semplice: il codice che crea un oggetto ha una reference read/write (eg. la classe di cui e' membro, lo scope locale e tutti i figli) e ogni volta che viene passata una reference all'esterno questa di default e' read-only, a meno che non venga scritto esplicitamente... una cosa tipo (in un eretico mix di C++ e java) Codice:
shared String plsMakeMeAString( String a ) {
a[1] = 'p'; //error: cannot modify 'a' without ownership (operator[] is non-const)
return new String(a);
}
String a( "derp" );
auto s = plsMakeMeAString( a );
s[0] = 'h'; //valido
Per il compilatore immagino sarebbe piuttosto semplice trovare in automatico i metodi che non si possono chiamare su una ref non-shared perche' modificano l'oggetto, basta controllare che non modifichino membri e cosi' via. Sinceramente la faccenda dei permessi e' cosi' dappertutto in informatica che mi stupisce che nessuno ci abbia pensato prima Tra l'altro un linguaggio che usa questi modifiers potrebbe fare a meno di un GC, perche' questa cosa mappa anche piuttosto bene l'ownership... basterebbe aggiungere una keyword "move" che toglie il permesso di scrittura a chi ha creato l'oggetto. Ad esempio, se volessi creare la stringa sullo stack e returnarla come move/shared il compilatore mi darebbe errore perche' l'ownership di un oggetto locale non e' trasferibile in quanto viene distrutto all'uscita dallo scope. Codice:
[move|shared] String plsMakeAString( String global )
String local;
local = global; //lo scope locale puo' scrivere sulla sua roba
return local; //error: cannot return a reference to a local object
Ultima modifica di Tommo : 01-09-2013 alle 19:44. |
|
|
|
|
|
|
#13 | ||||
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Proprio per questo e' piu' semplice la condivisione tra piu' thread degli stessi dati; in particolare non hai bisogno di lock e mutex. (Devi trovare una soluzione diversa se vuoi modificarli, ma l'alternativa e' solitamente piu' sicura). Poi se hai a che fare con funzioni pure e' molto piu' semplice per il compilatore fare common subexpression elimination su chiamate a funzioni. Infine dati immutabili aiutano la garbage collection: gli oggetti immutabili non potranno mai contenere riferimenti ad oggetti appartenenti ad una generazione piu' giovane. Questo vuol dire ad esempio che se sto ripulendo la nursery e un puntatore mi scappa in una generazione piu' vecchia allora posso smettere di controllare. Ma il vantaggio maggiore che ho trovato io e' che e' molto molto molto piu' semplice fare ragionamenti sul codice. Guardi la funzione/metodo e puoi fare tutte le valutazioni senza dover pensare a cosa succede nel resto del programma; e' difficile fare paragoni in questo caso perche' bisogna cambiare anche il modo in cui si struttura il programma. Quote:
Quote:
Ci sono altre tecniche per eliminare (o cmq ridurre) l'uso della GC, che sfruttano una escape analysis per allocare la memoria in un blocco unico che viene liberato all'uscita della chiamata (in sostanza uno heap locale in cui viene allocata tutta la memoria che si e' dimostrato non verra' mai ritornata al chiamante). Per inciso questo e' un altro caso in cui avere dati immutabili o almeno costanti aiuta, perche' se un argomento non lo posso modificare,sicuramente non ci scappera' dentro un oggetto che alloco nella funzione corrente... Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
||||
|
|
|
|
|
#14 | ||||||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Tanto per fare un esempio diverso, se scrivo una classe in cui faccio uso di una lista internamente che inizializzo mettendola vuota nel costruttore, in uno dei primi test che controllano il comportamento della nuova classe io metto lo stesso un controllo per vedere se la lista è vuota, anche se lo so che è così perché il codice l'ho scritto io. Ma non posso prevedere eventuali errori nell'averlo fatto, o se un domani rimettendoci mano per sbaglio modifico proprio quella parte. Per questo esplicito nel test il comportamento che mi aspetto; e mi è pure utile per documentarlo, questo comportamento. Quote:
Ci sono linguaggi che consentono di testare i cosiddetti invarianti. Non è il caso di Python, purtroppo, per cui risolvo effettuando una copia dell'oggetto restituito e scrivendo un metodo, usato nei test in cui serve, che controlla che l'oggetto che è stato restituito sia identico alla copia che è stata fatta. Quote:
Nel mio caso la copia la faccio solo nei test, per cui sposto il problema da un'altra parte. Quote:
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:18.













) aiuta nello gestire la condivisione delle risorse in maniera più safe e più scalabile.








