43

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

考虑一种编译语言,其中:

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

问题:

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

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

4

9 回答 9

34

我相信 Lisp 符合这种描述。

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

于 2010-03-31T17:32:54.007 回答
6

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

于 2010-03-31T17:32:49.517 回答
6

C# 4.0 具有许多(如果不是全部)这些特征。如果您真的想要本机机器码,您可以使用实用程序将字节码编译为机器码。

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

查看 Anders Hejlsberg 的视频The Future of C#,了解入门知识:

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

于 2010-03-31T17:33:11.347 回答
6

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

于 2016-03-09T04:26:40.560 回答
4

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

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

于 2010-03-31T17:33:34.670 回答
3

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

* 基于无点功能堆栈

于 2013-10-31T04:52:15.197 回答
2

VB 6 具有大部分功能

于 2010-03-31T17:35:49.103 回答
1

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

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

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

  1. 用 Python 编写。

  2. 将 Python 编译为可执行文件。请参阅将简单 Python 脚本转换为 Windows 可执行文件的过程。另请参阅编写从 Python 到 C 的代码翻译器?

于 2010-03-31T17:58:53.390 回答