|
|
1
0
任何高级语言设计的目标都应该是减少为了完成任务而需要编写的代码量,而不会太多地损害可读性。需要编写的代码越多,引入的bug就越多。限制型系统(如果设计不好的话)在最坏的情况下是一个普遍的谎言,在最好的情况下是一个过早的优化。我不认为过于严格的类型系统有助于编写正确的程序。原因是该类型只是一个断言,不一定基于证据。
|
|
|
2
1
略微 是这里的关键词。只有“契约式设计”——一种允许您明确说明前提、后置条件和不变量的语言,以及 它们——可以帮助您对抗您的库的用户,以经验的方式发现库到底会让他们得到什么,并利用这些发现超越您的设计意图(可能会限制您未来更改设计或其实现的自由)。主流语言不支持“契约式设计”——埃菲尔是最接近这一点的语言,现在很少有人会称之为“主流”——大概是因为它的成本(大部分不可避免地是在运行时)似乎无法用它的优势来证明。”参数x必须是一个素数,“方法a必须在调用方法B之前被调用”,“方法D被调用后不能再调用方法C”等等——这些都是您需要考虑的典型约束类型 喜欢 |
|
|
3
0
我不认为你的问题真的与动态和静态类型有多大关系。事实上,我可以看到两种情况:一方面,马丁·克莱顿提到了达夫的装置;这种用法在您第一次看到它时非常令人惊讶,但语言的语义明确允许这种用法。如果有一个标准,这种习惯用法可能会作为一个具体的例子出现在标准的后续版本中。这些都没有错,;事实上,它们可以(除非过度使用)极大地提高生产率。 另一种情况是对实现进行编程。这种情况 将 |
|
|
4
0
在我看来,原来的问题有点不连贯。如果规范明确允许特定行为(如必须、可能、应该或应该),那么根据定义,任何允许/实现该行为的编译器/解释器都符合该语言。这似乎是OP在comments部分中提出的情况——JavaScript规范假定*表示所讨论的函数可以在不同的情况下使用,因此它是明确允许的。 另一方面,如果编译器/解释器实现或允许规范明确禁止的行为,那么根据定义,编译器/解释器在规范之外运行。 还有第三种情况,以及相关的定义良好的术语,用于规范未定义行为的情况:未定义。如果规范没有实际指定特定情况下的行为,那么该行为是未定义的,编译器/解释器可能会有意或无意地处理该行为。然后,开发人员有责任意识到该行为不是规范的一部分,并且,如果他/她选择利用该行为,开发人员的应用程序因此依赖于特定的实现。提供实现的解释器/编译器没有义务维护官方未定义的行为,除了向后兼容性和生产者可能做出的任何承诺。此外,语言规范的后续迭代可能会定义先前未定义的行为,使编译器/解释器(a)与新迭代不兼容,或(b)推出新补丁/版本以变得兼容,从而破坏旧版本。 *“大概”是因为我自己还没看过说明书。我同意上面的陈述。 |