有编译的*编程语言是否具有动态,甚至是弱类型?

时间:2010-03-31 17:24:26

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

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

想一下编译语言:

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

问题:

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

我认为一种动态但强大的类型化编译语言真的会感觉到,但它有可能吗?

9 个答案:

答案 0 :(得分:31)

我相信Lisp符合这种描述。

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

答案 1 :(得分:6)

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

答案 2 :(得分:6)

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

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

查看Anders Hejlsberg的视频, C#的未来,获取初级读本:

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

答案 3 :(得分:4)

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

C#4.0具有许多这些功能,除了它被编译为IL(字节码)并使用虚拟机(CLR)进行解释。然而,这提出了一个有趣的观点:如果字节码即时编译为机器代码,那还算数吗?如果是这样,它不仅可以打开任何.Net语言,还可以打开Python(请参阅PyPyUnladed SwallowIronPython)和Ruby(请参阅MacRubyIronRuby)和许多其他动态类型语言,没有提到许多LISP变体。

答案 4 :(得分:4)

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

答案 5 :(得分:3)

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

*无点功能堆栈

答案 6 :(得分:2)

VB 6大部分都是

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

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

  1. 用Python编写。

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