7

在哪些情况下应该混合使用语言?

我不是在谈论使用带有 C# 和 HTML 的 ASP.NET 或用 C 编写的应用程序通过 SQL 查询访问 SQL 数据库。例如,我说的是诸如将 C++ 与 Fortran 或 Ada 与 Haskell 等混合。

[编辑]

首先:感谢您的所有回答。

当我问这个问题时,我想到你总是读到“每种语言都有其特殊目的”。

通常,您可以使用特殊库以任何语言完成几乎所有工作。但是,如果您对学习不同的语言感兴趣,为什么不选择最能满足您的目的的编程语言,而不是解决您的语言最初不是为之设计的问题的库呢?

4

11 回答 11

11

例如,在视频游戏中,我们为不同的目的使用不同的语言:

  • 应用程序(游戏)代码:必须快速、有条理并且大多数时候是跨平台的(至少要考虑 win,MacOS 是可以想象的),通常在约束繁重的平台(控制台)上,所以 C++(有时是 C 和 asm ) 用来。
  • 开发工具:关卡设计工具生成游戏代码将使用的数据。这类工具不需要在目标平台上运行(但如果可以的话,调试起来会更容易),所以它们通常是用 C#、Python 等快速开发语言制作的。
  • 脚本系统:游戏的某些部分必须由设计师使用变量或脚本进行调整。嵌入脚本语言而不是编写脚本语言确实更容易且便宜,因此经常使用 Lua 或其他类似的脚本语言。
  • Web 应用程序:有时游戏需要在线提供一些数据,通常在使用 SQL 访问的数据库中。然后用 C#、Ruby(ROR)、Python、PHP 或任何其他适合这项工作的语言编写 Web 应用程序。由于它是关于网络的,因此您也必须使用 HTML/Javascript。
  • ETC...

在我的游戏中,我也将 HTML/Javascript 用于 GUI。

[编辑]

回答您的编辑:您最了解的语言并不总是最有效的工作工具。这就是为什么我在自制游戏中使用 C++ 的原因,因为我最了解它(我可以使用很多其他语言,因为目标是 Win/Mac/Linux,而不是控制台),但我将 Python 用于与构建过程相关的所有内容,文件操作等。我不深入了解 Python,但使用它进行快速文件操作比使用 C++ 更容易。出于显而易见的原因,我不会将 C++ 用于 Web 应用程序。

最后,您使用对工作有效的方法。这就是您在现实世界的限制条件下工作所学到的,同时考虑到金钱、时间和质量。

于 2009-07-03T21:52:42.857 回答
5

好吧,最明显(也是最常见)的情况是,当您使用一些高级语言来编写大部分程序时,获得快速开发和健壮性的好处,同时使用一些低级语言(如 C 甚至汇编语言)来获得在重要的地方加快速度。

此外,很多时候需要与用其他语言编写的其他软件进行交互。这里的一个很好的例子是操作系统公开的 API - 它们通常是用 C 编写的(尽管我记得一些使用 Pascal 的旧 MacOS 版本)。如果您的语言编译器基础结构没有本机绑定,则必须编写一些接口代码来将您的程序与“另一面”“粘合”起来。

还有一些特定领域的语言经过专门调整以有效地表达某种类型的计算。您通常不会在其中编写整个程序,而只是其中一些部分是适当的工具。Prolog 就是一个很好的例子。

最后但并非最不重要的一点是,您有时手头有大量用另一种语言编写的旧代码和经过测试的代码,您可以从使用这些代码中受益。与其用一种新的更好的语言重新发明轮子,您可能只是想将它与您的新程序接口。当面向类似用途的语言混合在一起时,这可能是最常见的(如果不是唯一的)情况(您提到的是 C++ 和 Fortran 吗?)。

一般来说,不同的语言有不同的优点和缺点。您应该尝试使用适当的工具来完成手头的工作。如果用另一种语言表达程序的某些部分所带来的好处大于它带来的问题,那么最好去做。

于 2009-07-03T21:56:32.803 回答
4

我知道在您的问题中您排除了这一点,但不同的语言用于不同的域。

现在我正在开发一个数据可视化工具,数据在数据库中,所以当然有一些 SQL,但这几乎不重要,因为它很小并且经常需要。数据变成了一系列图表,我使用的是 R,它类似于 MATLAB,但是是开源的。它是一种独特的统计语言,具有一些高级绘图功能。

数据可视化器不仅仅是一个图形生成器,因此需要有一种方法来浏览和导航这堆图像文件。我们选择使用带有嵌入式 javascript 的 html 来构建一个可以轻松分发的离线“应用程序”。它是离线的,因为它是自包含的,html 是精心生成的,其中的 js 是精心制作的,允许用户浏览数千张按多种标准排序或过滤的图像。

您如何根据随着团队其他成员的进步而变化的数据库结构精心制作 javascript 和 html?它们是由一个 perl 程序(实际上是单通道脚本)制作的,该程序读入 db 以获取一些结构和关键信息,然后输出超过 300 KB 的 html/js。它也不是完全微不足道的 html,与 R 图和一些 onclick() javascript 仔细对齐的图像映射允许用户实际与纯图像图进行交互,因此整个事情感觉就像一个真正的数据浏览器/可视化应用程序。

