13

我一直在研究 ECMAScript 规范,发现它非常难以阅读和理解。我经常不得不回溯以将概念留在脑海中。在阅读 C# 规范时,我能够研究语言的组成部分,而无需不断地在文档中移动。

ECMAScript 规范

C# 规范

4

7 回答 7

61

因为我是唯一一个经常在 SO 上发帖的人,他同时是 C# 语言设计委员会和 ECMAScript 技术委员会的成员,所以我可能可以提供一些见解。

首先,感谢您对 C# 规范的客气话。我们非常努力地保持它的可读性,很高兴知道我们已经成功了。

其次,我注意到 C# 规范并不总是这样。C# 2.0 规范是作为 C# 1.0 规范的附录编写的。泛型、迭代器块和匿名方法对规范的许多部分产生了广泛的影响。阅读 2.0 规范并且不得不在两章之间跳来跳去理解真正的重载解决算法是一件非常痛苦的事情。Mads 在 C# 3.0 中进行了大量编辑工作,首先将所有 C# 2.0 更改集成到规范中的合理位置,这样您就不必到处乱跳了。

第三,您所描述的大部分内容是两个规范的主要架构师的目标和风格差异的结果。想象一下一系列“技术性”,一端主要是用希腊字母写的关于形式正确性的论文,另一端是面向初学者的杂志文章。我们将 C# 规范设计为属于该范围内的特定位置。我们不希望它成为初学者程序员教程,但希望它成为初学者 C# 程序员参考的合理文档。安德斯特别希望避免他所谓的“规范的高等数学”。

考虑到我们规范的目标受众,这是一组合理的目标:专业程序员,其中一些人想学习 C#,而另一些人想精确地查看某些东西是如何工作的。该规范具有模糊的教程方面和精确的语义描述方面,以便为这两个支持者服务。

Waldemar Horwat,ECMAScript 3 规范的主要作者,对 E3 规范有不同的目标——不是更糟的目标,而是不同的目标。E3 规范的目标是更接近数学上精确的频谱末端。您将注意到规范的每个部分实际上是如何由本质上的伪代码算法组成的,这些算法在相当繁重的数学散文中准确地描述了每个操作对系统的影响。

例如,您会注意到 E3 规范谈到了“数学”数字与其二进制表示之间的区别。E4 规范的一个草案甚至指出,如果类型也是值,那么将“类型”幼稚地定义为一组值存在集合论问题。这种事情在 C# 规范中完全不合适;它并不寻求有强大的理论数学基础来确保其正确性。您会注意到,C# 规范甚至没有定义“类型”——它是在假设读者是专业开发人员的情况下编写的,他们 (1) 已经知道什么类型是用于实际目的,并且 (2) 既不知道也不关心集合论或范畴论对任何“

ECMAScript 流程的目标是让高度相似的语言的多个供应商走到一起,并就所有这些实现之间的共同点达成精确描述。E3 规范从未打算成为任何类型的教程,主要针对语言和工具实现者,而不是语言用户

Waldemar 的 E4 规格更进一步。如果我没记错的话,他首先指定了一种非常精确、简单、语义清晰的“规范语言”。然后他用 Common Lisp 为该语言编写了一个解释器。然后他用他的规范语言编写了 E4 规范。结果是他可以将规范本身编译成一个工作的 ECMAScript 解释器。这正是我们在 C# 规范中试图避免的那种“高等数学”。如果您想要非常精确和准确,这是一种很棒的规范方法,但它是编写语言用户可以学习的文档的糟糕方法。

这是否回答你的问题?

于 2010-05-01T15:36:15.363 回答
3

您可能会遇到两种语言规范的可读性之间的差异,因为它们是由不同的人群编写的,并且讨论了采用不同对象范式的语言。

JavaScript 规范是在语言经过几年有机发展之后由一个委员会编写的。C# 规范是由一小群公司工程师编写的,而该语言正在以一种受控的方式发展。

C# 是以类为中心的 OOP,而 JavaScript 是以原型为中心的。如果您对其中一个不像对另一个那么熟悉,那么有些材料一开始可能难以理解,尤其是在涉及实现细节时。这并不一定表明规范的清晰度和可读性存在问题。

