是否有任何解释性语言公开其字节码(或任何 IR)
Is there any interpreted language exposing its bytecode (or any IR)
我很想知道是否存在任何语言可以让程序员在源代码中间使用 'emit' 字节码。更清楚地说,是否有任何解释性语言具有类似于 c/c++ 的 asm
关键字的功能?
不能严格意义上等同于 asm
,因为它本质上是针对 编译的 语言(并且 asm
在 C 中是可能的,因为 C 编译器发出汇编代码!)。
我在 DSL2011 论文中发表了对
MELT - 嵌入在 GCC 编译器中的已翻译域特定语言
我在那篇论文中描述了几个有助于从 MELT(这是一种翻译成 C 或 C++ 的类 Lisp 语言)生成 C 代码的特征。
但是带有字节码解释器的解释语言(例如 Lua、Guile、Nim、Ocaml)提供了将新原语添加到该字节码解释器中的钩子。通常,字节码操作类似于 invoke primitive#N with arguments arg1 arg2 arg3.
您可以将您的语言(某些 DSL)实现为 C 的翻译器。这是 usual practice, and quite fun to do. You then code some "naive" compiler from your language to C. You could consider instead using some JIT-compiling library like libgccjit or LLVM or libjit or lightning or asmjit。
有些语言是 homoiconic, they are then exposing somehow their bytecode or some good enough IR. Learn Lisp (at least read SICP) then read Lisp In Small Pieces
注意 Liam Proven 在 2018 年 FOSDEM 上的 Greenspun's tenth rule. Look into The circuit less traveled 演讲。
我不确定这是否重要,但在 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
returns从当前字节码函数中取出
我很想知道是否存在任何语言可以让程序员在源代码中间使用 'emit' 字节码。更清楚地说,是否有任何解释性语言具有类似于 c/c++ 的 asm
关键字的功能?
不能严格意义上等同于 asm
,因为它本质上是针对 编译的 语言(并且 asm
在 C 中是可能的,因为 C 编译器发出汇编代码!)。
我在 DSL2011 论文中发表了对 MELT - 嵌入在 GCC 编译器中的已翻译域特定语言
我在那篇论文中描述了几个有助于从 MELT(这是一种翻译成 C 或 C++ 的类 Lisp 语言)生成 C 代码的特征。
但是带有字节码解释器的解释语言(例如 Lua、Guile、Nim、Ocaml)提供了将新原语添加到该字节码解释器中的钩子。通常,字节码操作类似于 invoke primitive#N with arguments arg1 arg2 arg3.
您可以将您的语言(某些 DSL)实现为 C 的翻译器。这是 usual practice, and quite fun to do. You then code some "naive" compiler from your language to C. You could consider instead using some JIT-compiling library like libgccjit or LLVM or libjit or lightning or asmjit。
有些语言是 homoiconic, they are then exposing somehow their bytecode or some good enough IR. Learn Lisp (at least read SICP) then read Lisp In Small Pieces
注意 Liam Proven 在 2018 年 FOSDEM 上的 Greenspun's tenth rule. Look into The circuit less traveled 演讲。
我不确定这是否重要,但在 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
returns从当前字节码函数中取出