Usando un sistema di tipo "forte" nel mondo reale, diciamo, per le app Web su larga scala?


29

So che questa è una domanda molto ampia, ambigua e forse filosofica. In una certa misura, la parola chiave più importante nella domanda - sistema di tipo "forte" - stessa, è mal definita . Quindi, lasciami provare a spiegare cosa intendo.

Contesto generale della domanda

Abbiamo creato un'app Web su larga scala in Ruby on Rails e siamo stati generalmente contenti del nostro stack. Quando vogliamo, possiamo spedire roba molto velocemente - qualcosa che funziona per il 90% del caso "business", senza preoccuparci troppo del 10% dei casi limite. D'altra parte, con l'aiuto di revisioni del codice e copertura dei test, possiamo essere lenti e deliberati e assicurarci di coprire tutte le basi, ancora una volta, solo in situazioni che meritano un esame più attento e sicurezza.

Tuttavia, man mano che la squadra cresce, ho iniziato a sentirmi a disagio con la mancanza di una "rete di sicurezza" inserita nel nostro stack.

Di recente abbiamo iniziato a fare alcuni sviluppi nativi di Android su Java. E mi è stato (piacevolmente) ricordato la sicurezza fornita da un linguaggio compilato / statico / fortemente tipizzato.

  • Variabili errate, tipi di dati errati, invocazioni di funzioni errate e una miriade di errori insignificanti vengono rilevati dall'IDE stesso. Tutto perché l'IDE può agganciarsi al compilatore e verificare alcuni aspetti della "correttezza" del programma.
  • Devi cambiare la firma di una funzione? Facile. Il compilatore + IDE può aiutarti a individuare TUTTI i siti di chiamata.
  • Devi garantire che vengano gestite sempre determinate eccezioni? Eccezioni verificate per il tuo salvataggio.

Ora, mentre queste caratteristiche di sicurezza hanno i loro vantaggi, sono ben consapevole anche dei loro svantaggi. Più ancora, nel mondo di Java "plateplate heavy". Pertanto, invece di Java, ho iniziato a esaminare la serie di linguaggi moderni, "fortemente tipizzati" su cui le persone hanno iniziato a lavorare in questi giorni. Ad esempio: Scala, Rust, Haskell, ecc. Quello che mi interessa di più è la potenza dei loro sistemi di tipi e controlli statici / di compilazione.

Ora, la domanda

Come posso usare questi potenti sistemi di tipo e le funzionalità statiche / di compilazione in applicazioni più grandi?

Ad esempio, come potrei andare oltre il tipo standard di "ciao mondo" di introduzioni a queste potenti funzionalità? Uno che utilizza un sistema di tipo avanzato per modellare un problema di dominio aziendale? Il sistema di tipi aiuta o ostacola quando ci si trova nella zona 30.000 LOC +? Cosa succede alla rete di sicurezza fornita da questi sistemi di tipo (e controlli in fase di compilazione) quando il sistema interagisce con il mondo esterno debolmente tipizzato, ad es. tramite API JSON o XML, vari archivi di dati, input dell'utente, ecc.


12
Questo è fuori tema perché non c'è una vera risposta. La domanda ha lo scopo di provocare una discussione supponente ("Mi piace / non mi piacciono i tipi statici perché ..."), non una spiegazione fattuale . Il mio consiglio sarebbe di scegliere una delle parti più specifiche della tua domanda come "Cosa succede alla rete di sicurezza fornita da questi sistemi di tipo quando il tuo sistema interagisce con il mondo esterno debolmente tipizzato?" e riscrivere la domanda su questo. Riceverai risposte definitive che saranno utili ai futuri lettori in quel modo.
Benjamin Hodgson,

5
Anche i consigli sulle risorse sono fuori tema qui (perché tali risposte non sono aggiornate rapidamente e non siamo davvero migliori di Google). Come ha detto Benjamin, ci sono alcune domande rispondibili sepolte nel tuo post, ma l'intero post nel suo stato attuale sta essenzialmente chiedendo alle persone di descrivere le loro esperienze usando queste lingue, che è molto più adatta a Quora o Reddit che non a StackExchange posto. Non sto effettuando il downvoting, perché questa domanda è ben posta, ma non è solo una domanda StackExchange.
Ixrec,

4
Un sistema di tipi è uno strumento e, come qualsiasi altro strumento, la sua efficacia dipende in gran parte non dallo strumento stesso ma dal possessore. Puoi sfruttare il sistema di tipi di un linguaggio come Haskell per codificare gli invarianti sulla tua logica aziendale a livello di tipo e fare in modo che quegli invarianti siano controllati da una macchina (il compilatore) al momento del compilatore, ma per fare ciò hai bisogno di una comprensione della semantica di il sistema di tipi e il controllo del tipo. La domanda giusta non è "è un buon strumento per le cose sul web", è "ecco alcuni problemi specifici che devo affrontare; come potrebbe essere usato un sistema di tipo forte per risolverli?"
user2407038

5
La maggior parte delle cose che descrivi non hanno nulla a che fare con il sistema dei tipi. Sono funzioni puramente IDE. Con l'eccezione (nessun gioco di parole previsto) delle eccezioni controllate, tutte le funzionalità che menzionate erano presenti negli IDE Smalltalk molto prima che apparissero negli IDE per le lingue tipizzate staticamente. In effetti, uno degli IDE Java più utilizzati in realtà è iniziato come IDE Smalltalk modificato (IBM VisualAge Smalltalk, che è stato modificato per comprendere il codice Java ma è stato ancora scritto in Smalltalk e rilasciato come VisualAge Java, che è stato quindi portato su Java e rilasciato come ...
Jörg W Mittag il

4
... VisualAge Java Micro Edition, che è stato poi suddiviso in componenti riutilizzabili e rilasciato come Open Source con il nome Eclipse). Un po 'ironicamente nel contesto di questa domanda, è proprio a causa della natura dinamica dei sistemi Smalltalk che gli IDE Smalltalk sono così potenti. Rifattori automatici sono stati inventati e implementati per la prima volta in Smalltalk, per esempio. Secondo la tua logica, Haskell deve avere i migliori IDE poiché ha il sistema di tipo statico più forte e più rigoroso di tutte le lingue che hai citato. Ma non lo fa. Hai anche menzionato "aggancio al compilatore". Questo ha ...
Jörg W Mittag il

Risposte:


34

Darò una breve risposta a causa della mia mancanza di tempo al momento, ma attualmente sto lavorando a due grandi progetti (> 100.000 LOC a Haskell) - flowbox.io e luna-lang.org. Usiamo Haskell per tutte le parti, incluso il backend, il compilatore del nostro linguaggio di programmazione e persino la GUI basata su webGL. Devo ammettere che il sistema di tipo forte e le macchine simili al "tipo dipendente" possono guidarti e salvarti da oneri e seccature conosciute da altre lingue. Usiamo i tipi in modo molto esteso e tutto ciò che potrebbe essere verificato in fase di compilazione, viene fatto. In effetti, durante gli ultimi 3 anni di sviluppo, non abbiamo mai riscontrato errori di runtime o overflow dello stack (e questo è qualcosa di veramente incredibile). Gli unici errori sono evidenti errori logici commessi dai programmatori. Molte persone dicono che se qualcosa si compila in Haskell, funziona e dovresti essere abbastanza sicuro che un giorno non ti esploderà in faccia.

Rispondere alla prima parte della domanda: puoi conoscere queste potenti funzionalità del sistema di tipi leggendo alcuni grandi blog, come:

In effetti, ci sono molti altri bei blog là fuori (come il pianeta Haskell ). Ad ogni modo, il metodo migliore per comprendere veramente i sistemi di tipo avanzato è sviluppare un'utile libreria open source. Noi (di Flowbox e New Byte Order) stiamo rilasciando molte librerie (le potete trovare su Hackage), quindi se non avete idea di cosa sviluppare, potete sempre coinvolgervi nei nostri progetti - mandatemi un'e-mail ogni volta che vuoi (mail disponibile su luna-lang.org ).


4
"Molte persone dicono che se qualcosa si compila in Haskell, funziona e dovresti essere abbastanza sicuro che un giorno non ti esploderà in faccia.": Ho usato Haskell solo per piccoli progetti (anche se non banali) , ma posso confermare questo: una volta che il compilatore Haskell è soddisfatto, raramente trovo qualche bug rimasto.
Giorgio,

