在什么情况下应混合语言?
我不是在谈论将ASP.NET与C#和HTML一起使用,或者是用C语言编写的应用程序通过SQL查询访问SQL数据库。我正在谈论的事情,例如将C ++与Fortran或Ada与Haskell等混合使用。
[编辑]
首先:谢谢你的所有答案。
当我问这个问题时,我记得你总是读“每种语言都有其特殊用途”。
通常,您可以使用特殊库来获取几乎所有语言的内容。但是,如果您有兴趣学习不同的语言,为什么不采用最符合您目的的编程语言而不是解决您的语言最初不是为其设计的问题的库?
答案 0 :(得分:11)
例如,在视频游戏中,我们为不同的目的使用不同的语言:
在我的游戏中,我也使用HTML / Javascript进行GUI。
[编辑]
要回答您的编辑:您最了解的语言并不总是最有效的工作工具。这就是为什么例如我将C ++用于我的自制游戏,因为我最了解它(我可以使用很多其他语言,因为目标是Win / Mac / Linux,而不是控制台)但我使用Python来处理与构建过程相关的所有内容,文件操作等。我不深入了解Python,但使用C ++进行快速文件操作比使用C ++更容易。出于显而易见的原因,我不会将C ++用于Web应用程序。
最后,您可以使用对工作有效的方法。这就是你在现实世界的约束中学到的东西,并考虑到金钱,时间和质量。
答案 1 :(得分:5)
嗯,最明显(也是最常见)的情况是当你使用一些高级语言来制作大部分程序时,获得快速开发和健壮性的好处,同时使用一些较低级别的语言,如C甚至装配以在重要的地方获得速度。
此外,很多时候有必要与其他语言编写的其他软件进行交互。这里的一个很好的例子是操作系统公开的API - 它们通常用C编写(虽然我记得一些使用Pascal的旧MacOS版本)。如果您的语言编译器基础结构没有本机绑定,则必须编写一些接口代码以“粘合”您的程序“另一方”。
还有一些特定于域的语言专门用于有效地表达某种类型的计算。您通常不会将整个程序编写在其中,只是某些部分是适当的工具。 Prolog就是一个很好的例子。
最后但并非最不重要的一点是,您有时会有大量旧的和经过测试的代码用另一种语言编写,您可以从中受益。您可能只想将其与新程序连接,而不是用新的更好的语言重新发明轮子。这可能是最常见的(如果不是唯一的)将类似用途的语言混合在一起的情况(你提到的是C ++和Fortran吗?)。
通常,不同的语言有不同的优点和缺点。您应该尝试使用适当的工具来完成手头的工作。如果以不同的语言表达程序的某些部分所带来的好处大于这引入的问题,那么最好去做。
答案 2 :(得分:4)
我知道你在问题中排除了这一点,但不同的语言被用于不同的领域。
现在我正在研究一个数据可视化工具,数据在数据库中,所以当然有一些SQL,但这很难计算,因为它很小并且经常需要。数据变成了一系列图表,我使用R,就像MATLAB一样,但是开源。它是一种独特的统计语言,具有一些先进的绘图功能。
数据可视化工具不仅仅是图形生成器,因此需要一种方法来浏览和导航这堆图像文件。我们选择使用嵌入式javascript的html构建一个可以轻松分发的离线“应用程序”。它是独立的,它是自包含的,html是经过精心生成的,其内部的js经过精心设计,允许用户按照多种标准浏览数千个图像排序或过滤。
如何根据我的团队其他人取得进展而变化的数据库结构精心制作javascript和html?它们是由perl程序(真正的单通道脚本)制作的,它读取数据库中的某些结构和关键信息,然后输出超过300千字节的html / js。它也不是完全琐碎的html,与R图仔细对齐的图像映射和一些onclick()javascript允许用户实际与纯图像图进行交互,因此整个事情就像一个真正的数据浏览器/可视化应用程序。
这是四种“语言”,如果算上SQL,则为五种,只是为了制作单一的最终产品。
我不认为用单一语言这样做会是一个不错的选择,因为我们正在利用真实网络浏览器的功能为我们提供免费的GUI和前端。
答案 3 :(得分:2)
当前一个很好的例子是编写用于在VB.NET中创建XML文档的方法,它具有C#缺少的“XML文字”功能。由于它们都是.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
答案 4 :(得分:1)
将语言混合的最大原因是因为一种语言在某些领域具有优势,而另一种语言在另一种语言中具有优势。因此,您尝试通过将它们放在一起来利用两者的功能。一个常见的例子是使用C和ASM,因为C更抽象并且可以很容易地在程序中执行更复杂的操作,但是,您可能希望使用ASM来执行硬件和处理器的基本级别操作。因此,鉴于C的性质及其在嵌入式系统中的应用,它们经常是混合的。
答案 5 :(得分:1)
根据语言的范式,它有其优点和缺点。例如,有人可能希望使用C#的GUI功能,但使用 Prolog 的高效回溯或人工智能功能(逻辑范例)在显示之前计算一些细节。
简化示例
想象一下,尝试编写一个程序,允许用户对计算机进行国际象棋。
(潜在地)我会:
1。)使用Windows GUI库创建视觉效果。
2。)使用Prolog计算可能的移动,并选择最佳/最可行的移动。
3。)在我的C#代码中从Prolog中检索步骤2中的结果,然后渲染结果。
4。)允许C#中的视觉效果和用户界面的游戏性和快速开发,并依靠Prolog进行计算/回溯
答案 6 :(得分:1)
这种情况最常发生在您已经使用两种或更多种不同语言编写的代码时,您会发现组合这些程序是有意义的。重写很昂贵,需要时间。
在金融界,您经常需要将程序保持活跃(或替换)50年。每10年更换一次技术,就可以在最新的语言/环境中创建新的合同(抵押,人寿保险)。四个较旧的只处理每月付款和现有合同的变更。要了解公司的运作方式,您需要整合来自所有五个系统的数据。
我认为保持旧的活着比每次迁移到最新技术便宜。从风险规避的角度来看,这是有道理的。
Web应用程序可能不应该是开发人员的混合语言。 Smalltalk很好,Gemstone用于持久性,Seaside用作Web应用程序框架。多种语言(javascript)可以隐藏在框架中。
答案 7 :(得分:0)
当2个头比一个好时。
我经常看到用C#嵌入flash的游戏 - 用AI和其他繁重的代码运行C ++ DLL。
当被迫
时编写新代码以扩充旧框架支持的新系统
答案 8 :(得分:0)
例如在游戏中(这是相当硬核的应用程序)你通常有一个非常紧凑的c ++引擎,可以完成所有繁重的工作和脚本语言(例如Lua),这些语言可以访问并且适合于我们收集特殊情况呼叫'游戏'发生。
答案 9 :(得分:0)
这里的人有大部分原因。我会有这个:
还有优雅退化的情况。例如,我正在使用传统的内部网,我们正在逐渐从一种语言转换到另一种语言,所以此时我们在同一系统中使用不同的语言。
答案 10 :(得分:0)
设备编程 - 通常您会希望使用操作系统的本机UI语言(例如适用于Android的Java)对UI进行编程,但需要使用更低端的内容对设备驱动程序进行编程等级(如C)。