Quando elabora il progetto per un nuovo sistema, è meglio iniziare con un linguaggio tipizzato staticamente (come Haskell) o con un linguaggio tipizzato dinamicamente (come Ruby)?
Argomenti a cui posso pensare:
-
Con un linguaggio statico, puoi creare rapidamente una specifica e uno scopo per ciò che farà il programma. Con un linguaggio dinamico, puoi creare rapidamente una demo funzionante da presentare al cliente per la revisione.
-
Con un linguaggio dinamico, eviti spesso di dover riorganizzare le strutture dati e il codice refactoring quando cambi il tuo design. Con un linguaggio statico, puoi definire i tipi prima dell'implementazione, mantenendo il codice da mantenere molto piccolo.
-
Con un linguaggio statico, devi capire in anticipo cosa farà il tuo programma. Con un linguaggio dinamico, puoi iniziare a scrivere codice e far crescere organicamente il design. Come dice Paul Graham in Hacker e pittori :
A programming language is for thinking of programs, not for expressing programs you've already thought of.
-
Con un linguaggio statico, il compilatore può aiutare a identificare molti tipi di bug. Con un linguaggio dinamico, puoi iniziare a testare e trovare i bug prima.
La tipizzazione statica e dinamica hanno entrambi vantaggi e svantaggi per quanto riguarda la prototipazione. Tuttavia, entrambi mi sembrano approcci altrettanto validi. In base alle tue esperienze, quale è in definitiva migliore?
Note
Prototipazione in linguaggio naturale
Un terzo tipo di linguaggio da considerare: linguaggio naturale. Invece di prototipare in codice, si può prototipare per iscritto. Il cliente può quindi leggere la documentazione e criticare il tuo progetto in anticipo, ma non può divertirsi con una demo funzionante. Se ben scritta, la documentazione può rendere l'implementazione in qualsiasi lingua semplice. Avvertenze:
-
La documentazione può essere noiosa da leggere e difficile da digerire senza essere in grado di vederla. Suppongo che un cliente preferisca sperimentare qualcosa che funziona piuttosto che leggere un muro di testo (e immagini).
-
La prototipazione di un'applicazione in inglese anziché nelle definizioni di tipo è più prolissa e meno concreta.
I tipi di Haskell sono descrittivi
Si noti che i tipi sono particolarmente descrittivi in Haskell, più che in molti linguaggi statici come C ++ e Java. Ad esempio, supponiamo di avere una funzione con questo tipo di firma in Haskell:
foo :: forall a. [a] -> a
Una funzione che, per qualsiasi tipo a
, prende un elenco di voci di tipo a
e restituisce un valore di tipo a
.
Anche senza conoscere il nome della funzione, so per certo che:
-
Non esegue input / output o modifica alcun valore (beh, a meno che non usi unsafePerformIO in modo errato), perché Haskell è puramente funzionale.
-
Non può trattare gli elementi come, per esempio, numeri interi, perché deve supportare qualsiasi tipo .
-
Ha ha per usare la lista di input (quella, o lanciare un'eccezione o entrare in un ciclo infinito). Altrimenti, dove otterrebbe un valore di tipo
a
da?
Pertanto, l'unica cosa che questa funzione potrebbe fare (oltre che fallire) è estrarre un elemento dall'elenco di input e restituirlo. Anche se non so ancora quale oggetto userà, [a] -> a
mi dice praticamente tutto il resto.