问题标签 [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.
c++ - Creating FFI between C and my language
Let's say that I have implemented a programming language, (we'll call it A for now). A is pretty similiar to C.
I want my users to be able to access functions and data structures from already-existing C libraries. Is this possible? If it is, how would a naive implementation look ?
A
- is implemented in C++
- compiles to machine code
- needs to access closed-source C libraries
language-design - 在底层语言中实现脚本语言的核心方法的优缺点
背景:我正在编写一个脚本语言解释器来测试一些实验性语言的想法。我要为内置类型编写核心标准方法(函数)集。其中一些方法需要直接与底层数据结构交互,并且必须使用底层语言编写(在我的例子中是 Haskell,但这对于这个问题并不重要)。如果我选择,其他可以用脚本语言本身编写。
问题:用底层语言或语言本身实现核心库函数的优点和缺点是什么?
示例:我的语言包含一个内置类型Array
s,其工作方式与您认为的一样——有序数据组合在一起。一个Array
实例(这是一种面向对象语言)具有方法inject
和。我已经在 Haskell 中实现了。我也可以用 Haskell 编写和,或者我可以使用我的语言编写它们。例如:map
each
inject
map
each
inject
我想知道每种选择的优缺点是什么?
python - 如何找出我正在使用的 Python 实现?
有没有一种简单的方法,比如一个命令,可以让我找到我正在使用的 Python 实现(CPython、JPython 等)?
python - 从对象继承的类中 super() 和 __init__() 的行为是什么?
使用带有新类样式的python 2.7,如果我的类继承自Object
类,那么行为是super(ClassName, self).__init__()
什么?我的意思是,幕后发生了什么?如果我省略它有什么区别?
上面的一个例子:
如果我省略了super
,幕后会发生什么?
谢谢。
interpreted-language - 解释语言是否适合解释器的实现语言?
用 Python 这样的解释语言为新语言编写解释器在各个方面(例如速度)都是一个坏主意。
javascript - 实现 JavaScript 内部方法的源代码
有没有办法查看 JavaScript 方法背后的代码?不是网站的 .html 或 .js 文件中的 javascript 方法,而是 JavaScript 的内部方法。
例如:
- 如何查看 JavaScript 是如何计算
offsetTop
元素的?
python - 为什么 Python 对可以嵌套的静态块的数量有限制?
Python 中的静态嵌套块的数量限制为 20。也就是说,嵌套 19 个for
循环就可以了(虽然非常耗时;O(n^19)
太疯狂了),但是嵌套 20 个会失败,并出现:
有这样一个限制的根本原因是什么?有没有办法提高限额?
c++ - 虚拟继承的内部机制
C++ 中的示例代码:
这是钻石问题的典型代码(解决方案)。我知道为什么使用 virtual 关键字。但是我不知道编译器处理这个问题的内部机制。现在我遇到了关于上述机制的两种不同的理论,如下所述。
当使用 virtual 关键字继承一个类时,编译器会在派生类中添加一个虚拟基指针。我检查了派生类的大小,是的,它包括附加指针的大小。但是我不知道在上面的示例中,当类 A 的成员在类 D 中引用时它指向哪里以及它是如何工作的。
对于每个构造函数,编译器为程序员提供的每个定义创建两个版本。从这个链接知道, 例如在上面的代码中。编译器会生成 2 个版本的 C 构造函数
以及两个不同版本的构造函数 B
因此,当构建 D 时,编译器将生成以下任一代码
以确保只创建 A 的一个实例,从而避免 A 的重复副本。
请帮助我了解内部机制。
javascript - 如何可靠地检测 JavaScript 中的奇异对象?
有什么方法可以可靠地确定 JavaScript 对象是否是外来对象类型,如果是,它的类型是什么?
通过“异国情调”,我的意思是(就这个问题而言)任何无法使用Object.create
. 这包括ES2016 规范定义为奇异的所有内容(任何“没有一个或多个基本内部方法的默认行为的对象”)以及由ObjectCreate规范方法创建的具有非空internalSlotsList的任何内容,以及任何类型的宿主对象。
通过“可靠”,我的意思是不会被对象添加/删除属性、使用Object.create
或Object.setPrototypeOf
赋予对象意外原型、修改对象的@@toStringTag 或构造函数的@@hasInstance 所欺骗。这对于需要正确处理任意用户数据的库函数很重要。
(这尤其意味着,instanceof
andObject.prototype.isPrototypeOf()
没有用。例如:var a = Object.create(Array.prototype)
制作一个看起来和闻起来像数组的东西——<code>a instanceof Array === true 并且a.push
按a.pop
预期工作——但缺乏神奇的行为.length
并且是很容易证明它不是一个真正的数组异国情调:Array.isArray(a) === false
。)
通过“类型”,我的意思大致是 ECMAScript 5.1 语言规范所指的 [[Class]] - 即,将具有特殊 [[DefineOwnProperty]] 行为的 Array 实例与普通对象分开的质量。
例子
有些情况很简单:
- 可以使用
Array.isArray(a)
. - 可以使用 可靠地检测函数
typeof f === 'function'
。- 但是有什么方法可以检测一个函数是绑定函数、本机函数还是闭包?
- 通过仔细应用原型对象中的方法,可以可靠地检测到其他一些奇异对象,例如
- 可以通过调用来检测集合
Set.prototype.has.apply(s, undefined)
,并查看它是否抛出 TypeError。
- 可以通过调用来检测集合
有没有一般的方法来进行这样的检测?
尤其是:
- 有什么通用的方法可以确定一个物体是普通的还是异国情调的?
- 有什么通用的方法来确定奇异物体的类型吗?
我注意到它Object.toString.apply(o)
曾经为此目的工作得相当好:尽管在许多浏览器中它会谎报宿主对象的类型,但对于 ES 5.1 规范中定义的所有类型,它可以可靠地告诉你对象是否是平原[object Object]
或异国情调[object <Type>]
。然而,在 ES6 及更高版本中,修改@@toStringTag
会破坏这个测试。
一种适用于任何符合 JS 实现的检测方法将是理想的,但特定于 Node.js 的方法仍然有用。