【问题标题】:What is a dynamic language, and why doesn't C# qualify?什么是动态语言,为什么 C# 不合格?
【发布时间】:2010-10-21 16:42:07
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: c# ruby static-libraries dynamic-languages


【解决方案1】:

什么是动态语言?

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

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

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

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

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

为什么 Ruby 是未来的语言?

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

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

【讨论】:

  • 感谢 JaredPar,关于“为什么 Ruby 是未来的语言?”我在一个播客节目中听说过,伙计们都在谈论它,就好像这是事实。现在我知道他们错了……
  • 人们总是在宣称“未来的语言”。它总是恰好是他们最喜欢的语言。
  • 请注意,没有什么可以阻止语言同时支持静态和动态类型。一种这样的语言是 Curl。
  • Ruby 是 the language of the future 在播客节目中谈话的人之一。这些从RoR to .NET MVC 搬来的人可能会说Ruby is the language of the past。我还从一位Ruby 开发人员那里听说Ruby was created to make developers happy :)。关于这个主题有很多神话。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    【解决方案3】:

    我对 c# 采用基本集合的方式感到惊讶 编程范式。

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • @David - “另一方面,'X 是未来的 Y',意味着有人试图向你推销一些东西。” +1 很棒的评论。语言就像宗教……它们有很多,所以单一的就是最好的,未来的宗教也不是。这没有任何意义。
        【解决方案6】:

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

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

        Dim name as Label
        

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

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

        你也可以这样声明变量:

        Dim proxy As Object
        

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

        proxy.foo()
        

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

        您还可以执行:

        set proxy = <any instance>
        

        这将运行。 &lt;any instance&gt; 是否有 foo 方法并不重要。

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 哇。说不是这样!静态类型是 C# 相对于世界上的 rubies 和 phps 的最大优势。拼写错误是编译时错误,而不是奇怪的运行时不一致。我当然希望可以关闭动态输入。
          • @Jason:他们在 4.0 中所做的实际上非常棒。 “动态”成为声明动态类型的关键字,所以是的,它是可选的。 :) 但是他们也添加了一个完整的动态运行时层(“DLR”)。好东西。视频也很好 b/c 最后安德斯谈到了 4.0 之后的内容。很甜的东西。只是一个小剧透...... C# 中的 REPL!
          【解决方案8】:

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

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

          【讨论】:

          • 很高兴看到有人知道动态语言和对动态类型的支持之间存在差异。我不确定 C# 是否不是动态的 - 您当然可以在运行时自行修改对象。
          【解决方案9】:

          staticdynamic这两个词没有明确定义。

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

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

          int a;
          

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

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

          【讨论】:

          • 关于 (1):这是显式与隐式。有许多语言没有声明变量的类型,但它仍然是静态的,在编译时检查类型。这称为类型推断。
          【解决方案10】:

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

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

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

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

          【讨论】:

          • c# 中的 var 不是动态功能,它只是隐式类型。变量的类型仍然是强类型,不能改变。
          • C# 中的 var 只是节省输入的简写。此外,动态语言不仅仅是动态类型,否则您可以使用对象或变体来存储所有变量。
          【解决方案11】:

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

          根据维基百科:

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

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

          【讨论】:

          • >Ruby 是一种动态语言,而 C# 不是,因为 Ruby 是解释型的,而 C# 是编译型的。这是完全错误的。
          【解决方案12】:

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

          【讨论】:

            猜你喜欢
            • 2011-05-05
            • 2010-10-10
            • 1970-01-01
            • 1970-01-01
            • 2011-01-17
            • 2012-08-16
            • 1970-01-01
            • 2010-10-20
            • 2017-07-31
            相关资源
            最近更新 更多