Assembly(彙編)、C、C++、Java、C#訪談


會長:訪談時間還差5分鐘,下面我們先看看各大語言們在討論幹些什麼吧。
<會長走到了幕後>
Assembly:我是計算機程序設計界的老大,用我寫的程序運行效率最高,所以我覺得全世界應該都用我這門語言。

C:首先我極力反對這句話,Assembly運行效率雖高,但開發效率極端底下,而且特定於CPU指令集,移植等異常困難。看看由我寫的程序吧,一行可以頂你Assembly十多行,而且源代碼可移植,多方便啊。

C++:Assembly、C兩位請稍安勿躁,兩位忽略了一個重要問題,現在軟件的複雜度越來越高,你們二位在實現上都各有份額,但我們要向高處看,向OOP(面向對象編程)看齊,不然軟件將難以維護。像我一樣,加入了Encapsulation(封裝)、Inherit(繼承)、Polymorphism(多態)、Template(模板),而運行效率也不見得比C語言低,所以用我來設計程序是最合適的。

Java:C++也談OOP,哈哈,真可笑,你不知道自己並非完全面向對象嗎?你的入口點(主函數)永遠都是全局的,OOP最基本的要求是所有處理都在class(類)裏面,你連最基本的一條都滿足不了,哈哈。況且你自己還包含C語言,C語言完全是面向過程的啊。C++你自己要處理衆多指針、資源管理等細節問題,對於現代軟件來說,你真是糟透了。

C#:聽Java說那些風涼話吧,我提供的服務最全面了,OOP、資源管理等等等等,對於我來說,都是不在話下的,況且我有強大的框架,以及Visual Studio IDE。MSDN等幫助文檔,爲一個新學員上手帶來了極大的便利,況且我是由世界上最大的軟件公司所開發的,相信我吧,世界上最強大的語言。

會長:<怎麼都吵上啦>各位各位,我知道你們都有各自的好處,請平和下來,不要相互爭論,與其爭論誰好誰壞,不如大家找個共同點,一起探討自己對程序設計的發展。訪談的時間快到了,我們趕緊赴會吧。

<大家都坐在各自的位置上了,準備接受採訪>

會長:我們很榮幸的請到計算機界幾大語言共同探討程序設計的問題,我們請到的有:Assembly、C、C++、Java、C#。請大家簡要介紹一下自己。

Assembly:我的名字是“彙編語言”,從計算機出現到現在,我就存在了,而且我不會消失,因爲所有的語言都是先“變成”我,然後再交給CPU執行的。

C:我是一門非常經典的語言,具有語言級的平臺移植性,使用我比較簡單,而且一切都掌握在程序員手中,編譯後我不會產生其他代碼。其實我可以直接翻譯成彙編代碼。

C++:我是在C的基礎上,加入了面向對象特性而產生的,從我開始,OOP便流行了起來,OOP爲軟件開發帶來了非常大的進步。

Java:我是由Sun公司開發的一門完全面向對象的語言,我放棄了C++的一些複雜特性,如:指針等,加入了爲OOP而設立的關鍵字,如:interface等。我可是運行程序跨平臺的哦。

C#:我是有Microsoft公司開發的一門語言,別人多說我跟Java的相似度達80%,那是一般的特性,其實還是有兩點很不同的,一、我擁有強大的開發環境支持、強大的技術支持。二、繼承了Microsoft的一貫作風,我不跨平臺。

會長:各門語言都自我介紹完了,下面的記者們有什麼問題趕緊問啊。

記者1:聽了各位的自我介紹,我大概瞭解各門語言了,請問如果我想學習編程,要從Assembly開始,一直學下來嗎?

會長:這個問題我來回答吧,首先、編程的概念非常廣,對於想學習編程的人來說,首先要想好自己將編寫什麼類型的程序,然後對應各門語言進行學習。

記者2:請問Assembly,上面那些語言我都會用,但你說所有語言最終都變成彙編代碼,然後才執行的,我寫C++、Java等代碼的時候,根本沒有與Assembly打交道,你確信你說的話正確?

Assembly:你編寫的只不過是C++、Java等的代碼而已,試想一下,你寫完C++等代碼後,是否還有編譯等過程呢?這個過程會將C++代碼翻譯成彙編的。對於Java,會有類似Java虛擬機的東西,最終還是以Assembly代碼交給CPU的。我對C++、Java等語言瞭解甚少,難免有些失誤。

記者2:謝謝Assembly,我已經知道你所要表達的意思了,你是指無論什麼語言,最終都要轉化爲彙編的形式,然後交給CPU執行。

記者3:請問Java、C#,用你們編寫代碼的時候,申請的內存等資源不用手動釋放嗎?那樣會不會造成泄漏?我記得C、C++申請資源的時候,都要手動釋放的。

Java、C#:我們都有各自的垃圾回收器,其可以將一些廢棄的資源自動回收,然後交還給系統使用。我們要強調的一句是,並非所有資源我們都能夠有效回收,一些系統資源,比如:Windows上串行的句柄等等,這些還是要手動釋放的。

記者3:有些資源還是要手動釋放?你們不是有垃圾回收器嗎?爲什麼還要手動釋放呢?

Java、C#:用我們編寫代碼,難免會用到系統提供的功能,這些功能原本就是系統的,不屬於我們語言,而系統管理的方式是串行的,必須要釋放,所以我們語言也無能爲力了。不過我們各自的框架庫都已經夠強大了,所以編寫代碼的時候,首先考慮使用我們提供的框架,框架實在滿足不了的時候才考慮使用系統提供的功能。