那是四种“语言”,如果算上 SQL,则有五种,只是为了制作一个最终产品。

我不认为用一种语言来做这件事是一个好的选择,因为我们正在利用真正的网络浏览器的功能来为我们提供免费的 GUI 和前端。

于 2009-07-03T21:50:04.110 回答
2

当前一个很好的例子是在 VB.NET 中编写用于创建 XML 文档的方法,它具有 C# 所缺乏的“XML Literals”特性。由于它们都是 .NET 语言,因此没有理由不互相调用:

Public Function GetEmployeeXml (ByVal salesTerritoryKey As Integer) As XElement
    Using context As New AdventureWorksDW2008Entities
        Dim x = <x>
                <%= From s In context.DimSalesTerritory _ 
                Where s.SalesTerritoryKey = salesTerritoryKey _
                Select _
                <SalesTerritory 
                    region=<%= s.SalesTerritoryRegion %>
                    country=<%= s.SalesTerritoryCountry %>>
                    <%= From e in s.DimEmployee _
                        Select _
                    <Employee firstName=<%= e.FirstName %> lastName=<%= e.LastName %>>
                         <%= From sale in e.FactResellerSales _
                             Select _
                        <Sale 
                            orderNumber=<%= sale.SalesOrderNumber %>
                            price=<%= sale.ExtendedAmount %>/>  %>
                    </Employee> %>
                </SalesTerritory> %>
                </x>
        Return x
    End Using 
End Function  
于 2009-07-03T22:45:04.640 回答
1

您混合语言的最大原因是因为一种语言在某些领域具有优势,而另一种语言在另一种领域具有优势。因此,您尝试通过将两者结合在一起来利用两者的功能。一个常见的例子是使用 C 和 ASM,因为 C 更抽象,可以很容易地在程序中做更复杂的事情,但是,您可能希望使用 ASM 来处理硬件和处理器的基础级事情。因此,考虑到 C 的性质及其在嵌入式系统中的使用,它们通常是混合的。

于 2009-07-03T21:34:47.090 回答
1

根据一种语言属于哪种范式,它有其优点和缺点。例如,人们可能想使用 C# 的 GUI 功能,但使用Prolog (逻辑范式中的一种语言)的高效回溯或人工智能功能在显示它们之前计算一些细节。

一个简化的例子

想象一下尝试编写一个程序,允许用户对着计算机下国际象棋。

(可能)我会:

1.)使用 Windows GUI 库创建视觉效果。

2.)使用 Prolog 计算可能的移动,并选择最佳/最可行的移动。

3.)在我的 C# 代码中从 Prolog 中检索第 2 步的结果,并渲染结果。

4.)允许在 C# 中进行游戏性和视觉效果和 UI 的快速开发,并依靠 Prolog 进行计算/回溯

于 2009-07-03T21:41:18.090 回答
1

当您已经用两种或多种不同的语言编写了代码并且您注意到组合这些程序很有意义时,这通常会发生。重写是昂贵的并且需要时间。

在金融世界中,您通常必须使程序保持(或替换)50 年。随着每 10 年的技术更新,新合同(抵押贷款、人寿保险)以最新的语言/环境创建。四个较旧的只处理每月付款和现有合同的更改。要了解公司的运作情况,您需要整合来自所有五个系统的数据。

我想保持旧的活着比每次迁移到最新的技术要便宜。从风险规避的角度来看,这是有道理的。

对于开发人员来说, Web 应用程序可能不应该是混合语言。Smalltalk 做得很好,Gemstone 用于持久性,Seaside 作为 Web 应用程序框架。多种语言(javascript)可以隐藏在框架中。

于 2009-07-03T21:58:15.920 回答
0
  • 当 2 个头优于 1 个时。

    我经常看到使用 C# 嵌入 Flash 的游戏——AI 和其他繁重的代码从 C++ DLL 运行。

  • 当被迫

    编写新代码以增强旧框架支持的新系统

于 2009-07-03T21:45:11.000 回答
0

例如,在游戏(它们是非常核心的应用程序)中,您通常拥有一个非常紧凑的 c++ 引擎来完成所有繁重的工作,以及一种易于访问且适合制作我们称之为“游戏”的特殊情况集合的脚本语言(例如 Lua) '发生。

于 2009-07-03T21:57:27.637 回答
0

这里的人有大部分原因。我只要这个:

还有优雅降级的情况。例如,我正在研究一个遗留的 Intranet,我们正在从一种语言一点一点地改变到另一种语言,所以此时我们在同一个系统中有不同的语言。

于 2009-07-03T22:49:11.667 回答
0

设备编程- 通常您希望使用操作系统的本机 UI 语言(例如 Android 的 Java)对 UI 进行编程,但需要使用更深入底层的东西(如 C)对设备驱动程序进行编程。

于 2009-07-05T16:53:02.447 回答