Почему существует большая разница в читаемости между спецификациями С# и ECMAScript?

Я изучаю спецификацию ECMAScript и обнаружил, что читать и понимать очень сложно. Мне постоянно приходится отступать, чтобы сохранить концепции в моей голове. При чтении спецификации С# я могу изучать компоненты языка без постоянного перемещения документа.

Спецификация ECMAScript

Спецификация С#

Ответ 1

Поскольку я единственный человек, регулярно публикующий информацию о SO, который был членом как комитета дизайна языка С#, так и технического комитета ECMAScript, я, вероятно, могу предложить несколько идей.

Прежде всего, спасибо за ваши добрые слова о спецификации С#. Мы очень много работали, чтобы сохранить его читабельным, и хорошо знать, что мы преуспели.

Во-вторых, я отмечаю, что спецификация С# не всегда была такой. Спецификация С# 2.0 была написана как дополнение к спецификации С# 1.0. Дженерики, блоки итераторов и анонимные методы имели широкое влияние на многие разделы спецификации. Это была настоящая боль, читающая спецификацию 2.0 и необходимость прыгать между двумя главами, чтобы понять реальный алгоритм разрешения перегрузки. Mads сделал огромную работу по редактированию в С# 3.0, чтобы сначала интегрировать все изменения С# 2.0 в разумное место в спецификации, чтобы вам не пришлось прыгать по всему месту.

В-третьих, большая часть того, что вы описываете, является результатом различий как в цели, так и в стиле главных архитекторов этих двух спецификаций. Представьте себе спектр "технической" с документами об официальной правильности, написанных в основном на греческих буквах с одного конца, и журнальных статей для новичков - с другой. Мы разрабатываем спецификацию С# для падения в определенном месте на этом спектре. Мы не хотим, чтобы это был учебник для начинающих программистов, но вы хотите, чтобы он был разумным документом для начинающих программистов на С#. Андерс особо хотел избежать того, что он называет "высшей математикой спецификации".

Это разумный набор целей, учитывая нашу целевую аудиторию для специалистов: профессиональных программистов, некоторые из которых хотят изучать С#, а некоторые из них хотят точно посмотреть, как что-то работает. Спецификация имеет неопределенные аспекты учебника и точные семантические описания, чтобы обслуживать эти две группы.

У Вальдемара Хорвата, главного автора спецификации ECMAScript 3, были довольно разные цели для спецификации E3 - не худшие цели, а разные цели. Цель спецификации E3 заключалась в гораздо большем приближении к математически точному концу спектра. Вы заметите, как практически каждый раздел спецификации состоит из принципиально псевдокодовых алгоритмов, которые описывают в довольно математической прозе то, что эффект каждой операции в системе.

Вы заметите, например, что спецификация E3 говорит о различии между "математическими" числами и их двоичными представлениями. Один проект спецификации E4 даже дошел до того, что есть теоретико-множественные проблемы с наивным определением "тип" как набора значений, если типы также являются значениями. Подобные вещи были бы совершенно неуместны в спецификации С#; он не стремится иметь сильную теоретическую математическую основу для обеспечения ее правильности. Вы заметите, что спецификация С# нигде не определяет "тип" - она ​​была написана с предположением, что читатели будут профессиональными разработчиками, которые (1) уже знают, какие типы предназначены для практических целей, и (2) не знают и не заботятся что теория множеств или теория категорий должна сказать о математической обоснованности любого определения "типа".

Цель процесса ECMAScript заключалась в том, чтобы объединить несколько продавцов с очень похожими языками и договориться о точном описании того, что было в общих чертах среди всех этих реализаций. Спецификация E3 никогда не предназначалась для обучения в любом виде и в первую очередь предназначена для разработчиков языка и инструмента, а не для пользователей языка.

Waldemar E4 spec пошел еще дальше. Если я правильно напомню, он начал с указания очень точного, простого "языка спецификации" с четкой семантикой. Затем он написал интерпретатор для этого языка в Common Lisp. Затем он написал спецификацию E4 на своем языке спецификаций. В результате он смог скомпилировать спецификацию в рабочий интерпретатор ECMAScript. Это точно такая "высшая математика", которую мы пытаемся избежать в спецификации С#. Это потрясающий подход к спецификации, если вы хотите быть невероятно точным и точным, но это ужасный способ написать документ, на котором могут учиться пользователи на языке.

Отвечает ли это на ваш вопрос?

Ответ 2

Вероятно, вы испытываете разницу между читабельностью спецификаций двух языков, потому что они были написаны разными группами людей, и обсуждают языки, которые используют разные парадигмы объектов.

Спецификация JavaScript была написана комитетом после того, как язык был органически развит через несколько лет. Спецификация С# была написана небольшой группой корпоративных инженеров, в то время как язык развивался контролируемым образом.

С# - ориентированный на класс ООП, а JavaScript - прототип-ориентированный. Возможно, если вы не так знакомы с тем, как вы с другим, то некоторые материалы могут быть трудно понять сначала, особенно когда они попадают в детали реализации. Это не обязательно указывает на проблему с ясностью и удобочитаемостью спецификации.

Ответ 3

Относительно обычных языков JavaScript очень странный. На самом деле не так много популярных языков, которые, как JavaScript, основаны на прототипе. JavaScript полностью основан на объектах, и все объекты представляют собой по существу ассоциативные массивы с функциями, также являющимися первоклассным объектом. Обычно это не то, что вы ожидаете увидеть на каком-либо языке, но с популярностью Ajax и браузером на стороне браузера JavaScript стал языком Интернета. Хотя этих странных спецификаций можно было избежать, я считаю, что JavaScript может привести к интересному и творческому кодированию. Например, закрытие - это то, что большинство новых разработчиков пытаются понять, но по моему опыту они очень полезны. Семантика языка порой глупые разработчики считают, что JavaScript - это аромат C, но вскоре они понимают, что это не так.

Мне С# является вершиной языков программирования. Это правильно и соответствует академическим ожиданиям. Стыдно, что MS является основным драйвером этого языка. Как и я, я уверен, что есть много других, которым бы понравилась правильная реализация платформы с поддержкой С# в ни одной системе на базе Windows (Mono - это движение в правильном направлении).

Если вы хотите научиться JavaScript, а не JavaScript Framework, то я действительно предлагаю придерживаться книг, которые напрямую обсуждают JavaScript. Однако, если вы намереваетесь начать работу и не заботитесь о том, что все предложения и возможности JavaScript @bwawok - это правильный путь.

Ответ 4

Хорошо, ты первый человек, которого я знаю, пытаясь выучить язык на основе документов ECMA. Во всяком случае, я бы сказал, что разница в основном связана с умением людей писать спецификации. С#, очевидно, немного легче указать (из-за менее динамичной природы - как уже указывалось), но в конце... ... IIRC JavaScript разработан комитетом (многие люди пишут также по спецификации), в то время как С# был сделан Microsoft одним человеком в конце, возможно, с 1-2 авторами на этом пути и некоторыми помощниками, но в конце он это Андерс Хейлсберг (надеюсь, что я правильно это записал). Дизайн комитетом и необходимость участия в голосовании могут иногда приводить к менее оптимальному "дизайну" документа.

Итак, в конце я думаю, что речь идет об умении людей писать разные спецификации, которые сложнее читать, чем другие.

Ответ 5

Отчасти причина в том, что стандартом, на который вы ссылаетесь, является фактически ECMAScript. JavaScript, JScript и ActionScript - все реализации ECMAScript, и ECMAScript был написан, чтобы охватить общие части каждого. Напротив, С# был разработан в основном тремя людьми (в соответствии со стандартом ECMA-334) в Microsoft.

Кроме этого, вы должны принять его с помощью committee, в котором написаны стандарты ECMAScript.

Ответ 6

Проще говоря, это, вероятно, потому, что они были написаны разными авторами. Спецификация С# была написана Microsoft, которая заинтересована в том, чтобы сделать ее хорошей (чтобы она была принята), тогда как спецификация ECMAScript была написана комитетом после того, как язык уже использовался.

Ответ 7

Ну, лучшая часть, С# будет работать с одного компьютера на другой одинаково (да, возможно, небольшие различия в версиях .net, но материал вообще будет вести себя). Javascript будет отличаться от Internet explorer vs firefox vs chrome.

Например, у вас есть веб-страница с элементом

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

И вы запустите JavaScript

document.getElementById("fred")

Internet explorer предоставит вам элемент (хотя это неправильное поведение, нет элемента с идентификатором fred), но firefox даст вам нуль.

Скорее всего, это связано с тем, как выросли языки. С# была сделана 1 компанией, и разработчики были вынуждены следовать стандартам, или их код не сработает. JavaScript был реализован во многих разных браузерах по-разному, и люди могли свободно добавлять или удалять или изменять функции по своему усмотрению.

Таким образом, JavaScript требует больше работы, чем другие языки, из-за истории. Посмотрите на хорошую библиотеку, такую ​​как JQuery, чтобы абстрагироваться от различий в браузере, и вы должны получить ее достаточно быстро. Изучение документа - это лишь небольшая часть изучения языка... сделайте некоторую кодировку и узнайте, как она работает, и это будет иметь смысл.