Linguaggi intelligenti
Da un remoto angolo del manuale di PHP:
“If you compare an integer with a string, the string is converted to a number.”
Ciò significa che, in PHP, il seguente test:
if ("pippo" == 0) {
è sempre vero.
A loro discolpa, devono già essersi accorti che questa era una stupidaggine di prim’ordine: difatti già dal PHP 4 hanno introdotto l’operatore === che vuol dire “uguali e dello stesso tipo”. Ma all’incauto programmatore che ci perde una mezz’ora viene lo stesso voglia di fustigarli.
11 Aprile 2007, 11:55
Se tu usassi asp/js non avresti di questi problemi…
11 Aprile 2007, 15:26
Sono i difetti del dynamic typing in genere.
(PHP rulez comunque… ha la potenza del Perl e l’eleganza del C. Ormai anche gli script per automatizzare Windows o Linux li scrivo in PHP.)
11 Aprile 2007, 21:48
vb: oh beh, fosse l’unica stupidaggine di prim’ordine di PHP :)
blindwolf: per il caso specifico riportato da vb direi piuttosto che è un difetto dovuto alla stupidità del sistema di conversione dinamica tra tipi adottato da PHP, comunque in generale più che di caratteristica della tipizzazione dinamica parlerei di caratteristica della tipizzazione debole (php è dynamic e weak typed), tanto è vero che altri linguaggi a tipizzazione dinamica come Python o Ruby non permettono magheggi di questo genere (in uno slancio di bontà li chiamerò così) proprio perchè, al contrario di PHP, sono a tipizzazione forte.
11 Aprile 2007, 21:57
Viva il dynamic typing di python ;)
11 Aprile 2007, 23:00
@NRK: yep, sulla tipizzazione dinamica/debole hai ragione. Comunque “it’s not a bug… it’s a feature!” :-) Gli ideatori di PHP evitendemente hanno implementato questa conversione allegra per semplificare la vita a chi maneggia stringhe numeriche (es: parametri GET/POST, probabilmente anche l’accesso alle tuple di un DB); purtroppo quando le cose sono troppo facili (ed il PHP è facile) è facile anche fare caxxate.
Comunque, quanti di noi sono impazziti in C/C++/PHP e simili a debuggare il seguente baco?
for(i=0;i
e nonostante la nostra vita sessuale possa essere migliore di quella di Rocco Siffredi questo frammento di codice ci permette di bullarci una sola volta (e vale anche per i vergini, boia faos!).
Noto comunque con piacere che finalmente in questo blog da nerd si ritorna a parlare di cose da nerd!
Nerd power!
12 Aprile 2007, 10:48
Sì sì è una feature non mettevo in dubbio questo, il mio discorso riguardava piuttosto l’implementazione di questa conversione che secondo me lascia un pò a desiderare in quanto a coerenza. Voglio dire, se “pippo” == 0 e 0 == false, perché false != “pippo”? :D
Che poi questo renda la vita più facile è indubbiamente vero, ma penso sia un’arma a doppio taglio se non si è perfettamente consapevoli di ciò che si sta facendo. Mi dirai: “ma per programmare bisogna essere consapevoli di ciò che si sta facendo”… beh, in un mondo ideale sì :)
PS: nerd a chi? :p
12 Aprile 2007, 15:20
Non è detto che “per programmare bisogna essere consapevoli di ciò che si sta facendo”. Ci sono linguaggi per esperti che richiedono consapevolezza (una sola lettera: C!) e linguaggi orientati ai non-programmatori (Basic…)
12 Aprile 2007, 21:10
Non e’ il linguaggio che fa il programmatore. Dove lavoro si fa in Java e in Visual Basic, ma i programmatori lavorano in un certo modo sia con l’uno che con l’altro, se invece la stoffa non ce l’hai un progetto di un certo spessore non riesci a gestirlo con nessun linguaggio, perche’ non gli dai la struttura giusta e alla fine per ogni modifica di un certo peso che devi fare inizi col copia incolla a raffica o a dover riscrivere interi pezzi di codice perche’ non andavano bene. Se ti capita questo, e’ meglio che cambi mestiere..
(cosa che in effetti non dovrebbe essere nemmeno cosi’ male, si torna a programmare per passatempo, a smanettare per curiosita’..)
13 Aprile 2007, 11:23
Ciao NRK, sei venuto anche tu a forumizzare il blog di VB? ne avrebbe decisamente bisogno.
FF
13 Aprile 2007, 12:44
BlindWolf: non ne faccio una questione di esperienza o di quantosòfficoiocheprogrammoinC, sono semplicemente convinto che la maggior semplicità di PHP non debba illudere l’utilizzatore portandolo a dare per scontati più dettagli del dovuto proprio perché PHP stesso ha in realtà eccezioni o comportamenti strani piuttosto subdoli che possono fregarti in qualsiasi momento. L’origine del problema non è tanto di chi lo utilizza (oddio magari sì se il programmatore di turno intende sviluppare qualcosa di un certo spessore o livello, ma mica tutti hanno certe pretese), quanto dell’implementazione di PHP che per certi versi ne ha dentro di cotte e di crude.
Lobo: sì sì, anzi per forumizzarlo meglio se potessi metterei quelle belle signature con immagini da 400KB l’una e lunghe 1KM :p
13 Aprile 2007, 13:45
Fantastico! Devo fare più spesso post da nerd, funzionano un casino!
13 Aprile 2007, 15:57
@vb: quelli sul Lidl funzionano ancora di più
@NRK: ogni linguaggio ha le sue depravazioni (ed il C lo dichiara esplicitamente…). Lo Shuttle Challenger è esploso anche per colpa di una depravazione sintattica del Fortran.
14 Aprile 2007, 02:43
Il primo Ariane5 si era autodistrutto per un qui-pro-quo su una funzione Ada (ma li’ non era propriamente colpa del linguaggio, anche se un supporto per NaN avrebbe fatto risparmiare un tot di soldi…).
14 Aprile 2007, 17:26
E’ l’effetto Punto Informatico: i suoi forum sono frequentatissimi e anche la minima notizia tecnica d i tre righe scatena torme di nerd. Purtroppo la maggior parte sono nerd flammeggianti che non hanno mai superato la fase “Mio Vs. Tuo”, e quindi le discussioni degenerano quasi tutte, ma si sa: nessuno e’ perfetto.
14 Aprile 2007, 19:04
@simonecaldana: in effetti Ada ha la fama di essere molto robusto. Ma nel caso dell’Ariane5 un integer era andato in overflow…
@MCP: è per questo che io ho preso le seguenti precauzioni relativamente a Punto Informatico (che leggo tutti i giorni e lo reputo ben fatto):
1) elaboro il feed con uno script PHP in modo di avere tutta la notizia (nella versione stapabile) nel feed, anzichè solo l’intestazione
2) se accedo al sito tramite Firefox ho lo script GreaseMonkey che mi rimuove la tabellina “le ultime dal forum”.
In questo modo evito di leggere i deliri di troppi trolloni.
BTW, ci sono in Italia 2 siti che se la danno ancora di santa ragione sull’argomento “è meglio lo Spectrum o il Commodore 64?”.
15 Aprile 2007, 12:34
Decisamente il C64.
15 Aprile 2007, 17:33
@Blindwolf: no, una funzione restituiva un valore numerico oppure -1 in caso di errore. Il chiamante non controllava la condizione di errore e usava -1 (ma unsigned, quindi MAXINT/2) in elaborazioni successive.
Il risultato ha fatto scattare gli allarmi di integrita’ sul primo computer. L’unita’ di controllo lo ha messo offline e ha rifatto l’elaborazione sul secondo computer. Essendo l’errore deterministico ed essendo terminati i computer l’unita’ di controllo ha autodistrutto il prototipo del piu’ moderno grande vettore esistente.
La storia e una analisi dal punto di vista tecnio e progettuale del problema e’ stata pubblicata su un vecchio numero di Computer Programming. Quell’articolo valeva piu’ di un corso di ingegneria informatica.