Le lingue statiche e dinamicamente tipizzate possono essere viste come strumenti diversi per diversi tipi di lavori?

9

Sì, sono state poste domande simili, ma sempre allo scopo di scoprire "qual è il migliore"

Te lo chiedo perché sono venuto come sviluppatore principalmente in JavaScript e in realtà non ho alcuna esperienza in materia di scrittura in lingue tipizzate staticamente.

Nonostante ciò, vedo sicuramente un valore nell'apprendimento di C per gestire operazioni impegnative a livelli inferiori di codice (che presumo abbia molto a che fare con static vs dynamic a livello di compilatore), ma quello che sto cercando di avvolgere la mia testa è se ci sono specifici contesti di progetto (magari certi tipi di operazioni dinamiche ad alta intensità di dati?) che coinvolgono cose diverse dalle prestazioni, dove ha molto più senso andare con Java o C # rispetto a qualcosa come Python.

    
posta Erik Reppen 11.08.2011 - 18:52
fonte

5 risposte

10

Sì, sicuramente.
La digitazione dinamica ha vantaggi definiti nei casi in cui si desidera essere in grado di trattare tutto come un singolo tipo. La serializzazione / deserializzazione è uno degli esempi classici. Questo è il motivo per cui una tale programmazione Web viene eseguita in linguaggi di scripting con tipi dinamici: sono adatti per un'attività che richiede un sacco di conversione di tutti i tipi di dati da e verso le stringhe.

Per la programmazione delle applicazioni, d'altra parte, i linguaggi statici funzionano molto meglio perché provare a trattare tutto come un singolo tipo è non spesso un requisito. Spesso si desidera disporre di strutture dati efficienti con i dati rappresentati come se stessi e senza essere convertiti molto spesso in altri tipi. Ciò rende le funzionalità di digitazione dinamica un inconveniente invece di un vantaggio, motivo per cui le applicazioni vengono quasi esclusivamente scritte in lingue tipizzate staticamente.

    
risposta data 11.08.2011 - 22:32
fonte
4

Il modo in cui lo guardo è, se puoi lavorare in modo naturale all'interno di un linguaggio tipizzato staticamente, quindi la tipizzazione statica è la strada da percorrere. In generale, lo scopo di un sistema di tipi è di impedire all'utente di eseguire operazioni con semantica indefinita, come (string) "hello" + (bool) true . Avere il livello extra di sicurezza che ti impedisce di eseguire queste operazioni può essere un buon modo per prevenire i bug nel tuo codice, anche senza test di unità estesi. Cioè, la sicurezza del tipo fornisce un altro livello di sicurezza nella correttezza semantica del tuo codice.

Ma i sistemi di tipo sono molto difficili da ottenere. Non credo che sia un sistema di tipo perfetto in natura al momento della stesura di questo articolo. (Per "sistema di tipo perfetto", intendo un sistema di tipo rigoroso, che non richiede annotazioni di codice verbose, che non genera errori di tipo falso-positivi e il cui errore di tipo è facile da capire per il programmatore.) Inoltre, può essere difficile capire i sistemi di tipo veramente buoni che esistono. Quando stavo imparando Haskell, non posso dirvi il numero di errori di tipo oscuro che ho avuto durante il tentativo di scrivere quello che sembrava (a me) come il codice corretto. Di solito il codice non era effettivamente corretto (che è un punto a favore del sistema di tipi), ma ci sono voluti un lotto di lavoro per capire i messaggi di errore del compilatore, in modo da poter correggere il problemi sottostanti. Nei linguaggi OO, potresti eventualmente trovarti a pensare "questo argomento dovrebbe essere controvariante con il tipo di input, non covariante!", O (più probabilmente) tornare alle tipografie per scappare dai limiti del sistema di tipi. I sistemi di tipo possono diventare molto più complicati di quanto si pensi.

Per quello che vale, è a mia conoscenza che la difficoltà nel trovare buoni sistemi di tipo fa parte di ciò che è motivato Gilad Bracha a includere il supporto del sistema di tipi innestabile in Newspeak.

    
risposta data 11.08.2011 - 23:33
fonte
4

Sono diversi strumenti, ma non sono le prestazioni. Si tratta di complessità .

Le lingue dinamiche di solito puntano alla massima flessibilità e portano mancanza di convalida e una sorta di garanzia. Quindi, è molto potente nei programmi su piccola scala, ma diventa quasi impossibile mantenere programmi su larga scala (complessità).

Le lingue statiche di solito puntano alla massima validazione. Il loro primo obiettivo è di solito catturare errori (o bug) il prima possibile. Molte garanzie sono fatte per la convalida. Quindi è più difficile imparare e iniziare, ma man mano che i programmi aumentano, fornisce una migliore convalida del programma con costi molto inferiori (sforzi di codifica).

Di conseguenza, i linguaggi dinamici di solito si adattano a programmi piccoli (intendo molto piccoli) come pagine web dinamiche, browser Web DSL (non per applicazioni browser!) o script di shell. I linguaggi statici si adattano meglio alle programmazioni di sistema o qualsiasi altro materiale.

Le descrizioni di cui sopra sono qualcosa su linguaggi puramente dinamici o statici. La maggior parte delle lingue della vita reale si trova tra di loro e mostra varie caratteristiche.

Vedi qui per maggiori dettagli: link

    
risposta data 04.05.2014 - 02:57
fonte
1

Attualmente programmo in linguaggi di tipo statico (C # e F #), ma mi piace programmare in linguaggi dinamici (Smalltalk, Ruby). Ci sono un sacco di vantaggi e svantaggi che le persone associano con un tipo a un altro che riguardano più la lingua rispetto a quando imponi i tipi. Ad esempio, le lingue dinamiche di solito hanno una sintassi più pulita e sintetica, tuttavia F # e OCaml con il loro sistema di inferenza di tipo hanno una sintassi pulita come qualsiasi linguaggio dinamico. E con la tipizzazione statica, si hanno veri e propri refactoring automatici e completamento automatico, ma Smalltalk, con il suo intero codice sorgente in un database e ogni metodo compilato separatamente, è stato il primo a disporre di seri refactoring automatici e ha funzionato alla grande. In definitiva, i moderni linguaggi dinamici e statici oggi sono di tipo sicuro, che è l'aspetto più importante del tuo sistema di tipi, e il test automatico per la correttezza viene eseguito dal test delle unità, che eseguirai in entrambi i tipi di linguaggi.

    
risposta data 11.08.2011 - 20:19
fonte
-1

È ora il 2015, che aggiunge alcuni frammenti interessanti alla conversazione:

  1. Parti significative del mondo backend aziendale stanno prendendo in considerazione o stanno iniziando a usare Python (dinamico) al posto di Java (strict static)
  2. Il mondo aziendale frontend sta vedendo cose come AngularJS v2, basato su TypeScipt: un'estensione tipizzata di Javascript.

Quindi i backend sono stanchi della inutile straight-jacket di una tipizzazione rigorosa, mentre i frontend sono stanchi del caos della digitazione dinamica.

Abbastanza ironico: mi chiedo se si incontreranno nel mezzo, o si affretteranno a vicenda con il boom sonico di una scadenza che passa sopra ...? ;)

    
risposta data 09.07.2015 - 09:15
fonte

Leggi altre domande sui tag