我想知道是否有一种编程语言编译成机器代码/二进制文件(不是字节码然后由VM执行,这在考虑打字时完全不同)具有动态和/或弱类型,例如:
想一下编译语言:
问题:
我认为一种动态但强大的类型化编译语言真的会感觉到,但它有可能吗?
答案 0 :(得分:31)
我相信Lisp符合这种描述。
答案 1 :(得分:6)
Objective-C可能具有您寻求的一些属性。可以在运行时打开和更改类,并且可以向对象发送任何类型的消息,无论它是否通常响应它。通过这种方式,您可以实现鸭子类型,就像在Ruby中一样。类型id
(大致相当于void*
)可以赋予接口,该接口指定(否则未知)类型将遵守的合同。
答案 2 :(得分:6)
C#4.0具有许多(如果不是全部)这些特征。如果您真的想要本机机器代码,可以使用实用程序compile the bytecode down to machine code。
特别是,使用dynamic
关键字允许在运行时动态绑定对象及其成员。
查看Anders Hejlsberg的视频, C#的未来,获取初级读本:
答案 3 :(得分:4)
Objective-C有许多你提到的功能:它编译为机器代码,并且相对于对象实例有效地动态输入。 id
类型可以存储任何类实例,而Objective-C使用消息传递而不是成员函数调用。可以在运行时创建/添加方法。 Objective-C运行时还可以在运行时合成类实例变量,但仍需要声明局部变量(就像在C中一样)。
C#4.0具有许多这些功能,除了它被编译为IL(字节码)并使用虚拟机(CLR)进行解释。然而,这提出了一个有趣的观点:如果字节码即时编译为机器代码,那还算数吗?如果是这样,它不仅可以打开任何.Net语言,还可以打开Python(请参阅PyPy或Unladed Swallow或IronPython)和Ruby(请参阅MacRuby或IronRuby)和许多其他动态类型语言,没有提到许多LISP变体。
答案 4 :(得分:4)
是的,有可能。见Julia。它是一种动态语言(您可以编写没有类型的程序)但它永远不会在VM上运行。它在运行时将程序编译为本机代码(JIT编译)。
答案 5 :(得分:3)
与Lisp类似,有Factor,默认为无变量的串联*语言,动态类型和灵活的对象系统。因子代码可以在交互式解释器中运行,也可以使用其deploy
函数编译为本机可执行文件。
*无点功能堆栈
答案 6 :(得分:2)
VB 6大部分都是
答案 7 :(得分:1)
我不知道任何具有这些功能的语言。我可以想到两个有重要子集的人:
答案 8 :(得分:0)
Python to C可能需要这些标准。
用Python编写。
将Python编译为可执行文件。见Process to convert simple Python script into Windows executable。另请参阅Writing code translator from Python to C?