2010-07-31 13 views
15

Sono un grande fan di PHP ed è ovviamente un linguaggio tipicamente debolmente scritto. Mi rendo conto che alcuni dei vantaggi includono l'indipendenza generale di cambiare i tipi di variabili al volo e così via.Quali sono i vantaggi (e gli svantaggi) di un linguaggio tipizzato debolmente?

Quello che mi sto chiedendo sono gli svantaggi. Cosa si può ottenere da un linguaggio fortemente tipizzato come C che altrimenti non si può ottenere da un tipo tipizzato debole come PHP? Anche con l'impostazione del tipo (come double ($ variabile)), si potrebbe sostenere che anche un linguaggio tipizzato debole può agire come un tipo fortemente tipizzato.

Così. Debole-tipo. Quali sono alcuni benefici che non ho incluso? Ancora più importante, quali sono gli svantaggi?

+3

Cosa intendi per digitazione "forte" e "debole"? Statico e dinamico? Nomi di tipo espliciti o impliciti? Casting esplicito vs implicito? Casting sicuro e non sicuro? – dan04

+3

C è debolmente digitato. –

+0

Com'è C 'fortemente tipizzato'? – chimeracoder

risposta

9

Il citato vantaggio di statica digitazione è che ci sono intere classi di errori catturati in fase di compilazione, che non possono raggiungere il runtime. Ad esempio, se hai una classe o un'interfaccia tipicamente tipizzata come parametro di funzione, allora stai dannatamente bene non passare inavvertitamente un oggetto del tipo sbagliato (senza un cast esplicito e non corretto, cioè).

Naturalmente, questo non impedisce di passare nell'oggetto sbagliato del tipo giusto o un'implementazione di un'interfaccia in cui le hai dato le giuste funzioni ma fanno le cose sbagliate. Inoltre, se hai una copertura del 100% del codice, dì la gente PHP/Python/etc, a chi importa se riscontri l'errore al momento della compilazione o in fase di esecuzione?

Personalmente, ho avuto momenti divertenti in lingue con digitazione statica e tempi divertenti in lingue senza. Raramente è il problema decisivo, dal momento che non ho mai dovuto scegliere tra due lingue identiche a parte il tipo di digitazione e di solito ci sono cose più importanti di cui preoccuparsi. Trovo che quando uso linguaggi tipizzati staticamente mi "appoggi al compilatore" deliberatamente, cercando di scrivere codice in modo tale che se è sbagliato, non verrà compilato. Ad esempio, ci sono alcuni refactoring che puoi eseguire apportando una modifica in un punto, e quindi correggendo tutti gli errori di compilazione che risultano, ripetere fino a compilazione pulita. Fare la stessa cosa eseguendo una suite di test completa diverse volte potrebbe non essere molto pratico.Ma non è raro che gli IDE automatizzino gli stessi refact in altre lingue o che i test vengano completati rapidamente, quindi è una questione di cosa è conveniente, non di ciò che è possibile.

Le persone che hanno una preoccupazione legittima oltre la convenienza e la preferenza di stile di codifica sono quelle che lavorano su prove formali della correttezza del codice. La mia impressione ignorante è che la deduzione di tipo statico può fare la maggior parte (ma non tutte) del lavoro che esegue la tipizzazione statica esplicita e consente di risparmiare considerevole usura sulla tastiera. Quindi, se la digitazione statica obbliga le persone a scrivere codice in un modo che faciliti la dimostrazione, quindi potrebbe esserci qualcosa da quel POV. Dico "se": non lo so, e non è come se molte persone provassero comunque il loro codice tipizzato staticamente.

cambiare i tipi di variabili al volo e tale

Penso che sia di dubbia utilità. E 'sempre così forte la tentazione di fare qualcosa di simile (Python/Django):

user = request.GET['username'] 
# do something with the string variable, "user" 
user = get_object_or_404(User,user) 
# do something with the User object variable, "user" 

Ma in realtà, dovrebbe lo stesso nome utilizzato per cose diverse all'interno di una funzione? Può essere. Probabilmente no. "Ri-usare", per esempio, le variabili intere per altre cose in lingue tipizzate staticamente non sono nemmeno fortemente incoraggiate. Il desiderio di non dover pensare, nomi di variabili descrittive concisi, probabilmente il 95% del tempo non dovrebbe ignorare il desiderio di codice univoco ...

Btw, di solito debole digitazione significa che si verificano conversioni di tipo implicite, e strong digitando significa che non lo fanno. Con questa definizione, C è debolmente tipizzato per quanto riguarda i tipi aritmetici, quindi presumo che non sia quello che intendi. Penso che sia ampiamente considerato che la tipizzazione completa sia più un fastidio che un aiuto, e che "la digitazione completa" (qualsiasi cosa possa essere convertita a qualsiasi altra cosa) è priva di senso nella maggior parte delle lingue. Quindi la domanda è su quante e quali conversioni implicite possono essere tollerate prima che il codice diventi troppo difficile da capire. Vedi anche, in C++, la continua difficoltà nel decidere se implementare operatori di conversione e costruttori di un arg non espliciti.

