Perché c'è una grande differenza di leggibilità tra le specifiche C # e ECMAScript?

StackOverflow https://stackoverflow.com/questions/2748757

  •  02-10-2019
  •  | 
  •  

Domanda

Ho studiato le specifiche ECMAScript e ho trovato che è estremamente difficile da leggere e capire. Ho sempre fare marcia indietro per mantenere concetti nella mia testa. Durante la lettura della specifica C # Io sono in grado di studiare i componenti della lingua senza costantemente in movimento intorno al documento.

ECMAScript Specification

C # Specifiche

È stato utile?

Soluzione

Come io sono l'unica persona distacco regolarmente su SO che è stato un membro sia del comitato di progettazione del linguaggio C # e il comitato tecnico ECMAScript, probabilmente posso offrire alcune intuizioni.

Prima di tutto, grazie per le gentili parole circa le specifiche C #. Abbiamo lavorato molto duramente per mantenere leggibile ed è bene sapere che ci siamo riusciti.

In secondo luogo, rilevo che la specifica C # non è sempre stato così. La specifica C # 2.0 è stato scritto come un addendum per il C # 1.0 specifica . Generics, iteratore blocchi e metodi anonimi avevano impatti diffusi su molti tratti della specifica. E 'stato un vero e proprio dolore leggendo le specifiche 2.0 e di dover saltare tra due capitoli per capire l'algoritmo di risoluzione vera sovraccarico. Mads ha fatto una quantità enorme di lavoro di editing in C # 3.0 per integrare prima tutti i C # 2.0 si trasforma in un posto ragionevole nelle specifiche in modo che non avrebbe dovuto saltare tutto il luogo.

In terzo luogo, una grande parte di quello che stai descrivendo è il risultato di differenze sia obiettivo e lo stile dei principali architetti delle due specifiche. Immaginate uno spettro di "tecnico-ness" con articoli sulla correttezza formale scritta in gran parte in lettere greche da una parte, e articoli di riviste per i principianti, dall'altro. Progettiamo la specifica C # per cadere in un determinato luogo quello spettro. Noi non vogliamo che sia un programmatore un'esercitazione principiante, ma voglio che sia un documento ragionevole per principianti programmatori C # da consultare. Anders specificamente volevano evitare quello che lui chiama "la più alta matematica della specifica".

Questo è un insieme ragionevole di obiettivi dato il nostro target di riferimento per le specifiche: programmatori professionisti, alcuni dei quali vogliono imparare C #, e alcuni dei quali vuole cercare con precisione come qualcosa funziona. La specifica ha aspetti dell'esercitazione vaghi e precise descrizione aspetti semantici per servire questi due circoscrizioni.

Waldemar Horwat, il principale autore della ECMAScript 3 spec, ha avuto obiettivi piuttosto diversi per la specifica E3 - obiettivi non peggio, ma obiettivi diversi. L'obiettivo del E3 spec è stato quello di essere molto più verso la fine matematicamente preciso dello spettro. Avrete notato come praticamente ogni sezione della specifica è costituita da algoritmi essenzialmente pseudocodice che descrivono in prosa piuttosto matematica pesante esattamente ciò che l'effetto di ciascuna operazione è sul sistema.

Avrete notato per esempio che la specifica E3 parla della differenza tra i numeri "matematici" e le loro rappresentazioni binarie. Una bozza della specifica E4 si è spinto fino al punto di notare che ci sono problemi di set-teorici con una definizione ingenua di "tipo" come un insieme di valori, se i tipi sono anche i valori. Questo genere di cose sarebbe del tutto fuori luogo in C # spec; non cercare di avere un forte sostegno matematica teorica per garantirne la correttezza. Noterete che il C # spec nulla definisce anche "tipo" - è stato scritto con il presupposto che i lettori saranno pro sviluppatori che (1) già sanno quali tipi sono per scopi pratici, e (2) non conoscono né la cura ciò che la teoria degli insiemi o teoria delle categorie ha da dire circa la matematica fondatezza di una definizione di "tipo".

L'obiettivo del processo di ECMAScript è stato per più fornitori di lingue altamente simili a riunirsi e concordare una descrizione precisa di quello che era nel terreno comune tra tutte quelle implementazioni. L'E3 spec è mai stato destinato ad essere un tutorial di qualsiasi tipo, e si rivolge principalmente a linguaggio e strumento di implementatori , piuttosto che la lingua utenti .

E4 spec di Waldemar è andato anche oltre. Se ricordo bene, ha iniziato specificando una molto precisa, semplice "linguaggio spec" con la semantica chiare. Poi scrisse un interprete per la lingua in Common Lisp. Poi scrisse il E4 spec nella sua lingua specifica. Il risultato è stato che poteva compilare le specifiche stesso in un lavoro ECMAScript interprete . Questo è esattamente il tipo di "matematica superiore" che stiamo cercando di evitare nelle specifiche C #. Questo è un approccio impressionante per specifica se si vuole essere incredibilmente precisa e accurata, ma è un modo terribile per scrivere un documento che gli utenti di lingue può imparare da.

Ritiene che la risposta alla tua domanda?

Altri suggerimenti

Probabilmente si sta sperimentando una differenza tra la leggibilità delle specifiche delle due lingue perché sono stati scritti da diversi gruppi di persone, e discutere lingue che impiegano diversi paradigmi di oggetti.

