Differenze architettoniche tra linguaggi dinamici e statici


22

Ci sono differenze architettoniche importanti nella progettazione di applicazioni che saranno costruite su linguaggi statici (come C # o Java) e linguaggi dinamici (come Ruby o Python)?

Quali sono le possibilità di progettazione che potrebbero essere una buona scelta per un tipo che è una cattiva per l'altro? Ci sono funzioni utili ottenibili con un tipo che non è con l'altro (nel design e nell'architettura, ovviamente)?

Inoltre, ci sono modelli di progettazione specifici per la dinamica?


1
Qualunque siano le differenze architettoniche, i linguaggi dinamici - IronRuby e IronPython - completano facilmente i linguaggi statici di .Net.
Estratto

3
Non ne sono certo, ma se la metaprogrammazione è più facile nei linguaggi dinamici (sicuramente sembrava più facile in Ruby che in Java, l'ultima volta che ho guardato), ciò potrebbe influenzare le decisioni architetturali. Non sono sicuro di che tipo di influenza, perché non ho mai lavorato su qualcosa di così grande in questi linguaggi dinamici.
FrustratedWithFormsDesigner

Risposte:


14

Vediamo alcune cose direttamente:

  1. Gli script interattivi e i linguaggi statici non si escludono a vicenda. F # e Haskell hanno entrambi interfacce REPL.
  2. I linguaggi dinamici e le alte prestazioni non si escludono a vicenda, anche se alcune ottimizzazioni lo sono. Al giorno d'oggi JavaScript funziona abbastanza velocemente sulla maggior parte dei browser.
  3. Anche nei linguaggi dinamici, devi ancora documentare, ricordare e pensare ai tipi.
  4. A causa della crescente popolarità dell'inferenza dei tipi, molti linguaggi statici non devono più notarli molto spesso. In linguaggi statici con una forte deduzione del tipo, il compilatore capisce quali sono i tipi dal tuo codice in modo che il più delle volte e ti dice se fai mai qualcosa che viola le definizioni dei tipi. Per quanto riguarda la sintassi, ciò fornisce il meglio di entrambi i mondi.
  5. OOP e linguaggi dinamici non si escludono a vicenda. PHP ora supporta le classi e persino l'ereditarietà.

A parte queste sorprendenti somiglianze, ci sono alcune differenze pratiche che influenzano il processo di sviluppo:

  1. I linguaggi dinamici consentono modi interessanti per trasferire i dati nel piccolo .
  2. I linguaggi statici consentono di ridurre la quantità di test da eseguire rendendo impossibili molti tipi di bug.
  3. Allo stesso modo, i linguaggi statici consentono interessanti funzionalità di validazione e conversione automatica, come le unità di misura in F # .
  4. Prese all'estremo, i linguaggi statici consentono contratti di codice e verifica formale, che possono documentare e appianare prevenire cose come potenziali divisioni per zeri, cicli infiniti, riferimenti null, dimensioni o indici di elenco non validi, errori di intervallo e altri stati logicamente non validi che potresti definire.
  5. Portando questo estremo ancora di più, le ottimizzazioni della CPU possono essere fatte sulla base di questi vincoli statici, che producono prestazioni ancora migliori.

Esiste anche un tipo di programma che non avrebbe mai potuto essere realizzato senza la tipizzazione statica: Singularity , un sistema operativo senza limiti di processo hardware. È scritto in una piccola quantità di C, un po 'di C # e un dialetto di C # chiamato Spec #, che supporta i contratti di codice.

Nonostante sia scritto in un linguaggio spazzatura, le prestazioni di comunicazione multitasking e tra processi su questo sistema operativo sono in realtà migliori di qualsiasi altra cosa là fuori, a causa del fatto che tutti i processi vengono eseguiti in uno spazio di memoria e grazie alle ottimizzazioni formali di verifica I sopra menzionato. Non è possibile farlo senza la digitazione statica, perché affinché i programmi non possano compromettere il resto del sistema, gli oggetti di comunicazione devono essere verificabili staticamente.

La maggior parte delle volte, tuttavia, le architetture dovrebbero essere molto simili. I linguaggi statici possono rendere più facile ragionare sui programmi in molti casi perché i tipi sono ben definiti, ma un programma di linguaggio dinamico ben scritto avrebbe anche tipi che sono, almeno, ben definiti nella mente degli sviluppatori.


Singularity può fornire la massima garanzia di latenza in tempo reale?
Eonil,

@Eonil Non proprio il mio campo, ma penso che mi stai chiedendo se può fare duro in tempo reale. Non credo, dal momento che utilizza la raccolta dei rifiuti ovunque. Per quanto ne so, la singolarità non è stata aggiornata da un po ', ma forse qualcuno ha realizzato qualcosa di simile con un garbage collector in tempo reale.
Rei Miyasaka,

Grazie. Volevo solo controllare. Ho sentito che ci sono alcune implementazioni GC in tempo reale, ma non ho sentito come vengono utilizzate praticamente nel settore ...
Eonil

2

C'è una differenza architettonica significativa. Prestazione.

A seconda del budget dell'hardware, del carico di lavoro previsto e degli accordi sul livello di servizio, potrebbe non essere possibile soddisfare i requisiti con un linguaggio dinamico.

Molto spesso la velocità di sviluppo e la flessibilità fornite dai linguaggi dinamici compensano i tempi di risposta più lenti a un maggiore consumo di CPU e memoria. Ma per i sistemi più grandi con limiti di budget o prestazioni, i costi generali di un linguaggio dinamico possono essere elevati.


1

Non ho mai pensato in questo senso. Quindi, quando ha fatto un Google, il blog di Peter Norvig è stato uno dei maggiori successi. Dice che alcuni modelli di progettazione sono più facili da implementare nei linguaggi dinamici rispetto ai linguaggi orientati agli oggetti tradizionali come il C ++. Penso che dovrebbero esserci differenze anche nel design / nell'architettura, poiché osserva che l'implementazione è più semplice nei linguaggi dinamici. Cercherò di aggiungere altro alla risposta mentre studio ulteriormente.


1

Ci sono differenze architettoniche importanti nella progettazione di applicazioni che saranno costruite su linguaggi statici (come C # o Java) e linguaggi dinamici (come Ruby o Python)?

No.

È leggermente più semplice scrivere quadri fantasiosi per linguaggi dinamici. Ma non è un'applicazione.

Quali sono le possibilità di progettazione che potrebbero essere una buona scelta per un tipo che è una cattiva per l'altro?

Nessuno, davvero.

Puoi scrivere cose buone in entrambe le lingue.

Ci sono funzioni utili ottenibili con un tipo che non è con l'altro (nel design e nell'architettura, ovviamente)?

No.

La differenza è che i linguaggi dinamici sono "scrivi, esegui, correggi". Puoi sperimentare e risolvere rapidamente.

I linguaggi statici sono "scrivere, compilare, compilare, eseguire, correggere". Non puoi sperimentare così facilmente.

Oltre a ciò, sono quasi identici nelle loro capacità.

Esistono modelli di progettazione specifici per la dinamica?

Può essere. Il Python eval()e le execfile()funzioni - in un certo senso - evidenziano una funzione di linguaggio dinamico che è difficile (ma tutt'altro che impossibile) da gestire in un linguaggio statico. Sarebbe molto più righe di codice per compilare ed eseguire il codice nello stesso spazio di processo.

Non è specifico per il linguaggio dinamico. È più semplice


2
"Non puoi sperimentare così facilmente." - Vero, il compromesso è che il compilatore ti aiuta a trovare gli errori mentre con le lingue interpretate potresti non trovare un errore fino a quando un utente non esegue quella riga di codice.
Doug T.

4
@Doug T .: "il compilatore ti aiuta a trovare gli errori". A volte. Non abbastanza spesso. Gli errori interessanti non possono essere trovati da un compilatore. Ecco a cosa serve il test unitario.
S.Lott

2
@ S.Lott Trovo che le API scritte in linguaggi dinamici richiedano un po 'più di documentazione. In un linguaggio statico, la firma del metodo indica quali tipi di argomenti sono richiesti. In un linguaggio dinamico, non puoi dirlo con facilità: la documentazione dell'API deve dirti quali oggetti sono previsti.
quantico

1
@quanticle: non è proprio architettonico, vero?
S.Lott

2
"Non puoi sperimentare così facilmente." - F # e Haskell sono entrambi linguaggi statici e hanno REPL a tutti gli effetti, e raramente ti chiedono un identificatore o il tipo di espressione.
Rei Miyasaka,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.