Le lingue dinamiche tipizzate meritano tutte le critiche? [chiuso]

34

Ho letto alcuni articoli su Internet sulla scelta del linguaggio di programmazione in azienda. Recentemente sono stati diffusi molti linguaggi tipizzati dinamici, ad esempio Ruby, Python, PHP ed Erlang. Ma molte imprese continuano a utilizzare linguaggi tipizzati statici come C, C ++, C # e Java.

E sì, uno dei vantaggi dei linguaggi tipizzati statici è che gli errori di programmazione vengono rilevati prima, al momento della compilazione, anziché in fase di esecuzione. Ma ci sono anche vantaggi con i linguaggi tipizzati dinamici. ( altro su Wikipedia )

Il motivo principale per cui le aziende non iniziano a utilizzare linguaggi come Erlang, Ruby e Python, sembra essere il fatto che sono digitati dinamicamente. Questo sembra anche essere il motivo principale per cui le persone su StackOverflow decidono contro Erlang. Vedi Perché hai deciso "contro" Erlang .

Tuttavia, sembra esserci una strong critica contro la digitazione dinamica nelle aziende, ma non capisco perché è così strong.

In realtà, perché ci sono così tante critiche contro la tipizzazione dinamica nelle imprese? Influisce davvero tanto sul costo dei progetti o su cosa? Ma forse mi sbaglio.

    
posta Jonas 01.09.2010 - 21:46
fonte

9 risposte

46

Sì, credo che lo facciano.

Ci sono alcuni motivi che devono essere considerati nella selezione di una lingua per un nuovo progetto:

  • Velocità run-time. Rispetto a C / C ++ / Fortran, Perl e Python sono così lenti che è divertente.
  • Velocità di inizializzazione. Rispetto ai suddetti linguaggi veloci, Java cade e piange mentre la JVM continua a caricare e caricare e ... while(1) ....
  • Prototype-abilità. Eseguendo in modo esauriente e facendo il lavoro di dichiarazione / definizione richiesto per C ++ o Java, aumenta la LOC, che è la metrica nota solo che si relaziona in modo affidabile con i bug accounts. Ci vuole anche molto tempo. Richiede anche un po 'più di riflessione su tipi e connessioni.
  • Fiddlability interno. Dinamicamente scherzare con i tuoi interni è fantastico finché non inizi a eseguire il debug del tuo codice auto-modificante . (Python, Lisp, Perl)
  • Verifica della correttezza. Un compilatore può fornire un rapido passaggio una volta per volta della semi-correttezza del tuo codice in C ++, e questo può essere veramente bello.
  • Dettagli dell'analisi statica. C e Java hanno una buona analisi statica. Perl non è completamente analizzabile staticamente a livello teorico (Forse anche Python). Sono ragionevolmente sicuro che neanche Lisp sia.
  • Le piattaforme bizzarre prendono solo C, in generale.
  • Catena di supporto. Se puoi avere un contratto a cui vorrà vedere i bug esaminati e lavorato, questo è enorme .

