我很想知道是否有任何语言可以让程序员在源代码中间“发出”字节码。为了更清楚,是否有任何解释性语言具有类似于c / c ++的asm
关键字的工具?
我不确定这是否重要,但在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
从当前字节代码函数返回。
没有严格意义上相当于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 practice或libgccjit或libjit或lightning或LLVM。
有些语言是asmjit,然后他们以某种方式暴露他们的字节码或一些足够好的IR。学习homoiconic(至少阅读Lisp),然后阅读SICP
注意Lisp In Small Pieces。请看Liam Proven在2018年FOSDEM上的Greenspun's tenth rule演讲。