繁体   English   中英

函数编程语言和裸机代码?

[英]Function programming language and bare metal code?

我发现现代函数式编程语言和范式通常非常有趣。 通过使用C作为中间语言或使用其自己的代码生成器,许多功能性编程语言都能够生成有效的本机代码。 我说的是诸如Haskell,OCaml,LISP或Scheme(SBCL,Chiken,Gambit等)之类的语言。 但是知道函数式编程语言需要一个大型运行时库,该运行时库通常是用C实现的(例如,用于垃圾收集),我想问一问,是否真的有可能以这种语言创建裸机代码,并且仅在不使用需要回到C语言(例如,用于OS开发或在没有操作系统的嵌入式设备上运行本机代码)? 是否有任何不依赖于运行时的功能编程语言(即使它将是语言子集)? 有什么功能性语言可以重新实现它所需的运行时(例如,诸如Ada,D,Nimrod,Pascal之类的语言具有使用该语言本身编写的运行时)? 如今,我有哪些替代功能语言可用于裸机开发?

为什么对C如此讨厌? 功能语言必须使用低级语言来生成机器级代码。

您也可以用非常纯函数式的方式编写C。 C为开发人员提供了遵循她希望的任何编程风格的自由。

通过应用从其他功能语言中学到的原理,您可以轻松地遵循C中的功能范例:

  • 没有突变。
  • 没有malloc。
  • 避免状态。
  • 根据动词而不是名词建模。
  • 使用递归而不是迭代。
  • 等等。

    有一本书介绍了FunctionalC。

我想问一问,是否真的有可能以这种语言创建裸机代码,而无需返回C就可以使用它

裸机/机器级/目标代码是1GL(第一代编程语言),由二进制数制成,以1和0表示。

使用编译器的大多数3GL或4GL可以生成目标代码。

是否有任何不依赖于运行时的功能编程语言(即使它将是语言子集)

嗯,在操作系统之上运行的每个应用程序都必须使用操作系统的API。 几乎所有流行的OS都是用C / C ++编写的。 其中包括Windows,Linux,MacOS,Android等。

因此,在为操作系统创建应用程序时,您可能必须依赖于操作系统的运行时环境(通常使用C / C ++编写)。

有什么功能性语言可以重新实现它所需的运行时(例如,Ada,D,Nimrod,Pascal之类的语言都使用该语言编写)

是的,您可以为任何所需的语言编写自己的运行时库,但这并不是一件容易的事。

如今,我有哪些替代功能语言可用于裸机开发?

我建议您选择自己喜欢的功能语言(Haskell,F#,Scala或其他语言),而不必考虑运行时。 有很多很好的理由证明它是用C语言编写的。并且AFAIK不会很快改变。

通过在Scala中进行编程,您可以使用JVM,并通过F#使用CLR或WinRT。 也许这些选择可以为您提供帮助。

编辑:如果您真正想问的是是否可以用功能语言编写OS,那么答案是肯定的。

House是用Haskell编写的操作系统。 FFI为(a)调用低级例程以访问硬件,以及(b)显式管理内存提供了必要的功能。

MirageOS在OCaml中,并且已经在ML中实现了OS。

通常,可以使用任何“ Turing Complete”编程语言来创建操作系统,并且大多数功能语言(例如LISP,Haskell,OCaml等)都是Turing Complete。

我在想将有很少(如果有的话)替代方法,因为这些原语将依赖于系统,并且您的目标文件需要具有自己的GC。 (功能语言需要运行时GC)

您可以使用自己喜欢的功能语言(也许是Scheme)来制作自己的特定于领域的语言,该语言利用某种汇编程序(如Sassy )最终输出原始机器代码。 但这实际上只是制作自己的编译器。

使用C作为中间体的简单得多的选择。 由于大多数系统都有C编译器,因此可以执行许多操作。 设备带有C中的参考实现。

另一种替代方法是使像SBCL这样的系统交叉编译到您的体系结构,并将其用作设备的运行时操作系统

顺便说一句:除了Common Lisp,SBCL很少用其他语言实现。 主要部分可能是GC。 GC代码本可以在CL中实现的,但是这会使调试变得更加复杂,并且由于GC出错,您会遇到各种各样的奇怪行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM