閱讀更多
毫無疑問,不同的編程語言間存在著很多差異性。那么對于這種差異性開發者應如何解決?本文就來一探究竟。

以下為譯文:

我一直在告訴別人:“編程非常了不起?!痹諛閿腥魏蝸敕ǖ氖焙?,都可以編寫軟件,然后愿望就實現了。這很真實。與建立物理的東西不同,首先你需要建立整個工廠,而軟件的擴張相對非常容易。你可以找到所有已經編譯好的組件,而且是免費的,拿來就可以用。建立好一段代碼后,就可以重復使用無數次,而無需花錢。聽起來很厲害的樣子。

但有時候不是這樣的。編程帶給人的驚喜只是暫時的。在建立了很多代碼以后,在寫代碼的過程中你會不斷遇到讓人迷惑的錯誤。一旦你習慣了特定語言和框架的模式后,一旦你需要第二種天性去掌握所選語言中非自然的語法時,編程的偉大之處就不復存在了。

更別提我們有無數種不同的編程語言。每當開發人員面對特殊語言的語法而深感沮喪時,他們都會想“為什么我們不能創建一種新的語言改正這個問題呢?”有些人還真的這么做了,很幸運的是自然選擇已經淘汰了很多很差的語言(有時也有意外,比如至今PHP還存在)。一旦一門新的語言開始在一群開發者中流行起來,那么恭喜你 ,現在又出現了一個新的開發者社區,他們互相合作,努力讓這門特殊的語言發展壯大。

每一種新語言的誕生所帶來的創新,都能造福我們每一個人。但是有時也有不利的一面。有些人可能寫了一些非常有用的開源JavaScript庫,但是從事Python的開發者卻完全沒法用。他們不得不自己寫一個Python版本的函數庫,或者用JavaScript重寫所有代碼。再想想當前有多少種語言和框架。如果你不覺得這很荒謬的話,那只能說明或許你在軟件開發這一行太長時間,已經習以為常了。

語言都包含些什么?

各種編程語言都在以下三個方面上有著很大的不同:語法、語義和標準庫。

沒錯,我知道,我過于簡化它們了,但是聽我給你解釋。

1. 語法

如果不遵循語法,那么你會在編輯器中看到各種彎彎曲曲的紅線,而且你的代碼也無法通過編譯器或解釋器。

JavaScript使用大括號,布爾型使用小寫的true和false,用//表示行注釋。
function doSomething() {
  a = true;
  if (a) {
    ... // Do something.
  }
}

Python用縮進,布爾型用首字母大寫的True和False表示,用#表示行注釋。
def doSomething():
  a = True
  if a:
    ... # Do something.

Haskell又有完全不同的語法:
doSomething :: IO ()
doSomething = do
  let a = True
  if a
    then ... -- Do something.
    else return ()

2.語義

所有編程語言都有大多數相同的特征:變量賦值、數字相加、字符串操作、調用函數、等等。

然而,每種語言都有特殊的思想,以特定的方式運行??梢越腔殖剎煌哪J劍釷?、面向對象、函數式),但是即便是兩個相同模式的編程語言在細節上也是完全不同的。

在“聲明類”,“調用函數”,或“定義參數的類型”時,你定義了程序的語義。有些語言遵循這樣一套規則,而其他的遵循別的規則。比如:C++中聲明的類可以延伸到多個類。當你使用“+”將數字和字符串加到一起的時候,根據語言的語義會得出不同的結果。一些編程語言會因為類型不匹配而導致編譯失敗,但是有些編程語言會自動將數字轉換成十進制的字符串。

語法與語義的關系就相當于用單詞(語法)來表達想法(語義)。你可以通過語言的語法來表達語義。

3.標準庫

最后,每種語言都有各自的軟件包,我們稱之為“標準庫”。

在Python中,你可以調用如下函數:
  • print():在控制臺輸出信息
  • len():返回數組的長度
  • 以及各種實用的???,例如:json,threading,等等
在JavaScript中,你可以使用console.log()代替print(),可以訪問Object、Array等類。

標準庫是一門語言中重要的組成部分。它可以為語言帶來活力,沒有標準庫,你無法簡單地做出任何東西。

