我有一些语言,我一直在建立作为口译员.当我准备好采取"下一步"时,哪些选项最适合非本地编译格式...每种格式的优缺点是什么?
我一直在寻找编译CLR或LLVM,并考虑C-midcompile几次,但我不完全确定.
我希望能够移植的一些功能如下:
REPL - 我正在构建的语言之一支持运行时的块级评估.
强大的宏 - 我正在构建的语言之一需要能够在标记化之前单独过滤代码,并且在标记化和解析之间的中间步骤中.
好吧,不是真的"少数",只有两个.我想我可以将我的语言支持的任何其他功能移植到"任何东西".
什么是我最好的选择,以及他们的优点/缺点?
代码生成是我的事:-)
评论几个选项:
CLR:
亲:工业支持
Con:你必须完全买入他们的打字系统; 根据你想要对类型做什么,这可能无关紧要
Con:只有Windows平台才是真正的黄金时段质量
LLVM:
专业:热情的用户社区与魅力领袖
亲:Apple的认真支持
亲:许多有趣的性能改进
Con:有点复杂的界面
Con:工程中的漏洞历史; 随着LLVM的成熟,期望通过增加接口的复杂性来堵塞工程中的漏洞
C -
Pro:target是一种实际的书面语言,而不是API; 您可以轻松地检查,调试和编辑C--代码
亲:设计相当成熟,相当干净
Pro:支持准确的垃圾收集
专业:大多数用户报告它很容易使用
Con:非常小的开发团队
Con:截至2009年初,仅支持三种硬件平台(x86,PPC,ARM)
Con:不附带垃圾收集器
Con:项目没有前途
C作为目标语言
亲:看起来很容易
骗局:几乎不可能获得不错的表现
Con:从长远来看会让你疯狂; 询问那些尝试使用这种技术编译Haskell,ML,Modula-3,Scheme等的人.在某些时候,这些人中的每一个都放弃并构建了自己的本机代码生成器.
总结:除C之外的任何事情都是合理的选择.为了实现灵活性,质量和预期寿命的最佳组合,我可能会推荐LLVM.
完全披露:我隶属于C--项目.
PRO /缺点:
CLR:
亲:CLR环境随时可用; 很多要绑定的东西
con:绑定到CLR(;-); 一些系统的目标很难或不可能(嵌入式,大型机等等.CLR impl.在非MS系统上可能不太成熟)
LLVM:
亲:独立于MS.
con:针对某些系统可能涉及移植LLVM(?); 连接到DOT-net,Java等可能很麻烦(可能需要FFI)
C作为目标语言:
亲:几乎所有目标都可能; 简单的代码生成
con:你必须实现一些VM的东西作为运行时库(GC,dynload,dyn编译等); C中很难做到一些事情(延续,回溯,堆栈跟踪,异常); 有些事情很难在C中有效且可移植(GC,动态类型,堆栈布局依赖).
Java ByteCode作为目标:
亲:可能是最大的可能目标平台(甚至移动电话和嵌入式东西); 周围有很多现有的工具; 轻松连接现有的库
con:有些东西难以实现或难以有效实现(动态类型,延续,回溯)
综上所述,我认为针对Java ByteCode可能最适合您.
编辑:实际上是一个评论的答案,但300chars是不够的.
JByteCode iffy - 我同意(作为Smalltalker,JBytecode对我来说太有限了).
从虚拟机的角度来看,我认为作为JVM可以获得相对广泛的性能,从纯慢字节码解释器到高端复杂的JITting VM(IBM).我想,CLR VM将迎头赶上,因为MS迟早会窃取并整合所有创新,并且发布加速动态翻译的技术(例如,阅读自我论文).LLVM的进展可能会慢一点,但谁知道呢.使用C,您将从免费的更好的编译器中受益,但是像C作为目标很难实现动态重新翻译等.我自己的系统使用预编译和动态编译的代码(在一个内存空间中具有所有:慢字节码解释器,JITter和预编译的静态C代码)的混合.