Perfetto per un bel po' del codice che si vede da queste parti:
http://m.xkcd.com/1513/
![]()
Perfetto per un bel po' del codice che si vede da queste parti:
http://m.xkcd.com/1513/
![]()
Amaro C++, il gusto pieno dell'undefined behavior.
Il mio giudizio sull'università peggiora di giorno in giorno.
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
Non gettare il sasso e tirare indietro la mano, ora vogliamo sapere cos'è successo
Unrelated: alla fine ho trovato il tempo di studiarmi in maniera un po' più seria Lua (e di giocarci un po'), e confermo che concettualmente è veramente una figata; il fatto che si costruisce tutto con table/metatable/closures (che alla fine lavorano con poche regole e molto semplici) mi ha colpito in positivo - quasi alla maniera del Lisp, hai un core language ultra-minimale con cui puoi costruire qualunque cosa. L'altra cosa che è una figata atomica è LuaJIT, fa paura quanto è veloce.
(ah e mi è piaciuto un sacco come un web framework basato su Lua risolve il problema della gestione dello stato - ad esempio, per la paginazione - con le coroutine, non ci avevo mai pensato)
Però: provando a scriverci qualcosa di un po' più vero (stavo provando a vedere che velocità avrebbe avuto un nester minimale in LuaJIT) mi sono scontrato su alcuni punti:
- ok core language minimale con cui puoi fare qualunque cosa, ma una libreria standard un po' più vasta farebbe piacere
, sia per avere un po' più di roba pronta, sia per avere "convenzioni comuni" e best practices già un minimo definite (ho visto definire classi in 3 o 4 maniere diverse, un minimo di convenzione stabilita aiuterebbe);
- si sente un po' la carenza di zucchero sintattico: +=, ++ & co., break/continue, list comprehension, ... anche se le potenzialità di fondo sarebbero le stesse - ad esempio - di Python, in Python si riesce ad essere molto più concisi ed espressivi;
- gli indici che iniziano da 1, i loop con gli estremi inclusi
; ok che sono andato a cercarmi un caso rognoso (già a rasterizzare e a fare i conti con le scanline faccio casino con le convenzioni "normali"), ma mi si asimmetrizza un sacco di roba (prima tra tutte, le y mi partono da 1, le x da 0
) e rompe le convenzioni usate da tutto il resto del mondo software; poi se uno lo usa per embedding a lato conversione C/Lua con gli indici mi immagino già che incubo sia...
Ciò detto, confermo il giudizio molto positivo, come linguaggio è davvero un gioiellino. Tra l'altro, si capisce come i due punti di cui sopra vengano dalla "vocazione all'embedding", e che MoonScript (che compila Lua) dovrebbe fornire un po' di zucchero sintattico per noi programmatori abituati a linguaggi più zuccherosi(anche se mi sembra tradisca un po' lo spirito del Lua). Ne hai sentito parlare/l'hai provato?
Amaro C++, il gusto pieno dell'undefined behavior.
Ah, altra chicca trovata oggi: codice che cancella degli elementi che matchano una certa condizione da una lista linkata:
Questa roba è un piccolo capolavoro, credo sia riuscito a rendere O(n^3) un'operazione O(n):codice:REP: for (P = PPfirst; P != NULL; P = P->next) { if (condizione(P)) { // ... CPiazzPz *PL; if (P == PPfirst) { PPfirst = P->next; delete P; goto REP; } else { for (PL = PPfirst; PL != NULL && PL->next != P; PL = PL->next); if (PL == NULL || PL->next != P) { DIE("Errore in ..."); return 0; } PL->next = P->next; delete P; goto REP; } } }
- è il primo elemento che deve essere cancellato? ok lo faccio... e ricomincio da capo con un goto?!?
- altrimenti: ok, questo elemento va cancellato; però azz, devo agganciare il puntatore dell'elemento precedente, ma me lo sono dimenticato... spé che mi ri-scorro la lista da capo per andarlo a trovare
- visto che non mi fido, comunque controllo se ho ritrovato *davvero* lo stesso elemento;
- ok, sistemo i puntatori;
- RICOMINCIO DALL'INIZIO DELLA LISTA CON UN GOTO!
Dirai, è un aborto scritto da qualcuno momentaneamente incapacitato dal coma etilico e poi fatto sparire... none, è un pattern copincollato più o meno ovunque ci sia da filtrare questa lista:
E per tornare a bomba sul tuo discorso: ti farà piacere che l'autore di questo codice attualmente insegna all'Università di Genova.![]()
Amaro C++, il gusto pieno dell'undefined behavior.
Sostanzialmente abbiamo fatto un intero corso sulla programmazione OO a leggere assieme in aula la documentazione jdk e i tutorial oracle copiati (male) su delle slide.
A ogni lezione pensavo "alla prossima non vado" e poi "ma magari dice qualcosa di interessante"... Beh, potevo non andare!
Abbiamo fatto più di 3/4 del corso a leggere la documentazione di JavaFX (2.2 per giunta).
Per quanto riguarda lua, non posso confermare che la mancanza di convenzioni sia un problema. Più che altro perché, essendo la libreria standard limitata, ogni volta che cerchi una libreria "preconfezionata" su internet devi spendere il triplo del tempo per capirne la struttura.
Gli indici che iniziano da 1 danno molto fastidio a quelli del mestiere, per gli altri sono manna dal cielo
Penso che in ogni caso in quanto a flessibilità rimanga uno dei miei linguaggi preferiti.
LOL cioè, no, sul serio, non ho parole per esprimermi su quel codice. Tiene il corso di Algoritmi?
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
Consolati, chi avrebbe dovuto insegnare a noialtri il C++ sapeva bene probabilmente il Fortran 77, doveva ripassarsi la sintassi dei template nell'intervallo e nella prima lezione non ricordava se era "cin>>a" o "cin>>&a".
Esattamente quello che ho visto... ok fighissimo che il linguaggio non ti "cristallizza" i costruttori, ma capperi, almeno concordate tutti se è nomeclasse::new(), nomeclasse() o qualcos'altro ancora.Per quanto riguarda lua, non posso confermare che la mancanza di convenzioni sia un problema. Più che altro perché, essendo la libreria standard limitata, ogni volta che cerchi una libreria "preconfezionata" su internet devi spendere il triplo del tempo per capirne la struttura.
Gli altri devono morire.Gli indici che iniziano da 1 danno molto fastidio a quelli del mestiere, per gli altri sono manna dal cielo![]()
Dijkstra ha dimostrato conclusivamente che gli indici a base 0 e i range semi-aperti [0, length) sono la Cosa Giusta™, tutto il resto è fuffa.
(che poi, in generale in nel Lua attuale ci sono concetti ben più complicati da capire degli indici a base zero - che so, le coroutine, le magie delle closures, ... - mi sembra più un accidente storico che altro il fatto che sia rimasta questa odiosa peculiarità).
Sì, quando ho visto come usa closures+metatables per costruire la OOP mi sono quasi emozionatoPenso che in ogni caso in quanto a flessibilità rimanga uno dei miei linguaggi preferiti.è raro vedere un linguaggio che ti dà strumenti semplici ma sufficientemente potenti per costruire qualunque cosa in maniera così pulita.
Fortunatamente no.LOL cioè, no, sul serio, non ho parole per esprimermi su quel codice. Tiene il corso di Algoritmi?![]()
Amaro C++, il gusto pieno dell'undefined behavior.
Questi episodi vi aiutano senz'altro a capire meglio perché nelle multinazionali esistono apposite strutture formative interne, ben distinte dalle strutture che erogano corsi a clienti e appaltatori, le quali assorbono risorse notevoli (con non poche bestemmie a livello di management) perché, oltre alla vera e propria formazione verticale interna, spendono circa il 70% del tempo per (re)insegnare ai neoassunti (laureati o addottorati con punteggi non inferiori a 108/110) quello che in teoria dovrebbero già sapere benissimo dai loro corsi di laurea.
Potrei raccontare cose da farvi drizzare i capelli. Ce n'è davvero per tutti i gusti: dal docente che si è "aggiornato" per l'ultima volta nel 1985 e continua imperterrito ad insegnare che i microkernel message passing sono "più lenti" dei monolitici (poveretti, in fondo le dimostrazioni del contrario sono apparse in letteratura solo nella prima metà degli anni Novanta, e poi uno non può mica leggersi tutto quello che viene pubblicato, specialmente sulla sua materia d'elezione...), fino a quelli, forse più tipici dei politecnici e di certi ambienti didattici, che al contrario si fissano solo sull'ultima piattaforma wintel, sul più recente standard del linguaggio C o C++, sull'ottimizzazione per i sistemi mainstream perché "tanto il resto è obsoleto" e "oggi il compilatore fa tutto". Stendiamo un velo pietoso sugli ottimizzatori più in voga nel mainstream, vedi GCC e dintorni, messi facilmente in ginocchio perfino da una banale equazione di ricorsione espressa in forma moltiplicativa, e limitiamoci a considerare che il "resto" è talmente "obsoleto" che, una volta che questi laureati arrivano in una società dove l'embedded la fa da padrone, bisogna reinsegnare da capo tutti i fondamenti di architettura Harvard, ISA RISC, microottimizzazione, computer arithmetics e in pratica tutto quanto un tempo costituiva il core know how di una laurea in elettronica o informatica. Senza contare che, facendo un conto della serva, oltre il 95% del codice C circolante in totale (non solo nel mainstream!) è a malapena C'89 compatibile e i due standard più recenti fanno davvero ridere i polli quanto ad adozione generalizzata. E si può continuare molto, molto a lungo con gli esempi.
Riguardo a Lua, come già accennato, rimane uno dei linguaggi più flessibili in circolazione, dopo LISP e i suoi cloni.
• Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.
@beh, ci sono anche persone competenti comunque!
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
Poi diciamo che tra non trattare aspetti di micro-ottimizzazione e non sapere nemmeno il linguaggio di programmazione che si sta insegnando passano ordini di grandezza di incompetenza...![]()
Amaro C++, il gusto pieno dell'undefined behavior.
Per fortuna! Quella dovrebbe essere la regola generale, ma purtroppo diventa sempre più un'eccezione...
Purtroppo l'intera gamma d'incompetenza appare ben coperta, ci sono rappresentanti di tutte le categorie, anche molto oltre i semplici esempi riportati... i fenomeni di scadimento qualitativo e compressione quantitativa dei piani di studio sono comunque fortemente interrelati, anche se talora in modo non lineare e controintuitivo, con la proliferazione delle sedi e la scarsa competenza specifica di taluni docenti. Occorre anche dire che, contrariamente a quanto avviene nelle università nordeuropee e anglosassoni in genere, in Italia spesso i corsi vengono affibbiati a chi di norma si occupa (talora anche molto validamente) di tutt'altro, per esigenze didattico-organizzative. Il che non giustifica in alcun modo l'attuale stato di cose, ma almeno ne spiega alcuni dei motivi fondamentali.![]()
• Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.