标签: language-implementation

字节码堆栈与三个地址

在设计字节码解释器时,这些天是否有关于堆栈或三种地址格式(或其他什么?)更好的共识?我正在考虑这些考虑因素:

  1. 目标语言是一种非常类似于Javascript的动态语言.

  2. 性能很重要,但目前开发速度和可移植性更是如此.

  3. 因此,实施将严格地作为解释者; 资源许可后,JIT编译器可能会更晚出现.

  4. 口译员将用C语言编写.

interpreter bytecode compilation language-implementation

8
推荐指数
3
解决办法
1244
查看次数

在使用LLVM编写JIT时,如何重用C操作码实现?

在llvm教程和示例中,编译器通过这样的调用输出LLVM IR

return Builder.CreateAdd(L, R, "addtmp");
Run Code Online (Sandbox Code Playgroud)

但许多口译员写得像这样:

switch (opcode) {
     case ADD:
             result = L + R;
             break;
     ...
Run Code Online (Sandbox Code Playgroud)

您将如何提取每个代码片段以使用LLVM进行JIT而无需在LLVM IR中重新实现每个操作码?

compiler-construction jit language-implementation llvm

7
推荐指数
1
解决办法
1362
查看次数

C:`const`关键字的行为

我被告知如果我在ANSI-C中编码以按照将要使用的变量的顺序声明,断言指针不是null并且索引在边界内,并且在使用变量之前初始化.

如果我声明一个const,我可以在一个断言和代码块之后初始化它吗?在Java中,最终初始化必须在声明时进行,但是通过ANSI-C实现它是否一致,我可以初始化const一次但不一定在声明时?

c const language-implementation keyword

7
推荐指数
1
解决办法
1万
查看次数

尼姆罗德的Brainfuck翻译

我正在用nim(在编写本文的时候仍称为nimrod),通过在语言中编写Brainfuck解释器来玩弄它.没有实现循环,我有:

import os, unsigned

const RamSize = 200

type
  TRam = array[0..RamSize, int]

var
  ram : TRam
  ip  : int = 0
  dp  : int = 0

proc readCode(path: string) =
  var
    f : TFile = open(path)
    i : int = 0
  while i < RamSize and not EndOfFile(f):
    ram[i] = ord(readChar(f))
    inc(i)

proc main(path: string) =

  readCode(path)
  while ip < RamSize:
    case chr(ram[ip])
    of '>' : inc dp
    of '<' : dec dp
    of '+' : inc …
Run Code Online (Sandbox Code Playgroud)

interpreter language-implementation brainfuck nimrod nim-lang

7
推荐指数
1
解决办法
561
查看次数

异步回调是如何实现的?

所有语言如何实现异步回调?

例如,在C++中,需要一个"监视线程"来启动std::async.如果它在主线程中启动,则必须等待回调.

std::thread t{[]{std::async(callback_function).get();}}.detach();
Run Code Online (Sandbox Code Playgroud)

VS

std::async(callback_function).get(); //Main thread will have to wait
Run Code Online (Sandbox Code Playgroud)

那么JavaScript中的异步回调呢?在JS中大量使用回调... V8如何实现它们?V8是否会创建大量线程来监听它们并在收到消息时执行回调?或者它是否使用一个线程来监听所有回调并保持刷新?

例如,

setInterval(function(){},1000);
setInterval(function(){},2000);
Run Code Online (Sandbox Code Playgroud)

V8是否创建了2个线程并监视每个回调状态,或者它有一个池来监视所有回调?

asynchronous v8 language-implementation

7
推荐指数
1
解决办法
1640
查看次数

Forth LEAVE ... LOOP 是如何实现的,因为事先不知道 LEAVE 的数量?

LOOP 一词被描述为“解析所有未解析的 LEAVE 事件的目的地”。(强调我的)

与 IF ... ELSE ... THEN 的前向引用数始终为 1 不同,LOOP 对 LEAVE 的数量没有限制。那怎么实施呢?

我想到的一种方法是始终将 LEAVE 的数量保持在堆栈顶部。每个 LEAVE 都会增加此计数器并将其置于其下。LOOP 从顶部读取计数器并解析那么多引用。但这似乎是一个便宜的伎俩。

真正的 Forth 系统如何实现这种循环?我不需要 teh codez(将 Forth 作为学习经验实施),只需要概念。

language-implementation forth

7
推荐指数
1
解决办法
364
查看次数

为什么在将Python传递给函数时,可以省略Python中生成器的周围括号?

我只是用不同的语法在Python中进行实验,以便将生成器作为参数传递给函数,我意识到虽然我一直这样做,

>>> sum((j for j in xrange(5)))
10
Run Code Online (Sandbox Code Playgroud)

这也有效:

>>> sum(j for j in xrange(5))
10
Run Code Online (Sandbox Code Playgroud)

这是在Linux上的Python 2.6.6上测试的.引擎盖下发生了什么?它只是语法糖吗?毕竟,通常一个解包的生成器是解释器无法解读的:

>>> j for j in xrange(5)
  File "<stdin>", line 1
    j for j in xrange(5)
        ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

python syntax language-implementation generator

6
推荐指数
1
解决办法
961
查看次数

'yield'关键字是一个语法糖吗?它的实施是什么?

可能重复:
yield语句实现

我见过msdn docs,它说:

yield关键字向编译器发出信号,表明它出现的方法是迭代器块.编译器生成一个类来实现迭代器块中表达的行为.在迭代器块中,yield关键字与return关键字一起使用,以向枚举器对象提供值.

所以它意味着yield关键字是一个语法糖,编译器完成了生成迭代器的繁重工作.(我对么 ?)

那么这个语法糖的生成实现代码是什么.

c# language-implementation yield-keyword

6
推荐指数
1
解决办法
854
查看次数

G机器,(非)严格的背景 - 为什么案例表达需要特殊处理

我目前正在阅读实现函数式语言: SPJ的一个教程和我将在这个问题中引用的(子)章节是3.8.7(第136页).

第一个注意事项是,遵循本教程的读者尚未实现ECase表达式的C方案编译(即出现在非严格上下文中的表达式).
提出的解决方案是转换Core程序,以便ECase表达式根本不会出现在非严格的上下文中.具体来说,每次这样的事件都会创建一个新的超级组合器,其中只有一个变量,该变量的主体对应于原始的ECase表达式,并且该事件本身会被对该超级组合器的调用所替换.
下面我将介绍一个(略微修改过的)1的转换示例

t a b = Pack{2,1} ;
f x = Pack{2,2} (case t x 7 6 of
    <1> -> 1;
    <2> -> 2) Pack{1,0} ;
main = f 3

== transformed into ==>

t a b = Pack{2,1} ;
f x = Pack{2,2} ($Case1 (t x 7 6)) Pack{1,0} ;
$Case1 x = case x of
    <1> -> 1;
    <2> -> 2 ;
main = f 3
Run Code Online (Sandbox Code Playgroud)

我实现了这个解决方案,它就像魅力一样,就是输出Pack{2,2} 2 Pack{1,0} …

haskell functional-programming compilation language-implementation lazy-evaluation

6
推荐指数
1
解决办法
95
查看次数

为什么 std::same_as 以如此奇怪的方式实现?

cppref给出了可能的实现std::same_as

namespace detail {
    template<class T, class U>
    concept SameHelper = std::is_same_v<T, U>;
}

template<class T, class U>
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;
Run Code Online (Sandbox Code Playgroud)

为什么不实现如下:

template<class T, class U>
concept same_as = std::is_same_v<T, U> && std::is_same_v<U, T>;
Run Code Online (Sandbox Code Playgroud)

甚至更短:

template<class T, class U>
concept same_as = std::is_same_v<T, U>;
Run Code Online (Sandbox Code Playgroud)

c++ standards language-implementation c++-concepts c++20

6
推荐指数
1
解决办法
1097
查看次数