很諷刺的是,并沒有“標準的標準庫”。每個標準庫基本上都不同于其他庫:一些庫只提供最低限度的方法,而有些庫則提供非常廣泛的函數,所以開發人員基本上不需要依賴任何第三方庫。

基本的想法

以上我們介紹了一門語言的構成,接下來我有一個基本的想法:我們是否可以找到一種方法清晰地分割語法、語義和標準庫呢?我們又如何實現這一想法呢?

第一步:只有程序員關心語法

我想解決的第一個問題就是語法。編譯器和解釋器擁有更加有效的方式表現代碼,我們稱之為抽象語法樹。我們用代碼描述的內容最終可以用如下抽象語法樹表示:

圖:歐幾里得算法的抽象語法樹

如果仔細觀察,你會發現上述語法樹可能來自多個語言。是Python?是JavaScript?還是C++?這都無所謂:所有這些語言都擁有同一個語法樹。

當然,現實的例子會更加復雜。這就是為什么我們用文本寫代碼的原因:更加緊湊,更加易于書寫,還有更加易于閱讀(有人可能有不同的看法)。從編程誕生的第一天,我們采用的就是這種方法,很少有人對此質疑。

對于一個更加現實的例子來說,抽象語法樹會描述所選語言的語義(例如:類的定義)。但是擁有類似語義的語言之間還是可以共享同一個抽象語法樹,并可以擴展到一定范圍。這非常實用,因為你可以自動轉化部分代碼。

所以,我們可以把語法想象成抽象語法樹之上的人類思維。代碼可能并不會以文本的形式存儲在任何地方,僅在文本編輯器內。如果你想在特殊的語言上使用不同的語法,也完全可以。這不會影響到別人。

我其實有點驚訝怎么沒有一種工具可以將代碼從一種語言轉換成另一種語言,這完全可行啊。我猜肯定有人試過,但是放棄了,因為如果不將整個標準庫轉換過去的話是沒有實用性的。很明顯,我也在做這方面的嘗試。

第二步. 將標準庫抽象成API

API是一個非常高明的概念。每個軟件都可以通過API與其他軟件溝通。移動端的應用可以通過API與服務器交流。服務器可以通過API與數據庫交流。每個人都可以通過API與他人對話。這是一件很酷的事情。

為什么我要在這里討論API?因為這正是我們所需要的。API是語言的媒介。它們是一套語義,可以描述一個特殊代碼??槎醞馓峁┑墓δ?。無論是函數庫,HTTP服務器,或是別的。

聲明API的方式多種多樣??梢允荖PM上的JavaScript???,并在README文件內提供API文檔。也可以是代碼中明確聲明的API,比如TypeScript???。也有可能并沒有API的聲明,也沒有清晰的文檔。

但是重要的是:API聲明了代碼??櫚摹倍醞飩涌凇?,你可以用其他語言重寫??檳誆康拇?,但API不會發生改變。這就是API的魅力所在。雖然編程語言一團糟,但是API很酷。

前面我們提到了標準庫,并說了各個語言都擁有完全不同的標準庫。如果我們能想個辦法將標準庫抽象出來,做成干凈利落的API,那么我們就可以解決這個問題。雖然在語義上,調用print("Hello")與Java調用System.out.println("Hello")不同,但是其實它們可以是同一個API。

我們有兩種方法可以解決這個問題。要么我們讓大家都不要再使用標準庫了,轉而使用我們的“API層”?;蛘呶頤強梢勻眉撲慊遠貧夏閌褂玫拇?。我并不看好“說服大家改變他們的方式”,所以我會選擇后一種方法。

我們不用為編程語言的標準庫中的每個函數都提供API。一般我們只可能用到標準庫中的幾個函數。我們可以自動將這些代碼從一種語言轉換到另一種語言。然后,我們只需要每個開發都用這些API替換具體的標準庫的調用。不用擔心,計算機依然需要你,至少現在需要。

第三步:把所有東西都做成API

現在我們有了干凈的代碼??槎ㄒ宓拇看獾撓鏌?,并將與標準庫的交互抽象成了API。

下一步做什么?創建API。

現今的代碼庫有多個文件構成,彼此之間通過“import語句”互相引用。這對于我們來說很便利,但是這也意味著我們需要在腦海中勾畫代碼庫的結構。任何一個地方發生小的變化,都可能在不經意期間給別的地方帶來破壞性的影響,尤其是如果我們沒有做好自動測試的話。而且,代碼庫會不斷增長,而編譯的時間會逐漸加長。