于 2010-05-01T04:04:19.350 回答
1

相对于常规语言 JavaScript 是很陌生的。事实上,像 JavaScript 这样基于原型的流行语言并不多。JavaScript 完全基于对象,所有对象本质上都是具有函数的关联数组,也是一等对象。这通常不是您期望从一种语言中看到的,但是随着 Ajax 和浏览器端编程的流行,JavaScript 已成为 Web 的语言。虽然这些奇怪的规范是可以避免的,但我相信 JavaScript 可以带来一些有趣和创造性的编码。例如,闭包是大多数新开发人员难以理解的东西,但根据我的经验,它们非常有用。语言的语义有时会让开发人员误以为 JavaScript 是 C 的一种风格,但很快他们就意识到这不是真的。

对我来说,C# 是编程语言的巅峰之作。这是正确的,符合学术期望。遗憾的是,MS 是这种语言的主要驱动力。像我自己一样,我相信还有很多其他人会喜欢在非基于 Windows 的系统上正确实现支持 C# 的平台(Mono 是朝着正确方向迈出的一步)。

如果您热衷于学习 JavaScript 而不是 JavaScript 框架,那么我真的建议您继续阅读直接讨论 JavaScript 的书籍。但是,如果您打算开始并且不太关心 JavaScript 的来龙去脉,@bwawok 建议书籍是正确的方法。

于 2010-05-01T03:50:17.483 回答
1

嗯,你是我认识的第一个尝试根据 ECMA 文档学习语言的人。无论如何,我会说差异主要是由于编写规范的人的技能。C# 显然更容易指定(由于动态性较低 - 正如已经指出的那样),但最后... ...IIRC JavaScript 是由委员会设计的(许多人也在编写规范),而 C#最后由一个人由微软完成,可能有 1-2 位作者和一些助手,但最后是 Anders Hejlsberg(希望我拼写正确)。由委员会设计并且必须对事物进行投票有时可能会导致文档的“设计”不太理想。

所以,最后我认为一个比另一个更难阅读的不同规范的人的技能。

于 2010-05-01T04:08:53.377 回答
1

部分原因是您链接到的标准实际上是 ECMAScript。JavaScript、JScript 和 ActionScript 都是 ECMAScript 的实现,而 ECMAScript 的编写包含了它们的共同部分。相比之下,C# 主要由 Microsoft 的三个人(根据 ECMA-334 标准)设计。

除此之外,您必须与编写 ECMAScript 标准的委员会讨论。

于 2010-05-01T04:19:50.607 回答
1

简而言之,这可能是因为它们是由不同的作者编写的。C# 规范是由 Microsoft 编写的,微软对使它变得更好(以便它被接受)有既得利益,而 ECMAScript 规范是在该语言已经使用之后由一个委员会编写的。

于 2010-05-01T08:10:34.160 回答
-4

最好的部分是,C# 将从一台计算机运行到另一台相同的计算机(是的,.net 版本中可能存在细微差别,但东西通常会表现得很好)。Javascript 在 internet explorer、firefox 和 chrome 之间的运行会有很大的不同。

例如,您有一个带有元素的网页

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

然后你运行 JavaScript

document.getElementById("fred")

Internet Explorer 将为您提供元素(即使这是错误的行为,没有 ID 为 fred 的元素),但 firefox 会给您一个 null。

这很可能是因为语言是如何发展的。C# 由 1 家公司开发,开发人员被迫遵循标准,否则他们的代码将无法正常工作。JavaScript 在许多不同的浏览器中以不同的方式实现,人们可以自由地添加、删除或更改他们认为合适的功能。

总之,由于 JavaScript 的历史,它比其他语言需要更多的工作来学习。研究一个像 JQuery 这样的优秀库来抽象出浏览器的差异,你应该足够快地掌握它。从文档中学习只是学习语言的一小部分……做一些编码并了解它是如何工作的,这将是有意义的。

于 2010-05-01T03:31:09.940 回答