在听一档播客时,我听到C#不是动态语言,而Ruby是。
什么是“动态语言”?动态语言的存在是否意味着有静态语言?
C#为什么是动态语言,还有哪些语言是动态的?如果C#不是动态的,为什么微软还在大力推广它?
同时,为什么大多数.NET程序员都对它着迷并离开其他语言转向C#?
为什么Ruby是“未来的语言”?
在听一档播客时,我听到C#不是动态语言,而Ruby是。
什么是“动态语言”?动态语言的存在是否意味着有静态语言?
C#为什么是动态语言,还有哪些语言是动态的?如果C#不是动态的,为什么微软还在大力推广它?
同时,为什么大多数.NET程序员都对它着迷并离开其他语言转向C#?
为什么Ruby是“未来的语言”?
一个语言是否是动态的通常与编译器进行的绑定类型有关:静态或者晚期绑定。
静态绑定只意味着方法(或虚拟方法的方法层次结构)在编译时绑定。在运行时可能涉及到虚拟分派,但是方法标记在编译时被绑定。如果在编译时找不到合适的方法,则会收到错误提示。
相反,动态语言在运行时进行工作。它们在编译时很少检查方法的存在,而是在运行时完成所有操作。
C# 在 4.0 版本之前是一种静态绑定的语言,因此不是一种动态语言。
这个问题基于一个错误的前提,即存在一种语言是未来编程的选择。然而,目前并不存在这样的语言,因为没有一种单一的语言能够做到所有需要完成的不同类型的编程。
例如,Ruby 对于许多不同的应用程序都是一种很好的语言,比如 Web 开发是其中一种流行的应用。但我不会在 Ruby 中编写操作系统。
var something = 1;
something = "Foo";
something = {"Something", 5.5};
换句话说,类型不是静态的。在静态类型语言中,这将导致编译器错误。
像C、C++、C#和Java这样的语言是静态类型的。
像Ruby、Python和Javascript这样的语言是动态类型的。
此外,这与“强类型或弱类型”不同。那是完全不同的东西。我惊叹于c#如何拥抱一组基本的编程范式。
我们可以说,c#允许丰富的面向对象编程、丰富的组件化编程、良好集成的函数式编程、完整的查询操作(linq)和不同类型数据源、通过pLinq和并行扩展实现优雅的并发编程,在下一个版本(c# 4.0)中将具有强大的动态功能,在c# 5.0中几乎肯定会有一组坚实的元编程特性。
我们只需要说c#在一个工具箱中整合了所有这些强大的东西。在我看来,这是必须的方式,因为从一种编程语言跳到另一种编程语言几乎总是非常痛苦的。
你知道VB6既可以是静态的,也可以是动态的吗?
如果你使用给定类型声明变量,那么你会得到静态行为:
Dim name as Label
现在您只能访问名称为 Label
的成员,智能感知已知道此情况。
如果您有一个类并添加了implements
关键字,则您的类可以实现另一个类的方法。这是VB6允许的接口继承。您可以获得一些运行时多态性。
您还可以像这样声明变量:
Dim proxy As Object
现在智能感应不会提供任何帮助,而VB6将允许您对proxy
进行任何操作:
proxy.foo()
这行代码可以嵌入到编译和运行的程序中,不会产生任何问题,特别是如果它本身没有被运行。只有当这行代码被执行时才会进行查找。
你还可以执行以下操作:
set proxy = <any instance>
这将会运行。无论任何<实例>
是否有foo
方法都没有关系。
然后,任何一个实现了foo
的类的实例都可以被分配并调用该方法,VB6会顺利运行。
请注意,随着动态性的增加,运行时性能会有所下降。
从维基百科条目可以看出,动态语言是指在运行时执行大多数编译时执行的操作。通常情况下,在动态语言中,变量可以快速轻松地更改类型,并且通常没有单独的编译步骤(而是解释执行或非常快速的编译)。C#是一种更传统的语言,使用变量声明并进行编译。
维基百科条目列出了许多动态语言。
另一方面,“X是未来的Y”意味着有人试图向您销售某些东西。(不一定是字面上的,但试图以方便发言者的方式影响您的信仰。)
“静态”和“动态”这两个词并没有明确的定义。
然而,最常见的意思是两个问题:
1)在静态语言中,一个变量的类型(即变量可以包含或指向的值的类型)在程序执行期间不能改变。例如,在C#中,当您定义变量时,声明其类型,如下所示:
int a;
a
只能持有一个 int
值 - 如果你试图将一个字符串赋值给它或调用一个方法,你会得到编译错误。C# 是一种静态类型语言,例如 int i = 0; 尝试将 i 设置为字符串,编译器会报错。
而 Python 中,一个用于保存整数的变量可以被设置为保存字符串。
静态类型:类型是固定的,动态类型:类型可以改变。
C# 正在尝试添加更多类似动态类型的特性,例如 var。