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