也許有更好的方法解決這個問題。比如??榛褪歉齪冒旆?。

我之前寫過關于??榛奈惱攏ǖ慊髡飫鋝榭矗篽ttps://medium.com/@fwouts/the-zenc-master-plan-c693bf3b265e),基本上來說:每段獨立的代碼都應該抽象成API。我稱之為???。你無需在意一個具體的??槭褂檬裁從镅員嘈吹?。在寫??櫚氖焙?,你不用導入這些文件。實際上,這時文件已不復存在。你可以直接使用API,它們會自動加載這些功能。

??橛惺裁春么??
  • 可以鼓勵大家考慮設計:首先你需要設計API
  • 可以降低認知的開銷:你僅需要“填空”
  • 簡化測試:你只需測試API,并可以模擬所有的依賴性
  • 世界會變得更加美好:沒有了語言之間的壁壘,沒有了巨大的代碼庫;程序員更加快樂,客戶更加快樂
第四步:盡情享受

我不確定第三步之后會發生什么,但是我覺得所有人都會很滿意。
  • 大小: 341.7 KB
  • 大小: 91.3 KB
來自: CSDN資訊
4
0
評論 共 5 條 請登錄后發表評論
5 樓 xingqi1058 2019-08-22 15:27
xingqi1058 寫道
xingqi1058 寫道
ss

說的很好
4 樓 xingqi1058 2019-08-22 15:27
xingqi1058 寫道
ss
3 樓 xingqi1058 2019-08-22 15:27
2 樓 xingqi1058 2019-08-22 15:22
[img] [/img]
1 樓 aa87963014 2018-07-24 09:42
非常贊同,現在的語言太多了語法又差異太大增加無謂的學習成本很惡心

發表評論

您還沒有登錄,請您登錄后再發表評論

