我想知道是否有一种编程语言可以编译成机器码/二进制代码(不是字节码,然后由虚拟机执行,考虑类型时完全不同),具有动态和/或弱类型的特性,例如:
想象一种编译语言,其中:
- 变量不需要声明
- 变量可以在运行时创建
- 函数可以返回不同类型的值
问题:
- 是否有这样一种编程语言?
- 为什么没有呢?
我认为一种动态但强类型的编译语言真的很有意义,但这可能吗?
我想知道是否有一种编程语言可以编译成机器码/二进制代码(不是字节码,然后由虚拟机执行,考虑类型时完全不同),具有动态和/或弱类型的特性,例如:
想象一种编译语言,其中:
问题:
我认为一种动态但强类型的编译语言真的很有意义,但这可能吗?
Objective-C可能具有您寻求的某些属性。类可以在运行时打开和更改,并且您可以向对象发送任何类型的消息,无论它通常是否会响应。通过这种方式,您可以实现鸭子类型,就像Ruby一样。类型id
,大致相当于void*
,可以赋予接口,指定(否则未知的)类型将遵守的合同。
dynamic
关键字允许在运行时动态绑定对象及其成员。Objective-C具有您提到的许多功能:它编译为机器代码,并且在对象实例方面是动态类型。 id
类型可以存储任何类实例,Objective-C使用消息传递而不是成员函数调用。方法可以在运行时创建/添加。Objective-C运行时还可以在运行时合成类实例变量,但本地变量仍然需要声明(就像在C中一样)。
C# 4.0具有许多这些功能,只是它编译为IL(字节码),并使用虚拟机(CLR)进行解释。但这引出了一个有趣的问题:如果字节码被即时编译为机器代码,那算不算?如果是这样,它不仅打开了任何.NET语言的大门,还包括Python(请参见PyPy或Unladed Swallow或IronPython)和Ruby(请参见MacRuby或IronRuby)以及许多其他动态类型语言,更不要提许多LISP变体了。
deploy
函数编译为本机可执行文件。VB 6已经具备大部分功能
我不知道有哪种语言具有完全相同的功能。但我可以想到两种具有重要子集的语言:
C/C++ 都可以使用 void*
间接支持动态类型。C++ 示例:
#include <string>
int main() {
void* x = malloc(sizeof(int))
*(int*)x = 5;
x = malloc(sizeof(std::string));
*(std::string*x) = std::string("Hello world");
free(x);
return 0;
}
std::any
:#include <string>
#include <any>
int main() {
std::any x = 5;
x = std::string("Hello world");
return 0;
}
当然,在C/C++中很少使用或需要鸭子类型,这两个选项都存在问题(void*
不安全,std::any
是巨大的性能瓶颈)。
你可能正在寻找的另一个例子是JavaScript的V8引擎。它是一个JIT编译器,意味着源代码在运行时被编译成字节码和机器码,尽管这对用户来说是隐藏的。
将Python转换为C可能需要满足以下条件:
使用Python编写代码。
将Python编译为可执行文件。请参见将简单的Python脚本转换为Windows可执行文件的过程。还可以参见从Python到C的代码翻译器编写?
变体
的Python语言可以编译成C,但它从来都不是原始的Python(如Cython)。 - Manux