可以合并编程语言吗?


27

我已经编程了一段时间,已经编写了一些基本程序,而且我想继续学习。我已经到达了一个点,您不知道接下来要学什么,我想问一个自己的好奇心问题。

简而言之,问题是,是否可以将多种编程语言组合成一个结果?例如,此代码可以吗?

<html>
cout << "Hello world!";
</html>

要么

import java.util.Scanner;
cout << "Insert a number from 1 to 10";
Scanner n = new Scanner(System.in);
System.out.println("The value you entered was" +n.newLine());

这似乎是一个愚蠢的问题,但我不知道是否可能,所以这就是为什么我要问这个问题。在这个问题中,我注意到他在html代码中使用Python代码,如果上面的示例不可行,他做了什么?


12
为了使此方法有效(不使人发疯),至少需要严格的规则,以决定它们之间的交互方式以及应将哪些部分处理为哪种语言。

6
需要一个hellova lexer / parser。
乍得·哈里森,

2
@Brian Lua嵌入其中,解释器链接到某些C或C ++代码中,并用于运行存储在字符串或外部文件中的Lua代码,可能使C / C ++对象暴露于Lua代码。从这个问题的意义上讲,Lua 并非(如果有的话,也不经常)“嵌入”。

2
这就像制作五个字母,每个字母用不同的符号表示26个字母,然后将它们混合在一本书中:毫无意义,令人恼火且多余。
ThomasX 2012年

7
我认为人们显然已经忘记了“组合语言”(C / C ++程序中的ASM片段)的最常见(也是我能想到的唯一有效的现实生活)用例,通常是出于性能方面的考虑。
TC1 2012年

Answers:


43

您的第一个例子是可能的。通常,这种事情在PHP(以及其他相关的网络编程语言)中发生,如下所示:

<HTML>
<?PHP
call_some_php_function(1,2,"a","b"); /* This is may return nothing, a text string, or actual HTML markup code */
?>
</HTML>

有关此示例的一些重要注意事项:

  • HTML不是一种编程语言,它是一种标记语言。
  • PHP和HTML不在同一位置执行/解释:PHP代码由服务器上运行的PHP解释器执行,结果被“注入”到周围的HTML中。然后,将整个Blob发送到呈现完整HTML的客户端/浏览器。

您的第二个示例看起来像某种C ++和Java的混搭。可能会用不同的语言编写的已编译模块彼此对话,但是将Java和C ++合并在同一个源文件中将非常令人困惑和困难:编译器将如何知道哪些语句是Java以及哪些是C ++?

我想从理论上讲,您可以编写带有“语言”指示符的特殊编译器/预处理器,例如:

Java
{
    import java.util.Scanner;
}
C++
{
   cout << "Insert a number from 1 to 10";
}
Java
{
    Scanner n = new Scanner(System.in); //Actually, this line *could* be a C++ line - it's hard for me to tell just by looking at it.
    System.out.println("The value you entered was" +n.newLine());
}

但老实说,我不确定您这样做会带来什么帮助。

另外,这种混合语言环境将如何处理两者之间不兼容的语言功能?


每个人都忘记了一个示例(包括我自己),因此请随时将其添加到您的答案中:CUDA。它是两种非常不同的C语言的混合体,其中一些功能是为设备(GPU)编译的,而有些则保留在主机上,并且可以推断出通信层。
SK-logic

7
在一页上同时包含JavaScript,HTML和PHP并不少见。可怕,但并不罕见。
Michael Borgwardt 2012年

