Differenze architettoniche tra linguaggi dinamici e statici

22

Ci sono delle principali differenze architettoniche quando progettiamo 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 è negativo per l'altro? Ci sono caratteristiche utili ottenibili con un tipo che non è con l'altro (ovviamente nel design e nell'architettura)?

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

    
posta Raphael 01.09.2011 - 23:31
fonte

4 risposte

14

Raccogliamo alcune cose:

  1. Lo scripting interattivo e i linguaggi statici non si escludono a vicenda. F # e Haskell hanno entrambe le interfacce REPL.
  2. I linguaggi dinamici e le prestazioni elevate non si escludono a vicenda, anche se alcune ottimizzazioni lo sono. JavaScript funziona abbastanza velocemente sulla maggior parte dei browser al giorno d'oggi.
  3. Anche nei linguaggi dinamici, devi ancora documentare, ricordare e pensare ai tipi.
  4. A causa della crescente popolarità dell'inferenza di tipo, molti linguaggi statici non devono più notificare i tipi molto spesso. Nei linguaggi statici con una strong inferenza di tipo, il compilatore capisce quali sono i tipi dal tuo codice in modo tale che la maggior parte delle volte e ti dice se fai qualcosa che viola le definizioni del tipo. Per quanto riguarda la sintassi, questo offre 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 interessanti modi per trasmettere dati attorno a nel piccolo .
  2. I linguaggi statici ti consentono di ridurre la quantità di test che devi fare rendendo impossibile l'insorgere di molti tipi di bug.
  3. In questa stessa ottica, i linguaggi statici consentono interessanti funzioni di convalida e conversione automatica, come unità di misura in F # .
  4. Portati all'estremo, i linguaggi statici consentono contratti di codice e verifica formale, che possono documentare e disattivare impedire cose come potenziali divari per zero, loop infiniti, riferimenti null, dimensioni elenco non valide o indici, errori di intervallo e altri stati logicamente non validi che potresti definire.
  5. Prendendo questo estremo ancora più lontano, 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 mai è stato creato senza digitare staticamente: Singolarità , un sistema operativo senza limiti di processo hardware. È scritto in una piccola quantità di C, alcuni C # e un dialetto di C # chiamato Spec #, che supporta i contratti di codice.

Nonostante siano scritti in un linguaggio raccolto, le prestazioni di comunicazione multitasking e interprocesso su questo sistema operativo sono in effetti migliori di qualsiasi altra cosa, dato che tutti i processi vengono eseguiti in una memoria spazio, e grazie alle ottimizzazioni di verifica formali che ho menzionato sopra. Non è possibile farlo senza la digitazione statica, perché affinché i programmi non siano in grado di compromettere il resto del sistema, gli oggetti di comunicazione devono essere staticamente verificabili.

La maggior parte delle volte, però, le architetture dovrebbero apparire molto simili. I linguaggi statici possono rendere i programmi più facili da ragionare in molti casi, perché i tipi sono ben definiti, ma un programma di linguaggio dinamico ben scritto avrebbe anche dei tipi che sono, per lo meno, ben definiti nelle menti degli sviluppatori. / p>     

risposta data 02.09.2011 - 07:00
fonte
2

C'è una differenza architettonica significativa. Prestazioni.

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 flessibilità fornita dai linguaggi dinamici compensa i tempi di risposta più lenti con una maggiore consumo di CPU e memoria. Ma per i sistemi più grandi con limiti di budget o di prestazioni, i costi generali di un linguaggio dinamico possono essere elevati.

    
risposta data 02.09.2011 - 06:12
fonte
1

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

    
risposta data 02.09.2011 - 01:14
fonte
1

Are there any major architectural differences when designing applications that will be built on static languages (such as C# or Java) and dynamic languages (such as Ruby or Python)?

No.

È leggermente più facile scrivere quadri fantasiosi per le lingue dinamiche. Ma questa non è una cosa da applicare.

Which are the design possibilities that might be a good choice for one type that's a bad one for the other?

Nessuno, davvero.

Puoi scrivere cose buone in entrambi i linguaggi gentili.

Are there any useful features achievable with one type that's not with the other (in design and architecture, of course)?

No.

La differenza è che i linguaggi dinamici sono "write, run, fix". Puoi sperimentare e risolvere rapidamente.

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

Oltre a questo, sono quasi identici nelle loro capacità.

Are there any dynamic-specific design patterns?

Forse. Le funzioni Python eval() e execfile() - in un certo senso - puntano su una funzione di linguaggio dinamico che è difficile (ma tutt'altro che impossibile) gestire in un linguaggio statico. Sarebbe molto più linee di codice per compilare ed eseguire codice nello stesso spazio di processo.

Non è specifico per la lingua dinamica. È solo più semplice.

    
risposta data 02.09.2011 - 03:27
fonte

Leggi altre domande sui tag