我发现现代函数式编程语言和范型总体上非常有趣。许多函数式编程语言都能够通过使用C作为中间语言或使用自己的代码生成器来生成高效的本机代码。我说的是像Haskell、OCaml、LISP或Scheme (SBCL、Chiken、Gambit等)这样的语言。但是知道函数式编程语言需要一个大的运行时库,通常是用C实现的(例如垃圾回收),我想问一下,真的有可能用这种语言创建裸机代码,并且只使用它而不需要返回到C语言(例如,用于操作系统开发,或者用于在没有操作系统的嵌入式设备上运行本机代码)吗?有没有不依赖于运行时的函数式编程语言(即使它是一个语言子集)?有没有什么函数式语言可以让我重新实现它所需要的运行时(例如Ada、D、Nimrod、Pascal等语言本身就有运行时)?现在我有什么替代的函数式语言来进行裸机开发?
发布于 2014-07-30 21:37:42
为什么对C语言如此讨厌?函数式语言必须使用低级语言来生成机器级代码。
你也可以用一种非常纯函数的方式来写C。C为开发人员提供了遵循任何她想要的编程风格的自由。
通过应用从其他函数式语言中学到的原则,您可以轻松地在C中遵循函数式范例,例如:
基于动词而不是名词的
有一个指向函数式C。的book with an intro。
我想问一下,在这种语言中创建裸机代码,并且只使用它,而不需要返回到C#,这真的可能吗
裸机/机器级/目标代码是由二进制数组成的1GL (第一代编程语言),由1和0表示。
大多数使用编译器的3GL或4GL都可以生成目标代码。
有没有不依赖于运行时的函数式编程语言(即使它是一个语言子集)
好吧,在操作系统之上运行的每个应用程序都必须使用操作系统的API。几乎所有流行的OSes都是用C/C++编写的。包括Windows,Linux,MacOS,Android等。
因此,在为操作系统创建应用程序时,您可能必须依赖于操作系统的运行时环境(通常是用C/C++编写的)。
有没有任何函数式语言可以让我重新实现它所需要的运行时(例如像Ada,D,Nimrod,Pascal这样的语言都有用语言本身编写的运行时)
是的,你可以为任何你想要的语言编写你自己的运行时库,但这不是一件容易的事情。
现在我有哪些替代的函数式语言来进行裸机开发?
我建议您选择您最喜欢的函数式语言(Haskell、F#、Scala或其他语言),忘记运行时。它是用C和AFAIK编写的,有很多很好的理由,这在短期内不会改变。
通过使用Scala编程,您可以使用JVM,而对于F#,您可以使用CLR或WinRT。也许这些选项可以帮助你。
编辑:如果你真正想问的是是否有可能用函数式语言编写操作系统,那么答案是肯定的。
House是用Haskell编写的操作系统。FFI提供了必要的功能,用于(a)调用访问硬件的低级例程,以及(b)显式地管理内存。
MirageOS是用OCaml编写的,并且已经有了用ML实现的操作系统。
通常,任何“图灵完成”编程语言都可以用来创建操作系统,而大多数函数式语言,如LISP、Haskell、OCaml等等,都是图灵完成语言。
发布于 2014-07-30 23:07:56
我认为将会有很少的选择(如果有的话),因为原语将依赖于系统,并且您的目标文件需要有它自己的GC。(函数式语言需要运行时GC)
您可以使用自己喜欢的函数式语言(也许是Scheme )编写自己的特定于领域的语言,使用某种汇编器(如Sassy )最终输出原始机器代码。但实际上,这只是制作您自己的编译器。
使用C作为中间语言的一个简单得多的选择。因为大多数系统都有一个C编译器,所以很多都是这样做的。设备附带了C语言的参考实现。
另一种选择是让像SBCL这样的系统交叉编译到您的体系结构中,并将其用作设备的runtime OS。
顺便说一句:除了Common Lisp之外,SBCL在其他语言中几乎没有实现。主要部分可能是GC。GC代码本可以用CL实现,但这会使调试变得更加复杂,并且使用有but的GC时会出现各种奇怪的行为。
https://stackoverflow.com/questions/25034714
复制相似问题