1
对PHP不太熟悉,但是ASP.NET(无论是C#还是VB.NET)代码生成HTML和JavaScript-并且JavaScript通常嵌入在.aspx页中。通常将完全分隔引用为理想选择,但是对带有SO标签的ASP.NET上的问题的快速概述将使您了解其复杂程度。
sq33G'2

@ sq33G-ASP.NET生成HTML代码。您可以根据需要添加javascript。ASP.NET当然不是作者所描述的。
Ramhound 2012年

如果没有其他人,我打算在一个文档中提出PHP / HTML / JS。
Ben Brocka'2

19

简短答案

并不是的。


长答案

嵌入

通常,单个源文件包含恰好一种编程语言的代码。出于多种原因,将多种语言合并到一个文件中并不常见:

  • 同时解析几种语法上不同的语言非常困难(如果不是不可能的话)。
  • 不同的语言对编程的处理不同。Haskell对函数的概念与C ++不同。

连结中

可以将共享公共应用程序二进制接口的不同编程语言进行组合,以形成单个可执行文件或库。使两种语言的签名相互可用通常需要花费一些工作,但是存在一些工具可以简化此过程。

多重发光

多语种代码是有效的,并且在多种语言中等效。 Stack Overflow的404页包含一个这样的程序:

堆栈溢出404多语言

这会在Python,Perl,Ruby,C,Brainfuck和Befunge中打印“ 404”

结论

语言很少混入文件中,当它们混合在一起时,是出于笑。人们甚至试图避免在项目中混用语言,因为这样做会带来额外的麻烦。因此,尽管在技术上可行,但混合不同的语言既不常见也不实用。


我在这里看不到任何红宝石...
Jason Lewis,

@JasonLewis我不了解Ruby,但是这篇文章说它评估第4行。
2012年

9
语言不一定总会因笑而混杂。大多数C编译器允许您混合使用Assembly和C,许多Forths也是如此。早在八十年代,游戏中最好的BASIC方言之一,Acorn的BBC Basic,就可以让您混合使用6502组件,这是当时非常理想的功能。这当然使BBC用户大笑,但几乎其他所有人都哭了,特别是那些不得不手工汇编6502机器代码并将原始操作码粘贴在程序中的DATA语句的用户。并不是说我很苦或什么。不
Alexios '02

1
@ SK-logic SQL是结构化查询语言,而不是编程语言。
Maxpm 2012年

1
对于现代软件开发而言,可悲的事情之一就是现在多语言应用变得更加困难。在DOS时代,几乎所有东西都编译到相同的目标文件中,并使用相同的参数传递约定。将它们链接在一起确实很容易。如今,还没有那么多……
Brian Knoblauch 2012年

7

是的,确实有可能。当然,这不是您想象的那样。有一些专门为此目的而构建的语言

实际上,将多种特定域的语言混合为一种宿主语言可能非常有用。尽管经常会发现用VB.NET和C#两种语言编写的项目,并且分别编译了不同的语言组件,但是几乎不需要在单个源代码文件中将两种或更多种“通用”语言混合在一起。

至于HTML,它只是一种标记语言。您可能经常会发现服务器端代码(例如,在VB.NET中),HTML标记和客户端Javascript代码混合到单个源文件中,尽管许多人认为这是不好的做法。


7

这通常称为多语种代码 -如果您点击链接或在网络上的其他各个地方,都有一些有趣的例子。其中大多数只是为了娱乐/证明这是可能的。

更严重的是,有许多现实生活中的示例,其中可以将两种或更多种不同的语言有效地结合起来:

  • Web模板-PHP或JSP文件等语言将代码混合到HTML中。关于这是否是一个好主意,意见分歧很大。
  • 宏语言 -通常将宏语言混合到源文件中,例如C / C ++预处理器宏。还有像Lisp这样的有趣情况,其中宏语言本身就是Lisp(唯一的区别是代码是在编译时还是在运行时运行)
  • DSL-通常定义一种特定于域的语言来帮助有效地解决特定问题,该语言已嵌入另一种语言的源代码中。这是一个漂亮的SQL DSL示例,可以将其嵌入Clojure代码中。
  • 脚本 -一些动态语言对短脚本特别有用,并且可以嵌入到用另一种语言编写的软件中。例如,Groovy脚本很容易嵌入Java应用程序中。
  • 多种语言项目 -有时使用多种语言只是为了利用每种语言的不同功能才有意义。例如,JVM支持多种语言,它们可以相当透明地进行互操作,因此您可以将Java(用于速度和静态类型的OOP)与Clojure(用于交互式开发,并发和功能编程)混合使用。这样的项目通常仍将不同的语言分隔为单独的源文件/文件夹,但是它们同时被编译以产生单个应用程序。

6

可以使用Perl Inline进行语言的某种组合,该语言允许编写Perl脚本并插入用另一种语言编写的代码段:

内联支持C,C ++,Java,Python,Ruby,Tcl,Assembler,Basic,Guile,Befunge,Octave,Awk,BC,TT(模板工具包),WebChat甚至PERL


我从未听说过Perl Inline。这是一个有趣的想法,但是与为非PERL代码使用单独的模块的通常方法相比,它是否具有任何优势?
FrustratedWithFormsDesigner 2012年

1
@FrustratedWithFormsDesigner:内联Perl是一个很棒的模块,但是有一些缺陷。它运作良好,但仅在相当基本的代码范围内。尽管已经研究了一段时间,但我不会在任何类型的产品中使用它。
动态

3

嵌入式SQL是将SQL语句嵌入其他语言程序的一种常用方法。

如今,它几乎已被易于编译的基于API的数据库访问所完全取代,该访问不需要修改宿主语言,而是使用其常规功能。


1
如今,嵌入式SQL以LINQ的形式卷土重来,而且它会一直存在。
SK-logic

@ SK-logic:LINQ如何类似于嵌入式SQL?它不是另一种语言,只是宿主语言中其他语言构造的应用。
约阿希姆·绍尔

LINQ是非常典型的嵌入式DSL,在语义上与其宿主语言无关。而且,在LINQ2SQL的情况下,它的行为与旧的嵌入式SQL完全相同,将其从字面上转换为SQL。
SK-logic

但是嵌入式SQL并非“转换为SQL”。您可以在C代码中编写文字 SQL(通常也不是在字符串常量中)。即使“尽管LINQ使用的语言功能(据我所知)是专为LINQ开发的,但它只是其宿主语言中的API”。
约阿希姆·绍尔

1
Pro C和Pro Fortran转换了SQL语句。LINQ不只是一个API,它是一个带有语法糖和大量可互换编译器后端的API。这使其成为成熟的嵌入式DSL的完美示例。
SK-logic

2

几种编程语言可以用来形成1 exe。一种方法是使用DLL。当然,对此有各种各样的担忧。例如,参数兼容性,COM兼容性等。实际上,如果考虑如何调用数据库系统来工作,您可能会发现DBMS并非总是以您所知道的语言编写的。只要知道接口,您甚至可能都不在乎。

当您的解决方案使用Web服务时,将更进一步地理解这一概念,这是结合多个软件组件的更干净的方法。

在.NET世界中,以上所有这些都在接口级别上得到了应用,而且XAML和HTML接口可以在Silverlight中一起使用。

在UNIX世界中,我们一次使用KShell脚本来启动C ++和COBOL程序,以便该解决方案能够正常工作。


2

我认为在这里值得提及Cython。它是用于编写C扩展的Python的超集,尽管它本身确实是一种独特的语言,但是如果您遵循Cython的Python样式语法,它几乎可以使您在Python代码中使用C代码。


0

组合语言的示例:Jython(Java中的python),Cog(Python在几乎所有形式中都用作嵌入式代码生成器)。如果您考虑代码生成,我经常使用Perl代码生成C ++。


0

.NET框架旨在允许多种语言参与一种解决方案。只要该语言可以产生CLR兼容的字节码,它就起作用。

http://www.geekinterview.com/question_details/1047


我认为那不是原始海报的意思。最终的字节码与以其编译语言编写的字节码几乎没有关系。
波斯语2012年

我认为您不理解这个问题。作者正在谈论在一个晦涩的文件中组合多种语言。
Craige

0

在一个文件中组合多种编程语言非常困难,非常丑陋且通常无济于事。

但是,可以用一种以上的语言编写一个大型项目。例如,Mozilla Firefox和MySQL都包含C和C ++代码。对于大型项目,通常会采用这种做法,因为一种特定的语言提供了某些功能,而另一种则没有。例如,在PHP中,您可以要求执行二进制可执行文件,获取其结果,然后在您的PHP代码中使用它。

如果您对世界上一些最重要的开源项目所使用的语言感到好奇,可以查看Ohloh.net。可以在此处找到有关许多项目的源代码的统计信息。


-1

您可以“混合” HTML中的语言。您可以将javascript嵌入到html中,这对于许多网站的工作原理实际上很重要。但是,当然,HTML是标记,而不是编程语言。

我认为按照您的建议去做,无论如何都要写一种新的语言。您要么必须创建一个能够使用所有这些语言并可以始终如一地框架化的解释器/编译器,要么需要某种方法来逐行明确地评估元语言。这两个选项基本相同,除了程序员必须做些什么才能使语言协同工作。


+1在HTML中混合语言,但我个人认为将HTML / CSS和JS分开是比较干净的。Web设计人员可以做自己的事情,而不必费力浏览整个网站中嵌入的严格JavaScript。
jmort253

您可以在HTML中混合使用各种语言,但是其中很少有编程语言,这是当前的主题。
Alexios '02

??Javascript不是编程语言吗?PHP的?我也见过perl和python注入,尽管那是Apache模块的注入。
markw 2012年

-1

语言是一种工具。在选择一种工具之前(还要做一些奇怪的悍马-PC-光谱仪组合),人们应该问自己-我到底想做什么?给出答案后,您将发现几乎不需要这种语言的混合。


-3

是的,只要您的解释器/编译器可以理解,就可以混合使用编程语言。例如,将HTML中的javascript,PHP,python或C#中的C ++混合在一起。

但是,混合语言会使阅读和修改代码变得更加困难,因此必须谨慎进行。解决此问题的一种方法是使用您需要调用的语言为代码创建单独的文件,然后导入而不是嵌入。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.