記者3:哦,我想我明白了,垃圾回收是針對整個框架內部來說的,如果編寫的代碼超出了框架,那此語言的一些功能將不能使用,所以我們的程序應該儘量在框架範圍內運行,對嗎?

Java、C#:沒錯,這纔是我們提供如此強大框架的原因啊。

記者4:剛纔聽到Java、C#有強大的框架,那請問C、C++你們在框架間的表現如何呢?

C:就我語言本身來說,我沒有特定的框架,只有CRT(C Runtime 函數庫)可供使用,從表面上來看,這是一個缺陷,但也正因爲沒有特定的框架,才產生了其他第三方的C語言框架,只不過這些框架沒有被C/C++標準委員會列入罷了。這也保證了語言充分的擴展性。

C++:其實我有自己的框架,比如:C++標準程序庫,但這個框架跟C#的.NET比較的話,那就差遠了,因爲C/C++沒有特定的公司去維護,所以才導致今天沒有強大的框架的啊。跟C語言一樣,我也有非常多的擴展庫,如:MFC、ATL、Qt、Gtk、Boost等等,其實這些庫都很好,可以很方便的使用。

記者4:哦,雖然C/C++標準委員會沒有爲其加入框架,但第三方框架也是很強大的,這也是C/C++強大的生命力所在。

記者5:我提個比較廣的問題,請問會長,從效率角度來評價各門語言,您怎樣評價呢?

會長:嗯,此問題有深度。提到效率,首先效率分爲兩方面。
    一、代碼最終生成的可執行文件的交給CPU的效率,即執行效率。
    二、編寫代碼的程序員的功能實現效率,即開發效率。
    讓我一點點來說,首先從執行效率來說,Assembly的效率最高,因爲其是直接調用CPU指令完成的,不存在中間效率損失。其次當然是C了,C是處在Assembly上的一門語言,無需直接調用CPU指令,因此效率肯定有所下降,不過聽說好的編譯器優化性能很不錯,C能夠達到彙編80%左右的執行效率。再次就到C++了,直接說C++比C的執行效率低,C++肯定是不服的,那讓我們來看看具體的吧,從編寫過程性語言來說,C/C++的效率完全一樣,其實C++的class(包括assess level)、inherit等並不會影響C++的運行效率,主要影響其效率的罪魁禍首是關鍵字virtual,這個關鍵字引入了虛函因爲數、虛函數表、多態等等OO特性,所以導致C++效率低於C的。最後,Java、C#的執行效率最低,因爲其得一些高級特性(如:垃圾回收等)影響了效率。
    下面說說開發效率。首先Assembly的效率最低,因爲Assembly代碼是用CPU指令集編寫的,一個普通的操作需要幾行、甚至幾十行Assembly代碼。關於C、C++、Java、C#的開發效率,我不能籠統的說誰高誰低了,因爲具體要看實現的功能、項目等等。不過從籠統角度來說,效率可以這樣排列:C < C++ < Java、C#。畢竟越高級的語言開發效率是越高的。

記者6:我也提個廣泛的問題吧,其實一門語言的存在,都有其存在價值,那會長如何評價這些語言呢?

會長:嗯,此問題的確非常廣,說下去一整天也說不完啊,我大概說說這些語言的存在意義吧。
    一、Assembly。Assembly是使用CPU指令編寫的,所以其功能最強,一般高級語言不能甚至很難實現Assembly的底層功能,如:底層指令調用等,所以這是Assembly存在的一個價值。其次、新硬件的生產、測試等等都需要使用Assembly,在很多時候,新硬件上並不存在其他編譯器,所以Assembly是唯一的選擇。再次、目前病毒盛行,瞭解一個病毒具體的構造需要用到反彙編,這也是Assembly存在的強大理由啊。
    二、C。C是一門經典的過程性語言,使用其編程可以養成良好的過程性思維。一些底層功能使用C是非常方便的,因爲C編譯器不會生成額外的代碼,一切都在自己掌握中,這是編寫實時系統、軟件驅動等必須的,對比Assembly來說,C的效率並沒有低很多,開發效率卻大大提升。目前主流操作系統,如:Windows、Linux等,其大部分模塊都用C編寫,短期內也不可能改變,從這個角度來說,C也是非常具有生命力的。
    三、C++。C++是在C的基礎上發展而來的,對C語言進行了擴充,加入了OOP的特性。有人說C++是程序員必學的一門語言,這句話有一定的道理,如果想要了解OO底層實現機制的話,只有學習C++。C++是OO的編程語言,C是過程性的編程語言,而C++早期可以編譯成C,這就是OOP與過程編程的橋樑,這是學習OO底層實現機制的最佳策略。由於歷史原因,目前很大部分的核心代碼都用C++編寫了,跟C一樣,在短期內,這也不會改變C++佔據市場的地位。
    四、Java、C#。這兩門語言都是絕對的OOP語言,爲OOP提供了許多特性。將此二門語言放在一起的目的是由於它們相似度達到80%,此二門語言開發效率最高,是敏捷開發的得力助手,在降低開發成本、迅速完成任務方面表現出色,這兩門現代語言當然會有相當大的份額。

Assembly、C、C++、Java、C#:我們一直在自己的方面讓計算機編程更佳美好!

會長:今天的訪談就到此結束吧,謝謝Assembly、C、C++、Java、C#。
<強烈的掌聲,持續了很長時間>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章