Почему существует большая разница в удобочитаемости между спецификациями C # и ECMAScript? - PullRequest
13 голосов
/ 01 мая 2010

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

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

C # Технические характеристики

Ответы [ 7 ]

61 голосов
/ 01 мая 2010

Поскольку я являюсь единственным человеком, регулярно публикующим сообщения в 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 #. Это замечательный подход к спецификации, если вы хотите быть невероятно точным и точным, но это ужасный способ написать документ, которому пользователей языка могут научиться.

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

3 голосов
/ 01 мая 2010

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

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

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

1 голос
/ 01 мая 2010

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

1 голос
/ 01 мая 2010

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

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

1 голос
/ 01 мая 2010

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

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

1 голос
/ 01 мая 2010

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

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

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

0 голосов
/ 01 мая 2010

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

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

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

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

document.getElementById("fred")

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

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

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

...