1
Probabilmente sono uno dei ragazzi di "Haskell" che odiano di più i tipi (tanto ho scritto la mia versione di Haskell senza tipi , dopo tutto) - ma per diversi motivi la maggior parte delle persone. Quando si tratta di ingegneria del software, anche io ho la sensazione che, quando GHC è felice, il tuo programma funzioni. I sistemi di tipo simil-Haskell sono lo strumento ideale non solo per rilevare errori umanitari nella programmazione, ma per tenere sotto controllo enormi basi di codice. (Ricordo sempre la giustificazione di Giovanni alle armature di Mewtwo ogni volta che devo correggere errori di tipo.)
MaiaVictor

Il blog di Gabriel Gonzales è il migliore per cominciare.
Sam Boosalis,

@ danilo2 Hai inviato un'email all'indirizzo contact @ sul sito web della tua azienda. Ti chiedo di rispondere. Grazie!
Saurabh Nanda,

@SaurabhNanda: ho ricontrollato la nostra casella di posta e non vedo alcun messaggio da te. L'hai inviato per contattare <at> luna-lang.org? Vi prego di contattarmi direttamente scrivendo al mio wojciech <dot> danilo <at> gmail <dot> com e
studieremo

17

Bene, la digitazione debole vs. forte è definita in modo abbastanza vago. Inoltre, dal momento che l'uso più comune di "tipizzazione forte" è quello di riferirsi a cose che rendono difficile il cast di tipi, che non lascia altro per descrivere sistemi di tipi ancora più forti. È come dire che se riesci a trasportare meno di 30 libbre sei debole, e tutti coloro che possono sollevare di più sono nella stessa categoria di "forti" - una distinzione fuorviante.

Quindi preferisco la definizione:

  • I sistemi tipicamente deboli usano tipi per impedirti di fare determinate cose (come errori)
  • I sistemi fortemente tipizzati usano i tipi per fare le cose per te

Che cosa intendo per fare le cose per te? Bene, esaminiamo la scrittura di un'API di conversione delle immagini nel framework Servant (in Haskell, ma non è necessario conoscerla per seguirla, vedrai ...)

