31

听播客,我听说 C# 不是动态语言,而 Ruby 是。

什么是“动态语言”?动态语言的存在是否意味着存在静态语言?

为什么 C# 是一种动态语言,而其他哪些语言是动态的?如果 C#不是动态的,那么微软为什么要大力将其推向市场?

以及为什么大多数 .NET 程序员都为之疯狂而离开其他语言并转向 C#?

为什么 Ruby 是“未来的语言”?

4

12 回答 12

73

什么是动态语言?

语言是否是动态的通常是指编译器执行的绑定类型:静态或后期绑定。

静态绑定只是意味着方法(或虚拟方法的方法层次结构)在编译时绑定。运行时可能涉及虚拟调度,但方法令牌在编译时绑定。如果在编译时不存在合适的方法,您将收到错误消息。

动态语言则相反。他们在运行时完成他们的工作。他们在编译时很少或根本不检查方法的存在,而是在运行时进行。

为什么 C# 不是动态语言?

C#,在 4.0 之前,是一种静态绑定语言,因此不是动态语言。

为什么 Ruby 是未来的语言?

这个问题基于一个错误的前提,即确实存在一种语言,它是编程的未来。今天没有这样的语言,因为没有一种语言最擅长完成所有需要完成的不同类型的编程。

例如,对于许多不同的应用程序来说,Ruby 是一门很棒的语言:Web 开发是一种流行的语言。但是,我不会在其中编写操作系统。

于 2009-04-24T19:35:00.143 回答
26

在动态语言中,您可以这样做:

var something = 1;
something = "Foo";
something = {"Something", 5.5};

换句话说,类型不是静态的。在静态类型语言中,这将导致编译器错误。

C、C++、C# 和 Java 等语言是静态类型的。

Ruby、Python 和 Javascript 等语言是动态类型的。

此外,这与“强或弱”类型不同。那是完全不同的东西。

于 2009-04-24T19:35:09.613 回答
6

我对 c# 采用一套基本的编程范式的方式感到震惊。

我们可以说 C# 允许丰富的面向对象编程、丰富的面向组件的编程、良好集成的函数式编程、对不同类型数据源 (linq) 的完整查询操作集、通过 pLinq 和并行进行并发编程的优雅方法扩展,在下一个版本 (c# 4.0) 中将具有强大的动态功能,并且几乎可以肯定在 c# 5.0 中将具有一组可靠的元编程功能。

只能说 c# 在将所有这些强大的东西集成到一个工具箱中方面做得很好。在我看来,这就是它必须的方式,因为从一种编程语言跳到另一种编程语言几乎总是非常痛苦。

于 2009-08-01T00:50:03.330 回答
3

C# 是一种静态类型语言,因为您正在使用的每个对象的类型都需要在编译时知道。在动态语言中,您不需要在编译时知道对象的类型。也许你导入了一些你事先不知道的类,比如你导入一个文件夹中的所有类,比如插件之类的。甚至对象的类型也可能取决于用户交互。

您可以通过使用接口或基类来实现类似的效果,但它并不完全相同,因为您仅限于使用显式继承或实现该接口的类。

在动态类型语言中,编译时它不关心类型是什么,它会尝试调用您按名称指定的方法,如果该方法在对象上不存在,它将引发运行时异常,因此由程序员来确保不会发生或适当地处理它。您获得了灵活性,但在编译时错误检查方面有所损失。

于 2009-04-24T19:38:52.553 回答
3

查看Wikipedia 条目,我们看到动态语言是一种在运行时执行大多数在编译时执行的操作。通常,在动态语言中,变量可以快速轻松地更改类型,并且通常没有单独的编译步骤(而是解释执行或真正快速编译)。C# 是一种更传统的语言,使用变量声明并被编译。

维基百科条目列出了许多动态语言。

另一方面,“X 是未来的 Y”意味着有人想卖给你一些东西。(不一定是字面意思,而是试图以一种方便说话者的方式影响你的信念。)