Se puoi presumere che l'organizzazione con cui stai lavorando ha un principio di "andare avanti" (c'è un termine contabile per questo), e non solo casualmente decidere di non lavorare sul software, quindi avete un caso molto migliore per l'utilizzo del software. Dal momento che non esiste un'importante vendita (che implica l'assunzione di responsabilità nel mantenerla) Python / Perl / $ dynamic_language, riduce considerevolmente il rischio.

In base alla mia esperienza, i manutentori open source hanno spesso un problema con la totale responsabilità di correggere i bug e rilasciare gli aggiornamenti. "È gratis, ci lavori!" è non una risposta accettabile per la maggior parte delle aziende (non le sue principali competenze, tra le altre cose).

Ovviamente, non sto parlando del mondo webapp / startup, che tende a giocare con regole di alto rischio / alta ricompensa ed essere molto aperto a rimanere al limite della tecnologia.

    
risposta data 14.09.2010 - 22:19
fonte
24

Stai dando troppo credito tecnico ai responsabili delle decisioni aziendali. C'è un vecchio detto: "Nessuno è stato licenziato per aver acquistato IBM". Se si segue un percorso diverso e le cose si fanno rocciose (lo fanno sempre), nessuno vuole rischiare di essere incolpato. Attenersi agli standard e dare la colpa a qualcun altro.

Ci sono molte aziende più giovani che diventeranno le imprese di domani e useranno quelle lingue.

E non dimentichiamo le linee di codice buggillion scritte in VBA!

    
risposta data 17.09.2010 - 21:47
fonte
16

Il motivo per cui le aziende usano C, C ++, C # e Java non è perché sono tipizzate staticamente (almeno non direttamente). I responsabili delle decisioni aziendali non stanno facendo questo tipo di scelte sulla base di un confronto obiettivo dei sistemi di tipi, te lo assicuro.

Le aziende fanno si preoccupano di:

  • Costi di manutenzione a lungo termine : puoi ragionevolmente aspettarti che le cose continuino a funzionare bene tra 10 anni? In realtà è una buona cosa se l'evoluzione del linguaggio è conservativa e retrocompatibile (come con Java). La tipizzazione statica è utile qui perché cattura un grosso tipo di bug in fase di compilazione prima che entrino nei tuoi sistemi di produzione .....
  • Disponibilità dei talenti - sarai in grado di trovare sviluppatori per mantenere il tuo nuovo sistema brillante? e se lo sviluppatore originale se ne va, tutti gli altri capiranno il codice? Ciò pone un grande ostacolo all'introduzione di qualsiasi "nuovo" linguaggio (specialmente se crea anche nuovi requisiti per l'implementazione, i sistemi di compilazione, il supporto operativo ecc.). Ciò offre enormi vantaggi ai linguaggi ampiamente utilizzati (C, C ++, C # e Java)
  • Costi di integrazione : è facile connettersi / integrarsi con altre tecnologie già in uso o che è probabile che acquisiscano? Se si dispone già di una serie di sistemi J2EE legacy, è necessario integrarsi con essi. Una nuova soluzione Java EE sarà probabilmente molto più pratica per questo rispetto ad es. Python.
  • Predittività / basso rischio : la piattaforma / lingua è stata provata e posso essere sicuro che funzionerà? Questo è solitamente più importante della semplice produttività. È molto più facile per un manager persuadere il suo capo a dargli un grosso budget per la manodopera per costruire un nuovo sistema piuttosto che per tornare indietro e dire che non ha funzionato .....
  • Supporto / supporto delle imprese : le principali organizzazioni internazionali impegnate a supportare la lingua e la piattaforma? Firmano un contratto per supportarmi in modo da avere qualcuno da chiamare se le cose vanno male?
  • Neutralità del fornitore / indipendenza dalla piattaforma - vado bloccato in un unico fornitore? Oppure ho a disposizione una vasta gamma di opzioni / percorsi di transizione futuri? Non vuoi essere bloccato in un vicolo cieco architettonico, incapace di fare progressi mentre i tuoi concorrenti mangiano il tuo pranzo. Se stai facendo il tuo lavoro correttamente come un architetto d'impresa, devi riflettere almeno 5-10 anni su questo argomento.

Personalmente, penso che se si desidera utilizzare i linguaggi dinamici nell'Enterprise, la migliore possibilità di gran lunga è quella di utilizzare qualcosa che ricopre un ecosistema aziendale esistente. I più notevoli sono le nuove lingue dinamiche JVM: ad es. JRuby, Groovy, Clojure. Per quanto riguarda la gestione IT, queste sono scelte linguistiche "sicure" perché operano all'interno e giocano bene con il resto dell'ecosistema aziendale Java.

    
risposta data 20.02.2013 - 16:50
fonte
10

The main reason why enterprises don't start to use languages like Erlang, Ruby and Python, seem to be the fact that they are dynamic typed.

Penso che questa sia solo la loro scusa principale. La vera ragione è che le aziende non li prendono sul serio e sentono che sono forse un po 'troppo dilettanti. Java e .NET sono "grandi nomi di aziende", hanno un buon marketing commerciale, supporto clienti commerciale e sono quindi ampiamente presi molto sul serio.

È spiacevole che non ci sia praticamente nessun linguaggio tipicamente statico così popolare come i nomi delle grandi aziende. Perché gli ambienti di programmazione open source / software libero sono quasi sempre digitati in modo dinamico? Ciò potrebbe indicare che un linguaggio tipizzato staticamente non è così facile da realizzare e che la digitazione dinamica è un "hack man's hack". Se questo è il caso, le aziende che decidono contro le lingue con dattilografia dinamica potrebbero effettivamente avere un punto.

    
risposta data 02.09.2010 - 22:08
fonte
9
  • Le lingue digitate dinamicamente tendono ad essere più lente dei loro cugini statici.
  • Gli errori sono più difficili da individuare e possono essere più difficili da eseguire il debug
  • Il compilatore / interprete tende ad essere molto meno meticoloso su ciò che puoi e non puoi fare. Ad esempio, praticamente catturi solo errori di sintassi nella fase di compilazione
  • Se non si presta molta attenzione alla progettazione di un linguaggio digitato in modo dinamico, si finisce con Javascript, che è la lingua dei code-odori

EDIT: Dovrei menzionare che il mio linguaggio di programmazione principale al momento è Python, che viene digitato in modo dinamico. Personalmente, adoro la libertà che deriva dal non pre-dichiarare variabili, ma a volte sarebbe bello per specificare (ad esempio) che tipo di parametri una funzione impiega per catturare gli errori piuttosto presto piuttosto tardi.

    
risposta data 01.09.2010 - 22:22
fonte
8

Le lingue digitate dinamicamente sono percepite (da alcuni programmatori / boss) per produrre codice che non funziona altrettanto bene. Il fatto che compili un programma scritto in modo dinamico ti dice molto poco sulla sua correttezza. Il fatto che una compilazione di una lingua scritta staticamente ti dica molto di più. (D'altra parte, c'è ancora molta strada tra la compilazione e fa la cosa giusta, quindi questo potrebbe essere meno significativo di quanto sembri)

Le lingue digitate dinamicamente sono percepite come lingue di scripting. Non scrivere mai un'applicazione in bash o in un file batch. Tutte le lingue digitate dinamicamente tendono ad essere inserite in quella categoria (ingiustamente).

Le lingue digitate dinamicamente sono più lente delle lingue tipizzate in modo statico. (Ma vedremo quanto bene il lavoro su JIT cambia)

    
risposta data 14.09.2010 - 20:00
fonte
8

Nota: questo è per lo più soggettivo e basato sulle mie esperienze e impressioni.

Le lingue digitate dinamicamente sono molto diverse dalle lingue tipizzate staticamente. Queste differenze probabilmente diventano più importanti nei software aziendali pesanti che nella maggior parte delle altre applicazioni.

Le lingue tipizzate staticamente tendono ad essere molto prescrittive. Un metodo prenderà solo input che corrispondono esattamente alla sua firma. I livelli di accesso tendono ad essere molto importanti e le interfacce sono definite esplicitamente, con restrizioni verbose ma non ambigue per applicare tali definizioni.

Le lingue digitate dinamicamente sono molto pragmatiche. Le conversioni di tipo spesso avvengono implicitamente, le funzioni possono persino funzionare se si fornisce il tipo di input errato purché si comporti in modo sufficientemente simile. In linguaggi come Python, anche i livelli di accesso saranno basati sul contratto piuttosto che sulle restrizioni tecniche (ad esempio, è solo private perché ti viene detto di non usarlo e ha un nome divertente).

Molti programmatori preferiscono le lingue dinamiche perché (probabilmente) consentono la prototipazione rapida. Il codice spesso finisce più corto (se non altro per mancanza di dichiarazioni di tipo) e se vuoi violare il protocollo corretto perché hai bisogno di una soluzione rapida e sporca o vuoi testare qualcosa, è facilmente possibile.

Ora, la ragione per cui le aziende "intraprendenti" spesso preferiscono le lingue tipizzate staticamente è esattamente che esse sono più restrittive e più esplicite riguardo a tali restrizioni. Sebbene nella pratica anche il codice tipizzato staticamente possa essere rotto da idioti con un compilatore, molti problemi saranno molto più visibili molto prima nel processo (cioè prima del runtime). Ciò significa che anche se il codebase è grande, monolitico e complesso, molti errori possono essere catturati facilmente, senza dover eseguire il codice o inviarlo al dipartimento QA.

La ragione per cui il vantaggio non supera gli svantaggi di molti programmatori esterni a quell'ambiente è che si tratta di errori che possono essere facilmente rilevati da un'attenta ispezione del codice o anche dal tentativo di eseguirlo. Soprattutto quando si segue una metodologia basata sui test, questi errori diventano spesso banali da catturare e facili da risolvere. Inoltre, con molte di queste aziende che hanno un ciclo di rilascio molto più breve, la produttività è spesso più importante della rigidità e molti sviluppatori (di base) vengono fatti dagli stessi sviluppatori.

L'altro motivo per cui le aziende di livello enterprise non utilizzano linguaggi tipizzati dinamicamente è molto importante. Per quanto possano sembrare sciocchi a noi nerd, le grandi aziende si attaccheranno spesso a soluzioni che funzionano, anche se sono ben oltre la loro shelf-life. Questo è il motivo per cui così tante grandi aziende applicano Internet Explorer 6 e sono così lenti ad aggiornare i propri sistemi operativi. Questo è anche il motivo per cui spesso scriveranno un nuovo codice in "vecchi" linguaggi (ad es. Versioni antiche di Java): è molto più semplice aggiungere poche righe di codice a un pezzo di software non vivente piuttosto che ottenere l'approvazione per una completa riscrittura in un nuovo lingua.

tl; dr: i linguaggi statici sono più simili alla burocrazia, quindi i manager più esperti come loro sono migliori.

    
risposta data 19.09.2010 - 18:33
fonte
3

No, non penso che le lingue digitate dinamicamente meritino tutte le critiche. (O se preferisci, meritano tanto critiche quanto le lingue tipizzate staticamente.)

Nella mia esperienza (e non cerco di generalizzare questa affermazione), i programmatori che criticano le lingue dinamiche non li hanno usati. La conversazione di solito va "ma con la tipizzazione statica il compilatore cattura così tanti errori!" e dico "beh, questo non è un problema, nella mia esperienza". (Di solito gli altri programmatori provengono da Java, Delphi o uno sfondo simile, non conosco programmatori Haskell o ML.)

L'unica cosa che mi affligge veramente è quando qualcuno sostiene che la tecnica Foo non può possibilmente essere fatta (o potrebbe essere molto difficile da fare) in un linguaggio tipizzato dinamicamente ... quando quella tecnica è stato inventato in, da e per un linguaggio tipizzato dinamicamente. IDE? Smalltalk. Refactoring automatico? Smalltalk. Chiamanti-di / implementatori-di? Smalltalk.

    
risposta data 19.09.2010 - 14:52
fonte
-1

Le aziende non stanno semplicemente adottando nuovi linguaggi e strumenti abbastanza velocemente e ci sono buone ragioni per farlo. Ma, quando uno degli strumenti tradizionali come C # implementa alcune di queste funzionalità, allora si riverseranno nelle imprese tradizionali ....

    
risposta data 17.09.2010 - 21:57
fonte