相關推薦

  • 淺談各類編程語言之間差異

    引 瀏覽各大編程相關的網站, 總是能看到有關于編程語言的爭論, 這些爭論使得想要學習編程的人變得疑惑。?總會讓人陷入到底什么是最好的編程語言, 我該學什么, 這樣的疑問中。 我曾經也陷入過這樣的疑惑中, 入行做“碼農”大概也有一年半的時間了, 借著2018的過去, 2019的開始, 嘗試總結一下這類問題, 給過去的疑問一個交代, 給新人一份細微幫助(但愿)。 機器碼編程(匯編語言) 匯編語言...

  • hadoop snapshot差異性問題

    master:/mnt/hgfs/tmp>hdfs dfs -lsr /snapshot/.snapshotrn lsr: DEPRECATED: Please use 'ls -R' instead.rn 16/10/27 01:58:09 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicablern drwxr-xr-x - hadoop supergroup 0 2016-10-27 01:02 /snapshot/.snapshot/s20161027-010230.369rn drwxr-xr-x - hadoop supergroup 0 2016-10-27 01:24 /snapshot/.snapshot/s20161027-012406.172rn drwxr-xr-x - hadoop supergroup 0 2016-10-27 01:26 /snapshot/.snapshot/s20161027-012600.797rn master:/mnt/hgfs/tmp>hdfs dfs -lsr /data1rn lsr: DEPRECATED: Please use 'ls -R' instead.rn 16/10/27 01:58:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicablern -rw-r--r-- 3 hadoop supergroup 15779309 2016-10-27 01:23 /data1/apache-hive-2.0.0-src.tar.gzrn drwxr-xr-x - hadoop supergroup 0 2016-10-26 01:55 /data1/datarn -rw-r--r-- 3 hadoop supergroup 69621760 2016-10-27 01:23 /data1/hbase-1.1.3-src.tarrn -rw-r--r-- 3 hadoop supergroup 186354175 2016-10-27 01:25 /data1/spark-2.0.0-bin-hadoop2.7.tgzrn master:/mnt/hgfs/tmp>rn master:/mnt/hgfs/tmp>rn master:/mnt/hgfs/tmp>hdfs dfs -rm /data1/apache-hive-2.0.0-src.tar.gzrn 16/10/27 01:58:35 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicablern 16/10/27 01:58:36 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.rn Deleted /data1/apache-hive-2.0.0-src.tar.gzrn master:/mnt/hgfs/tmp>hdfs dfs -rm /data1/spark-2.0.0-bin-hadoop2.7.tgzrn 16/10/27 01:58:45 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicablern 16/10/27 01:58:45 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.rn Deleted /data1/spark-2.0.0-bin-hadoop2.7.tgzrn master:/mnt/hgfs/tmp>hadoop fs -createSnapshot /snapshotrn 16/10/27 02:00:09 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicablern Created snapshot /snapshot/.snapshot/s20161027-020009.972rn master:/mnt/hgfs/tmp>hdfs dfs -lsr /snapshot/.snapshotrn lsr: DEPRECATED: Please use 'ls -R' instead.rn 16/10/27 02:00:24 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicablern drwxr-xr-x - hadoop supergroup 0 2016-10-27 01:02 /snapshot/.snapshot/s20161027-010230.369rn drwxr-xr-x - hadoop supergroup 0 2016-10-27 01:24 /snapshot/.snapshot/s20161027-012406.172rn drwxr-xr-x - hadoop supergroup 0 2016-10-27 01:26 /snapshot/.snapshot/s20161027-012600.797rn drwxr-xr-x - hadoop supergroup 0 2016-10-27 02:00 /snapshot/.snapshot/s20161027-020009.972rn rn master:/mnt/hgfs/tmp>hdfs snapshotDiff /snapshot s20161027-010230.369 s20161027-020009.972 rn 16/10/27 02:01:09 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicablern Difference between snapshot s20161027-010230.369 and snapshot s20161027-020009.972 under directory /snapshot:rnrn為什么沒有輸出差異結果啊?

  • javaWEB下的各大瀏覽器差異性問題

  • SetLayeredWindowAttributes函數在XP系統上的SP2與SP3版之間差異性問題

    BOOL SetLayeredWindowAttributes(rn hwnd,rn COLORREF crKey,rn BYTE bAlpha,rn DWORD dwFlagsrn);rn當dwFlags==LWA_COLORKEY時,表示窗口中顏色值為crKey的地方會鏤空。rn今天發現XP的SP2版和SP3版對于這一點,表現情況居然不同~~rn比如我把crKey設置為RGB(255,255,255),也就是白色。rn這個時候打開一張位圖(為簡便起見,只測試位圖,且用GDI裝載位圖)。rn結果SP2下表現“正?!保核邪咨牡胤蕉鹼慰樟?;rn而SP3卻“不正?!繃耍旱蔽煌疾皇?2位時,白色的地方依舊可以鏤空,rn但當位圖是32位時,單個像素的alpha值能夠決定該點鏤空與否。rn這到影響不是很大,但是當我用GDI+時,不管是不是32位的位圖,rn和若是32位的位圖時,不管單個像素的alpha值是多少,白色的地方都不會鏤空~~rn而SP2上GDI+則可以~~~rn大家可以試試這個情況~~順便散分~~rn雖然后來用三緩存,并用TransparentBlt函數解決了這個差異性的問題。

  • 操作Excel,不同版本之間差異,如何解決?

  • 處理瀏覽器之間差異

    [code=JScript]rn//處理瀏覽器之間差異rnvar EventUtil = rn addHandler: function (element, type, handler) rn if (element.addEventListener) rn element.addEventListener(type, handler, false); //Dom2級方法rn rn else if (element.attachEvent) rn element.attachEvent("on" + type, handler); //IE方法rn rn else rn element["on" + type] = handler; //Dom0級方法rn rn ,rn removeHandler: function (element, type, handler) rn if (element.removeEventListener) rn element.removeEventListener(type, handler, false);rn rn else if (element.detachEvent) rn element.detachEvent("on" + type, handler);rn rn else rn element["on" + type] = null;rn rn ,rn getEvent: function (event) //返回對event對象的引用rn return event ? event : window.event;rn ,rn getTarget: function (event) //返回事件的目標rn return event.target || event.srcElement;rn ,rn preventDefault: function (event) //取消事件的默認行為rn if (event.preventDefault) rn event.preventDefault();rn rn else rn event.returnValue = false;rn rn ,rn stopPropagation: function (event) //阻止事件冒泡rn if (event.stopPropagation) rn event.stopPropagation();rn rn else rn event.cancelBubble = true;rn rn ,rn getRelatedTarget: function (event) rn if (event.relatedTarget) //DOM只對于mouseout、mouseover才包含值rn return event.relatedTarget;rn rn else if (event.toElement) //IE mouseoutrn return event.toElement;rn rn else if (event.fromElement) //IE mouseoverrn return event.fromElement;rn rn else rn return null;rn rn ,rn getButton: function (event) rn if (document.implementation.hasFeature("MouseEvents", "2.0")) rn return event.button;rn rn else rn switch (event.button) rn case 0: //表示沒按下按鈕rn case 1: //表示按下了主鼠標按鈕rn case 3: //表示同時按下了主,次鼠標按鈕rn case 5: //表示同時按下了主鼠標按鈕和中間的鼠標按鈕rn case 7: //表示同時按下了三個鼠標按鈕rn return 0;rn case 2: //表示按下了次鼠標按鈕rn case 6: //表示同時按下了次鼠標按鈕和中間的鼠標按鈕rn return 2;rn case 4: //表示按下了中間的鼠標按鈕rn return 1;rn rn rn ,rn getWheelDelta: function (event) //檢測事件是否包含wheelDelta屬性rn if (event.wheelDelta) rn return (client.engine.opera && client.engine.opera < 9.5 ? -event.wheelDelta : event.wheelDelta);rn rn else rn return -event.detail * 40;rn rn ,rn getCharCode: function (event) //檢測charCode屬性是否包含數值rn if (typeof event.charCode == "number") rn return event.charCode;rn rn else rn return event.keyCode;rn rn rnrnrn[/code]rn閑著無聊,看書看到這些,總結了下

  • diff 文件之間差異

  • H.265和H.266之間差異

    ? ? ? ?臨近校招,這個問題可能經?;岜晃?,所以趁著K次會議結束先對H.265和H.266之間的到差異做個目前為止做個總結。由于時間問題,只寫有較大改進的技術,一些小細節就忽略不計了。 ? 1.劃分結構 ? ? ? H.265是四叉樹劃分,H.266中是四叉樹加三叉樹和二叉樹劃分,所以在H.266的劃分中會存在很多矩形塊(https://blog.csdn.net/cxy19931018/...

  • ibatis # $ 之間差異

  • JQUERY 版本之間差異

    ??????????????? ??????????????? 上午通過使用jquery實現取被選中復選框的值:兩次導進來的jquery不一樣,得到jquery版本之間差異性! ?代碼如下:&amp;lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;//www.w3.org/TR/xhtml1/DTD/x...

  • 計算機體系與編程語言之間的關系?

    STL之父說道:“我們現在來探討一下為什麼說C是一種偉大的語言......我們說語言是計算機體系結構的抽象......C當時并不是什麼利器. 但是當計算機被用來處理各種問題時, 作為最小抽象模型的C成了一種非常強大的語言, 在各個領域解決各種問題時都非常高效. 這就是C可移植性的奧秘, C是所有計算機的最佳抽象模型, 而且這種抽象確確實實是建立在實際的計算機, 而不是假想的計算機上的”rn 裘衷燕教授有句話(在《程序員》雜志討論《D&E》的一篇文章里)說:GC與高效在馮·羅衣曼計算機體系里是一個兩難。rn 到底計算機體系與語言之間有什么樣的關系?從什么樣的角度去分析,用什么樣的方法去認識了。rn 希望熱烈討論

  • js中for in與for of之間差異

  • HTML和XHTML之間差異

  • Python2與Python3之間差異

  • C和java之間差異

    C和java之間差異---------------------------摘自《java技術手冊P101》rnrnrnrn沒有預處理器rnJava沒有包括一個預處理器,并且沒有定義任何類似的#define #include 以及 #ifdef 偽指令。rn常量定義在java種被使用 static final 字段取代。rn在java中沒有宏定義,但是高級編譯器技術和內聯已經使它們不那么重要。rnjava不要求使用#include偽指令,因為java沒有頭文件。rnjava類文件包括類API和類執行過程,而編譯器在必要的時候從類文件中讀取信息。rnjava缺乏任何形式的條件編譯,但是它的穿越平臺的可移植性意味著找個特點并非必要。rnrnrn沒有全局變量rnjava定義了一個非常整齊的名字空間。包容納了類,類包括字段和方法,而方法包括局部變量。但是在java種沒有全局變量,因此沒有可能在這些變量之間發生名字空間的沖突。rnrnrn明確定義的基本數據類型大小rn在java種所有基本數據類型都有定義明確的大小。在C中,short,int以及long數據類型的大小都是依賴于它們的執行平臺,這一個特點阻礙了它們的可移植性。rnrnrn沒有指針rnjava類和數組都是引用類型,而對于對象和數組的引用類似于C 中的指針。然而,和C中的指針不同,在java中的引用是完全不透明的。沒有辦法將一個引用轉換為一個基本數據類型,而且一個引用不能被增加或者減少。java中沒有類似于&的地址運算符,沒有類似*或者->的引用運算符,或者sizeof運算符。指針是造成程序錯誤的一個重要的原因。消除它們將簡化這種語言,并且使java程序更加強壯和安全。rnrnrn無用存儲單元收集rnjava虛擬機執行無用存儲單元收集,從而使java程序員不必明確地管理有所有對象和數組使用的內存。這個特點消除了另外一個全體類別的常見程序錯誤,并且幾乎消除了java程序中的內存泄露。rnrnrn無goto語句rnjava不支持goto語句。除非在定義明確的環境中,使用goto語句通常被視為一種拙劣的程序設計習慣。java添加了異常處理和標記語句break與continue來代替C語言提供的流控制語句。它們極好地代替了goto語句。 rnrnrn隨處可以聲明變量rnC要求局部變量的聲明必須放在方法或程序塊的開始,但是java則允許聲明隨處出現。盡管如此,許多程序員還是喜歡把所有的變量聲明集合起來,放在方法的開頭。 rnrnrn向前引用rnjava編譯器比c編譯器聰明,因為它允許在定義方法之前就調用它。這就不必在一個程序文件中定義函數之前先在一個頭文件中聲明它們了,C就有這樣的要求。rnrnrn方法重載rnjava程序可以使用同一個名字定義多個方法,條件是這些方法的參數列表不同。rnrnrn無struct和union類型rnjava不支持C的類型struct和union。但是可以將java的class看做一種增強的struct。rnrnrn無枚舉類型rnC的關鍵字enum是用來定義由指定值的固定集合構成的類型的,java不支持該關鍵字。對于像java這樣的強類型語言來說,這是令人驚異的現象,但是使用對象常量可以模擬這一特性。rnrnrn無位字段rnC可以指定struct結構的各個字段所占用的位數,java不支持這一(不常用的)功能。rnrnrn無typedefrnC用關鍵字typedef可以為類型名定義別名,java不支持這一關鍵字。因為java沒有指針,比C的命名模式更加簡單一致,所以typedef的許多常用用法在java中都是不必要的。rnrnrn無方法指針rnC可以將一個函數的地址存儲在一個變量中,并把這個函數指針傳遞給其他的函數。對于java的方法,則不能這樣處理,但是傳遞實現某個特殊接口的對象通??梢源锏較嗨頻男Ч?。而且java方法還可以由java.lang.reflect.Method對象表示和調用。rnrnrn無變量長度參數列表rnjava不允許定義參數數目可變的方法,諸如C的printf()。 雖然通過方法重載可以模擬C的這種函數,但是沒有一種通用的方法可以替代這一特性。rnrn

  • 淺談編程語言之間的區別

    1、shell程序 windows的shell叫做cmd,它會運行.bat的batch文件。Linux中的shell程序被稱為bash或者sh。shell程序的問題在于程序超過百行之后擴展性差,并且比其他語言的運行速度慢很多。 2、C和C++語言 極其重視性能的時候使用,它們有許多細節需要自己處理,處理不當就會導致程序崩潰和其他難解決的問題。而C++和C看起來很像,但是特性完全不同。 ...

  • 編程語言之間的區別與特點

    編程語言之間的區別與特點的表述和介紹及其它們本身的優點

  • 關于線程創建的unix/linux差異性問題?

  • html5 ios與安卓的一些差異性問題

  • 關于表之間的相關性問題

Global site tag (gtag.js) - Google Analytics