Haskell,Scala,...和函数式编程语言一般是在低级别实现的?也就是说,如果是Von Neumann,计算机如何实际运行功能程序?如何翻译代码(通常解释,我不知道是否有编译的函数式语言)?
答案 0 :(得分:2)
通过将函数转换为动作序列(某些虚拟机或真实机器中的指令)。
考虑这个功能程序,使用Lisp表示法让我们摆脱语法上的困难:
;; function definitions
(defun square (x) (* x x))
(defun difference (a b)
(if (> a b)
(- a b)
(- b a)))
;; actual program
(difference (square 5) 5)
假设严格(非懒惰)评估,在计算difference
之前,您显然需要计算square
。推广这个想法意味着,为了计算函数,首先需要计算它的参数。计算参数的顺序可能是未指定的,但为了简单起见,我们假设它们是从左到右计算的。然后,您可以将上述程序(省略函数定义)转换为以下命令描述:
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
当然这只是一个非常粗略的草图,但希望能让你知道从哪里开始。我在其他两个答案中实现了a small sketch以及更多complete version。两者都是解释功能程序的样子的例子。
然后,还有关于如何实际实现函数语言的好教程,如http://www.buildyourownlisp.com/。
我的回答完全集中在“实用”方法上。还有很多我完全遗漏的理论,比如spineless tagless G-machine,转换为延续传递风格或一些严肃的图形,但我希望我的回答可以让你知道从哪里开始。
答案 1 :(得分:1)
当你问:
时,你犯了逻辑谬误That is, how a computer can actually run a functional program if it's Von Neumann?
但是我们的计算机可以计算任何可以计算的东西,无论硬件架构如何。就好像你在问:当计算机由电子元件组成时,它如何帮助化学。