我经常发现开发人员一起使用术语功能语言和动态语言,并想知道为什么它们总是被放在一起。 它们之间有什么区别?语言既可以动态又有功能吗?他们互相补充吗?为什么我们还需要它们呢? 我是一个C#程序员,还没有理解这整个动态/功能的东西(C#将在第4版中有一些动态功能。它还能运行吗?这里发生了什么?)。
谢谢, 亚伯拉罕
答案 0 :(得分:8)
动态类型是一种类型系统,与“功能”(一种编程范例)正交。
动态'语言'实际上是动态类型的。这意味着您没有对变量类型进行编译时检查。
功能语言提供了大量支持,例如: lambda演算 - 匿名函数。
动态类型语言的示例,和支持匿名函数:javascript。 Ruby也有一些功能样式支持。还有其他人。
答案 1 :(得分:8)
将其置于简单(但不准确)的答案中
sort(list)
适用于字符串列表以及整数列表。例如Ruby et。所有然而,语言越来越混乱,语言越来越好......你可以使用一种或两种语言。
例如主要是静态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#中轻松地编写很多功能样式的代码 。)
C#4将通过dynamic
类型获得一些动态能力(它本身实际上是一种静态类型,你可以做任何事情)。这将有点“选择加入” - 如果你从不使用dynamic
类型,C#仍然是完全静态的语言。没有语言支持动态响应,但DLR支持此功能 - 例如,如果您实施IDynamicMetaObjectProvider
或从DynamicObject
派生,则可以添加动态行为。< / p>
我想说C#并没有成为一种功能语言或动态语言,而是一种能够以功能风格编码并与动态平台互操作的语言。