Questions tagged «language-design»

涉及编程语言的设计和结构的问题。


9
为什么在大多数现代编程语言中对合同设计的支持如此有限?
我最近发现了按合同设计(DbC),发现这是一种非常有趣的编写代码的方式。除其他外,它似乎提供: 更好的文档。由于合同是文件,因此不可能过时。此外,由于合同明确规定了例程的功能,因此有助于支持重用。 更简单的调试。由于程序在合同失效时立即停止执行,因此错误不会传播,并且可能会突出显示违反的特定断言。这在开发和维护期间提供了支持。 更好的静态分析。DbC基本上只是Hoare逻辑的一种实现,应该应用相同的原理。 相比之下,成本似乎很小: 额外的手指打字。由于必须明确说明合同。 进行一些培训以使自己习惯于写合同。 现在,首先熟悉Python,我意识到实际上可以编写前提条件(只针对不适当的输入抛出异常),甚至可以使用断言再次测试某些条件。但是,如果没有一些最终被认为不是Python风格的额外魔术,就不可能模拟“旧”或“结果”之类的某些功能。(此外,有一些库提供支持,但最终我感觉使用它们是错误的,因为大多数开发人员没有这样做。)我假设所有其他语言都存在类似的问题(当然,除外) ,埃菲尔)。 我的直觉告诉我,缺乏支持一定是由于某种拒绝做法的结果,但是在线搜索并没有取得丰硕的成果。我想知道是否有人可以弄清楚为什么大多数现代语言似乎提供的支持很少?DbC有缺陷还是过于昂贵?还是由于极限编程和其他方法而过时?

12
为什么大多数编程语言都具有用于声明函数的特殊关键字或语法?[关闭]
大多数编程语言(动态和静态类型的语言)都具有特殊的关键字和/或语法,这些关键字和/或语法与用于函数声明的变量大不相同。我认为函数就像声明另一个命名实体一样: 例如在Python中: x = 2 y = addOne(x) def addOne(number): return number + 1 为什么不: x = 2 y = addOne(x) addOne = (number) => return number + 1 同样,使用Java之类的语言: int x = 2; int y = addOne(x); int addOne(int x) { return x + 1; } 为什么不: int x …

4
可以走多快?
Go是少数应该“接近金属”运行的语言之一,也就是说,它是经过编译,静态类型化的,并且无需VM即可在本地执行代码。这应该使其相对于Java,C#等具有速度优势。但是,它似乎落后于Java(请参阅《编程语言实战》) 我假设不太成熟的编译器对此负有很大责任,但是还有其他原因吗?Go的设计中是否有固有的功能可以阻止它比Java更快地运行?我对运行时模型有一个非常简单的看法,但是由于本地代码的执行,看来至少在原则上它应该比Java运行得更快。

8
基于作用域的内存管理的缺点
我真的很喜欢基于作用域的内存管理(SBMM)或RAII,因为它在C ++社区中更为常见(令人困惑?)。据我所知,除C ++(和C)外,当今没有其他主流语言使SBMM / RAII成为主要的内存管理机制,相反,他们更喜欢使用垃圾回收(GC)。 我觉得这很令人困惑,因为 SBMM使程序更具确定性(您可以确切地说出销毁对象的时间); 在使用GC的语言中,您通常必须执行手动资源管理(例如,参见关闭Java中的文件),这在一定程度上违背了GC的目的,并且也容易出错。 堆内存还可以(非常优雅地称为imo)是作用域绑定的(请参见std::shared_ptrC ++)。 为什么SBMM没有得到更广泛的使用?它有什么缺点?