{-# LANGUAGE
    TypeOperators,
    DataKinds
    #-}

import Codec.Picture
import Data.Proxy
import Network.Wai.Handler.Warp (run)
import Servant
import Servant.JuicyPixels

main :: IO ()
main = run 8001 conversion

Questo sta dicendo che vogliamo alcuni moduli tra cui il pacchetto Servant e il plug-in JuicyPixels su Servant e che il punto di accesso principale del programma è quello di eseguire la funzione 'conversione' sulla porta 8001 come server utilizzando il back-end Warp. Ignora il bit della lingua.

conversion :: Application
conversion = serve (Proxy :: Proxy ConversionApi) handler

Ciò significa che la funzione di conversione è un server in cui l'API deve corrispondere al tipo "ConversionApi" e le richieste sono gestite dalla funzione handler

type ConversionApi
     = ReqBody '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage
    :> Post '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage

Questo specifica il ConvesionApitipo. Dice che dovremmo accettare i tipi di contenuto in entrata specificati dall'elenco "[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] e gestirli come DynamicImage e che dovremmo restituire un DynamicImage convertito nello stesso intervallo di contenuti tipi. Non preoccuparti esattamente di cosa:> significhi, pensalo come una magia felice per ora.

Quindi, data la mia definizione preferita, un sistema debolmente tipizzato può ora garantire cose come:

  • Non si restituisce il tipo di contenuto in uscita errato
  • Non si analizza la richiesta in arrivo come tipo di contenuto errato
  • Se il nostro server fosse più complicato, ci impedirebbe di creare URI non validi, ma in realtà non stiamo restituendo alcuna pagina HTML per contenere collegamenti (e il tipo assicura che non possiamo!)
  • Un sistema di digitazione molto ambizioso potrebbe persino verificare che stiamo gestendo in modo esaustivo tutti i tipi di contenuto in entrata e in uscita, consentendo al tipo di agire anche come documento di specifica anziché solo un vincolo.

Tutti obiettivi nobili, ma in realtà non abbastanza per qualificarsi come un sistema fortemente tipizzato, data la definizione di cui sopra. E ora dobbiamo arrivare alla parte più difficile della scrittura del codice che segue questa specifica. In un sistema di tipo davvero potente , scriviamo:

handler = return

E poi abbiamo finito. Ecco fatto, non c'è altro codice da scrivere . Questo è un server web pienamente operativo (modulo qualsiasi errore di battitura che ho perso). Il tipo ha detto al compilatore tutto ciò di cui ha bisogno per creare il nostro web server dai tipi e dai pacchetti (tecnicamente moduli) che abbiamo definito e importato.

Quindi, come impari a farlo nella scala delle applicazioni principali? Bene, in realtà non è molto diverso dal loro utilizzo in applicazioni su scala ridotta. Ai tipi che sono assoluti non importa quanto codice è scritto relativo a loro.

L'ispezione del tipo di runtime è qualcosa che probabilmente vorrai evitare, perché elimina una grande quantità del vantaggio e consente ai tipi di rendere il tuo progetto più complicato con cui lavorare, piuttosto che avere tipi semplifica le cose.

Come tale, è principalmente solo una questione di pratica modellare le cose con i tipi. I due modi principali per modellare le cose (o costruire cose in generale) sono dal basso verso l'alto e dall'alto verso il basso. Il top down inizia con il livello più alto di operazioni e quando si crea il modello si hanno parti in cui si rimanda la modellazione fino a dopo. La modellazione bottom-up significa che inizi con le operazioni di base, proprio come inizi con le funzioni di base, quindi costruisci modelli sempre più grandi fino a quando non hai acquisito completamente l'operazione del progetto. Bottom up è più concreto e probabilmente più veloce da costruire, ma top down può informare meglio i tuoi modelli di livello inferiore su come debbano comportarsi effettivamente.

I tipi sono il modo in cui i programmi si relazionano letteralmente con la matematica, quindi non c'è davvero un limite superiore a quanto possano essere complicati, o un punto in cui è possibile "imparare" su di essi. Praticamente tutte le risorse al di fuori dei corsi universitari di livello superiore sono tutte dedicate al modo in cui i tipi funzionano in una determinata lingua, quindi è necessario decidere anche quello.

Come meglio posso offrire, i tipi possono essere stratificati in questo modo:

  • Caratterizzato in modo molto debole, cose come JavaScript in cui è definito [] + {}
  • Digitato debolmente come Python, dove non puoi fare [] + {}, ma non viene controllato fino a quando non provi
  • Digitato debolmente come C o Java, dove non è possibile eseguire [] + {}, ma è verificato al momento della compilazione, tuttavia non si dispone delle funzionalità di tipo più avanzate
  • A cavallo tra il confine tra caratteri deboli e fortemente tipizzati, come la metaprogrammazione del modello C ++ e il codice Haskell più semplice in cui i tipi applicano solo proprietà.
  • Completamente in fortemente tipizzato, come i programmi Haskell più complicati in cui i tipi fanno le cose, come mostrato sopra
  • Sono fortemente tipizzati, come Agda o Idris, in cui tipi e valori interagiscono e possono vincolarsi a vicenda. Questo è forte quanto i sistemi di tipo ottengono e la programmazione in essi è la stessa di scrivere prove matematiche su ciò che fa il tuo programma. Nota: la codifica in Agda non sta letteralmente scrivendo prove matematiche, i tipi sono teorie matematiche e le funzioni con quei tipi sono esempi costruttivi che dimostrano tali teorie.

Generalmente, più in basso vai in questa lista, più i tipi possono fare per te, ma in fondo stai salendo nella stratosfera e l'aria sta diventando un po 'sottile: l'ecosistema del pacchetto è molto più piccolo e tu' Dovrai scrivere più cose da solo rispetto ad aver trovato una libreria pertinente. La barriera all'ingresso aumenta anche quando si scende, in quanto è necessario comprendere il sistema dei tipi abbastanza per scrivere programmi su larga scala.


Si noti che non è necessario aggiungere il prefisso all'elenco a livello di tipo con un apostrofo se nella lista è presente più di un elemento. L'apostrofo è necessario solo per elenchi a livello di tipo 0 o 1 elemento poiché sono ambigui (potrebbero riferirsi al normale costruttore di tipi di elenco)
Gabriel Gonzalez,

1
Sono consapevole, ma avevo l'impressione che l'apostrofo fosse solo una buona forma per i tipi di dati promossi in generale. EG che Proxy :: Proxy Truefunziona, ma è meglio scriverlo come Proxy :: Proxy 'True.
Steven Armstrong,

1
Sembra meglio non comprimere i vari assi in base al tipo di sistemi che possono essere classificati. Il cubo lambda di Barendregt ne include già tre, e inoltre lungo il singolo asse debole-forte includi anche polimorfismo statico vs. dinamico e parametrico vs ad hoc (quest'ultimo è ciò che consente alla tecnica serva di creare tipi che fanno gran parte del lavoro ').
user2141650

1
Il punto è giusto, ma la risposta è già molto lunga così com'è, e devi essere sulla buona strada nello studio della teoria dei tipi prima che il cubo lambda inizi davvero ad avere un senso. Inoltre, al di fuori delle lingue di nicchia (e dato che sto già includendo Haskell e persino Agda, intendo davvero piuttosto di nicchia), non troverai davvero una lingua che abbia, ad esempio, tipi dipendenti ma nessun operatore di tipo .
Steven Armstrong,

Puoi spiegare brevemente la '[xs]sintassi? Questo chiaramente non è un Char, ma non vedo come TypeOperatorso DataKindsabilita una sintassi alternativa. È una sorta di quasiquotazione?
wchargin,

10

Ho appena iniziato a lavorare sul core team di una grande piattaforma scritta in Scala. Puoi guardare applicazioni open source di successo, come Scalatra, Play o Slick per vedere come gestiscono alcune delle tue domande più dettagliate sulle interazioni con i formati di dati dinamici.

Uno dei grandi vantaggi che abbiamo riscontrato della forte tipizzazione di Scala è nella formazione degli utenti. Il team principale può prendere decisioni e applicare tali decisioni nel sistema di tipi, quindi quando altri team che hanno molta meno familiarità con i principi di progettazione devono interagire con il sistema, il compilatore li corregge e il team principale non corregge costantemente le cose in richieste pull. Questo è un enorme vantaggio in un sistema di grandi dimensioni.

Ovviamente, non tutti i principi di progettazione possono essere applicati in un sistema di tipi, ma più forte è il sistema di tipi, più principi di progettazione è possibile applicare nel compilatore.

Possiamo anche semplificare le cose per gli utenti. Spesso a loro stanno solo lavorando con raccolte regolari o classi di casi e lo stiamo convertendo in JSON o qualsiasi altra cosa automaticamente come necessario per il trasporto di rete.

La digitazione forte aiuta anche a fare distinzioni tra elementi come input non sanificati e sterilizzati, il che può aiutare con la sicurezza.

La digitazione forte aiuta anche i tuoi test a concentrarsi maggiormente sul tuo comportamento reale , invece di aver bisogno di un sacco di test che testano solo i tuoi tipi. Rende i test molto più piacevoli, più mirati e quindi più efficaci.

Lo svantaggio principale è la non familiarità con la lingua e il paradigma della lingua, e questo è correggibile con il tempo. A parte questo, ne abbiamo trovato la pena.


8

Pur non essendo una risposta diretta (dato che non ho ancora lavorato su +30.000 basi di codici LOC in haskell :( ..), ti imploro di dare un'occhiata a https://www.fpcomplete.com/business/resources/case-studies / che presenta molti casi studio di haskell in contesti industriali reali.

Un altro buon articolo è IMVU, che descrive la loro esperienza passando a haskell - http://engineering.imvu.com/2014/03/24/what-its-like-to-use-haskell/ .

Per esperienza personale in applicazioni di grandi dimensioni, il tipo di sistema molto ti aiuta molto, soprattutto se si cerca di codificare il più possibile in tipi. Il vero potere è davvero ovvio quando si tratta di refactoring - che significa manutenzione e che diventa un compito molto meno preoccupante.

Ho intenzione di scaricare un paio di collegamenti a risorse che raccomando, dal momento che stai facendo molte domande contemporaneamente:

Come osservazione conclusiva, riguardo al trattare con il mondo esterno è fatto in diversi modi. Ci sono librerie per assicurarti che le cose alla tua estremità siano di tipo sicuro, come Aeson per JSON, Esqueleto per SQL e molte altre.


1
grazie per la risposta, tuttavia, i casi studio su fpcomplete.com/business/resources/case-studies non sono più disponibili.
Saurabh Nanda,

Sembra che i case study siano stati spostati su fpcomplete.com/case-study
Steven Shaw,

3

Quello che ho visto:

Ho lavorato su alcune grandi applicazioni Web Ruby (Rails), una grande applicazione Web Haskell e molte altre più piccole. Con questa esperienza devo dire che la vita che lavora sulle applicazioni Haskell è molto più semplice rispetto a Rails per quanto riguarda la manutenzione e la curva di apprendimento inferiore. Sono dell'opinione che questi benefici siano dovuti sia al sistema di tipi di Haskell che allo stile di programmazione funzionale. Tuttavia, a differenza di molti, ritengo che la parte "statica" del sistema di tipi sia solo una grande comodità in quanto vi sono ancora vantaggi quando si utilizzano i contratti dinamici.

Quello in cui credo

Esiste un bel pacchetto chiamato Contracts Ruby che fornisce alcune delle principali funzionalità che sento aiutare i progetti Haskell a raggiungere migliori caratteristiche di manutenzione. Contratti Ruby esegue i suoi controlli in fase di esecuzione, quindi è meglio se associato a test convergenti elevati ma fornisce comunque la stessa documentazione ed espressione in linea di intenti e significati dell'utilizzo di annotazioni di tipo in linguaggi come Haskell.

Risposta alla domanda

Per rispondere alle domande poste sopra, ci sono molti posti in cui è possibile acquisire familiarità con Haskell e altre lingue con sistemi di tipo avanzati. Tuttavia, e ad essere sinceri, mentre queste fonti di documenazione sono eccellenti di per sé, sembrano tutte un po 'deludenti rispetto alla pletora di documentazione e consigli pratici trovati in Ruby, Python, Java e altri linguaggi simili. In ogni caso, Real World Haskell sta invecchiando ma è ancora una buona risorsa.

Teoria di categoria

Se scegli Haskell ti imbatterai in grandi quantità di letteratura che discute la teoria delle categorie. La teoria della categoria IMHO è utile ma non necessaria. Data la sua prevalenza nella comunità di Haskell, è facile confondere i pro ei contro dei tipi con i sentimenti sulla praticità della teoria delle categorie. È utile ricordare che sono due cose diverse, vale a dire che le implementazioni guidate dalla teoria delle categorie possono essere eseguite in linguaggi tipizzati dinamicamente e statici (modulo i vantaggi offerti dal sistema di tipi). I sistemi di tipo avanzati in generale non sono legati alla teoria delle categorie e la teoria delle categorie non è legata ai sistemi dei tipi.

Altro su tipi

Man mano che impari di più sulla programmazione con i tipi e le relative tecniche (cosa che accade abbastanza rapidamente perché è divertente) vorrai esprimere di più con il sistema dei tipi. In tal caso, vorrei esaminare alcune delle seguenti risorse e unirmi a me nel rendere consapevoli i venditori di strumenti che desideriamo strumenti di qualità industriale con queste funzionalità solo impacchettate in qualcosa che espone un'interfaccia facile da usare (come Contracts Ruby):


2

In primo luogo, mi sento come se ci fosse una confusione nelle risposte tra tipicamente debolmente versus fortemente tipizzato e statico contro dinamicamente tipizzato. Collegare l'OP fornito chiaramente fa la distinzione:

Un sistema di tipo forte è un sistema di tipo che presenta una limitazione del tempo di compilazione o una funzionalità di runtime che ritieni interessante.

Un sistema di tipo debole è un sistema di tipo che manca di tale restrizione o caratteristica.

Ad esempio, C, C ++ e Java vengono digitati staticamente poiché le variabili vengono digitate al momento della compilazione. Tuttavia, C e C ++ possono essere considerati tipizzati debolmente perché il linguaggio consente di aggirare le restrizioni usando void *puntatori e cast. Maggiori informazioni su questo argomento.

Su questa distinzione, la digitazione forte non può che essere migliore. Prima si fallisce, meglio è.

Tuttavia, sulla scrittura di programmi di grandi dimensioni, non credo che il sistema dei tipi abbia un ruolo importante. Il kernel Linux ha dieci milioni di LOC scritti in C e assembly ed è considerato un programma molto stabile, è a miglia di distanza dalle mie 200 linee Java che sono probabilmente piene di falle di sicurezza. Allo stesso modo, sebbene i "linguaggi di script" digitati dinamicamente soffrano di una cattiva reputazione quando si tratta di scrivere programmi di grandi dimensioni, ci sono occasionalmente prove che è immeritato (come Python Django, oltre 70k LOC)

Secondo me, si tratta di standard di qualità. La responsabilità della scalabilità di applicazioni di grandi dimensioni dovrebbe essere detenuta solo dai programmatori e dagli architetti e dalla loro volontà di rendere l'applicazione pulita, testata, ben documentata ecc.


-1

Dove si può leggere su come utilizzare questi potenti sistemi di tipo e le funzionalità statiche / di compilazione in applicazioni più grandi?

dalla risposta precedente https://www.fpcomplete.com/business/resources/case-studies/

Come si può andare oltre il tipo standard di "ciao mondo" di introduzioni a queste potenti funzionalità?

è davvero come qualsiasi altra lingua per rafforzare

Come si può utilizzare un sistema di tipo avanzato per modellare un problema di dominio aziendale?

Utilizzando tipi di dati astratti o, più in generale, polimorfismo

Il sistema di tipi aiuta o ostacola quando ci si trova nella zona 30.000 LOC +?

Aiuta fino in fondo. il sistema dei tipi ti aiuta a scrivere il codice in quanto ti dice la forma del risultato che vuoi avere. In realtà Agda scrive il codice per te.

PS: non commettere l'errore di avere un sistema di tipi e dover scrivere i tipi da solo, il che è idiota: il computer può farlo per te.

Cosa succede alla rete di sicurezza fornita da questi sistemi di tipo (e controlli in fase di compilazione) quando il sistema interagisce con il mondo esterno debolmente tipizzato, ad es. tramite API JSON o XML, vari archivi di dati, input dell'utente, ecc.

È fantastico, poiché conoscere la struttura dei valori tramite i tipi significa che il computer può dedurre un modo per scrivere (de) serializzatore per te.

Se vuoi davvero conoscere i tipi e l'astrazione, la migliore introduzione è sulla comprensione dei tipi, dell'astrazione dei dati e del polimorfismo

È un documento, non un caso di studio con belle immagini, ma è illuminante


-2

Come programmatore .net che lavora molto sulle applicazioni web, vedo sia il lato C tipizzato che il lato Javascript non tipizzato.

Non sono sicuro di aver visto alcuna letteratura sulle domande che fai. Con un linguaggio tipizzato dai per scontato tutto ciò. Con uno non tipizzato vedi definire i tipi come spese generali non necessarie.

Personalmente, non penso che tu possa negare che un linguaggio fortemente tipizzato offra i vantaggi che descrivi a un costo molto basso (rispetto alla scrittura di unit test equivalenti). L'interazione con sistemi debolmente tipizzati di solito implica tipi generici, come array o dizionari di oggetti, come DataReader, o l'uso creativo della stringa o della nuova classe dinamica. Fondamentalmente funziona tutto, ottieni solo un errore di runtime invece del tempo di compilazione.

Se vuoi scrivere un programma molto breve, magari definendo una funzione in un paio di righe per lavorare con un'applicazione più grande, semplicemente non hai spazio per dichiarare le classi. Sicuramente sono queste le lingue di nicchia non tipizzate come JS che occupano?


Vuoi dire tipizzato / non tipizzato o tipicamente statico / tipizzato dinamicamente? JavaScript non è non tipizzato ma digitato in modo dinamico.
Giorgio,

2
non è necessario definire i tipi. qualsiasi linguaggio decente inferirà i tipi per te: haskell, ocaml, sml, F # ...
nicolas

1
quando sei abituato a un linguaggio fortemente tipizzato tutto il resto è non tipizzato, quando dico di definire i tipi intendo 'creare le classi' sicuro che puoi usare var o qualunque altra cosa, ma è solo un trucco del compilatore
Ewan
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.