+0

"Debole" e "Forte" è chiaramente un continuum, non una o/o proprosizione - dopo tutto, in C puoi assegnare un 'int' a' float', ma non puoi assegnare 'struct a' a' struct b' anche se quei tipi sono definiti in modo identico. – caf

+0

@caf: true, e proprio quello di cui stavo scrivendo mentre stavi commentando :-) –

1

Molti libri sono stati scritti su questo genere di cose. C'è un compromesso intrinseco; con un linguaggio tipizzato male un sacco di fastidi semplicemente cessano di essere. Ad esempio, in Python non ti devi preoccupare di dividere uno float con uno int; aggiungendo uno int a list; Argomenti delle funzioni di scrittura (lo sapevate, OCaml ha operatori speciali + per l'aggiunta di float s perché (+) invia int s a int s!); dimenticando che una variabile può essere nulla ... questi tipi di problemi semplicemente svaniscono.

Al loro posto arrivano un'intera serie di nuovi bug di runtime: Python's [0]*5 dà, aspetta, [0,0,0,0,0]! OCaml, per il fastidio di una forte digitazione, cattura molti bug con il suo compilatore; e questo è esattamente il motivo per cui è buono. È un compromesso.

+1

"Bug di runtime"? La ripetizione della sequenza anziché la mappatura per elemento è abbastanza ragionevole, coerente e prevista. Dopo tutto, cosa ti aspetteresti da "xyz" * 5'? –

+5

@Jon: dipende se l'aritmetica dei caratteri è valida nella tua lingua (in C è, sfortunatamente). La mappatura per elemento è * anche * abbastanza ragionevole e coerente laddove gli operatori hanno senso: in matematica siamo perfettamente felici che [0,1,2] * 2 sia [0,2,4], non [0,1, 2,0,1,2], no? Sarebbe un incubo se Mathematica definisse una moltiplicazione vettoriale scalare come la moltiplicazione scalare-scaletta Python. Non penso che nessuna delle due parti abbia il diritto di essere stupita dalle convenzioni dell'altra, devi solo imparare cosa significa "*" nella tua lingua. –

+0

>>> 1 + [] Traceback (chiamata più recente scorso): file "", linea 1, in TypeError: tipo di operando non supportato (s) per +: 'int' e 'list' –

0

Direttamente da wikipedia:

The advantage claimed of weak typing is that it requires less effort on the part of the programmer than strong typing, because the compiler or interpreter implicitly performs certain kinds of conversions. However, one claimed disadvantage is that weakly typed programming systems catch fewer errors at compile time and some of these might still remain after testing has been completed.

Questo è circa la stessa cosa che vorrei dire. Tuttavia, fai attenzione alla relativa ambiguità di questi termini ("tipizzazione forte" e "digitazione debole") poiché le conversioni implicite sfociano la linea.

Fonte: http://en.wikipedia.org/wiki/Weak_typing

+2

Sono completamente DISAGREE con "Il vantaggio dichiarato di una digitazione debole è che richiede meno sforzo da parte del programmatore rispetto alla tipizzazione forte, perché il compilatore o l'interprete esegue implicitamente determinati tipi di conversioni", invece, aggiunge molto più sforzo per gli sviluppatori di eseguire il debug dei problemi di tipizzazione STUPID ..... –

+0

@PeterLee: Punto giusto, forse l'ipotesi ottimistica è che il programmatore sia maturo e consapevole delle avvertenze comuni. Il tuo punteggio suona molto vero nelle impostazioni "Intro to CS" ma diventa meno rilevante man mano che lo sviluppatore migliora (se migliora). –

+1

Ho scoperto che quando faccio codice della lingua sempre più debole, il programmatore stesso sta diventando un compilatore, mentre dal mio punto di vista, gli sviluppatori/programmatori dovrebbero concentrarsi sulla logica di business, non su questi caveat tipografici, che dovrebbe essere catturato dagli strumenti (il vero compilatore sul tuo computer). L'altra parte è, grazie a tutti i framework che abbiamo, come JavaScript jQuery ....... –

2

Debole e Forte sono termini caricati. (Vuoi essere un programmatore linguistico debole?) Dinamico e statico sono migliori, ma immagino che la maggior parte delle persone preferirei essere un programmatore dinamico piuttosto che statico. Io chiamerei PHP un linguaggio promiscuo (Quello non è un termine forte;))

PHP:

garbage_out = garbage_in * 3; // garbage_in was not initialized yet 
"hello world" + 2; // does this make sense? 

Permettere variabili non inizializzate crea molto difficile trovare gli errori da errori ortografici. Anche le operazioni su tipi non correlati è quasi sempre un errore che dovrebbe essere segnalato. I linguaggi dinamici più interpretati non consentono queste cose per una buona ragione. È possibile avere una lingua digitata dinamicamente senza consentire la garbage.

+0