La specifica JavaScript è stato scritto da un comitato, dopo la lingua era evoluta organicamente dopo diversi anni. La specifica C # è stato scritto da un piccolo gruppo di ingegneri aziendali, mentre la lingua è stata crescendo in modo controllato.

C # è OOP di classe-centrica e JavaScript è il prototipo-centric. E 'possibile che se non si ha familiarità con uno come siete con l'altro, poi un po' di materiale può essere difficile da capire a prima, soprattutto quando si entra in dettagli di implementazione. Ciò non indica necessariamente un problema con la chiarezza e la leggibilità di una specifica.

relativa ai linguaggi convenzionali JavaScript è molto strano. In realtà, non ci sono troppe lingue popolari che, come JavaScript sono prototipo basato. JavaScript è completamente oggetto basato, e tutti gli oggetti sono essenzialmente array associativi con funzioni anche di essere oggetto prima classe. Non si tratta di quello che ci si aspetta di vedere da un linguaggio però con la popolarità di Ajax e programmazione lato del browser JavaScript è diventato il linguaggio del web. Mentre queste strane specifiche avrebbe potuto essere evitato, credo JavaScript può portare a qualche codifica interessante e creativo. Chiusure per esempio, sono la cosa che la maggior parte nuovi sviluppatori fatica a capire, ma nella mia esperienza sono molto utili. La semantica del linguaggio a volte sciocchi agli sviluppatori di pensare JavaScript è un sapore di C, ma ben presto si rendono conto che questo è non è vero.

Per me C # è l'apice di linguaggi di programmazione. E 'corretto e in linea con le aspettative accademiche. È un peccato che MS è il driver primario di questo linguaggio. Come me Sono sicuro che ci sono molti altri che avrebbero godere di una corretta attuazione di una piattaforma con supporto per C # su nessuno sistema basato su Windows (Mono è una mossa nella giusta direzione).

Se siete interessati a imparare JavaScript e non un quadro JavaScript, poi ho davvero consiglia di bastone con i libri che trattano direttamente JavaScript. Tuttavia, se avete intenzione di iniziare e non si cura molto circa i pro ei contro di JavaScript @bwawok suggestione di libri è la strada giusta da percorrere.

Bene, tu sei la prima persona che conosco di provare ad imparare un linguaggio basato sui documenti ECMA. In ogni caso, direi che la differenza è in gran parte dovuta alla bravura dei persone che scrivono le specifiche. C # è ovviamente un po 'più facile per specificare (a causa della natura meno dinamico - come già sottolineato), ma alla fine ... ... IIRC JavaScript è disegno di commissione (molte persone che scrivono anche sulla spec), mentre C # è stato fatto da Microsoft da una persona alla fine, magari con 1-2 autori lungo la strada e alcuni aiutanti, ma alla fine è è Anders Hejlsberg (speranza ho scritto che a destra). Design di comitato e di dover votare su cose a volte può portare a meno ottimale "design" di un documento.

Quindi, alla fine penso che sia circa l'abilità delle persone che scrivono le diverse specifiche che uno è più difficile da leggere rispetto agli altri.

Parte del motivo è che lo standard si collega a è in realtà ECMAScript. JavaScript, JScript e ActionScript sono tutte le implementazioni di ECMAScript, e ECMAScript è stato scritto fino a comprendere le parti comuni di ciascuno. Al contrario, C # è stato progettato principalmente da tre persone (secondo lo standard ECMA-334) di Microsoft.

Oltre a questo, si avrebbe dovuto riprendere con la comitato che ha scritto gli standard ECMAScript.

In parole povere, è probabilmente perché sono stati scritti da autori diversi. Il C # spec è stato scritto da Microsoft che aveva tutto l'interesse a che rende bene (in modo che sarebbe stata accettata), mentre l'ECMAScript spec è stato scritto da un comitato, dopo la lingua era già in uso.

Beh, la parte migliore è, C # verrà eseguito da un computer a un altro lo stesso (sì differenze forse minori in versioni .net, ma roba generalmente comportarsi). Javascript verrà eseguito molto diversa tra Internet Explorer vs Firefox vs Chrome.

Per esempio si dispone di una pagina web con un elemento

<input type="text" name="fred" />

E si esegue il JavaScript

document.getElementById("fred")

Internet Explorer ti porterà l'elemento (anche se questo è un comportamento sbagliato, non v'è alcun elemento con un ID di fred), ma Firefox vi darà un nullo.

Più probabile che no, questo è a causa di come le lingue sono cresciuti. C # è stata fatta da 1 società e gli sviluppatori sono stati costretti a seguire gli standard, o il loro codice non avrebbe funzionato. JavaScript è stato implementato in molti browser diversi in modi diversi, e le persone erano liberi di aggiungere o rimuovere o modificare le funzioni come meglio credevano.

In sintesi, JavaScript richiede più lavoro per imparare di altre lingue a causa della sua storia. Guardare in una buona biblioteca come jQuery per astrarre le differenze del browser, e si dovrebbe ottenere il blocco di esso abbastanza veloce. Imparare da un documento è solo una piccola parte di apprendimento di una lingua ... fare un po 'di codifica e imparare come funziona, e sarà un senso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top