Esiste un motivo specifico per il Web per le scelte di progettazione dietro il linguaggio JavaScript?

7

Con l'avvento di "il web è la piattaforma", JavaScript sta rapidamente diventando il linguaggio di programmazione più utilizzato al mondo.

Tuttavia, molte attività facili da realizzare in altre lingue moderne sono difficili o sconcertanti in JavaScript , perché il design della lingua è così "unico" ":

  • JavaScript ha un sistema OOP basato su prototipo ; la maggior parte degli altri linguaggi moderni ha uno basato sull'eredità
  • JavaScript ha un strano sistema di battitura che non rientra in nessuna delle categorie standard (molti esempi su WTFJS)
  • JavaScript è estremamente indulgente nel modo in cui analizza la sintassi (i punti e virgola sono facoltativi ecc.)

Dal punto di vista di uno sviluppatore, la maggior parte di queste decisioni di progettazione rende più difficile lo sviluppo in JavaScript. Concettualmente, il linguaggio JavaScript sembra un passo indietro rispetto a Java e due passi dietro a Python e Ruby. Ma poiché non credo che le persone dietro JavaScript stiano cercando di creare un linguaggio che sia difficile da usare, posso solo pensare che quei punti di progettazione debbano avere qualcosa a che fare con l'uso previsto di JavaScript come linguaggio di scripting per i siti web , profondamente connesso al DOM.

In che modo (se possibile) questi punti di progettazione soddisfano i casi d'uso previsto di JavaScript? Che ragionamento sta dietro a quelle decisioni progettuali apparentemente casuali?

    
posta user121228 25.02.2014 - 12:21
fonte

3 risposte

3

Penso che la domanda dovrebbe essere riscritta sulla falsariga di "in che modo i punti di forza / debolezza di internet / browser Web / ecc. influenzano la progettazione e l'implementazione di Javascript?" - In tal caso, cancellerò il mio post - perché la maggior parte della domanda è irrilevante / errata / selezionata / esempi superficiali che in realtà non indicano nulla sul design di Javascript.

Imparando di più su Javascript - specialmente usandolo per implementare alcune applicazioni - scoprirai che i tuoi punti sono in realtà solo trappole per gli sprovveduti, ma diventano non-problemi per gli sviluppatori di Javascript più esperti. Comprendendo e sfruttando i punti di forza di Javascript, tra cui this , scope lessicale, chiusure, funzioni di ordine superiore, i letterali delle funzioni risultano essere più importanti di essere inciampati in uno dei punti deboli che hai citato. OTOH, un problema reale che deve essere affrontato è la mancanza di un sistema di moduli standard.

L'unica sotto-domanda interessante è:

JavaScript has a prototype-based OOP system; most other modern languages have an inheritance-based one

Sospetto che questo abbia qualcosa a che fare con i limiti di memoria, ma non riesco a trovare un riferimento per questo. Inoltre, come menzionato da @jozefg, ci sono altri linguaggi con i sistemi prototipo; ha diversi punti di forza / debolezza rispetto all'eredità "mainstream". I sistemi di oggetti basati su prototipi hanno una propria ricca storia che dovresti conoscere prima di eliminarli come errori.

However, many tasks that are easy to accomplish in other modern languages are difficult or puzzling in JavaScript

Scegli una lingua e poni la domanda inversa: quanti compiti facili da realizzare in Javascript sono difficili o sconcertanti in altre lingue? Che cosa dice la risposta di queste altre lingue? (IMHO, non molto: è sempre facile cogliere esempi, ma molto più difficile mostrare come quegli esempi impediscono alle persone di ottenere lavoro)

JavaScript has such a weird typing system that it doesn't fall into any of the standard categories (plenty of examples on WTFJS)

Che cosa c'è di strano in questo? Non è sicuramente l'unico linguaggio digitato dinamicamente; non è nemmeno l'unico che consente la coercizione. Forse il numero di coercizioni e qualche comportamento inaspettato in alcuni casi angolari ti distrae.

JavaScript is extremely lenient in how it parses the syntax (semicolons are optional etc.)

In che modo? Avete altri esempi di clemenza? FWIW, i punti e virgola sono facoltativi a volte ; in realtà è ben specificato e quindi non è quello che definirei "clemente".

Se questo è un problema per te, usa un linter .

From a developer's point of view, most of these design decisions make developing in JavaScript harder.

In che modo? Puoi fornire esempi? Questo è molto soggettivo.

Conceptually, the JavaScript language seems one step behind Java, and two steps behind Python and Ruby.

In che modo? Puoi fornire esempi? Questo è molto soggettivo.

What reasoning is behind those seemingly random design decisions?

Perché sembrano casuali?

    
risposta data 25.02.2014 - 18:37
fonte
2

Doug Crockford ha risposto alla tua domanda nel video "JavaScript: The Good Parts": link

Solo perché JavaScript è diverso, non significa che sia peggio. Il problema è quando si tenta di creare un'eredità classica in JS, ma non si dovrebbe. I prototipi sono piuttosto grandi una volta capito.

BTW: Go (golang) è sfuggito all'eredità classica a favore dell'incorporazione. Alcuni dicono che è liberatorio.

    
risposta data 25.02.2014 - 12:52
fonte
2
  1. Patrimonio prototipo

    Questo sembra essere dovuto al fatto che, nonostante ciò che più afferma, JavaScript non è un discendente principalmente di Scheme, ma Self. Il sé ha prototipi e così fa JavaScript.

  2. Coercizione implicita

    Né Scheme né Self hanno avuto la quantità invasiva di coercizione implicita che JavaScript ha quindi dobbiamo indovinare un po 'su perché esattamente esistono.

    È abbastanza ragionevole suggerire che Eich guardava il web e ha notato che tutto era / è, una stringa. Ha un certo senso quindi dire "Ehi, lo so, salviamo il programmatore con una noiosa digitazione e trasformiamo semplicemente le stringhe in quello che vogliamo".

    Inoltre, fare questo piuttosto che andare in crash significa che mentre parte della pagina potrebbe essere visualizzata in modo errato perché una stringa non conteneva un numero, la pagina non si è bloccata. Che è probabilmente un UX molto migliore. Occasionalmente fare qualcosa , anche se sbagliato, è rassicurante per l'utente.

    Ricorda che JavaScript è stato introdotto sul mercato ed è stato congelato prematuramente, nessuno sapeva quante cose strane erano in agguato nelle conversioni implicite di JavaScript fino a quando non era troppo tardi. Non discuterò in questa risposta se sono bravi però:)

  3. Zucchero sintattico

    Sospetto che ciò non abbia nulla a che fare con JavaScript essendo un linguaggio web e tutto ciò che ha a che fare con JavaScript cerca di essere facile da usare. Permettere il punto e virgola opzionale e altro zucchero sintattico è incredibilmente comune al giorno d'oggi. Direi che è più comune trovare una lingua fatta negli ultimi 10 anni che omette il punto e virgola di quanto non richieda loro.

    Tutto questo fa parte di una tendenza verso JavaScript e altri linguaggi che cercano di ottimizzare i tempi del programmatore rendendo facili da digitare gli schemi comuni.

Per concludere, No, Kinda, No.

    
risposta data 25.02.2014 - 16:10
fonte