于 2009-04-24T19:39:47.667 回答
3

您知道 VB6 既是静态的又是动态的?

如果您声明具有给定类型的变量,那么您将获得静态行为:

Dim name as Label

您现在只能访问名称为Labels 的成员,而智能感知知道这一点。

如果你有一个类并添加implements关键字,那么你的类可以实现另一个类的方法。这是VB6允许的接口继承。您可以获得一些运行时多态性。

你也可以像这样声明变量:

Dim proxy As Object

现在智能感知不会给你任何帮助,而 VB6 将允许你做任何你喜欢的事情proxy

proxy.foo()

这条线可以位于已编译和正在运行的程序中,不会引起任何问题,尤其是如果它没有自行运行。只有当线路运行时才会进行查找。

您还可以执行:

set proxy = <any instance>

这将运行。<any instance>有没有foo方法并不重要。

然后可以分配任何实现的类的任何实例,调用的方法和VB6都会很高兴。foo

请注意,随着您变得越来越动态,运行时性能会受到影响。

于 2010-02-26T11:07:14.783 回答
2

静态动态这两个词没有明确定义。

然而,最常见的意思是两个问题:

1)在静态语言中,变量的类型(即变量可以包含或指向的值的类型)在程序执行过程中不能改变。例如,在 C# 中,您在定义变量时声明它的类型,例如:

int a;

现在a只能保存一个int值——如果你试图给它分配一个字符串,或者在它上面调用一个方法,你会得到一个编译类型错误。

2)在静态语言中,对象的类型不能改变。在动态语言中,一个对象可以改变,因为您可以附加或删除方法和属性,从而基本上将它变成一个完全不同的对象。

于 2009-04-24T19:35:48.363 回答
2

在 C# 3.0 中,需要在编译时知道所有内容的类型。它是一种静态语言。动态语言在运行时使用动态调度来决定事物的类型以及调用这些事物的方法。这两种语言都有其优点和缺点。C# 4.0 将添加动态功能。 Anders Hejlsberg 在 PDC 上就静态与动态语言和 C# 4.0 进行了精彩的演讲。

于 2009-04-24T19:35:59.313 回答
2

动态语言通常被认为是一种可以在运行时动态解释和生成代码的语言。C# 无法做到这一点。

还有动态类型和静态类型的语言。动态类型意味着变量的类型没有设置并且可以在整个程序执行过程中改变。

于 2009-04-24T19:37:02.777 回答
1

c#是静态类型的,即int i =0;尝试将 i 设置为字符串。编译器会抱怨,

其中,作为 python,可以将用于保存整数的变量设置为保存字符串,

静态:类型是最终的,动态:类型可以更改,

c# 正在尝试添加更多类似动态的功能,例如 var

于 2009-04-24T19:35:34.213 回答
1

没有真正的“未来语言”。不同的语言有不同的目的。最多,你可以说 Ruby 是一种未来的语言。

根据维基百科:

动态编程语言是计算机科学中广泛使用的一个术语,用于描述一类高级编程语言,它们在运行时执行其他语言在编译期间可能执行的许多常见行为,如果有的话。这些行为可能包括程序扩展、添加新代码、扩展对象和定义或修改类型系统,所有这些都在程序执行期间进行。这些行为几乎可以用任何足够复杂的语言来模拟,但动态语言提供了直接使用它们的工具。大多数动态语言都是动态类型的,但不是全部。

Ruby 是一种动态语言,而 C# 不是,因为 Ruby 是解释型的,而 C# 是编译型的。但是,C# 确实包含一些使它看起来动态的特性。

于 2009-04-24T19:36:27.927 回答
0

一种语言是动态类型的,这意味着一个变量可以用于任何事情。变量没有类型,值是。变量可以具有任何原始类型的值,也可以引用任何对象。

于 2017-12-03T03:17:34.957 回答