问题标签 [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 回答
25606 浏览

boolean - 布尔真 - 正 1 或负 1?

我正在设计一种语言,并试图决定true应该是 0x01 还是 0xFF。显然,所有非零值都将转换为 true,但我正在尝试确定确切的内部表示。

每种选择的优缺点是什么?

0 投票
17 回答
24473 浏览

c++ - 为什么引用在 C++ 中不可重新安装

C++ 引用有两个属性:

  • 它们总是指向同一个对象。
  • 它们不能为 0。

指针则相反:

  • 它们可以指向不同的对象。
  • 它们可以为 0。

为什么 C++ 中没有“不可为空、可重新定位的引用或指针”?我想不出一个很好的理由为什么引用不应该是可重新安装的。

编辑: 这个问题经常出现,因为当我想确保“关联”(我在这里避免使用“引用”或“指针”这些词)永远不会无效时,我通常会使用引用。

我想我从来没有想过“很棒,这个 ref 总是指同一个对象”。如果引用是可重新安装的,仍然可以得到如下的当前行为:

这已经是合法的 C++,但毫无意义。

我这样重申我的问题: “'引用对象'设计背后的基本原理是什么?为什么认为引用始终是同一个对象而不是仅在声明为 const 时才被认为是有用的?”

干杯,菲利克斯

0 投票
6 回答
22762 浏览

c# - 为什么 C# foreach 语句中的迭代变量是只读的?

据我了解,C# 的 foreach 迭代变量是不可变的。

这意味着我不能像这样修改迭代器:

我不能直接修改迭代器变量,而是必须使用 for 循环

来自 C++ 背景,我认为 foreach 可以替代 for 循环。但是由于上述限制,我通常会回退到使用 for 循环。

我很好奇,使迭代器不可变的原因是什么?


编辑:

这个问题更多的是好奇问题,而不是编码问题。我很欣赏编码答案,但我不能将它们标记为答案。

另外,上面的例子过于简单化了。这是我想要做的 C++ 示例:

我不能在 C# 的 foreach 中执行上述操作,因为迭代器 i 是不可变的。我认为(如果我错了,请纠正我),这是特定于语言中 foreach 的设计。

我对为什么 foreach 迭代器是不可变的很感兴趣。

0 投票
5 回答
616 浏览

c - 为什么 C 的语言设计者会这样做类型等价?

我正在学习 C 并且正在阅读关于类型等价的内容。

我很好奇,有没有人有意见,为什么他们对数组和指针使用结构等价,但对结构和联合使用声明等价?

为什么会有差距?使用结构/联合进行声明等效以及对其他所有内容进行结构等效有什么好处?

0 投票
3 回答
11273 浏览

sql - 为什么 ORACLE 不允许在命令中使用连续的换行符?

我写:

并将其保存到文件“a.sql”中。

如果我随后在 SQL*Plus 命令提示符中键入“@a”来运行它,它会告诉我以“ssn”开头的行未被识别为命令,并被忽略。

据我所知,如果 sqlplus 连续遇到多个换行符,它似乎会终止命令。这是一个准确的说法吗?如果是这样,有谁知道这是否有必要/为什么选择这样做?

0 投票
4 回答
473 浏览

templates - 用编程语言实现模板的最佳方法是什么?

我正在设计一种高级的、面向对象的、垃圾收集的编程语言,但我在如何制作模板方面遇到了问题。我计划创建一个类似于 .NET 或 JVM 的 VM 类型系统(但它会在底层使用 LLVM)。问题是我想拥有强大的、类似 C++ 的模板,但具有动态链接(因此我可以替换模板库而无需重新编译使用它的所有内容)。我希望能够在没有模板定义的情况下编译源文件。应尽量减少 JIT 时的代码生成。

以下是我正在考虑的选项:

  • 具有静态链接到每个编译单元的模板库的概念。模板库本质上就像一个 AST,在模板实例化时需要填充空白。这样做的问题是,如果使用不同版本的模板库编译两个文件,它们可能不兼容,或者如果模板库有错误,则所有内容都必须重新编译。这就是 C++ 的做法。
  • 具有在 JIT 时间链接的模板库。这解决了大部分问题,但要求 IR 本质上是 AST。我希望 IR 的水平要低得多。这需要更多的 JIT 工作。
  • 拥有类似 C# 的懦弱泛型,只有类型作为参数。这是相当有限的,但允许简单的代码生成和动态链接。

还有其他我没有想到的好方法吗?我倾向于第一个选项,但我真的不喜欢任何选项。你认为最好的选择是什么?

0 投票
3 回答
1375 浏览

c - 如何将基于 C 的语言添加到 GCC

如果我想修改或添加我自己的 C 扩展,并将它们添加到 GCC C 编译器,我需要做什么?我不想提议对语言进行更改,我想知道 C 编译器实际上是如何工作的。

我查看了 GCC 的源代码,它看起来好像 Objective-C 被实现为一个简单的解析器,它生成引用修改后的运行时库的代码,然后对于基于 C 的所有内容,它使用常规C 编译器。我没有深入研究它,所以我可能不在正确的轨道上。

例如,我想在 Objective-C 中添加我自己的关键字,只是为了好玩。我想添加一些看起来很容易实现的东西,比如也许@assert. 我想要的只是@assert调用一个我将添加到 Objective-C 运行时的函数:

显然,无论如何我都可以将其实现为函数调用和宏,但我想了解 C 源代码的解析和编译阶段,也许我可以将自己的扩展添加到语言中以供自己使用。

我看过的源代码一直是指“树”,并且有很多很多宏可以执行操作或从这些树中获取信息。

是否有任何文档可以深入解释这类事情?

0 投票
11 回答
11493 浏览

c++ - 为什么空表达式在 C/C++ 中是合法的?

0 投票
2 回答
454 浏览

language-design - 通常的算术转换——一套更好的规则?

考虑以下代码:

在 C++、C#、D 和 Java 中,两个函数调用都解析为“int”重载……我已经意识到这是“规范中的”,但为什么语言会这样设计呢?我正在寻找更深层的原因。

对我来说,结果是能够表示两个操作数的所有可能值的最小类型是有意义的,例如:

这将消除不方便的代码,例如short s3 = (short)(s1 + s2),以及 IMO 更加直观和易于理解。

这是 C 时代遗留下来的遗产,还是当前行为有更好的理由?

0 投票
7 回答
1693 浏览

c++ - 为什么 C/C++ 中没有 ^^ 运算符?

&&&|||。为什么^没有^^

我知道它不会短路,但它会有不同的语义。在 C 中,true实际上是任何非零值。按位异或并不总是与逻辑异或相同:

既然你不能总是依赖一个真正的价值是1or -1,那么^^运算符不是很有帮助吗?我经常不得不做这样奇怪的事情: