代码之家  ›  专栏  ›  技术社区  ›  ChaosPandion

为什么C和ECMAScript规范的可读性有很大差异?

  •  13
  • ChaosPandion  · 技术社区  · 15 年前

    我一直在研究ECMAScript规范,发现它非常难以阅读和理解。我必须不断地回溯以保持我头脑中的概念。在阅读C规范时,我能够在不不断移动文档的情况下学习语言的组件。

    ECMAScript Specification

    C# Specification

    7 回复  |  直到 15 年前
        1
  •  61
  •   Eric Lippert    14 年前

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

    首先,感谢您对C规格的友好表述。我们已经努力保持它的可读性,很高兴知道我们已经成功了。

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

    第三,您所描述的内容的很大一部分是两个规范的主要架构师在目标和风格上存在差异的结果。想象一下一系列“技术性”的文章,其中一部分是关于形式正确性的文章,大部分是用希腊字母写的,另一部分是针对初学者的杂志文章。我们设计了C规范,使其落在该频谱的特定位置。我们不希望它是初学者程序员教程,但希望它是初学者C程序员参考的合理文档。安德斯特别希望避免他所说的“规范中更高的数学”。

    这是一组合理的目标,考虑到我们的目标读者是规范的:专业的程序员,他们中的一些人想学习C,还有一些人想精确地查看某个东西是如何工作的。为了服务于这两个方面,规范有模糊的教程方面和精确的语义描述方面。

    ECMAScript 3规范的主要作者WaldemarHorwat对E3规范有着不同的目标——不是更差的目标,而是不同的目标。E3规范的目标是更接近 数学上精确的 光谱的末端。您将注意到规范的每一部分实际上都是如何由伪代码算法组成的,这些伪代码算法用相当数学化的繁文缛节精确地描述了每个操作对系统的影响。

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

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

    Waldemar的E4规格更进一步。如果我记得正确的话,他首先指定了一种非常精确、简单、语义清晰的“规范语言”。然后他用普通的口齿不清为那门语言写了一个翻译。然后他用自己的规范语言编写了E4规范。结果是他可以 将规范本身编译成一个有效的ecmascript解释器 . 这正是我们在C规范中试图避免的那种“高等数学”。如果您希望非常精确和准确,这是一种很棒的规范方法,但是编写一个 语言用户 可以学习。

    那能回答你的问题吗?

        2
  •  3
  •   Timothy    15 年前

    您可能正在经历两种语言规范的可读性之间的差异,因为它们是由不同的人群编写的,并且讨论使用不同对象范式的语言。

    Javascript规范是在语言经过几年的有机发展后由一个委员会编写的。C规范是由一小部分公司工程师编写的,而语言是以一种受控的方式增长的。

    c是以类为中心的OOP,而javascript是以原型为中心的。有可能,如果您对其中一个的熟悉程度不如对另一个的熟悉程度,那么在开始时,某些材料可能很难理解,特别是在涉及到实现细节时。这并不一定表示规范的清晰性和可读性有问题。

        3
  •  1
  •   Roman    15 年前

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

    对我来说,C是编程语言的顶峰。它是正确的,符合学术期望。很遗憾,MS是这种语言的主要驱动力。像我一样,我相信还有很多人会喜欢在非基于Windows的系统上适当地实现一个支持C的平台(Mono是朝着正确的方向发展)。

    如果你热衷于学习javascript,而不是一个javascript框架,那么我真的建议你继续学习直接讨论javascript的书籍。然而,如果你打算开始,不太关心javascript@bwawok的进进出出,那么书籍建议是正确的选择。

        4
  •  1
  •   ChaosPandion    15 年前

    嗯,你是我认识的第一个尝试学习基于ECMA文档的语言的人。不管怎样,我想说的区别主要是由于人们写规格的技能。显然,C更容易指定(由于其动态性较低,如前所述),但在最后… …iirc javascript是由委员会设计的(许多人也在编写规范),而C是由一个人在最后完成的,一路上可能有1-2个作者和一些助手,但最后是安德斯·海斯伯格(希望我拼写正确)。委员会的设计和对事物的投票有时会导致文件的“设计”不太理想。

    所以,最后,我认为这是关于人们编写不同规范的技巧,一个规范比另一个规范更难阅读。

        5
  •  1
  •   outis    15 年前

    部分原因是您链接到的标准实际上是ecmascript。javascript、jscript和actionscript都是ecmascript的实现,而ecmascript的编写是为了包含每个脚本的公共部分。相比之下,C主要由微软的三个人(根据ECMA-334标准)设计。

    除此之外,你必须接受 committee 写了ECMAScript标准。

        6
  •  1
  •   Damian Powell    15 年前

    简而言之,这可能是因为它们是由不同的作者写的。C规范是由微软公司编写的,微软公司对完善C规范有着既定的兴趣(以便它被接受),而ECMAScript规范则是在C规范已经被使用之后由委员会编写的。

        7
  •  -4
  •   bwawok    15 年前

    好吧,最好的部分是,C将从一台计算机运行到另一台相同的计算机(是的,可能在.NET版本中有细微的差别,但一般情况下,这些东西都会表现出来)。JavaScript在Internet Explorer和FireFox和Chrome之间的运行方式会有很大的不同。

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

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

    运行javascript

    document.getElementById("fred")
    

    Internet Explorer将为您获取元素(即使这是错误的行为,但没有ID为fred的元素),但Firefox将为您提供一个空值。

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

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