在编译器设计中,命令式语言和函数式语言有什么区别?
命令式语言
命令式语言通过状态变化来实现计算。状态指的是计算机随机存取存储器 (RAM) 或存储器的条件。可以将计算机内存视为一系列快照,每个快照捕获特定时间所有内存单元中的值。每个快照记录一个状态。
当程序输入时,相关数据处于某种状态,例如脱机的未排序列表。程序员的工作是指定一系列对存储器的更改,以产生所需最终状态,例如排序列表。存储器包含的内容远不止数据和存储程序。它包括符号表、运行时堆栈 (S)、操作系统,其 CPU 本身也可以视为初始状态的一部分。
函数式语言
函数式语言是一种编程语言,其编程结构围绕逻辑函数或过程构建。它依赖于其程序流中的数学函数,并等同于数学函数。
函数式语言将其基本结构从λ演算和组合逻辑的数值结构中改变。Erlang、LISP、Haskell 和 Scala 是最著名的函数式语言。
命令式语言 | 函数式语言 |
---|---|
命令式语言基于冯·诺依曼架构。 | 函数式语言不基于冯·诺依曼架构。 |
程序员关心的是变量的管理以及向其赋值。 | 程序员不需要关心变量,因为不需要将内存单元抽象到语言中。 |
命令式语言使用状态变化来促进计算。 | 函数式语言促进程序表示的函数,而不是仅在程序逐语句执行时声明更改。 |
它可以提高执行效率。 | 它可能会降低执行效率。 |
它用于费力的程序构建。 | 比命令式语言编程所需的劳力更少。 |
它是一个非常简洁的语法框架。 | 它比命令式语言具有更复杂的语法结构。 |
并发执行难以设计和使用。 | 并发执行易于设计和使用。 |
语义难以理解。 | 与命令式语言相比,语义更简单。 |
程序员应该创建程序的静态划分,将其划分为并发元素,然后将其编写为函数。这可能是一个复杂的过程。 | 函数式语言中的程序可以由执行系统动态地分解为并发元素,从而使该过程高度适应其运行的硬件。 |
命令式语言的示例包括 C、C++、ADA、Pascal 等。 | 函数式语言的示例包括 LISP、ML、Scheme 等。 |
广告