5
为什么C#在case块中没有局部作用域?
我在写这段代码: private static Expression<Func<Binding, bool>> ToExpression(BindingCriterion criterion) { switch (criterion.ChangeAction) { case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action); case BindingType.ExplicitValue: var action = (byte)ChangeAction.SetValue; return (x => x.Action == action); default: // TODO: Localize errors throw new InvalidOperationException("Invalid criterion."); } } 惊讶地发现一个编译错误: 此范围中已经定义了一个名为“ action”的局部变量 这个问题很容易解决。只是摆脱第二个var就可以了。 …

26
您希望语言设计师注意什么?[关闭]
这个问题的目的不是要整理一些编程语言功能,这些功能是您不能没有的,或者希望使用您选择的主要语言。这个问题的目的是揭示大多数语言设计师可能没有想到的语言设计的角落。因此,与其思考语言特征X,不如多加思考。 我的偏见之一,也许是有争议的,是工程学的较柔和的一面(为什么和为什么)比更为具体的一面要重要许多倍。例如,Ruby的设计目标是提高开发人员的满意度。尽管您对于是否可以交付发表意见不一,但事实上这是一个目标,这意味着语言设计中的某些选择受该哲学的影响。 请不要发布: 语法火焰大战。面对现实,我们有我们的喜好,语法很重要,因为它与语言设计有关。我只是想避免emacs与VI的本质之间的史诗般的战斗(如今,很多人对此一无所知)。 “任何不具有功能X的语言都不应该存在”类型注释。所有编程语言都存在的至少一个原因-好的或坏的。 请做后: 语言设计师似乎错过的哲学思想。 似乎实施得不好的技术概念经常会出现。请提供一个示例,说明造成疼痛的原因,以及您对如何使其功能有任何想法。 您希望的东西在平台的公共库中,但很少。一个相同的标记,通常在您希望的公共库中没有的东西。 您希望所有编程语言都能正确实现并正确定义的概念性功能(例如内置的测试/声明/合同/错误处理支持)。 我希望这将是一个有趣而有趣的话题。 编辑:澄清了我的意思是语法火焰战争。我并不是想避免对语法的所有讨论,特别是因为语法是程序语言设计的基础部分。

2
什么是第四代和第五代编程语言?还有更多吗?[关闭]
由于通常在学校/学院级别进行分类,因此流行的编程语言(C#,Java,C ++)都是第3代语言(从机器的物理部件中具有更高的抽象级别)。同样,汇编语言被分类为第二语言,机器语言被分类为第一代语言。 最初,我认为SQL应该被认为是第四代语言,因为它更抽象,并且与循环细节和描述性相去甚远。 刚才我发现有第四代和第五代语言,但是将任何编程语言或技术归为第四代或第五代语言的基础是什么? 另外,还有第六代或第七代语言吗?

7
为什么有那么多语言按价值传递?
即使是像C这样的具有显式指针操作的语言,也总是按值传递(您可以按引用传递它们,但这不是默认行为)。 这有什么好处,为什么这么多的语言通过值传递,为什么其他的语言通过引用传递?(我不确定Haskell是通过引用传递的,尽管我不确定)。

3
Java开发是否通常比C#/。NET涉及更多的子类化?
我最近开始研究Android开发。这使我回到了Java软件开发领域。我承认,上一次我使用Java时,我对OOP的了解不如现在(我认为)那么多。 在我的职业生涯中主要使用C#之后,我注意到Java和C#在继承使用方式方面的惊人差异。 在C#中,似乎在大多数情况下都可以避免继承。通常,可以通过使用.NET框架的具体类来完成当前的任务。 在Java中,从我从代码示例中收集的信息来看,Java框架似乎提供了许多接口或抽象类,这些接口或抽象类将由开发人员实现/扩展。 这似乎太大了,不能简单地归结为风格。这背后的原因是什么?我觉得直到我理解这一点,我才会写干净的Java代码。 此外,这是否仅限于Android SDK还是Java范围内的OOP方法? 或换种说法, 这两种语言(似乎鼓励)比另一种或多或少使用继承的设计是什么? 如果语言对继承的处理相同,并且假设我的观察是有效的,则意味着这与框架/库的设计有关,而与语言无关。这种设计的动机是什么?


5
为什么C#和Java使用引用相等作为'=='的默认值?
我已经思考了一段时间,为什么Java和C#(我敢肯定其他语言)默认引用相等==。 在我做的编程中(当然,这只是编程问题的一小部分),在比较对象而不是引用相等时,我几乎总是想要逻辑相等。我试图思考为什么这两种语言都走这条路线而不是颠倒它,并具有==逻辑上的相等性,并.ReferenceEquals()用于引用相等性。 显然,使用引用相等很容易实现,并且行为非常一致,但是似乎并不适合我今天看到的大多数编程实践。 我不想对尝试实现逻辑比较的问题一无所知,并且必须在每个类中都实现它。我也意识到这些语言是很久以前设计的,但总的问题仍然存在。 默认情况下,我只是缺少一些主要好处,还是默认行为应该是逻辑相等,并且默认返回引用相等,而该类不存在逻辑相等似乎合理吗?

6
为什么编程语言允许对变量和函数进行阴影/隐藏?
许多最流行的编程语言(例如C ++,Java,Python等)都具有隐藏或隐藏变量或函数的概念。当我遇到隐藏或阴影时,它们是导致难以发现错误的原因,而且我从未见过需要使用这些语言功能的情况。 在我看来,禁止隐藏和遮盖似乎更好。 有人知道这些概念的好用法吗? 更新: 我不是指封装类成员(私有/受保护的成员)。

10
为什么Math.Sqrt()是静态函数?
在讨论静态和实例方法时,我总是认为,这Sqrt()应该是数字类型的实例方法,而不是静态方法。这是为什么?显然,它对一个值有效。 // looks wrong to me var y = Math.Sqrt(x); // looks better to me var y = x.Sqrt(); 值类型显然可以具有实例方法,就像在许多语言中一样,有一个实例方法ToString()。 从评论中回答一些问题:为什么1.Sqrt()不合法?1.ToString()是。 某些语言不允许对值类型使用方法,但是某些语言可以。我正在谈论这些,包括Java,ECMAScript,C#和Python(已__str__(self)定义)。这同样适用于其他功能,例如ceil(),floor()等等。

4
为什么.equals()在Java中的类中时,为什么.compareTo()在接口中?
我想知道为什么类中有类似方法的同时.compareTo()在Comparable接口.equals中Object。在我看来,为什么.compareTo()没有这样的方法似乎是武断的Object类中。 要使用.compareTo(),您可以实现Comparable接口并根据需要实现.compareTo()方法。对于该.equals()方法,您只需在类中重写该方法,因为所有类都从Object该类继承。 我的问题是,为什么.compareTo()在您实现的接口中而不是在像这样的类中实现这样的方法Object?同样,为什么要.equals()在类中Object而不是在某些接口中实现该方法?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.