2010-03-11 15 views
5

Con Java su un lato e Ruby/Groovy sull'altro, so che nel secondo campo sono libero di fare errori di battitura che non verranno scoperti prima dell'ora di esecuzione. È vero per tutte le lingue tipizzate dinamicamente?Tutte le lingue dinamiche sono tipografiche?

Modifica: Mi è stato chiesto di approfondire il tipo di errore di battitura. In Ruby e in Groovy, è possibile assegnare a una variabile con un nome accidentale che non viene mai letto. Puoi chiamare metodi che non esistono (ovviamente i tuoi test dovrebbero prenderlo, è stato detto). Puoi fare riferimento a classi che non esistono, ecc. Ecc. Fondamentalmente qualsiasi sintassi valida, anche con errori tipografici, è valida sia in Ruby che in Groovy.

+1

Si consiglia di elaborare su che tipo di errore di battitura, in particolare dove si verifica. – NomeN

+2

Intendevi - fino al tempo di esecuzione? –

+6

Sembra che tu consideri "amichevole" come "non si lamenta quando faccio un refuso finché non è necessario eseguirlo". Penserei che la definizione opposta sia migliore. Un interprete "amichevole" è uno che analizza il codice e cerca errori di battitura e mi dà un errore prima dell'esecuzione effettiva. – shoosh

risposta

3

In Perl, se si dichiara use strict nel codice, è necessario dichiarare le variabili con my. Gli errori di battitura nei nomi delle variabili verranno catturati in fase di compilazione. Questa è una delle cose più grandi che mi manca durante la codifica in Python.

+0

A proposito, penso ' use strict' rende l'usabilità di Perl molto meglio di quanto non sia altrimenti. :) –

+0

La cosa più strana di tutto questo è, non c'era un'opzione per farlo in QuickBasic o forse i primi Visual Basic? Insisti a voler usare i tipi? –

+0

@yar: Non insisti sull'uso dei tipi. Stai insistendo sull'uso della dichiarazione delle variabili. Il tipo di variabile non ha nulla a che fare con il tuo nome. Fortran è un linguaggio fortemente tipizzato che consente di evitare la dichiarazione delle variabili. Hai bisogno di 'IMPLICIT NONE' in alto, proprio come' use strict' di Perl. Se non usi "IMPLICIT NESSUNO", puoi fare errori di battitura con i nomi delle variabili con la stessa facilità con cui sono in una lingua dinamica. –

2

Per la maggior parte, sì. La digitazione dinamica e la non richiesta di dichiarazione delle variabili sono proprietà linguistiche che si trovano spesso insieme.

Tuttavia, questi non sono inerentemente correlati. Una lingua può facilmente avere una digitazione dinamica mentre richiede che i nomi delle variabili vengano dichiarati prima dell'uso. Come cita ire_and_curses, questo può essere ottenuto in Perl tramite la direttiva "use strict".

+2

Anche l'altro modo avviene - L'obiettivo C è dinamico: i nomi dei metodi, ma le regole di dichiarazione delle variabili sono quelle di C. –

+0

Ottima risposta. Penso che sia vero per altre cose, e non solo per le dichiarazioni variabili. La mia domanda è, oltre a SmallTalk, qual è il più grande generatore di regole dinamiche? Scala? –

+0

Non sono un programmatore di Scala ma la mia comprensione è che Scala non è un linguaggio dinamico dalla maggior parte delle definizioni. –

2

Ecco cosa succede quando provo a entrare nelle insidie ​​che hai menzionato in Squeak e Dolphin, due implementazioni del linguaggio dinamico Smalltalk 80.

È possibile assegnare ad una variabile con un nome casuale che non è mai leggere

Il linguaggio Smalltalk richiede variabili TEMP e istanze da dichiarare. Se provo a compilare un metodo contenente una variabile non definita, ottengo un errore in fase di compilazione.

| anArray | 
anArrray := Array with: 2 with: 1. "Unknown variable anArrray" 

creazione di variabili dinamicamente non è qualcosa linguaggi dinamici devono consentire. C'è una differenza tra dichiarazioni senza tipo e nessuna dichiarazione.


È possibile chiamare i metodi che non esistono

La questione compilatore un avviso se si utilizza un selettore (metodo vale a dire nome), che è del tutto sconosciuta.

Il compilatore non si preoccuperà se chiamo il metodo paint su un array perché c'è un'altra classe nel sistema che implementa paint. Questo errore verrà rilevato solo in fase di esecuzione.

Se tuttavia chiamo il metodo sortt (mentre intendo chiamare sort) il compilatore genera un avviso. Durante lo sviluppo dall'alto verso il basso è possibile procedere con questi avvertimenti.

| anArray | 
anArray := Array with: 2 with: 1. 
anArray paint. "Runtime error. You can't paint an array but perhaps a Shape" 
anArray sortt. "Compile-time warning" 

È possibile fare riferimento a classi che non esiste

Questo non è consentito. Anche se in Squeak puoi creare rapidamente una nuova classe dalla finestra di dialogo degli errori, se necessario.

+0

Affascinante. Non so se Smalltalk stia guadagnando popolarità, ma ne sento parlare su tutte le mie domande in lingua dinamica :) –

3

Python è typo-friendly come descritto nella domanda.

Ma questo non significa che questi 'errori di battitura' possono solo essere catturati @ runtime. Quando si utilizza un analizzatore di codice come pylint (idealmente integrato nell'ambiente di sviluppo), si otterrà 'la maggior parte' di questi in modo coerente prima di premendo 'Esegui'.

+0

Davvero? È pulito, non lo sapevo. In Ruby non c'è niente del genere, penso. Netbeans cattura alcune cose, ma si confonde abbastanza rapidamente –

+0

Alcuni strumenti esistono in base a questa domanda (http://stackoverflow.com/questions/286564/can-anyone-recommend-a-ruby-source-code-analyzer-something -come-pylint) anche se nessuno degli strumenti menzionati sembra pienamente completo come puntatore al momento. – ChristopheD

Problemi correlati