我想知道是否有一种编程语言可以编译为机器码/二进制(不是字节码,然后由 VM 执行,在考虑打字时这是完全不同的东西),具有动态和/或弱类型,例如:
考虑一种编译语言,其中:
- 变量不需要声明
- 可以在运行时创建变量
- 函数可以返回不同类型的值
问题:
- 有这样的编程语言吗?
- (为什么不?
我认为动态但强类型的编译语言真的很有意义,但有可能吗?
我想知道是否有一种编程语言可以编译为机器码/二进制(不是字节码,然后由 VM 执行,在考虑打字时这是完全不同的东西),具有动态和/或弱类型,例如:
考虑一种编译语言,其中:
问题:
我认为动态但强类型的编译语言真的很有意义,但有可能吗?
我相信 Lisp 符合这种描述。
Objective-C 可能有一些你想要的属性。类可以在运行时打开和更改,并且您可以向对象发送任何类型的消息,无论它通常是否响应它。通过这种方式,您可以实现鸭子类型,就像在 Ruby 中一样。type id
,大致相当于 a void*
,可以被赋予接口来指定(否则未知的)类型将遵守的协定。
C# 4.0 具有许多(如果不是全部)这些特征。如果您真的想要本机机器码,您可以使用实用程序将字节码编译为机器码。
特别是,dynamic
关键字的使用允许对象及其成员在运行时动态绑定。
查看 Anders Hejlsberg 的视频The Future of C#,了解入门知识:
是的,有可能。见朱莉娅。它是一种动态语言(您可以编写没有类型的程序),但它永远不会在 VM 上运行。它在运行时将程序编译为本机代码(JIT 编译)。
Objective-C 具有您提到的许多功能:它编译为机器代码,并且相对于对象实例有效地动态键入。该id
类型可以存储任何类实例,Objective-C 使用消息传递而不是成员函数调用。可以在运行时创建/添加方法。Objective-C 运行时也可以在运行时合成类实例变量,但是仍然需要声明局部变量(就像在 C 中一样)。
C# 4.0 具有许多这些功能,除了它被编译为 IL(字节码)并使用虚拟机(CLR)进行解释。然而,这带来了一个有趣的观点:如果字节码被即时编译为机器码,这算不算?如果是这样,它不仅为任何 .Net 语言、Python(参见PyPy或Unladed Swallow或IronPython)和 Ruby(参见MacRuby或IronRuby)和许多其他动态类型语言打开了大门,更不用说许多 LISP 变体了。
与 Lisp 类似,还有Factor ,一种默认情况下没有变量的连接*语言、动态类型和灵活的对象系统。因子代码可以在交互式解释器中运行,也可以使用其deploy
函数编译为本机可执行文件。
* 基于无点功能堆栈
VB 6 具有大部分功能
我不知道有任何语言具有这些功能。不过,我可以想到两个具有重要子集的:
Python 到 C 可能需要这些标准。
用 Python 编写。
将 Python 编译为可执行文件。请参阅将简单 Python 脚本转换为 Windows 可执行文件的过程。另请参阅编写从 Python 到 C 的代码翻译器?