将多种语言编译在一起

3

是否有可能将多种语言编译在一起,以获得不同语言的最佳功能?


2
为什么交叉编译是您的标签之一?不是批评,只是想知道。 - Richard Pennington
7个回答

7

如果编译器和链接器都兼容,那么在将它们分别编译后,肯定可以(如果编写得当)将它们连接在一起。例如:

g77 -c one.f
gcc -c two.c
gcc -o together one.o two.o

这个命令会编译一个Fortran文件和一个C文件,然后使用GCC工具链将它们链接起来成为一个名为together的可执行文件(假设它们彼此调用正确)。

微软的.NET是一种常见的多语言混合使用的方法——比如C#、F#、IronPython、IronRuby等。Visual Studio会处理编译成兼容代码和组装在一起形成程序集的工作,但你也可以手动操作。

如果你所说的“编译在一起”是指将多种不同语言的代码放在同一个文件中,这也是可能的,但较为罕见——例如,有些C编译器有扩展功能,可以让你在同一个文件中表达“内嵌”汇编语言。


真的吗?我们可以创建一个组合语言/编译器吗?也许在未来这将成为可能,因为所有语言都会创建与语言无关的机器代码..是什么阻止我们创造这样的东西呢? - Xinus
1
通常代码的复杂性较高,因为您需要编写基本上两个编译器加上一些额外的代码才能使其正常工作。 - RCIX

3

是的,这是可能的,但很大程度上取决于具体的语言。例如,从Python调用C函数或C++类通常是可以实现的。


但是,如何使其独立于语言呢?我知道.NET通过IL实现了语言互操作性,但为什么我们不能结合不同的语言进行本地编译呢?Alex Martelli提出的解决方案之一是将它们分别放在不同的文件中并分别编译,但是否可能创建一个编译器,利用所有编译器来编译同一文件中存在的不同语言源代码呢? - Xinus
1
Xinus:编写一个可以理解多种混合语言的编译器是完全可行的,只要您能够解决互操作性歧义和其他问题。但是,为一种语言编写一个功能完善的编译器已经很困难了,更别提解决这些额外的问题了。此外,语言设计者们总是会从其他语言中借鉴他们认为有用的特性,并且几乎总能更容易地将它们融入到该语言中,而不是尝试支持许多不同语言的整体。 - Roger Pate

1
在C语言中,处理Algol-68的thunks确实很困难。虽然可以做到,但我不认为我每天都愿意这么做。

1
Algol60是具有thunks的语言... Algol68具有数组/字符串/矩阵切片...这需要一个C-API来访问Algol68运行时。其他考虑因素包括嵌套函数、格式类型和线程。对于大多数代码,这些可以简单地避开。 - NevilleDNZ

1

.Net平台是多语言的。Parrot非常适合于混合使用Perl、Python、Ruby等编程语言。你想要做什么呢?


1

另一个结合语言的好例子是Java平台。您可以在Java中混用Groovy、Jython、JRuby、Scala、Clojure和其他语言。这些不同的语言需要不同的编译器,但通常可以从一种语言调用另一种语言。Groovy和Scala特别适合互操作。

哦,Java本地接口(JNI)允许您从Java调用C、C++、汇编和其他语言。

(.NET平台具有与此相同的属性,正如其他帖子所指出的那样。)


1
如果你正在使用 .NET,你可以将你的项目编译成不同的语言的 netmodule 然后将它们链接到一个单独的 dll/exe 中。Visual Studio 不支持这个功能,但是 msbuild 可以。最简单的编译方法是编辑一个 .csproj 文件的副本,将输出类型更改为 "module",然后运行 msbuild 进行编译。然后使用 "link" 命令将你的模块链接到最终的 exe/dll 中。

0

看一下Swig。它可以封装你的C/C++代码,这样你就可以从几乎任何其他语言中调用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接