【问题标题】:Is there a compiled* programming language with dynamic, maybe even weak typing?是否存在具有动态甚至弱类型的编译*编程语言?
【发布时间】:2011-02-03 01:07:09
【问题描述】:

我想知道是否有一种编程语言可以编译成机器码/二进制文件(不是字节码,然后由 VM 执行,在考虑打字时这是完全不同的东西),具有动态和/或弱类型,例如:

想象一种编译语言,其中:

  • 变量不需要声明
  • 可以在运行时创建变量
  • 函数可以返回不同类型的值

问题:

  • 有这样的编程语言吗?
  • (为什么)不是?

我认为动态但强类型的编译语言会很有意义,但有可能吗?

【问题讨论】:

  • @Platinum:您可以使用 NGen 获取机器码。
  • @Robert Harvey:噢,来吧,这不算数。这不是语言所固有的。按照这个速度,我可以声称 Java 也是一种编译语言,因为它也有 .exe 包装器可用。为什么不是脚本语言,而我正在使用它,肯定有转换程序可以接受脚本并生成二进制文件?
  • @Platinum:不确定我明白你的意思。您从 C# 和 NGen 获得的机器代码实际上可能比那里的一些直接到机器代码的本机代码编译器质量更高。抖动能够进行一些相当大的优化。执行 hack 的脚本甚至不能被远程认为是同一件事。
  • @Robert Harvey:我有点受伤,你会这样骗我。仔细阅读:我没有说 NGen 不生成机器码。无论如何,这不是我的问题。我的问题是你必须使用它,因为需要多个步骤之一才能将 C# 代码转换为机器语言。 C# 编译为中间语言。编译的机器代码不是该语言固有的。从这个意义上说,它完全像一个脚本到 .exe 工具,就像那些工具一样,很老套。
  • @Platinum Azure - 每种编译的编程语言都需要从源代码到可执行文件的多个步骤,但您的第二个语句的真正问题是使用了“解释”一词。在编程语言社区中,“解释”具有特定的含义,它对 Java 的早期版本有效,但从未对任何版本的 C# 有效。 C# 是一种编译型语言,无论它经过什么阶段才能到达那里。

标签: programming-languages typing static-typing dynamic-typing


【解决方案1】:

Objective-C 可能具有您寻求的一些属性。类可以在运行时打开和更改,并且您可以向对象发送任何类型的消息,无论它通常是否响应它。这样,您可以实现鸭子类型,就像在 Ruby 中一样。类型id,大致相当于void*,可以被赋予接口来指定(否则未知的)类型将遵守的合同。

【讨论】:

    【解决方案2】:

    我相信 Lisp 符合这个描述。

    http://en.wikipedia.org/wiki/Common_Lisp

    【讨论】:

      【解决方案3】:

      C# 4.0 具有许多(如果不是全部)这些特征。如果您真的想要本机机器代码,您可以使用实用程序compile the bytecode down to machine code

      特别是,dynamic 关键字的使用允许对象及其成员在运行时动态绑定。

      观看 Anders Hejlsberg 的视频,C# 的未来,了解入门:

      http://channel9.msdn.com/pdc2008/TL16/

      【讨论】:

      • 技术上这是不正确的。 C# dynamic 所做的只是提供语法糖而不是使用 Object 作为类型。
      【解决方案4】:

      我不知道有任何语言具有这些功能。不过,我可以想到两个具有重要子集的:

      • D 具有类型推断、垃圾收集和强大的元编程工具,但可以编译为高效的机器代码。但是,它没有动态类型。
      • C#可以通过mono项目直接编译成机器码。 C# 具有与 D 类似的功能集,但同样没有动态类型。

      【讨论】:

        【解决方案5】:

        Objective-C 具有您提到的许多功能:它编译为机器代码,并且针对对象实例有效地动态键入。 id 类型可以存储任何类实例,Objective-C 使用消息传递而不是成员函数调用。可以在运行时创建/添加方法。 Objective-C 运行时也可以在运行时合成类实例变量,但是局部变量仍然需要声明(就像在 C 中一样)。

        C# 4.0 具有许多这些功能,除了它被编译为 IL(字节码)并使用虚拟机(CLR)进行解释。然而,这带来了一个有趣的观点:如果字节码被即时编译成机器码,这算不算?如果是这样,它不仅打开了任何 .Net 语言的大门,还打开了通往 Python(参见 PyPyUnladed SwallowIronPython)和 Ruby(参见 MacRubyIronRuby)和许多其他动态语言的大门类型语言,更不用说许多 LISP 变体了。

        【讨论】:

          【解决方案6】:

          VB 6 中的大部分内容

          【讨论】:

          • ...但并没有真正编译成机器码(编译成 p 码)。
          • 默认设置为编译为本机代码。 (您可以在项目属性中进行更改。)
          【解决方案7】:

          Python 到 C 可能需要这些标准。

          1. 用 Python 编写。

          2. 将 Python 编译为可执行文件。见Process to convert simple Python script into Windows executable。另见Writing code translator from Python to C?

          【讨论】:

          • 你不是在谈论/不是所有这些“编译器”链接器,它们只是将 python 二进制文件与脚本一起打包到一个可执行文件中?
          • @sub:“将二进制文件打包......在一个可执行文件中”不是编译器吗?请提供一些不包括从源代码创建一个可执行文件的定义。有些确实在编译二进制文件 FWIW 之前翻译成 C。
          • 不,不是。编译器将代码转换为计算机可读的二进制文件。 Py2exe(和其他系统)仅将 Python 可执行文件与 Python 脚本一起提供,因此,原始代码仍然是 Python,并且只能由 Python 可执行文件执行。但是存在variations 允许编译为 C 的 Python 语言,但它从来都不是原始的 Python(如 Cython)
          • @Manux: 在我运行 py2exe 之后,我有一个 .exe 可以直接被 windows 执行。正确的?这如何不符合问题中所述的标准?重要的不是你对编译的理解。重要的是这个问题是模糊的,有很多解决方案是可能的。
          • @S.Lott 因为它是packaged 而不是compiled
          【解决方案8】:

          与 Lisp 类似,Factor,默认情况下 无变量 的串联*语言、动态类型和灵活的对象系统。因子代码可以在交互式解释器中运行,也可以使用其deploy 函数编译为本机可执行文件。

          * 基于无点功能栈

          【讨论】:

            【解决方案9】:

            是的,这是可能的。见Julia。它是一种动态语言(您可以编写没有类型的程序),但它永远不会在 VM 上运行。它在运行时将程序编译为本机代码(JIT 编译)。

            【讨论】:

            • 在运行时编译和解释语言有什么区别?
            • 这是一个苹果/橘子的比较。运行时编译(jit 编译)是解释器在运行时用来提高性能的一种方法。解释型语言不一定需要 jit 编译,但基本上所有运行时都需要。
            猜你喜欢
            • 2012-12-12
            • 2015-09-09
            • 2011-05-20
            • 1970-01-01
            • 2016-04-05
            • 1970-01-01
            • 2011-02-09
            • 2019-10-23
            • 1970-01-01
            相关资源
            最近更新 更多