可以附加多少编程语言 - 有限制吗?
没有限制。您可以根据需要在单个程序中使用尽可能多的编程语言。
同时在同一个项目中使用多种语言(但不一定是同一个程序)称为多语言编程。
甚至还有一种称为面向语言编程的编程范例,您不仅可以在同一个程序中同时使用多种语言,还可以创建适合您的问题域的语言。就像您创建许多不同的高度专业化的对象来解决面向对象编程中的特定子问题一样,您可以创建许多不同的高度专业化的编程语言来解决LOP中的特定子问题。
哪些其他编程语言具有类似功能?
它不是编程语言的一个特性,正如您自己发现的那样,它是实现的一个特性。(或者,更为精确:所涉及的所有语言的实现之间的交互特征。)在您的情况下,不是Python编程语言允许这种互操作性,它是IronPython实现 - 您不能如果您使用CPython或Jython,几乎可以轻松地在C和Python之间进行互操作。
但是,请注意,编程语言规范当然可能要求所有实现必须以某种方式可互操作。
通常,为了混合两种不同的编程语言,这些语言中的程序必须能够彼此交换数据,并且以某种方式影响彼此的行为(例如,调用函数)。让我们称之为使语言能够互操作“魔术通道”的东西。
魔术频道越基本和越低,两种语言在某种程度上能够互操作的可能性就越大,但另一方面,互操作将具有更低的“保真度”。在最坏的情况下,您创建两个完全独立的程序,一个程序可以简单地将其输出写入文件,然后由另一个文件读取和解析并处理。
魔术频道越高级,互操作性就越高。例如,语言A中的类可以从语言B中的类继承并调用用C语言编写的方法。但另一方面,魔术通道的级别越高,它就越有可能存在。魔术频道和其中一种语言之间的“阻抗不匹配”。想象一下基于对象,类和方法的魔术通道,现在你尝试在Io(没有类)和Forth(没有对象,没有类,没有方法)之间进行互操作。
许多编程语言实现允许与C编程语言的一部分功能的基本互操作性作为它们的“共同魔术通道”。这通常称为外部函数接口(FFI)。由于许多现代操作系统都是基于C的语义,许多编程语言实现都是用C语言实现的,或者可以很容易地与它互操作的语言(C ++,D,Rust,Go等),基于C语言的FFI通常会允许几乎任何东西的互操作性。但是,它有点低级。
针对Java平台或CLI平台的编程语言实现通常尝试使用该平台的本机抽象作为其神奇通道,这些通道比C高一点(例如,Java和CLI都有对象,类和方法) 。
微软创建了(现在大部分被遗弃的)动态语言运行时作为在更高层次上实现互操作性的一种方式。作为一点历史:IronPython是由Jython的作者编写的,用于证明CLI不适用于动态语言。令他惊讶的是,他早期的,未经优化的一次性演示不仅比他想象的要快得多,而且比Jython快得多,甚至比CPython还要快。他后来被微软聘用,并聘请了另一个人来编写IronRuby实现。他们分析了IronPython的实现和Ruby实现的潜在需求(以及CLI的现有Ruby实现,如Ruby.NET),同时还关注其他潜在的语言,如ECMAScript。然后,他们提取了部分IronPython并使它们通常可重复使用,动态语言运行时,同时构建IronRuby作为开源和永不发布的专有ManagedJS(ECMAScript的实现)和动态VB(又名VBx,一种语言的实现,可以看作是Classic VB6的现代化延续或VisualBasic.NET的动态变体)。其他开发人员很快就接受了DLR,产生了例如IronJS和IronScheme。
MS展示了这四种语言以及其他“经典”CLI语言(如C和F)之间令人印象深刻的互操作性。不幸的是,微软完全放弃了ManagedJS和VBx,向社区发布了IronPython和IronRuby(IronPython被捡起,IronRuby或多或少死了)并且也停止了DLR的开发。现在,只有支持C所需的最小DLR功能dynamic仍然是.NET的一部分,更全功能的版本作为IronPython的一部分进行维护。
在Java社区中,有一些类似的项目:dynalang现在大多已经死了,但dynalink是从Nashorn中提取出来的,类似于从IronPython中提取的DLR,它是活生生的,并且是自Java以来Java的一部分9。
一个非常有趣的项目是Truffle,它是一个轻松编写编程语言解释器的框架。通常,如果这些语言解释器是根据某些接口和规则编写的,那么它们将能够在很高的层次上相互之间以及与其他基于JVM的语言(包括但不限于Java)进行互操作。Truffle目前提供Ruby,ECMAScript(包括Node.js兼容库和运行时),R,Python以及非常有趣的LLVM bitcode的实现。特别是在GraalVM上运行Truffle时,您可以非常好地支持Polyglot编程。
该鹦鹉虚拟机是一个非常宏大的虚拟机和运行时的目的是对动态语言的一个通用平台。它由Perl6社区设计,旨在作为Rakudo的主要目标平台。曾经有过Perl5,Perl6,Ruby,Python,ECMAScript,Lua,PHP,Scheme等许多实现,但没有一个处于生产就绪状态。