一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

編程語言講解 聰明的笨蛋CPU

multisim ? 來源:碼農(nóng)的荒島求生 ? 作者:碼農(nóng)的荒島求生 ? 2021-08-16 11:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

聰明的人類發(fā)現(xiàn)把簡單的開關(guān)組合起來可以表達(dá)復(fù)雜的bool邏輯,在此基礎(chǔ)之上構(gòu)建了 CPU ,因此 CPU 只能簡單的理解開關(guān),用數(shù)字表達(dá)就是0和1。

創(chuàng)世紀(jì):聰明的笨蛋

CPU 相當(dāng)原始,就像單細(xì)胞生物一樣,只能把數(shù)據(jù)從一個地方搬到另一個地方、簡單的加一下,沒有任何高難度動作,這些操作雖然看上去很簡單很笨,但 CPU 有一個無與倫比的優(yōu)勢,那就是一個字:快,這是人類比不了了的,CPU 出現(xiàn)后人類開始擁有第二個大腦。就是這樣原始的一個物種開始支配起另一個叫做程序員的物種。

干活的是大爺一般來說兩個不同的物種要想交流,比如人和鳥,就會有兩種方式:要不就是鳥說人話,讓人聽懂;要不就是人說鳥語,讓鳥聽懂;就看誰厲害了。最開始 CPU 勝出,程序員開始說鳥語并認(rèn)真感受 CPU 的支配地位,好讓 CPU 大爺可以工作,感受一下最開始的程序員是怎么說鳥語的:程序員按照 CPU 的旨意直接用0和1編寫指令,你沒有看錯,這破玩意就是代碼了,就是這么原生態(tài),然后放到打孔紙帶上輸入給CPU,CPU 開始工作,這時的程序可真的是看得見摸得著,就是有點(diǎn)浪費(fèi)紙。這時程序員必須站在 CPU 的角度來寫代碼,畫風(fēng)是這樣的:

1101101010011010100100110010100111001000110111101011101101010010乍一看你知道這是什么意思嗎?你不知道,心想:“這是什么破玩意?”,但 CPU 知道,心想“這就簡直就是世界上最美的語言”。

天降大任終于有一天程序員受夠了說鳥語,好歹也是靈長類,嘰嘰喳喳說鳥語太沒面子,你被委以重任:讓程序員說人話。你沒有苦其心志勞其筋骨,而是仔細(xì)研究了一下 CPU,發(fā)現(xiàn) CPU 執(zhí)行的指令集來來回回就那么幾個指令,比如加法指令、跳轉(zhuǎn)指令等等,因此你把機(jī)器指令和對應(yīng)的具體操作做了一個簡單的映射,把機(jī)器指令映射到人類能看懂的單詞,這樣上面的01串就變成了:

sub $8, %rspmov $.LC0, %edicall putsmov $0, %eax這樣,程序員不必生硬的記住1011.。..。,而是記住人類可以認(rèn)識的ADD SUB MUL DIV等這樣的單詞即可。匯編語言就這樣誕生了,編程語言中首次出現(xiàn)了人類可以認(rèn)識的東西。這時程序員終于不用再“嘰嘰喳喳。。”,而是升級為“阿巴阿巴。?!保m然人類認(rèn)知“阿巴阿巴”這幾個字,但這和人類的語言在形式上差別還是有點(diǎn)大。

細(xì)節(jié) VS 抽象盡管匯編語言已經(jīng)有人類可以認(rèn)識的單詞,但匯編語言和機(jī)器語言一樣都屬于低級語言。所謂低級語言是說你需要關(guān)心所有細(xì)節(jié)。關(guān)心什么細(xì)節(jié)呢?我們說過,CPU 是非常原始的東西,只知道把數(shù)據(jù)從一個地方搬到另一個地方,簡單的操作一下再從一個地方搬到另一地方。因此,如果你想用低級語言來編程的話,你需要使用多個“把數(shù)據(jù)從一個地方搬到另一個地方,簡單的操作一下再從一個地方搬到另一地方”這樣的簡單指令來實現(xiàn)諸如排序這樣復(fù)雜的問題。有的同學(xué)可能對此感觸不深,這就好比,本來你想表達(dá)“去給我端杯水過來”:如果你用匯編這種低級語言就得這樣實現(xiàn):我想你已經(jīng) Get 到了。

彌補(bǔ)差異CPU 實在太簡單了,簡單到不能了理解任何稍微抽象一點(diǎn)諸如“給我端杯水”這樣的東西,但人類天生習(xí)慣抽象化的表達(dá),人類和機(jī)器的差距有辦法來彌補(bǔ)嗎?換句話說就是有沒有一種辦法可以自動把人類抽象的表達(dá)轉(zhuǎn)為 CPU 可以理解的具體實現(xiàn),這顯然可以極大增強(qiáng)程序員的生產(chǎn)力,現(xiàn)在,這個問題需要你來解決。

套路,都是套路思來想去你都不知道該怎么把人類的抽象自動轉(zhuǎn)為 CPU 能理解的具體實現(xiàn),就在要放棄的時候你又看了一眼 CPU 可以理解的一堆細(xì)節(jié):電光火石之間靈光乍現(xiàn),你發(fā)現(xiàn)了滿滿的套路,或者說模式。大部分情況下 CPU 執(zhí)行的指令平鋪直敘的,就像這樣:

4204ee2c-fdb8-11eb-9bcf-12bb97331649.png

這些都是告訴 CPU 完成某個特定動作,你給這些平鋪直敘的指令起了個名字,姑且就叫陳述句吧,statement。除此之外,你還發(fā)現(xiàn)了這樣的套路,那就是需要根據(jù)某種特定狀態(tài)決定走哪段指令,這個套路在人看來就是“如果。。。就。。。否則。。就。。?!保?/p>

if *** blablablaelse *** blablabla

在某些情況下還需要不斷重復(fù)一些指令,這個套路看起來就是原地打轉(zhuǎn):

while *** blablabla最后就是這里有很多看起來差不多的指令,就像這里:

42681d8a-fdb8-11eb-9bcf-12bb97331649.png

這些指令是重復(fù)的,只是個別細(xì)節(jié)有所差異,把這些差異提取出來,剩下的指令打包到一起,用一個代號來指定這些指令就好了,這要有個名字,就叫函數(shù)吧:

func abc: blablabla

現(xiàn)在你發(fā)現(xiàn)了所有套路:

// 條件轉(zhuǎn)移if *** blablablaelse *** blablabla // 循環(huán)while ***blablabla // 函數(shù)func abc: blablabla

這些相比匯編語言已經(jīng)有了質(zhì)的飛躍,因為這已經(jīng)和人類的語言非常接近了。接下來你發(fā)現(xiàn)自己面臨兩個問題:

這里的blablabla該是什么呢?

該怎樣把上面的人類可以認(rèn)識的字符串轉(zhuǎn)換為 CPU 可以認(rèn)識的機(jī)器指令

盜夢空間你想起來了,上文說過大部分代碼都是平鋪直敘的陳述句,statement,這里的blablabla 僅僅就是一堆陳述句嗎?顯然不是,blablabla 可以是陳述句,當(dāng)然也可以是條件轉(zhuǎn)移if else,也可以是循環(huán)while,也可以是調(diào)用函數(shù),這樣才合理。

雖然這樣合理,很快你就發(fā)現(xiàn)了另一個嚴(yán)重的問題:blabalbla中可以包含 if else 等語句,而if else等語句中又可以包含blablabla,blablabla中反過來又雙可能會包含if else等語句,if else等語句又雙叒有可能會包含blablabla,blablabla又雙叒叕可能會包含if else等語句。。。

就像盜夢空間一樣,一層夢中還有一層夢,夢中之夢,夢中之夢中之夢。。。一層嵌套一層,子子孫孫無窮匱也。。。此時你已經(jīng)明顯感覺腦細(xì)胞不夠用了,這也太復(fù)雜了吧,絕望開始吞噬你,上帝以及老天爺啊,誰來救救我!此時你的高中老師過來拍了拍你的肩膀,遞給了你一本高中數(shù)學(xué)課本,你惱羞成怒,給我這破玩意干什么,我現(xiàn)在想的問題這么高深,豈是一本破高中數(shù)學(xué)能解決的了的,抓過來一把扔在了地上。此時一陣妖風(fēng)吹過,教材停留在了這樣一頁,上面有這樣一個數(shù)列表達(dá):