"questo ha senso" - sì lo capovolge, e ogni volta che Python ha lanciato un'eccezione perché ho scritto "ciao mondo" +2 ', Io * sempre sempre sempre * significato' "ciao mondo" + str (2) '. La mia teoria è che è un astuto trucco per convincere la gente a usare '%' (stringhe di formato), dato che può darti una conversione libera alla stringa. '" Ciao mondo% s "% 2' va bene. Se è stato un tale trucco, in pratica ha funzionato su di me ;-) –

+0

La prima riga non è un codice PHP valido. Ma anche supponendo che lo sia, PHP lancia un avvertimento su una variabile indefinita in faccia. Questo non dimostra nulla di debole o promiscuo o qualsiasi digitazione. Il secondo esempio è più legittimo, ma il caso d'uso è '$ a = '2'; $ b = $ a + 1; // $ b == 3'. Non è del tutto assurdo permettere '+' con le stringhe. – deceze

1

Vedi this table, che mostra i risultati dell'operatore PHP == applicata a coppie di valori principali vuoti o altri di vario tipo, quali 0, "0", NULL e "". L'operatore non è commutativo e il tavolo è piuttosto intuitivo, per usare un eufemismo. (Non che avrebbe molto senso chiedere se una stringa è uguale a un array, in tutta onestà - ma tu puoi fare in una lingua debolmente digitata, che è il trabocchetto, e Turing può aiutarti se la lingua prova per "aiutarti".)

+1

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. –

+0

@RostyslavDzinko: hai assolutamente ragione. Grazie per il suggerimento. – aib

-1

Devi capire che PHP è stato creato per il contesto delle applicazioni web.Tutto nel contesto del web è una stringa. Pertanto è molto raro che una forte tipizzazione sia vantaggiosa.

1

Ho utilizzato da un po 'di tempo sia le lingue scritte a caratteri forti (come Java) sia quelle scritte a caratteri deboli (come JavaScript). Quello che ho trovato è che la convenienza dei linguaggi tipizzati deboli è grande per le piccole applicazioni. Sfortunatamente, man mano che l'applicazione aumenta di dimensioni, diventa impossibile gestirla. Ci sono troppe cose da tenere a mente e devi iniziare a dipendere dal tuo IDE e dal compilatore sempre di più o la tua codifica si ferma. Questo è il momento in cui le forti lingue tipizzate iniziano a diventare più utili - con l'applicazione che diventa molto grande.

Due esempi che costantemente mi fanno impazzire nel debole JavaScript digitato utilizzano librerie esterne che non sono completamente documentate e refactoring.

Librerie esterne: quando si ha a che fare con un linguaggio fortemente tipizzato, il codice della libreria fornisce un'autodocumentazione. Quando creo una variabile di tipo Person, l'IDE può ispezionare il codice e dire che c'è un getFirstName(), getLastName() e getFullName(). Nei linguaggi tipizzati deboli, questo non è il caso in quanto una variabile può essere qualsiasi cosa, avere qualsiasi tipo di variabile o funzione e avere argomenti di funzione che potrebbero anche essere qualsiasi cosa (non sono definiti in modo esplicito). Di conseguenza, uno sviluppatore deve basarsi molto sulla documentazione, le ricerche sul web, i forum di discussione e la memoria dei precedenti usi. Trovo che possa richiedere ore di ricerca di cose in JavaScript per le librerie esterne mentre con Java ho appena colpito il "." chiave e visualizza tutte le mie opzioni con la documentazione allegata. Quando incontri librerie che non sono completamente documentate al 100%, può essere davvero frustrante con linguaggi tipizzati deboli. Recentemente mi sono ritrovato a chiedere "Qual è l'argomento 'trama' nella funzione 'disegnare'?" quando si utilizza jqplot, una libreria JavaScript abbastanza buona ma non completamente documentata. Ho dovuto trascorrere un'ora o due a scavare attraverso il codice sorgente prima di rinunciare e trovare una soluzione alternativa.

Refactoring: con linguaggi fortemente tipizzati, mi trovo in grado di refactoring rapidamente semplicemente cambiando il file che ho bisogno di cambiare e poi andando a correggere gli errori del compilatore. Alcuni strumenti possono anche essere rifattorici con un semplice clic di un pulsante. Con linguaggi tipizzati deboli, devi eseguire una ricerca e quindi sostituirla con cura, quindi testare, testare, TEST e poi testarne altri. Raramente si è completamente sicuri di aver trovato e risolto tutto ciò che si è rotto, soprattutto in applicazioni di grandi dimensioni.

Per esigenze semplici e piccole applicazioni, queste due preoccupazioni sono minime o inesistenti. Ma se stai lavorando con un'applicazione con centinaia di migliaia o milioni di linee di codice, le lingue tipizzate deboli ti faranno impazzire.

Penso che molti sviluppatori si arrabbino per questo e trasformarlo in una discussione emotiva è perché a volte ci viene in mente che esiste un approccio giusto e uno sbagliato. Ma ogni approccio ha i suoi meriti - i suoi vantaggi e svantaggi. Una volta che riconosci che hai messo da parte le emozioni e scegli il meglio per te per ciò di cui hai bisogno in questo momento.

Problemi correlati