代码之家  ›  专栏  ›  技术社区  ›  Community wiki

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

  •  32
  • Community wiki  · 技术社区  · 2 年前

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

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

    为什么C#是一种动态语言,还有哪些语言是动态的?如果C#是 动态,微软为什么要大力推动它进入市场?

    为什么大多数.NET程序员都为之疯狂,离开其他语言,转而使用C#呢?

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

    12 回复  |  直到 13 年前
        1
  •  74
  •   JaredPar    16 年前

    什么是动态语言?

    一种语言是否是动态的通常指编译器所做的绑定类型:静态绑定或后期绑定。

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

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

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

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

    为什么Ruby是未来的语言?

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

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

        2
  •  26
  •   Brian Genisio    16 年前

    在动态语言中,您可以执行以下操作:

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

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

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

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

    此外,这与“强或弱”类型不同。这些加在一起就不一样了。

        3
  •  6
  •   Alberto    16 年前

    我对c#包含基本集合的方式感到震惊 编程范例。

    我们可以说c是一个丰富的面向对象编程, 丰富的面向组件的编程, 集成良好的功能编程, 在不同类型的数据源(linq)上的查询操作的完整集合, 一种通过pLinq和并行扩展的并发编程的优雅方法, 在下一个版本(c#4.0)中将具有powerfull动态功能, 几乎可以肯定的是,在c#5.0中会有一套坚实的元编程 功能。

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

        4
  •  3
  •   Davy8    16 年前

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

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

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

        5
  •  3
  •   David Thornley    16 年前

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

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

    另一方面,“X是未来的Y”意味着有人试图卖给你一些东西。(不一定是字面上的,但要试图以一种对演讲者方便的方式影响你的信仰。)

        6
  •  3
  •   quamrana    15 年前

    你知道VB6是静态和动态的吗?

    如果您声明具有给定类型的变量,则会得到静态行为:

    Dim name as Label
    

    您现在只能访问 Label s和intellisense都知道这一点。

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

    您也可以这样声明变量:

    Dim proxy As Object
    

    现在intellisense不会给你任何帮助,VB6将允许你用它做任何你喜欢的事情 proxy :

    proxy.foo()
    

    这一行可以放在编译和运行的程序中,不会引起任何冒犯,尤其是在程序本身没有运行的情况下。只有当线路运行时,才会进行查找。

    您还可以执行:

    set proxy = <any instance>
    

    这将运行。是否 <any instance> 有一个 foo 方法。

    然后 任何 任何实现的类的实例 foo 可以被分配,并且方法被调用,VB6将很高兴。

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

        7
  •  2
  •   JP Alioto    16 年前

    在C#3.0中,所有东西的类型都需要在编译时知道。这是一种静态语言。动态语言在运行时使用动态调度来决定事物的类型以及对这些事物调用什么方法。这两种语言都有其优点和缺点。C#4.0将增加动态功能。 Anders Hejlsberg gave a great talk on static v.s. dynamic languages and C# 4.0 at PDC.

        8
  •  2
  •   Steven    16 年前

    动态语言通常被认为是能够动态地解释&在运行时生成代码。C#做不到。

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

        9
  •  2
  •   JacquesB    16 年前

    文字 静止的 动态 定义不明确。

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

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

    int a;
    

    现在 a 只能持有 int value-如果您试图为它分配一个字符串,或者调用它的方法,您将得到一个编译类型错误。

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

        10
  •  1
  •   Fusspawn    16 年前

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

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

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

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

        11
  •  1
  •   luiscubal    16 年前

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

    根据维基百科:

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

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

        12
  •  0
  •   user9045232    7 年前

    语言是动态类型化的,这意味着中的变量可以用于任何事情。 变量不是类型化的,值是。变量可以具有任何基元类型的值,也可以引用任何对象。

    推荐文章