问题标签 [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.

0 投票
1 回答
477 浏览

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
0 投票
1 回答
70 浏览

language-design - 在底层语言中实现脚本语言的核心方法的优缺点

背景:我正在编写一个脚本语言解释器来测试一些实验性语言的想法。我要为内置类型编写核心标准方法(函数)集。其中一些方法需要直接与底层数据结构交互,并且必须使用底层语言编写(在我的例子中是 Haskell,但这对于这个问题并不重要)。如果我选择,其他可以用脚本语言本身编写。

问题:用底层语言或语言本身实现核心库函数的优点和缺点是什么?

示例:我的语言包含一个内置类型Arrays,其工作方式与您认为的一样——有序数据组合在一起。一个Array实例(这是一种面向对象语言)具有方法inject和。我已经在 Haskell 中实现了。我也可以用 Haskell 编写和,或者我可以使用我的语言编写它们。例如:mapeachinjectmapeachinject

我想知道每种选择的优缺点是什么?

0 投票
1 回答
363 浏览

python - 如何找出我正在使用的 Python 实现?

有没有一种简单的方法,比如一个命令,可以让我找到我正在使用的 Python 实现(CPython、JPython 等)?

0 投票
1 回答
156 浏览

python - 从对象继承的类中 super() 和 __init__() 的行为是什么?

使用带有新类样式的python 2.7,如果我的类继承自Object类,那么行为是super(ClassName, self).__init__()什么?我的意思是,幕后发生了什么?如果我省略它有什么区别?

上面的一个例子:

如果我省略了super,幕后会发生什么?

谢谢。

0 投票
1 回答
35 浏览

interpreted-language - 解释语言是否适合解释器的实现语言?

用 Python 这样的解释语言为新语言编写解释器在各个方面(例如速度)都是一个坏主意。

0 投票
1 回答
1654 浏览

javascript - 实现 JavaScript 内部方法的源代码

有没有办法查看 JavaScript 方法背后的代码?不是网站的 .html 或 .js 文件中的 javascript 方法,而是 JavaScript 的内部方法。

例如:

  • 如何查看 JavaScript 是如何计算offsetTop元素的?
0 投票
1 回答
446 浏览

java - java中AtomicMarkableReference的“get”方法实现背后的原因是什么?

在 java 中,AtomicMarkableReference可用于以原子方式更新对象引用以及标记位。

javadoc指出:

实现说明:此实现通过创建表示“盒装”[reference, boolean] 对的内部对象来维护可标记引用。

根据该类的 java 8 源代码中可以看到的内容,这是正确的:

类的get方法的设计背后有原因吗?

使用这种布尔数组有什么意义(而不是返回一对值)?是并发驱动的选择吗?或者可能是遗留代码?

0 投票
3 回答
8676 浏览

python - 为什么 Python 对可以嵌套的静态块的数量有限制?

Python 中的静态嵌套块的数量限制为 20。也就是说,嵌套 19 个for循环就可以了(虽然非常耗时;O(n^19)太疯狂了),但是嵌套 20 个会失败,并出现:

有这样一个限制的根本原因是什么?有没有办法提高限额?

0 投票
1 回答
573 浏览

c++ - 虚拟继承的内部机制

C++ 中的示例代码:

这是钻石问题的典型代码(解决方案)。我知道为什么使用 virtual 关键字。但是我不知道编译器处理这个问题的内部机制。现在我遇到了关于上述机制的两种不同的理论,如下所述。

  1. 当使用 virtual 关键字继承一个类时,编译器会在派生类中添加一个虚拟基指针。我检查了派生类的大小,是的,它包括附加指针的大小。但是我不知道在上面的示例中,当类 A 的成员在类 D 中引用时它指向哪里以及它是如何工作的。

  2. 对于每个构造函数,编译器为程序员提供的每个定义创建两个版本。从这个链接知道, 例如在上面的代码中。编译器会生成 2 个版本的 C 构造函数

    以及两个不同版本的构造函数 B

    因此,当构建 D 时,编译器将生成以下任一代码

    以确保只创建 A 的一个实例,从而避免 A 的重复副本。

请帮助我了解内部机制。

0 投票
1 回答
277 浏览

javascript - 如何可靠地检测 JavaScript 中的奇异对象?

有什么方法可以可靠地确定 JavaScript 对象是否是外来对象类型,如果是,它的类型是什么?

通过“异国情调”,我的意思是(就这个问题而言)任何无法使用Object.create. 这包括ES2016 规范定义为奇异的所有内容(任何“没有一个或多个基本内部方法的默认行为的对象”)以及由ObjectCreate规范方法创建的具有非空internalSlotsList的任何内容,以及任何类型的宿主对象。

通过“可靠”,我的意思是不会被对象添加/删除属性、使用Object.createObject.setPrototypeOf赋予对象意外原型、修改对象的@@toStringTag 或构造函数的@@hasInstance 所欺骗。这对于需要正确处理任意用户数据的库函数很重要。

(这尤其意味着,instanceofandObject.prototype.isPrototypeOf()没有用。例如:var a = Object.create(Array.prototype)制作一个看起来和闻起来像数组的东西——<code>a instanceof Array === true 并且a.pusha.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 的方法仍然有用。