动态语言和函数式语言有什么区别?

时间:2009-06-26 07:16:19

标签: functional-programming dynamic-languages

我经常发现开发人员一起使用术语功能语言和动态语言,并想知道为什么它们总是被放在一起。 它们之间有什么区别?语言既可以动态又有功能吗?他们互相补充吗?为什么我们还需要它们呢? 我是一个C#程序员,还没有理解这整个动态/功能的东西(C#将在第4版中有一些动态功能。它还能运行吗?这里发生了什么?)。

谢谢, 亚伯拉罕

5 个答案:

答案 0 :(得分:8)

动态类型是一种类型系统,与“功能”(一种编程范例)正交。

动态'语言'实际上是动态类型的。这意味着您没有对变量类型进行编译时检查。

功能语言提供了大量支持,例如: lambda演算 - 匿名函数。

动态类型语言的示例,支持匿名函数:javascript。 Ruby也有一些功能样式支持。还有其他人。

答案 1 :(得分:8)

将其置于简单(但不准确)的答案中

  • Dynamic languages类型(类的名称)与其克星静态类型语言相比不那么重要的。变量可以在任何给定的时间点分配给它的不同类型的对象。方法调用在运行时解析。这意味着您失去了静态类型的好处(编译器警告),但简单的方法变为泛型 - sort(list)适用于字符串列表以及整数列表。例如Ruby et。所有
  • Functional languages价值不变性。程序是根据越来越大的功能(通常是自下而上)编写的。 对象状态和可变性的概念不受欢迎。此上下文中的功能自给自足(根据维基百科,该术语是纯粹的):产生输出所需的一切都在于它接收的输入。它还会产生无副作用(除非它明确提到它)并返回给定输入的一致输出。这可以产生优雅的代码(参见:流畅的接口),其中输入数据通过diff函数流水线化以产生最终输出,例如: LISP et.all

然而,语言越来越混乱,语言越来越好......你可以使用一种或两种语言。
例如主要是静态C#在3.0中获取lambda表达式并引入4.0的动态功能

答案 2 :(得分:4)

动态类型和函数式编程是独立的概念。您可以使用某种语言,也可以同时使用或使用两种语言。

静态类型意味着在编译时已知对象类型。在动态类型中,它们在运行时是已知的。

函数式编程意味着编程风格,通过在避免状态变化的同时评估函数来完成计算。 (示例:您使用递归而不是for循环,因为循环需要更改计数器变量等)这有助于避免错误并使并发编程更容易。纯语言要求您以功能方式编程,其他语言只需启用它。

示例语言:

|----------------+---------+---------|
|                | Dynamic | Static  |
|----------------+---------+---------|
| Functional     | LISP    | Haskell |
| Not functional | PHP     | Java    |
|----------------+---------+---------|

另一方面,动态语言是一个更广泛的概念。没有确切的定义,但通常编译器的更多功能被移动到运行时,语言更加动态。这意味着在动态语言中,您通常可以在运行时评估表达式,更改对象结构等。

答案 3 :(得分:3)

如果您对范例感兴趣,那么论文 Programming Paradigms for Dummies: What Every Programmer Should Know 将涵盖它们。

在函数式编程中,state是隐式的 - 程序通过调用调用其他函数的函数来执行。在命令式编程和面向对象编程中,状态是显式的 - 您可以更改变量或对象字段的值。

在某种程度上,功能和命令式系统可以看作是双重系统 - 固定在一个系统中的是另一个系统中的动态值。

Closures - 在一个可以被称为函数的对象中捕获一些显式的,可变的状态 - 介于两者之间,既不是纯粹的函数式编程,也不是完全成熟的对象;它们更像是匿名对象,而不是函数。

'动态语言'是一个模糊的术语,通常意味着以下之一:

  • 动态类型语言 - 将类型延迟确定为运行时的语言,但是类型集是固定的。示例是Smalltalk,Lisps,当前的Fortress实现。一些其他静态类型的语言也允许一些动态类型检查 - Java,C#,C ++和Ada。 (这是一个失败的动态类型演员,从Ada中的浮动到int,撞毁了阿丽亚娜5)

  • 动态类型的语言 - 可在运行时创建新类型的语言。最流行的是JavaScript。因为您必须运行程序来确定类型,所以使用类型感知自动完成为这些程序创建IDE会更加困难。

  • 动态编译的语言 - 可在运行时编译新脚本的语言。对于页面范围内的bash,JSP,PHP和ASP,情况也是如此,对于支持编译和运行表达式的“eval”函数的lisps和JavaScript,它更合适。

强类型的函数式语言通常会执行大量的类型推断,因此对于他们的程序而言,通常使用的键入方式比实现不当的静态类型语言要少。这会使那些只看到动态类型语言缺乏明确键入的人感到困惑,认为类型推断与动态类型相同。

答案 4 :(得分:2)

xtofl已经提供了一个很好的整体情况。我可以谈谈C#点。

C#已经变得更容易以一种功能性方式使用了一段时间:

  • C#2引入了匿名方法,这样可以更容易地创建使用状态的委托,而该方法本身就是方法
  • C#3引入了lambda表达式,它们大多像匿名方法,但更紧凑
  • C#3和.NET 3.5中的LINQ支持使得以功能方式查询数据变得更加容易,将谓词,预测等链接在一起
  • C#4特性中没有一个直接有助于函数式编程IMO,尽管命名参数和可选参数可以使创建/使用不可变类型更容易,这是IMO功能图片中缺少的最大特征之一。

(函数式语言通常还有其他一些东西,例如模式匹配和更令人印象深刻的类型推断,但你可以在C#中轻松地编写很多功能样式的代码 。)

C#4将通过dynamic类型获得一些动态能力(它本身实际上是一种静态类型,你可以做任何事情)。这将有点“选择加入” - 如果你从不使用dynamic类型,C#仍然是完全静态的语言。没有语言支持动态响应,但DLR支持此功能 - 例如,如果您实施IDynamicMetaObjectProvider或从DynamicObject派生,则可以添加动态行为。< / p>

我想说C#并没有成为一种功能语言或动态语言,而是一种能够以功能风格编码并与动态平台互操作的语言。