2

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

4

2 回答 2

3

为什么这么讨厌C?函数式语言必须使用较低级别的语言来生成机器级代码。

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

通过应用从其他函数式语言中学到的原则,您可以轻松地遵循 C 中的函数式范例,即:

  • 没有突变。

  • 没有malloc。

  • 避免状态。

  • 用动词而不是名词来建模。

  • 使用递归而不是迭代。

  • ETC。

    有一本书介绍了函数式 C。

我想问一下是否真的可以用这种语言创建裸机代码并且只使用它而不需要回到 C

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

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

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

好吧,在操作系统之上运行的每个应用程序都必须使用操作系统的 API。几乎所有流行的操作系统都是用 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-30T13:37:42.167 回答
1

I'm thinking there will be very few (if any) alternatives since the primitives will then be system dependent and your object file needs to have it's own GC. (functional languages need a runtime GC)

You can make your own domain specific language in your favorite functional language, perhaps Scheme, that utilize some sort of assembler, like Sassy, to eventually output raw machine code. But really this is just making your own compiler.

A much simpler option to use C as an intermediate. Many does this since most systems have a C compiler. Devices comes with reference implementations in C.

A different alternative is to make a system like SBCL cross compile to your architecture and use it as the runtime OS of your device.

BTW: SBCL has very little implemented in other languages than Common Lisp. The main part is probably the GC. The GC code could have been implemented in CL, but that would have made debugging far more complex and with a buggy GC you get all sorts of strange behaviour.

于 2014-07-30T15:07:55.833 回答