Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Programming languages 有没有一种编译过的*编程语言具有动态的,甚至是弱类型的功能?_Programming Languages_Typing_Static Typing_Dynamic Typing - Fatal编程技术网

Programming languages 有没有一种编译过的*编程语言具有动态的,甚至是弱类型的功能?

Programming languages 有没有一种编译过的*编程语言具有动态的,甚至是弱类型的功能?,programming-languages,typing,static-typing,dynamic-typing,Programming Languages,Typing,Static Typing,Dynamic Typing,我想知道是否有一种编程语言可以编译成机器代码/二进制代码(而不是字节码,然后由VM执行,这在考虑键入时是完全不同的),它具有动态和/或弱键入功能,例如: 设想一种编译语言,其中: 变量不需要声明 可以在运行时创建变量 函数可以返回不同类型的值 问题: 有这样一种编程语言吗 (为什么)没有 我认为,一种动态但强类型的编译语言确实有意义,但这有可能吗?Objective-C可能具有您所寻求的一些属性。类可以在运行时打开和更改,并且您可以向对象发送任何类型的消息,无论对象是否通常响应它。这样,

我想知道是否有一种编程语言可以编译成机器代码/二进制代码(而不是字节码,然后由VM执行,这在考虑键入时是完全不同的),它具有动态和/或弱键入功能,例如:

设想一种编译语言,其中:

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

  • 有这样一种编程语言吗
  • (为什么)没有

我认为,一种动态但强类型的编译语言确实有意义,但这有可能吗?

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

我相信Lisp符合该描述

C#4.0有很多(如果不是全部的话)这些特性。如果您确实需要本机代码,可以使用实用程序

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

请查看Anders Hejlsberg的视频《C#的未来》,了解入门知识:


我不知道有哪种语言具有这些功能。不过,我可以想出两个具有重要子集的:

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

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


除了编译成IL(字节码)并使用虚拟机(CLR)进行解释外,C#4.0还有许多这些特性。然而,这带来了一个有趣的问题:如果字节码被及时编译成机器码,那么这算不算?如果是这样的话,它不仅为任何.Net语言打开了大门,而且为Python(请参阅或)和Ruby(请参阅或)以及许多其他动态类型语言打开了大门,更不用说许多LISP变体了。

VB6拥有其中的大部分,Python到C可能需要这些标准

  • 用Python编写

  • 将Python编译为可执行文件。看见也看到


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


    *基于无点功能堆栈的

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

    @Platinum:您可以使用NGen获取机器代码。@Robert Harvey:噢,拜托,这不算。这不是语言固有的。以这种速度,我可以说Java也是一种编译语言,因为它也有.exe包装器。既然我在使用脚本语言,为什么不使用脚本语言呢?当然也有转换程序可以使用脚本并生成二进制文件?@Platinum:我不太明白你的意思。从C#和NGen获得的机器代码实际上可能比一些直接到机器代码的本机代码编译器的质量更高。抖动能够进行一些相当实质性的优化。exe黑客的脚本甚至不能被认为是同一件事。@Robert Harvey:我有点受伤,因为你会这样对待我。仔细阅读:我没有说NGen没有生成机器代码。这不是我的问题。我的问题是,您必须使用它,作为将C#代码转化为机器语言所需的多个步骤之一。C#编译成一种中间语言。编译后的机器代码不是该语言的固有代码。从这个意义上讲,它就像是一个脚本到-.exe工具,尽管这些工具可能很粗糙。@Platinum Azure-每种编译的编程语言都需要从源代码到可执行文件的多个步骤,但第二条语句的真正问题是使用了“解释”一词。在编程语言社区中,“解释的”有一个特定的含义,它适用于早期版本的Java,但从来没有适用于任何版本的C。C#是一种编译语言,不管它经过什么阶段到达那里……但并不真正编译为机器代码(编译为p代码)。默认设置是编译为本机代码。(您可以在项目属性中对此进行更改。)您不是在谈论/不是所有这些“编译器”链接器,它们只是将python二进制文件与脚本打包在一个可执行文件中吗?@sub:“打包二进制文件…在一个可执行文件中”怎么不是编译器?请提供一些排除从源代码创建一个可执行文件的定义。有些在编译二进制文件之前会翻译成C,FWIW。不,不是。编译器将代码转换为计算机可读的二进制文件。Py2exe(和其他系统)仅将Python可执行文件与Python脚本t一起提供