程序和指令程序是為了完成某項(xiàng)任務(wù)(例如聊天、聽音樂)而使用某種編程語言(例如C/C++)編寫的一組指令序列。 而指令是計(jì)算機(jī)程序控制的最小單位,由操作碼和操作數(shù)組成,操作碼是計(jì)算機(jī)要執(zhí)行什么操作,例如加減乘除操作,而操作數(shù)具體執(zhí)行的對象,具體的數(shù)據(jù)以及數(shù)據(jù)的位置。 所有指令的集合稱為指令系統(tǒng),常見的PC機(jī)指令系統(tǒng)有Intel X86指令集,常見的手機(jī)指令系統(tǒng)有ARM,因此手機(jī)上的程序不加修改是不能直接在PC機(jī)上運(yùn)行,因?yàn)椴煌闹噶罴遣患嫒莸摹?/p> 那么計(jì)算機(jī)是如何處理程序的? 根據(jù)馮諾依曼計(jì)算機(jī)結(jié)構(gòu)的原理,計(jì)算機(jī)的工作流程大致如下 當(dāng)用戶從計(jì)算機(jī)中打開程序時(shí)(鼠標(biāo)點(diǎn)擊桌面的快捷方式圖標(biāo)),程序開始執(zhí)行。 操作系統(tǒng)將程序的指令和相關(guān)的數(shù)據(jù)傳送到內(nèi)存中。 CPU根據(jù)程序內(nèi)容從內(nèi)存中讀取指令。 CPU分析、處理指令,并為下一條指令做準(zhǔn)備,如果有涉及到調(diào)用硬件資源(例如調(diào)用聲卡播放音樂)的指令,操作系統(tǒng)會通過調(diào)用對應(yīng)的硬件驅(qū)動程序來實(shí)現(xiàn)調(diào)用硬件的功能。 CPU取下一條指令并分析、處理,如此重復(fù)操作,直到執(zhí)行完程序中的全部指令,最后將計(jì)算的結(jié)果放到指令指定的存儲器地址中。 計(jì)算機(jī)編程語言發(fā)展史計(jì)算機(jī)已經(jīng)成為人類大腦的延伸,成為不可或缺的一部分。而算法是計(jì)算機(jī)的靈魂,編程語言是塑造計(jì)算機(jī)靈魂的工具。讓計(jì)算機(jī)具備'靈魂',可以按照人的意志運(yùn)行,甚至某天按照計(jì)算機(jī)自己的意志運(yùn)行,其核心就是算法。 計(jì)算機(jī)程序設(shè)計(jì)語言經(jīng)歷了機(jī)器語言到匯編語言和高級程序設(shè)計(jì)語言三個(gè)階段,其特點(diǎn)是使得程序員用編程語言開發(fā)、測試、部署應(yīng)用程序越來越方便、高效。但是是以犧牲效率為代價(jià),但是隨著計(jì)算機(jī)硬件的快速發(fā)展,絕大多數(shù)應(yīng)用場景的效率損失可以忽略不計(jì)。
計(jì)算機(jī)發(fā)展的最早期,程序員編寫程序采用二進(jìn)制的指令(010010101)來實(shí)現(xiàn)的,而每種CPU都有各自不同的指令系統(tǒng)(SPARC/Intel X86/ARM),因此在不同的機(jī)器上使用不同的機(jī)器語言實(shí)現(xiàn)。其特點(diǎn)是性能特別高效,而面向機(jī)器編程也就意味著不能移植,需要手動處理底層硬件的差異性,而且二進(jìn)制的指令難以理解和維護(hù)。
隨著時(shí)代和計(jì)算機(jī)技術(shù)的發(fā)展,匯編語言和編譯器的出現(xiàn)解決了機(jī)器語言需要記住非常多的二進(jìn)制機(jī)器指令的難題,但是還是沒有從根本上解決移植性的問題,只是將機(jī)器指令轉(zhuǎn)換為易懂的英文單詞,然后由編譯器編譯成機(jī)器指令,因?yàn)橛?jì)算機(jī)終歸揭底只能識別二進(jìn)制的0001110100110機(jī)器指令,而且匯編語言是面向機(jī)器的,不同機(jī)器(SPARC/Intel X86/ARM)的匯編指令是不相同的。盡管如此匯編語言目前仍然在工業(yè)電子編程、軟件的加密解密和計(jì)算機(jī)病毒分析等場景廣泛使用。
高級程序設(shè)計(jì)語言的高級之處體現(xiàn)在開發(fā)人員在編寫程序時(shí)無需關(guān)心計(jì)算機(jī)底層硬件差異而只需要專注于業(yè)務(wù)模塊實(shí)現(xiàn)即可。而且相對于機(jī)器語言、匯編語言而言,高級語言學(xué)習(xí)起來更加容易,因此會有更加充足的人力資源,也更容易開發(fā)大型商業(yè)軟件,例如Windows、macOS、Linux等操作系統(tǒng)都是使用C/C++實(shí)現(xiàn)。國內(nèi)的阿里巴巴在電商、物流、金融、支付領(lǐng)域大量使用Java實(shí)現(xiàn)。 計(jì)算機(jī)語言應(yīng)用場景如果想知道目前主流的編程語言有哪些,可以訪問tiobe 首頁獲取編程語言排行榜。 2019年12月編程語言排行榜Top20 根據(jù)Tiobe排行榜得知,Java/C/Python分別排在前三名, 隨后緊跟著C++,C#,JavaScript等等。 每種編程語言都有自己擅長的應(yīng)用場景。 編程語言及其應(yīng)用場景 那么如果你作為初學(xué)者,面對如此之多的編程語言,到底應(yīng)該先從哪門語言上車呢?如果你想深入的學(xué)習(xí)其他語言和架構(gòu)相關(guān)的知識之前建議熟練掌握C語言。因?yàn)镃++/Java/C#等編程語言都模仿了C語言。無論哪種語言,都是實(shí)現(xiàn)目標(biāo)的工具,而不是目標(biāo)本身。 而不出意外的話,我的Devops 頭條號會覆蓋上述的十種編程語言,目的是實(shí)現(xiàn)全平臺(Windows,Linux,macOS)應(yīng)用開發(fā)、測試、部署。感興趣的同學(xué)可以關(guān)注。 程序的編譯和解釋由于高級編程語言和計(jì)算機(jī)底層語言是互不相通的,計(jì)算機(jī)最底層只能識別01010這種二進(jìn)制的機(jī)器指令,因此需要使用工具進(jìn)行語言之間的轉(zhuǎn)換。這個(gè)就是程序編譯或者解釋的由來。 為了理解程序編譯和程序解釋,這里引入兩種語言,分別是高級計(jì)算機(jī)語言L1,以及低級計(jì)算機(jī)語言L0。
而Java和C#屬于編譯+解釋型語言,以Java為例子,Java程序在運(yùn)行之前首先被編譯成Java字節(jié)碼,然后在JVM虛擬機(jī)上解釋運(yùn)行。 |
|