问题标签 [language-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
7664 浏览

language-agnostic - 你最喜欢的语言如何处理深度递归?

我最近开始学习 Python,我很惊讶地发现深度递归限制为 1000(默认情况下)。如果你将它设置得足够高,大约 30000,它会像 C 一样因分段错误而崩溃。虽然,C 似乎要高得多。

(Python 人员很快指出,您始终可以将递归函数转换为迭代函数,并且它们总是更快。这是 100% 正确的。不过,这并不是我的问题所在。)

我在 Perl 中尝试了相同的实验,大约 1000 万次递归消耗了我所有的 4 gig ram,我使用 ^C 停止尝试。显然 Perl 不使用 C 堆栈,但它在递归时确实使用了大量的内存——考虑到调用函数需要做多少工作,这并不令人震惊。

我在 Pike 中尝试过,在大约 2 秒内获得了 100,000,000 次递归,这让我感到非常惊讶。我不知道它是如何做到的,但我怀疑它会将递归展平为一个迭代过程——它在执行此操作时似乎没有消耗任何额外的内存。[注意:Pike 确实可以使琐碎的情况变平,但在更复杂的情况下会出现段错误,或者我被告知。]

我使用了这些原本无用的功能:

我很好奇其他语言(例如 PHP、Ruby、Java、Lua、Ocaml、Haskell)是如何处理递归的,以及为什么它们以这种方式处理递归。此外,请注意如果函数是“尾递归”(见评论),它是否会有所不同。

0 投票
9 回答
73894 浏览

c - 为什么 switch 语句被设计为需要中断?

给定一个简单的 switch 语句

在 case 2 中没有 break 语句,意味着在 case 3 的代码中继续执行。这不是偶然的;它就是这样设计的。为什么做出这个决定?与块的自动中断语义相比,这有什么好处?理由是什么?

0 投票
22 回答
62762 浏览

language-agnostic - 异常或错误代码的约定

昨天,我与一位同事就首选的错误报告方法进行了激烈的辩论。我们主要讨论了在应用层或模块之间报告错误时使用异常或错误代码。

您使用什么规则来决定是抛出异常还是返回错误代码以进行错误报告?

0 投票
4 回答
7957 浏览

c - 'entry' 关键字发生了什么?

前几天在浏览我的白皮书时,我注意到了 C 关键字列表。 entry是该列表中的关键字之一。

它保留供将来使用。回想我的 Fortran 日子,有一个函数使用入口语句来创建第二个参数签名或函数的入口点。

这是条目最初的用途吗?还是完全不同的东西?

入口关键字的故事是什么?

0 投票
1 回答
3074 浏览

c# - 重新实现另一个接口已经继承的接口

我经常看到这样的东西:

当 B 已经继承 A 时,为什么要指定 C 实现接口 A?它会产生任何语义差异还是只是风格问题?

(许多示例之一是List<T>实现IList<T>and ICollection<T>,同时IList<T>也派生自ICollection<T>)。


更新:感谢您确认我的猜测,它不会产生任何语义差异。

我想出了一个相关的情况,显式命名已经在继承树中的接口确实会有所不同:

如果B是一个类,则C只会(重新)实现接口成员,A如果它A在“”之后显式命名:

[编辑] 我更改了问题的措辞以避免与显式实现的接口成员混淆,这将成员的使用限制在对象被转换为接口的情况下。

0 投票
6 回答
2994 浏览

c++ - C++ 不能消除 pimpl 成语吗?

据我了解,pimpl 习惯用法的存在只是因为 C++ 强制您将所有私有类成员放在标题中。如果标头仅包含公共接口,理论上,类实现的任何更改都不需要重新编译程序的其余部分。

我想知道的是为什么 C++ 的设计不是为了提供这样的便利。为什么它要求一个类的私有部分在标题中公开显示(不是双关语)?

0 投票
7 回答
693 浏览

language-features - 使用 bignums 的开销

当涉及数字时,我遇到了关于是否在我的语言中使用 bignums 作为默认数据类型的问题。我自己对此进行了评估,并将其简化为便利和舒适与性能的问题。该问题的答案取决于未得到优化的程序对性能的影响有多大。

在固定数字或整数就足够的地方使用大数字的开销有多小?在最好的实现中它可以有多小?什么样的实现可以达到最小的开销,它们会导致什么样的额外权衡?

如果我将我的语言默认设置为 bignums,我可以期望对整体语言性能产生什么样的影响?

0 投票
5 回答
926 浏览

programming-languages - 为什么在命令式或 OO 语言(如 C/C++/C#/Java...)中不存在交换/交换运算符?

我一直想知道为什么像交换两个变量的内容这样简单而基本的操作对于许多语言来说不是内置的。

它是计算机科学课程中最基本的编程练习之一;它在许多算法中大量使用(例如排序);时不时地需要它,并且必须使用临时变量或使用模板/通用函数。

它甚至是许多处理器上的基本机器指令,因此带有临时变量的标准方案将得到优化。

已经创建了许多不太明显的运算符,例如赋值运算符(例如 +=,它可能是为了反映累积的机器指令而创建的,例如 add ax,bx),或 ?? C# 中的运算符。

那么,是什么原因呢?还是它真的存在,而我总是错过它?

0 投票
15 回答
4366 浏览

class - 有没有静态鸭子类型的语言?

声明成员时可以指定接口吗?

在考虑了这个问题一段时间后,我突然想到静态鸭子类型的语言可能真的有效。为什么预定义的类不能在编译时绑定到接口?例子:

你知道任何支持这种功能的语言吗?它对 Java 或 C# 有帮助吗?它在某些方面存在根本性缺陷吗?我知道你可以继承 MyClass 并实现接口或使用 Adapter 设计模式来完成同样的事情,但这些方法看起来像是不必要的样板代码。

0 投票
1 回答
5155 浏览

initialization - C、C++、C#、Java 和 Python 中的声明、定义、初始化

这些术语在上述每种语言中的含义是什么?为什么这些语言在这方面有所不同(无论它们在哪里,如果有的话)?