草庐IT

c++ - 我的编译器在 C/C++、OCaml 和 F# 之间犹豫不决

coder 2023-05-30 原文

我想开始研究一个小编译器并构建它,我在几种不同的语言之间犹豫不决。

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

所以现在我有以下选择:

  1. 使用 OCaml 和 LLVM 绑定(bind) - 高效,LLVM 附带 OCaml 绑定(bind),但 OCaml(IDE,支持)的编码体验并不是最好的。

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

  3. 使用 F# - 我爱上了这种语言,但没有官方的 LLVM 绑定(bind)。所以我想我可以通过使用 System.Reflection.Emit 来做同样的事情。尽管这里似乎有针对 LLVM 的 F# 绑定(bind)的倡议 - https://github.com/keithshep/llvm-fs

我很想听听您对此的看法。

最佳答案

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

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

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

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

关于c++ - 我的编译器在 C/C++、OCaml 和 F# 之间犹豫不决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6390665/

有关c++ - 我的编译器在 C/C++、OCaml 和 F# 之间犹豫不决的更多相关文章

  1. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  4. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  5. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  6. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  7. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  10. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

随机推荐