f(x) = f(x-1) + f(x-2)

這個遞歸公式在表達(dá)什么呢?f(x)的值依賴f(x-1),f(x-1)的值又依賴f(x-2),f(x-2)的值又依賴。。。一層嵌套一層,夢中之夢,if中嵌套 statement,statement 又可以嵌套if。。。等一下,這不就是遞歸嘛,上面看似無窮無盡的嵌套也可以用遞歸表達(dá)??!你的數(shù)學(xué)老師仰天大笑,too young too simple,留下羞愧的你佛手而去,看似高科技的東西竟然用高中數(shù)學(xué)就解決了,一時震驚的目瞪狗帶不知所措無地自容。有了遞歸這個概念加持,聰明的智商又開始占領(lǐng)高地了。

遞歸:代碼的本質(zhì)不就是嵌套嘛,一層套一層嘛,遞歸天生就是來表達(dá)這玩意的 (提示:這里的表達(dá)并不完備,真實的編程語言不會這么簡單):

if : if bool statement else statementfor: while bool statementstatement: if | for | statement

上面一層嵌套一層的盜夢空間原來可以這么簡潔的幾句表達(dá)出來啊,你給這幾句表達(dá)起了高端的名字,語法。數(shù)學(xué),就是可以讓一切都變得這么優(yōu)雅。世界上所有的代碼,不管有多么復(fù)雜最終都可以歸結(jié)到語法上,原因也很簡單,所有的代碼都是按照語法的形式寫出來的嘛。至此,你發(fā)明了真正的人類可以認(rèn)識的編程語言。之前提到的第一個問題解決了,但僅僅有語言還是不夠的。

讓計算機(jī)理解遞歸現(xiàn)在還差一個問題,怎樣才能把這語言最終轉(zhuǎn)化為 CPU 可以認(rèn)識的機(jī)器指令呢?人類可以按照語法寫出代碼,這些代碼其實就是一串字符,怎么讓計算機(jī)也能認(rèn)識用遞歸語法表達(dá)的一串字符呢?

這是一項事關(guān)人類命運(yùn)的事情,你不禁感到責(zé)任重大,但這最后一步又看似困難重重,你不禁仰天長嘆,計算機(jī)可太難了。此時你的初中老師過來拍了拍你的肩膀,遞給了你一本初中植物學(xué)課本,你惱羞成怒,給我這破玩意干什么,我現(xiàn)在想的問題這么高深,豈是一本破初中教科書能解決的了的,抓過來一把扔在了地上。

此時又一陣妖風(fēng)掛過,書被翻到了介紹樹的一章,你望著這一頁不禁發(fā)起呆來:樹干下面是樹枝,樹枝下是樹葉,樹枝下也可以是樹枝,樹枝下還可以是樹枝、吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮,哎?這句不對,回到上面這句,樹干生樹枝,樹枝還可以生樹枝,一層套一層、夢中之夢、子子孫孫無窮匱、高中數(shù)學(xué)老師,等一下,這也是遞歸?。。?!我們可以把根據(jù)遞歸語法寫出來的的代碼用樹來表示?。?/p>

43a58cf0-fdb8-11eb-9bcf-12bb97331649.png

你的初中老師仰天大笑,圖樣圖森破,看似高科技的東西竟然靠初中知識就解決了。

優(yōu)秀的翻譯官計算機(jī)處理編程語言時可以按照遞歸定義把代碼用樹的形式組織起來,由于這棵樹是按照語法生成的,姑且就叫語法樹吧。

現(xiàn)在代碼被表示成了樹的形式,你仔細(xì)觀察后發(fā)現(xiàn),其實葉子節(jié)點(diǎn)的表達(dá)是非常簡單的,可以很簡單的翻譯成對應(yīng)的機(jī)器指令,只要葉子節(jié)點(diǎn)翻譯成了機(jī)器指令,你就可以把此結(jié)果應(yīng)用到葉子節(jié)點(diǎn)的父節(jié)點(diǎn),父節(jié)點(diǎn)又可以把翻譯結(jié)果引用到父節(jié)點(diǎn)的父節(jié)點(diǎn),一層層向上傳遞,最終整顆樹都可以翻譯成具體的機(jī)器指令。

448c7246-fdb8-11eb-9bcf-12bb97331649.png

完成這個工作的程序也要有個名字,根據(jù)“弄不懂原則”,你給這個類似翻譯的程序起了個不怎么響亮的名字,編譯器,compiler。

現(xiàn)在你還覺得二叉樹之類的數(shù)據(jù)結(jié)構(gòu)沒啥用嗎?至此,你完成了一項了不起的發(fā)明創(chuàng)造,程序員可以用人類認(rèn)識的東西來寫代碼,你編寫的一個叫做編譯器的程序負(fù)責(zé)將其翻譯成 CPU 可以認(rèn)識的機(jī)器指令。后人根據(jù)你的思想構(gòu)建出了C/C++、以及后續(xù)的Java、Python,這些語言現(xiàn)在還有一幫人在用呢。

總結(jié)世界上所有的編程語言都是遵照特定語法來編寫的,編譯器根據(jù)該語言的語法將代碼解析成語法樹,遍歷語法樹生成機(jī)器指令(C/C++)或者字節(jié)碼等(Java),然后交給 CPU(或者虛擬機(jī))來執(zhí)行。也因此,高級語言的抽象表達(dá)能力很強(qiáng),代價都是犧牲了對底層的控制能力,這就是為什么操作系統(tǒng)的一部分需要使用匯編語言編寫,匯編語言對底層細(xì)節(jié)的強(qiáng)大控制力是高級語言替代不了的。

最后請注意,本文為通俗易懂講解編程語言犧牲了嚴(yán)謹(jǐn)性,這里的語法沒有體現(xiàn)函數(shù)、表達(dá)式等等,真實語言的語法遠(yuǎn)遠(yuǎn)比這里的復(fù)雜,此外關(guān)于編譯器也不會直接把語法樹翻譯成機(jī)器語言,而是生成一種類似機(jī)器指令的中間語言,經(jīng)過一系列復(fù)雜的優(yōu)化后最終生成真正的機(jī)器指令,真實的編譯器遠(yuǎn)比這里復(fù)雜。希望本文對大家理解編程語言有所幫助。

責(zé)任編輯:haq

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11076

    瀏覽量

    217002
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95226

原文標(biāo)題:假如你來發(fā)明編程語言

文章出處:【微信號:A1411464185,微信公眾號:multisim】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    數(shù)字電路編程語言介紹

    數(shù)字電路編程語言是專門為描述和模擬數(shù)字電路而設(shè)計的編程語言。它們通常具有以下特點(diǎn): 硬件描述語言(HDL) :大多數(shù)數(shù)字電路
    的頭像 發(fā)表于 01-24 09:39 ?767次閱讀

    gitee 支持的編程語言有哪些

    Gitee(碼云)是一個基于 Git 的代碼托管和研發(fā)協(xié)作平臺,類似于 GitHub 和 GitLab。它支持多種編程語言,允許開發(fā)者托管和管理代碼,進(jìn)行版本控制,以及協(xié)作開發(fā)。以下是一些
    的頭像 發(fā)表于 01-06 09:50 ?672次閱讀

    三菱PLC編程語言解析

    三菱電機(jī)(Mitsubishi Electric)是全球知名的自動化和制造解決方案供應(yīng)商,其PLC(可編程邏輯控制器)產(chǎn)品廣泛應(yīng)用于工業(yè)自動化領(lǐng)域。三菱PLC編程語言主要基于國際標(biāo)準(zhǔn)IEC
    的頭像 發(fā)表于 12-26 17:36 ?1326次閱讀

    Triton編譯器支持的編程語言

    Triton編譯器支持的編程語言主要包括以下幾種: 一、主要編程語言 Python :Triton編譯器通過Python接口提供了對Triton語言
    的頭像 發(fā)表于 12-24 17:33 ?963次閱讀

    如何選擇適合自己的編程語言

    在當(dāng)今這個技術(shù)日新月異的時代,編程語言的選擇對于軟件開發(fā)者來說至關(guān)重要。不同的編程語言有著不同的優(yōu)勢和適用場景,因此,選擇合適的編程
    的頭像 發(fā)表于 11-15 09:37 ?1910次閱讀

    編程語言的誤區(qū)與常見問題

    誤區(qū)一:編程語言的選擇 常見問題: 初學(xué)者在選擇編程語言時,往往會被市場上的熱門語言所吸引,而忽視了自己的實際需求和興趣。 一些開發(fā)者認(rèn)為某
    的頭像 發(fā)表于 11-15 09:35 ?749次閱讀

    NPU支持的編程語言有哪些

    NPU(Neural Processing Unit)是一種專門為深度學(xué)習(xí)和人工智能應(yīng)用設(shè)計的處理器。NPU支持的編程語言通常與它所集成的平臺或框架緊密相關(guān)。以下是一些常見的編程語言
    的頭像 發(fā)表于 11-15 09:21 ?1911次閱讀

    C語言中的socket編程基礎(chǔ)

    Socket編程簡介 Socket是一種通信機(jī)制,允許程序之間進(jìn)行通信。在C語言中,socket編程是網(wǎng)絡(luò)編程的基礎(chǔ)。通過使用socket,程序可以發(fā)送和接收數(shù)據(jù),實現(xiàn)不同計算機(jī)之間的
    的頭像 發(fā)表于 11-01 16:51 ?1221次閱讀

    單片機(jī)編程語言有哪些選擇

    常用的單片機(jī)編程語言,以及它們的特點(diǎn)和應(yīng)用場景: 1. C語言 特點(diǎn) :C語言是一種通用的編程語言
    的頭像 發(fā)表于 11-01 14:13 ?2413次閱讀

    MCU編程語言和開發(fā)環(huán)境介紹

    微控制器單元(Microcontroller Unit,簡稱MCU)是嵌入式系統(tǒng)的核心,廣泛應(yīng)用于各種電子產(chǎn)品中。隨著技術(shù)的發(fā)展,MCU編程語言和開發(fā)環(huán)境也在不斷進(jìn)步,以適應(yīng)不同的應(yīng)用需求。 1.
    的頭像 發(fā)表于 11-01 11:51 ?2188次閱讀

    C語言與其他編程語言的比較

    C語言作為一種歷史悠久的編程語言,自其誕生以來,一直在軟件開發(fā)領(lǐng)域扮演著重要角色。它以其高效、靈活和可移植性強(qiáng)的特點(diǎn),成為了系統(tǒng)級編程的首選語言
    的頭像 發(fā)表于 10-29 17:30 ?1070次閱讀

    Orin芯片的編程語言支持

    Orin是一款高度集成、高性能的車載計算平臺,由英偉達(dá)推出,并采用了英偉達(dá)自家的Volta架構(gòu)GPU和其他高級處理器技術(shù)。關(guān)于Orin芯片的編程語言支持,可以從以下幾個方面進(jìn)行介紹: 一、主要編程
    的頭像 發(fā)表于 10-27 16:45 ?982次閱讀

    plc編程語言編程相關(guān)技巧有哪些

    PLC(可編程邏輯控制器)編程語言及相關(guān)編程技巧是工業(yè)自動化領(lǐng)域中不可或缺的知識。 一、PLC編程語言
    的頭像 發(fā)表于 10-21 16:56 ?1108次閱讀

    labview是什么編程語言寫的

    的一種圖形化編程語言。它并不是用傳統(tǒng)的文本編程語言(如C++、Python等)編寫的,而是采用了一種獨(dú)特的圖形化編程
    的頭像 發(fā)表于 09-04 16:00 ?2198次閱讀

    plc編程st語言怎么編

    PLC(可編程邏輯控制器)編程中的ST(Structured Text)語言是一種高級編程語言,它類似于Pascal或C
    的頭像 發(fā)表于 08-25 10:05 ?2796次閱讀