问题标签 [language-implementation]
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.
language-design - 任何功能无法访问全局范围的语言?
我一直在用 BASIC 方言写一点,它有用户定义的函数,只能访问局部变量;例如,下面的代码:
将打印一个空行,因为S$
在 . 的上下文中没有值someFunction$
。
问题:是否有其他常用语言具有无法从函数内部访问的全局范围?
asynchronous - 异步回调是如何实现的?
所有语言如何实现异步回调?
例如在 C++ 中,需要有一个“监控线程”来启动一个std::async
. 如果它在主线程中启动,它必须等待回调。
对比
JavaScript 中的异步回调呢?在 JS 中,回调被大量使用...... V8 如何实现它们?V8 是否创建了很多线程来监听它们并在收到消息时执行回调?还是使用一个线程监听所有回调并保持刷新?
例如,
V8 是创建 2 个线程并监控每个回调状态,还是有一个池来监控所有回调?
javascript - 实现定义标识符的 JavaScript 约定
在 C 语言中,如果编译器想要提供实现定义的标识符(语言扩展、内在函数、伪函数和伪宏,基本上任何不是语言标准的保留关键字但也不是常规函数的东西),约定是名称前加下划线;可以理解,代码不应将此类名称用于正常目的。
JavaScript中有等效的约定吗?或者,如果 JavaScript 编译器想要为特殊目的提供实现定义的标识符,并避免与代码中通常使用的标识符发生冲突,那么最好的方法是什么?
embedded - Osek 实现语言
在 OIL 文件中,始终包含一个名为“Implementation.oil”的文件。我找不到任何解释这个文件做什么的东西!她就是一个例子:`
javascript - 如果我不指定字符串,Angular 怎么知道要注入什么?
考虑这段代码:
我知道,为了避免在缩小 JS 时出现注入问题,应该使用 Dependency Injection 的数组形式:
但是 Angular 在第一种情况下(非数组)如何知道要注入什么?如果我使用.controller('MainCtrl', function (scop)
而不是$scope
怎么办?它会解析我的 JS 并查找与其某些提供程序匹配的函数参数名称吗?
c# - 在另一个 DynamicExpression 的后备中创建 DynamicExpression 是否安全?
这个标题是非常不言自明的。
澄清一下:我已经使用动态表达式构建了一个非常完整的语言基础结构,并认为尝试输出程序集会很酷。任何有这方面经验的人都知道“LambdaExpression.CompileToMethod”需要将动态表达式转换为 CallSite<> 并将其分配给您的表达式稍后可以访问的某个私有字段。
我在一些测试项目中成功地做到了这一点,但在我去重构所有(我的意思是所有)我的代码(再次)之前,我需要知道我是否必须对在回退过程中创建的活页夹实例做同样的事情。
此外,在编译为方法时,使用“Expression.Constant”有其局限性。该限制是否也存在于活页夹内部,或者被认为是“运行时”和“安全”。
python - Python3解释器中方法和类的位置
我们的教授今天告诉我们,我们可以构建一个迭代器,例如
当我们使用它时,如(for i in iteratorExample),解释器将调用 __iter__(self) 和 __next__(self) 方法。我的问题是:
- 如果我打开 C:\Python 文件夹 - 我在哪里可以看到调用这些方法的代码?
- 在 python 文件夹中,我在哪里可以看到其他内置方法的代码(如 len() 或 int()?
haskell - G-machine,(非)严格上下文 - 为什么 case 表达式需要特殊处理
我目前正在阅读实现功能语言:SPJ 的教程,我将在这个问题中提到的(子)章节是 3.8.7(第 136 页)。
首先要注意的是,阅读本教程的读者尚未实现 ECase 表达式的 C 方案编译(即出现在非严格上下文中的表达式)。
提出的解决方案是转换核心程序,以便 ECase 表达式根本不会出现在非严格上下文中。具体来说,每个这样的事件都会创建一个新的超级组合子,其中只有一个变量,该变量的主体对应于原始 ECase 表达式,并且该事件本身被对该超级组合子的调用替换。下面我介绍一个从1
开始的这种转换的(稍微修改的)示例
我实现了这个解决方案,它就像魅力一样工作,也就是说,输出是Pack{2,2} 2 Pack{1,0}
.
然而,我不明白的是——为什么要这么麻烦?我希望不只是我,但我解决问题的第一个想法是在 C 方案中实现 ECase 表达式的编译。我通过模仿 E 方案中的编译规则来做到这一点(1中的第 134 页,但为了完整起见,我在这里展示了该规则):所以我使用了
并写道
我补充说[Eval]
,因为Casejump
需要一个弱头范式(WHNF)的堆栈顶部的参数,而 C 方案不能保证这一点,而不是 E 方案。
但随后输出变为神秘:Pack{2,2} 2 6
.
当我使用与 E 方案相同的规则时,这同样适用,即
所以我想我的“明显”解决方案本质上是错误的——我可以从输出中看到这一点。但是我很难就为什么这种方法注定会失败提出正式的论点。
有人可以向我提供这样的论点/证据或一些直觉,说明为什么天真的方法不起作用吗?
java - Java 的包含的 TreeSet 实现(源代码)缺失
当我打开 TreeSet 类的源代码时,有以下代码:
m 是一个 NavigableMap,它是一个接口。那么实施在哪里呢?它绝对不在 TreeSet 本身。
c++ - 堆栈在哪里实现?
C++ 允许程序员使用堆栈分配的内存或堆上的动态内存。我对堆栈的操作方式非常清楚(我在 C++ 中创建了堆栈作为练习),但仍然对“堆栈”的定义方式和位置感到好奇。
“堆栈”是语言的特性、操作系统的特性还是硬件的特性?我有一个模糊的想法,从操作系统的角度来看,每个堆栈都是与许多活动线程进程中的每一个相关的东西。这表明它是在软件级别实现的,而不是 CPU 或主板的硬连线功能。
我想,在 C++ 的情况下,编译器可能已经将堆栈的实现插入到每个二进制文件中。或者操作系统将它自己的堆栈实现应用到每个正在运行的进程中?这是如何定义的?
我在这里发现了一个类似的问题,但我没有看到它得到回答,我希望更直接地重新陈述这个问题。