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

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

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

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

13
задан Shog9 17 August 2010 в 23:29
поделиться

7 ответов

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

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

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

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

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

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

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

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

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

Это ответ на ваш вопрос?

61
ответ дан 1 December 2019 в 17:19
поделиться

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

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

1
ответ дан 1 December 2019 в 17:19
поделиться

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

В остальном вам придется обсудить это с комитетом , который написал стандарты ECMAScript.

1
ответ дан 1 December 2019 в 17:19
поделиться

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

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

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

3
ответ дан 1 December 2019 в 17:19
поделиться

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

1
ответ дан 1 December 2019 в 17:19
поделиться

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

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

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

1
ответ дан 1 December 2019 в 17:19
поделиться

Что ж, самое приятное то, что C # будет работать с одного компьютера на другой одинаково (да, возможно, незначительные различия в версиях .net, но в целом все будет работать) . Javascript будет работать по-разному между Internet Explorer, Firefox и Chrome.

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

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

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

document.getElementById("fred")

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

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

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

-4
ответ дан 1 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: