是否有任何解释性语言暴露其字节码(或任何IR)

问题描述 投票:0回答:2

我很想知道是否有任何语言可以让程序员在源代码中间“发出”字节码。为了更清楚,是否有任何解释性语言具有类似于c / c ++的asm关键字的工具?

assembly keyword bytecode inline-assembly interpreted-language
2个回答
4
投票

我不确定这是否重要,但在Forth你传统上可以做到这一点。您可以随时使用[保留编译器,并在使用]恢复编译之前操作字节代码和编译器状态。单词,直接将堆栈中的字发送到字节代码中。例如,下面的单词在堆栈上按6×7;注释用括号分隔:

: answer               ( create a word answer, start the compiler )
[                      ( stop the compiler )
6 7 *                  ( compute 6 × 7 )
' LIT                  ( push the word LIT (push literal) on the stack )
,                      ( append it to the machine code )
,                      ( append 6 × 7 to the machine code )
]                      ( resume compilation )
;                      ( finish the definition of answer )

此代码与您编写的代码相同

: answer 42 ;

它被编译为字节码

LIT 42 EXIT

单词LIT从字节代码流中取出下一个字并将其推送到堆栈,EXIT从当前字节代码函数返回。


1
投票

没有严格意义上相当于asm,因为它主要用于编译语言(并且qzxswpoi在C中是可能的,因为C编译器发出汇编代码!)。

我在我的asm论文中发表了关于MELT的描述 - 一种嵌入在GCC编译器中的翻译领域特定语言

我在那篇论文中描述了几个有助于从MELT生成C代码的特性(这是一种翻译成C或C ++的类似Lisp的语言)。

但是使用字节码解释器(例如Lua,Guile,Nim,Ocaml)的解释语言提供了将新原语添加到该字节码解释器中的钩子。通常,字节码操作类似于使用参数arg1 arg2 arg3调用原语#N。

你可以实现你的语言(一些DSL)作为C的翻译。这是DSL2011,非常有趣。然后,您将一些“天真”的编译器从您的语言编写为C.您可以考虑使用一些JIT编译库,如usual practicelibgccjit或libjit或lightning或LLVM

有些语言是asmjit,然后他们以某种方式暴露他们的字节码或一些足够好的IR。学习homoiconic(至少阅读Lisp),然后阅读SICP

注意Lisp In Small Pieces。请看Liam Proven在2018年FOSDEM上的Greenspun's tenth rule演讲。

© www.soinside.com 2019 - 2024. All rights reserved.