Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C/C和x2B之间犹豫+;,OCaml和F#用于我的编译器_C++_C_F#_Ocaml_Llvm - Fatal编程技术网

C++ 在C/C和x2B之间犹豫+;,OCaml和F#用于我的编译器

C++ 在C/C和x2B之间犹豫+;,OCaml和F#用于我的编译器,c++,c,f#,ocaml,llvm,C++,C,F#,Ocaml,Llvm,我想开始一个小编译器的工作,并建立它,我犹豫了几个不同的语言 我的要求很简单,我希望能够发出LLVM-IR代码,因为我有一个LLVM后端,我想重用它来针对特定的平台 所以现在我有以下选择: 使用OCaml和LLVM绑定—高效的LLVM随OCaml绑定一起提供,但是OCaml(IDE,支持)的编码体验不是最好的 使用C/C++和LLVM绑定——这是我想说的最明显的方式,但我想使用函数式语言,因为这个主题对我来说是新的,我想学习一些新的东西 使用F#-我喜欢这种语言,但是没有正式的LLVM绑定。所以

我想开始一个小编译器的工作,并建立它,我犹豫了几个不同的语言

我的要求很简单,我希望能够发出LLVM-IR代码,因为我有一个LLVM后端,我想重用它来针对特定的平台

所以现在我有以下选择:

  • 使用OCaml和LLVM绑定—高效的LLVM随OCaml绑定一起提供,但是OCaml(IDE,支持)的编码体验不是最好的

  • 使用C/C++和LLVM绑定——这是我想说的最明显的方式,但我想使用函数式语言,因为这个主题对我来说是新的,我想学习一些新的东西

  • 使用F#-我喜欢这种语言,但是没有正式的LLVM绑定。所以我想我可以通过使用System.Reflection.Emit来做同样的事情。尽管这里似乎有一项针对LLVM的F#绑定的计划-


  • <>我想知道你的想法。

    < P>程序设计是C++的一个真正的弱点。你的大部分精力都会花在操纵树木上。在这种情况下,OCaml和F#的核心优势在于模式匹配优于联合类型(而不是函数式编程),这正是因为这使得操作树变得更加容易。从历史上看,OCaml和F#来自ML语言家族,是专门为这个应用领域培育的

    我通过其OCaml绑定使用LLVM进行编写,其中包括对本机代码的独立编译和JIT编译、支持多核的垃圾收集、外部函数接口、尾部调用优化和许多其他功能。这次经历非常愉快。我唯一的建议是跟踪哪些LLVM特性经过了尝试和测试,哪些是实验性的,因为您不想依赖任何实验性的东西(例如,我编写HLVM时的GC支持)

    您可以轻松地使用
    System.Reflection.Emit
    从F#生成CIL,但这样做显然无法利用LLVM后端,当然,您可以免费获得垃圾收集器。NET绑定到LLVM是一个选项。我不熟悉您引用的内容,但编写到LLVM的C API的绑定相对简单。但是,我不确定LLVM在Windows平台上的支持程度


    关于OCaml和F#,两者都有优点和缺点,但我要说的是,在这种情况下,总体差异相对较小。在OCaml中,由于缺乏通用打印,因此编写函数来打印大联合类型的值是很乏味的,尽管这可以使用一些第三方宏实现自动化。F#提供通用打印,但缺少一些有用的功能,如多态变体和结构类型对象。

    不要因为没有简单或正确的答案就关闭此功能。信息丰富的讨论是有帮助的。@ildjarn:当然,可能会提出一些意见,但也可以给出客观的标准。投票系统有助于筛选出这些人。这是一个很好的问题,我希望看到一些答案。@ildjarn:“问题是赞成和反对意见都是主观的”。这显然不是事实。有许多客观的利弊。例如,ML语言家族(包括OCaml和F#)就是专门为此而设计的,因此,它们具有许多非常适合于此的特性,例如变体类型和模式匹配。另外,以CIL而不是LLVM为目标显然会免费提供一个垃圾收集器。还有很多客观的答案有待给出,因此我很抱歉看到这个问题结束。因为只有一小部分人阅读了程序员SE的任何内容,所以这个问题将在这里提供更多有趣/有用的答案,以及投票系统将处理的不太有用的答案。非常感谢Jon!这真的很有帮助。现在是2015年,用OCaml编写自己的打印函数的问题已经基本解决了。其中一种解决方案是使用
    Sexplib
    库,详细描述如下: