2009-12-11 228 views
4

一個程序可以用多種編程語言編寫嗎?我在The Daily WTF上閱讀的內容似乎意味着大型公司/組織在構建大型應用程序時使用幾種不同的語言。這是如何運作的?我知道從與Django一起工作時,動態網頁經常與許多不同的語言(Python的控制器,HTML + Django的模板語言的視圖和SQL的模型)放在一起,但怎麼樣,即編譯時會變成.exe的東西?用2種語言編寫程序?

+0

亞馬遜的體系結構 - http://highscalability.com/amazon-architecture - 是C++,Java和Perl的良好混搭。 – 2009-12-11 06:17:51

回答

3

這是相當普遍建立使用不同的漢語語言和技術的大型應用程序。混合語言有不同的方式。

首先,從不同語言的編譯器可產生可連接在一起兼容輸出。這可以是C,C++,Pascal等編譯爲本地代碼的.obj文件。或者可以是.NET程序集 - 您可以毫不費力地使用任何其他.NET家族語言程序集編寫的任何.NET族語言編寫的程序集。

然後,還有就是各種互聯互通技術。您可以將一些代碼封裝爲COM對象,並以不同語言的應用程序使用。或者你可以將不同語言的代碼放入不同的程序中,並通過RPC等進程間通信技術進行通信。在後一種情況下,他們完全不關心另一個進程是如何工作的 - 他們只發送和接收消息 - 就像你不關心你從瀏覽器中讀取頁面的瀏覽器和Web服務器很可能是用不同的語言編寫的一樣。

3

如果不同語言的編譯器可以生成相同格式的目標文件,鏈接器不關心他們編譯的語言

此外,您可以從任何語言編譯.dll,它的工作原理是相同的。

2

這是可能的,雖然不是很常見。所有語言最終都被編譯爲彙編語言,因此只要每種語言使用相同的ABI(調用約定等),用不同語言編譯的模塊就可以鏈接在一起。不過這並不常見。

另外,許多程序使用擴展語言。例如,魔獸世界中的大部分用戶界面都是用Lua擴展語言編寫的,儘管核心WoW程序可能是C++。

+10

交互語言實際上是非常常見的。 – Randolpho 2009-12-11 06:04:40

+0

我會同意它很常見。大多數程序都是以一種核心語言開始開發的。然而,隨着時間的推移,隨着計劃的發展,會引入更多的語言。 – 2009-12-11 06:08:14

+0

並非所有語言都被編譯爲程序集。許多仍然被解釋。它們被彙編代碼解釋,並且它們可以被編譯成彙編,但它們仍然被解釋。 – 2009-12-11 06:46:17

1

簡短的回答是肯定的,長的回答是:

是,通過執行以下的一種或多種:

  1. 大廈庫和編譯時他們連接起來。
  2. 構建動態庫並在運行時鏈接到它們,這樣你就可以擁有一個exe和一些dll。
  3. 對於像.net這樣的框架,只要框架支持,語言並不重要,因爲它可以用相同類型的代碼編譯,或者框架知道如何運行它。
3

是的,您當然可以使用多種語言編寫程序。你需要做的是模塊化程序。例如將模塊寫入爲DLL。如果只要DLL之間的接口很常見,就可以爲每個DLL使用不同的語言。

我在一個已經開發了8年以上的程序上工作。該程序是在C++年前開發的。今天,它的.NET。模塊化是通過構建COM對象來執行的。這使我們能夠爲相同的應用程序使用各種語言和技術。我擁有的最古老的代碼是基本香草C,最新的代碼是C#3.5。

+0

確實。我公司的主要產品使用PowerBuilder,C,C#和VBA。我們使用ODBC,COM和OLE進行各種進程間通信。再也無法用一種語言去做任何真正有用的東西了。 – DaveE 2009-12-11 07:13:10

0

是的,當然。在.NET中你可以使用C#,VB和C++,因爲它們都生成IL對象代碼。

在Windows或其他平臺(Unix,Linux)上編譯爲本機時,許多編譯器會以標準/共享格式生成目標文件。在這種情況下,鏈接器可以很容易地將它們組合成一個共享庫,靜態庫或最終運行庫(Unix中的a.out或ELF二進制)。

這通常是因爲不同的程序員有不同的偏好,也因爲某些語言結構可以更好地描述特定類型的解決方案。當一個應用程序從多個不同的語言放在一起

0

大多數編程語言具有用於與C.接口連接的裝置,它可以通過爲每個不同的部件的創建I2C接口和連接I2C接口,或不同的組件來實現可能實際上被編譯成單獨的應用程序,這些應用程序使用套接字或其他形式的進程間通信相互通信。

0

近編程,當一切都用匯編語言編寫的石器時代,編譯語言走過來。在經歷了一些痛苦,悲傷和多年之後,人們猶豫地承認用FORTRAN這樣的「高級語言」編寫至少一部分應用程序是件好事。但是許多模塊仍然在組裝中,包含了FORTRAN做得不好的東西,比如CPU技巧,微小的代碼空間要求等等。

在1980年代我開發的一個應用程序中,我們開發了FORTRAN,PL/M,8086程序集和C語言的選擇是由歷史的動力加上不斷改進的編譯器和構建工具所驅動的。

0

今天,你不可能只用一種語言逃脫。

看看Adobe。所有流行的Adobe產品現在都包含越來越多的Lua腳本。他們從Lightroom開始,現在技術上的商業策略是用C/C++/Assember編寫基本的例程(你需要這個用於快速SSE圖形),所有的GUI都和Lua粘在一起。

1

上面的答案(我迄今見過的)都是正確的。其他未提及的東西是公司/組織定義「大型應用程序」,而不是程序員有時做的不同。

醫院醫療信息系統對於醫療服務來說是一個「大型應用程序」,即使它實際上涉及到一些不同的Web服務器,數據庫,用於集成各種第三方產品的各種定製腳本,特別是客戶端用於放射診斷的程序,用於醫生和護士的不同網頁界面以及用於在結果上傳時用於尋呼醫生的SMS系統等。

換句話說,在你可能認爲「大應用= 1大二進制」可能會認爲「大型應用程序=一大型IT合同的名詞,無論涉及多少二進制文件」。

0

是的,可以做到。更常見的情況是,沒有這樣做,因爲目標語言沒有特定的功能,或者所述功能更容易在另一種語言中執行。

0

性能的另一個原因是在一個單一的應用程序混合語言。在解釋型語言中,速度可能比C/C++慢幾個數量級。應用程序可以使用C/C++編寫CPU密集型部分,同時留出更高級語言中的大部分程序邏輯,以充分發揮性能和編程的便利性。