Functional programming 如何在底层实现函数式编程?

Functional programming 如何在底层实现函数式编程?,functional-programming,low-level,Functional Programming,Low Level,哈斯克尔,斯卡拉,。。。而函数式编程语言一般在底层实现?也就是说,如果一台计算机是冯·诺依曼的话,它是如何运行一个功能程序的?代码通常是如何翻译的,我不知道是否有编译过的函数式语言?简短回答: 通过将功能转换为动作序列,在某些虚拟或真实机器中执行指令 详细回答: 考虑此功能程序,使用Lisp符号将我们从语法困难中解放出来: ;; 函数定义 德方x*x x 差分a和b 如果>a b -a b -b a ;; 实际程序 差平方5 假设严格的非惰性计算,在计算差异之前,显然需要计算平方。推广这个概念意

哈斯克尔,斯卡拉,。。。而函数式编程语言一般在底层实现?也就是说,如果一台计算机是冯·诺依曼的话,它是如何运行一个功能程序的?代码通常是如何翻译的,我不知道是否有编译过的函数式语言?

简短回答: 通过将功能转换为动作序列,在某些虚拟或真实机器中执行指令

详细回答: 考虑此功能程序,使用Lisp符号将我们从语法困难中解放出来:

;; 函数定义 德方x*x x 差分a和b 如果>a b -a b -b a ;; 实际程序 差平方5 假设严格的非惰性计算,在计算差异之前,显然需要计算平方。推广这个概念意味着为了计算一个函数,首先需要计算它的参数。参数的计算顺序可能未指定,但为了简单起见,让我们假设它们是从左到右计算的。然后,您可以将上述省略函数定义的程序转换为以下命令式描述:

1: use value 5 as parameter
2: call square using 1 parameter, use result as parameter
3: use value 5 as parameter
4: call difference using 2 parameters
此操作序列可以相对容易地编译,例如,对于基于堆栈的机器:

square:
   dup ; duplicate top of stack
   mul ; pops 2 numbers from stack, multiplies them and pushes the result
   ret

difference:
   compare_greater_than ; uses the top 2 numbers from stack, pushes result
   jmpif L ; pops 1 number from stack, jumps if non zero
   swap ; swap top 2 numbers on stack
L: sub
   ret

main:
   push 5
   call square
   push 5
   call difference
当然,这只是一个非常粗略的草图,但希望能给你一个从哪里开始的想法。我在这里的另外两个答案中实现了更多。这两个例子都说明了如何解释功能程序

然后,还有一些关于如何实际实现函数式语言的好教程,如


我的回答完全集中在实际方法上。还有很多我完全忽略的理论,比如,转换为连续传递样式或一些严肃的图形内容,但我希望我的回答能让你知道从哪里开始。

当你问:

That is, how a computer can actually run a functional program if it's Von Neumann?

但是我们的计算机可以计算任何可以计算的东西,而不管硬件结构如何。这就好像你在问:当计算机由电子元件组成时,它如何帮助化学。

格拉斯哥哈斯克尔编译器GHC编译成许多不同体系结构上的本机代码,以及使用C作为中间语言编译成ANSI C。GHC已经成为事实上的标准Haskell方言,编译器的后端将核心代码转换为C的内部表示形式−−, 通过中间语言STG,STG是无脊椎无标记G-machine的缩写−− 然后,代码可以采取三种途径之一:要么打印为C代码,以便使用GCC进行编译;要么在传统代码生成阶段直接转换为本机代码;要么转换为LLVM虚拟机代码,以便使用LLVM进行编译。在这三种情况下,最终生成的本机代码与GHC运行时系统链接,以生成一个可执行文件。30秒的谷歌搜索时间……我问的是它是如何完成的,而不是什么。考虑到C和汇编是命令式的、过程性的,而不是功能性的,您如何翻译它。OOP略有不同,但最终是必须的。我了解OOP程序是如何实现的。但是你如何使用函数式编程呢?@Jose它不全是黑白的。事实上,您可以用C编写函数式程序,即使C不完全是函数式语言。亲爱的匿名投票人:请解释为什么你认为我的答案不好。非常感谢@DanielJour。终于有人回答了这个问题+1对于详细和准确的回答,问题不能是逻辑谬误,因为它不是陈述;“是的,@Jose,但有时一个问题会揭示出一个类似于这种情况的假设。