问题标签 [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.
c# - 为什么我不能在 C# 中使用抽象静态方法?
最近我一直在与提供程序合作,我遇到了一个有趣的情况,我想要一个具有抽象静态方法的抽象类。我阅读了一些关于该主题的帖子,这有点道理,但是有一个很好的清晰解释吗?
file-io - 为什么许多语言中的“文件存在”方法对目录返回 true?
我知道它在 PHP 中是这样,而且我很确定它在 Java 中也是如此。我没有使用过最新版本的 .NET,所以我不会为他们说话。这似乎很尴尬,但我想知道这是否有潜在的原因。
.net - 如何为 .NET 制作并行编译器
Nikhil Kothari 的Script#很可能是很长一段时间以来我在 JavaScript 领域看到的最令人惊叹的概念之一。这个问题不是关于 JavaScript,而是关于 .NET 运行时中的语言编译。
我一直对如何使用 .NET 平台为已经具有编译器(如 C#)的语言编写编译器非常感兴趣,该编译器将从原始编译器生成单独的输出,同时允许原始编译器生成输出在相同的构建操作期间使用相同的源,同时也引用/使用其他编译器的输出。
我不完全确定我是否足够了解这个过程,可以用正确的细节提出问题,但这是我目前看到这个过程的方式,根据 Script# docs 中的图表。我考虑过许多涉及复杂语言设计和编译的事情,这些事情可能能够利用这样的概念,我对其他人对这些概念的看法很感兴趣。
--
编辑:到目前为止,感谢您的评论;您的信息本身就很有趣,我想对其进行更多研究,但我的问题实际上是关于如何编写可以同时在同一源上运行的自己的编译器使用 CLR 产生多种不同类型的(可能)相互依赖的输出。Script# 用作示例,因为它使用相同的 C# 源代码生成 JavaScript 和程序集,同时使编译的程序集与 JavaScript 协作。我很好奇在设计这种性质的东西时各种方法和理论概念是什么。
garbage-collection - 如何在没有 gc 的情况下实现闭包?
我正在设计一种语言。首先,我想决定生成什么代码。该语言将具有类似于 javascript 的词法闭包和基于原型的继承。但我不是 gc 的粉丝,并尽量避免。那么问题来了:有没有一种优雅的方式来实现闭包,而无需在堆上分配堆栈帧并将其留给垃圾收集器?
我的第一个想法:
- 使用引用计数和垃圾收集周期(我不太喜欢这个)
- 使用意大利面条堆栈(看起来非常低效)
- 将闭包的形成限制在某些上下文中,这样我就可以摆脱返回地址堆栈和本地堆栈。
我不会使用高级语言或遵循任何调用约定,所以我可以随心所欲地粉碎堆栈。
(编辑:我知道引用计数是垃圾收集的一种形式,但我在其更常见的含义中使用 gc)
c# - 为什么“catch”或“finally”范围内的“try”中没有声明变量?
在 C# 和 Java(可能还有其他语言)中,在“try”块中声明的变量不在相应的“catch”或“finally”块的范围内。例如,以下代码无法编译:
在这段代码中,catch 块中对 s 的引用会发生编译时错误,因为 s 仅在 try 块的范围内。(在 Java 中,编译错误是“s cannot be resolved”;在 C# 中,是“The name 's' does not exist in the current context”。)
这个问题的一般解决方案似乎是在 try 块之前声明变量,而不是在 try 块中:
然而,至少对我来说,(1)这感觉像是一个笨拙的解决方案,并且(2)它导致变量的范围比程序员预期的更大(方法的整个其余部分,而不是仅在try-catch-finally)。
我的问题是,这种语言设计决策背后的基本原理是什么(在 Java、C# 和/或任何其他适用的语言中)?
java - 将 java 更改为同时支持静态和动态类型是否有用?
如果 Java 允许静态和动态类型怎么办。这可能允许两全其美。IE:
- 那可能吗?
- 那会有好处吗?
- 目前是否有任何语言支持这两种语言以及它的效果如何?
这是一个更好的例子(不能使用泛型,但程序确实知道类型):
language-agnostic - 为什么默认情况下语言不会在整数溢出时引发错误?
在几种现代编程语言(包括 C++、Java 和 C#)中,该语言允许在运行时发生整数溢出,而不会引发任何类型的错误条件。
例如,考虑这个(人为的)C# 方法,它没有考虑上溢/下溢的可能性。(为简洁起见,该方法也不处理指定列表为空引用的情况。)
如果这个方法被调用如下:
方法中会发生溢出sumList()
(因为int
C#中的类型是32位有符号整数,列表中的值之和超过了最大32位有符号整数的值)。sum 变量的值为 -294967296(不是 4000000000);这很可能不是 sumList 方法的(假设的)开发人员想要的。
显然,开发人员可以使用多种技术来避免整数溢出的可能性,例如使用 Java 之类的类型BigInteger
,或者 C# 中的checked
关键字和/checked
编译器开关。
但是,我感兴趣的问题是为什么这些语言被设计为默认情况下首先允许整数溢出发生,而不是例如在运行时执行操作时引发异常,这会导致溢出。如果开发人员在编写执行可能导致溢出的算术运算的代码时忽略了溢出的可能性,这种行为似乎有助于避免错误。(这些语言可能包含类似“unchecked”关键字之类的东西,它可以指定一个允许发生整数溢出而不引发异常的块,在开发人员明确意图该行为的情况下;C# 实际上确实有 this . )
答案是否简单地归结为性能 - 语言设计者不希望他们各自的语言默认具有“慢”算术整数运算,运行时需要做额外的工作来检查每个适用的算术是否发生溢出操作——在发生意外溢出的情况下,这种性能考虑是否超过了避免“静默”故障的价值?
除了性能方面的考虑之外,这种语言设计决策还有其他原因吗?
html - 基于 XML 的 GUI 语言的“必备”功能是什么
迫不及待的总结:
我想知道的是你想用一种新的 gui 语言拥有什么。关于提到的简短答案$your_favorite_one
;我假设你的意思是,这样的语言应该看起来像$your_favorite_one
. 这些没有帮助。抵制诱惑。
我正在考虑基于 XML 的语言的用户友好性,例如 XHTML(或 HTML,尽管它们不是 XML,它们非常相似)、XUL、MXML 和其他(在这种情况下,“其他”意味着,我知道存在其他语言及其实现替代它们的原始语言,并且仅按名称提及这些语言的目的是为了让我了解我在说什么,我不想提及任何其他语言,而且,我认为没有无论如何都要尝试制作一个全面的清单。)。我对这种语言应该具有哪些功能有一些看法;
- 该语言应该是“人类可写的”,这样,普通的开发人员应该能够编写大量代码,而无需不断地参考哪些标签具有哪些属性,什么是允许的。XHTML/HTML 在这方面是最好的。
- 应该为常见任务内置良好的控件集合。XHTML/HTML 在这里很糟糕。
- 它应该能够使用类似 css 的语言进行样式设置(就功能而言)。应该很容易区分对结构和眼睛糖果的关注。这个组合整体的布局算法应该简单直观。为什么地狱浮动从布局中删除元素?为什么没有 layout:not-included 或类似的东西?
我知道我什至没有提到非常重要的设计注意事项,例如与渲染引擎和其他通用语言的交互、数据绑定、严格的 XML 合规性(定义新标签的能力?没有命名空间?)但这些都是我想要的问一下你认为对于这种语言来说什么是重要的?
language-design - Fantom 编程语言的第一印象?
这里有没有人试用过Fantom 编程语言?(双关语)。
我的第一印象:
- 我喜欢让代码在 .NET 或 Java VM 上运行的能力。
- 语法很好很干净,没有尝试任何花哨的东西。
- 我相信“库就是语言”,Fan 的开发者相信他们的 USP 就是他们的 API:
但是让一种语言同时在 Java 和 .NET 上运行是很容易的部分——事实上,这个问题有很多解决方案。困难的部分是获得可移植的 API。Fan 提供了一组抽象出 Java 和 .NET API 的 API。实际上,我们认为这是 Fan 的主要优势之一,因为它使我们有机会开发一套与 Java 和 .NET 对应部分相比更优雅且易于使用的系统 API。
还有其他想法,第一印象,利弊吗?
javascript - “this”关键字在函数中如何工作?
我刚刚在 JavaScript 中遇到了一个有趣的情况。我有一个类,其方法使用对象文字表示法定义多个对象。在这些对象中,this
正在使用指针。从程序的行为中,我推断出this
指针指的是调用方法的类,而不是由字面量创建的对象。
这似乎是任意的,尽管这是我期望它工作的方式。这是定义的行为吗?跨浏览器安全吗?是否有任何理由说明为什么它超出了“规范所说的”(例如,它是一些更广泛的设计决策/哲学的结果)?精简代码示例: