當前位置:首頁 » 編程軟體 » 讀懂編譯器需要知識

讀懂編譯器需要知識

發布時間: 2025-04-28 07:25:11

㈠ CPU是怎麼看懂代碼的

備註:這是我問答內容的一個精編版,增加了一些內容,所以和原內容略有不同。

去年底,有中國開發者已經開發出文言文編程語言,並在GitHub上摘得了5500星,在國內引起不小反響。這件事給普通人的印象是, 科技 發展日新月異,電腦CPU太厲害,都能讀懂文言文了!

CPU真的能看懂文言文代碼嗎?答案是CPU既看不懂文言文代碼,也看不懂英文代碼。

現在的CPU晶體管數量動輒幾十億個,結構非常復雜,但內部傳輸的信號只有兩種:高電壓和低電壓,分別代表數字信號「1」和「0」(也有相反的),因此CPU唯一能看懂的就是由「1」和「0」組成的代碼。

由於程序(代碼)存儲在電腦硬碟中時,也是「1」和「0」的形式,是否就意味著,只要程序存到硬碟中,CPU就能認識呢?

答案是CPU仍然看不懂這些程序,因為以「1」和「0」位模式存儲的程序和以「1」和「0」寫成的機器語言完全是兩回事,簡單說,兩者的區別類似於漢語書和英語書都用紙和油墨印製,但依然是兩種不同的語言,不會英語的依然看不懂英語書。

機器語言是CPU唯一能看懂的語言,也是第一代編程語言。

圖片說明:早期的計算機程序員使用機器語言編程,將用0和1數字編成的程序代碼打在紙帶或卡片上(打孔代表1,不打孔代表0),再將它通過紙帶機或卡片機輸入計算機,進行運算。

機器語言的最大特點是面向計算機硬體編程,簡單說就是程序員需要通曉計算機硬體知識,寫的程序要真實表示數據是如何被計算機操縱的。對程序員來說這就比較頭大,一方面不僅需要通曉計算機硬體知識,另一方面如果計算機使用了不同的硬體,那麼就得重新編程。

畢竟上得了「廳堂」(搞掂硬體)下得了「廚房」(玩得轉軟體),只有少數大神能做到,加上機器語言純用「0」和「1」序列組成,非常單調枯燥,不僅扼殺了編程的趣味,而且對視力也是一種考驗,稍微一眼花,看錯1或0的排列位置,就會製造一個大BUG。

於是,有一幫人開始琢磨了:能不能將計算機硬體從編程中分離出來,讓硬體知識小白也能編程?

最先開竅的是藍色巨人IBM,它在其System/360計算機中引入了ISA(Instruction Set Architecture)概念,將編程所需要了解的硬體信息從硬體中抽象出來,這樣編程人員就可以面向ISA編程。由於ISA是用來描述編程時用到的抽象機器(不是具體的電腦CPU),包括了一套指令集和一些寄存器,因此,程序員只要知道ISA,不需要了解具體的硬體知識,就可以編寫程序,在ISA相同的電腦上運行。

這樣一來,就出現了匯編語言,但匯編語言用符號寫成,還是不夠接地氣兒,於是高級語言就誕生了。高級語言的誕生,使程序員將精力從復雜的計算機結構轉移到要解決的問題,從而可以專心烹調程序大餐。

由此也可以看出,現在的程序員並不都是了解計算機硬體的,所以妹子們不要指望自己的程序員男朋友給你DIY電腦,或者電腦壞了,他能給你省下一筆修理費。他說不會修,那就是真的不會修。

自從高級語言出現後,人類開始了在編程語言上的放飛自我,經過數十年的發明創造,現在的高級編程語言已超過2500種,像比較知名的C++和java等,都屬於高級語言。

但問題出現了,CPU能理解的機器語言還是那個機器語言,幾十年來沒有變化,讓它讀懂高級語言那是不可能的。

怎麼辦?

其實,早在高級語言出現之前的匯編語言時代,聰明的計算機研發人員就開發出了專門的程序,用來將匯編語言和高級語言翻譯成機器語言,其過程相當於將英語名著翻譯成漢語著作。

說白了,這種翻譯程序相當於人類中的翻譯家。

翻譯程序有兩種工作方法:編譯和解釋,相應的程序名稱是編譯器和解釋器。兩者的區別是,編譯是在執行前把整個源程序(高級語言程序)翻譯成目標程序(機器語言程序),而解釋是一次只翻譯和執行源程序中的一行。

打個形象的比方,解釋器相當於發布會的實時翻譯,演講的嘉賓說一句,實時翻譯馬上翻譯一句。編譯器則相當於著作翻譯家,整本翻譯完成後,再讓出版社印刷上市。

經過翻譯程序的努力,現在CPU能看懂程序員寫的程序了。當然,用開頭提到的文言文編程語言編寫的程序想要讓CPU看懂,還得多一道翻譯步驟,即要麼翻譯成Javascript,要麼翻譯成Python。多轉了一圈,不知道程序執行效率如何。

由於CPU不能直接理解用高級語言寫成的代碼,必須依賴翻譯程序翻譯成機器語言,因此翻譯程序可以極大地影響甚至決定處理器性能的發揮。如果沒有一個好的翻譯程序,那麼CPU的性能再強大,也好比茶壺裝的餃子,倒不出來。

正因為如此,谷歌在安卓4.4之後,拋棄了Dalvik虛擬機,改為ART,實際是將翻譯程序從解釋器切換到編譯器,發揮了晶元的性能,提高了程序運行效率。

現在,手機大廠包括華為、OPPO和vivo都開始重視編譯器開發,說到底就是為了發揮晶元性能,讓它不再成為倒不出餃子的茶壺。

最後總結一下,用翻譯程序把程序員編寫的程序翻譯成二進制代碼的機器語言後,CPU就能看懂代碼了,而且翻譯程序的優劣可以影響乃至決定CPU性能發揮。

圖片源自網路,版權歸圖片作者所有。

㈡ 學習編程的基本知識

學編程要具備一定的基礎,總結之有以下幾方面:
(1)數學基礎 必須喜歡數學! 從計算機發展和應用的歷史來看計算機的數學模型和體系結構等都是有數學家提出的,最早的計算機也是為數值計算而設計的。因此,要學好計算機就要有一定的數學基礎,初學者有高中水平就差不多了。
(2)邏輯思維能力的培養 學程序設計要有一定的邏輯思維能力,「邏思力」的培養要長時間的實踐鍛煉。要想成為一名優秀的程序員,最重要的是掌握編程思想。要做到這一點必須在反復的實踐、觀察、分析、比較、總結中逐漸地積累。因此在學習編程過程中,我們不必等到什麼都完全明白了才去動手實踐,只要明白了大概,就要敢於自己動手去體驗。誰都有第一次。有些問題只有通過實踐後才能明白,也只有實踐才能把老師和書上的知識變成自己的,高手都是這樣成材的。
(3)選擇一種合適的入門語言 面對各種各樣的語言,應按什麼樣的順序學呢?程序設計工具不外乎如下幾類: 1)本地開發 應用軟體開發的工具有:VS、Delphi 、VC++ ( C++ Builder ) 等;資料庫開發工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 2)跨平台開發 開發工具如 Java 等。 3)網路開發 對客戶端開發工具如:Java Script 等;對伺服器開發工具如:ASPX 、PHP、ASP 、 JSP 、ISAPI 、NSAPI 、CGI 等。 以上不同的環境下幾種開發工具C#中 法簡單並容易理解,界面設計是可設化的,易學、易用。選 C#作為入門的方向對出學者是較為適合的。

(4)注意理解一些重要概念

一本程序設計的書看到的無非就是變數、函數、條件語句、循環語句等概念,但要真正能進行編程應用,需要深入理解這些概念,在理解的基礎上應用,不要只簡單地學習語法、結構,而要吃透針對這些語法、結構的應用例子,做到舉一反三,觸類旁通。
本人自己學的是C#,現在感覺了自己也在不斷成長,的確編程是一條「不歸路」,既然選擇了就勇敢走下去!慢慢地語言差異的概念越來越模糊。走上設計居上的路。只有不斷學習,不斷充實才能走的更遠!

㈢ 一文讀懂ninja構建系統

ninja是一種高效的構建工具,專為大型項目設計,以下是對ninja構建系統的簡要介紹

  1. 基本定義

    • 構建工具:ninja用於調用各種工具來編譯大型項目。
    • 生成目標:ninja不是為人直接編寫的,而是通常由其他程序生成。
  2. 設計哲學

    • 避免模糊:ninja避免makefile中可能存在的模糊內容,如dir/*.cpp,而是直接列出具體要執行的命令。
    • 明確命令:ninja本質上就是一條一條地列出了具體要執行的命令,並直接執行。
  3. 核心特點

    • 依賴關系分析:ninja會分析命令之間的依賴關系,並據此優化構建過程。
    • 高效構建:通過精確分析依賴關系,ninja能夠實現高效的增量構建。
  4. 安裝方式

    • GitHub下載:直接從ninja的GitHub release頁面下載,確保安全。
    • pip安裝:使用pip包管理工具進行安裝,方便快捷。
    • conda安裝:使用conda包管理工具進行安裝,適用於特定環境。
  5. 構建配置文件

    • 文件名:ninja的構建配置文件一般叫做build.ninja。
    • 內容理解:雖然不直接編寫build.ninja,但需要大致看懂它,以便調試或理解構建過程。
  6. 增量編譯

    • depfile機制:通過編譯器支持,將文件與頭文件的依賴關系輸出到depfile中,用於增量編譯。
    • 檢查修改:ninja會根據depfile的內容,檢查相關文件的修改時間,以決定是否重新編譯。
  7. phony規則

    • 定義:phony是ninja的一個內置規則,意思是「假冒的」,即一個不存在規則的規則。
    • 用途:phony規則不會執行任何操作,但會在輸入和輸出之間建立依賴關系。
  8. 構建目標

    • 默認目標:不帶參數的ninja命令會構建文件里的default構建目標。
    • 手動構建:可以使用ninja [target]來手動構建某個特定的目標。
  9. 高級用法

    • 清理生成文件:ninja t clean可以清理全部生成文件。
    • 查看依賴圖:ninja t browse可以打開一個網頁瀏覽器查看文件之間的依賴圖。
    • 導出依賴圖:ninja t graph可以導出依賴圖的dot graph文件。
    • 列出構建目標:ninja t targets all可以列出全部的構建目標。
    • 切換目錄和文件:ninja C /path/to/dir f /path/to/file可以讓ninja切換到指定目錄去執行命令,並讀取指定配置文件。

通過以上內容,可以對ninja構建系統有一個初步的認識。ninja以其高效、簡潔的設計哲學,成為大型項目構建的重要工具。

㈣ 軟體開發需要掌握哪些知識

成為一名好的程序員,不是簡單地通過學幾門課程就能做到的。我個人認為成為一名好的程序員的要素有:

1。扎實的基礎知識;

2。很強的解決問題的能力;

3。熟練的編程調試能力;

4。創新能力;

5。團隊合作能力;

6。持續的自學能力;

7。好奇心

這些能力和品質(甚至可以說是習慣)都應該從大學階段就著手培養,並且從身邊的小事開始培養。比如,很多中國的大學畢業生都缺乏編程和調試經驗。學習C語言,考試過關就算學會了。課題項目中,只要程序能夠編譯,運行,並且輸入輸出滿足要求就了事了。但是,寫程序的時候是否想過如何把程序寫得更加精煉,高效,高質量?對程序調試中出現的問題是否刨根問底知道原因,還是不求甚解搪塞過去算數?還有,很多中國的大學畢業生對於知識的掌握膚淺,機械,沒有好奇心,不會刨根問底。比如,學會了C,有沒有看過一個object在編譯後,在匯編代碼中是如何被初始化的?這個object的各個成員在內存中是如何放的?在一個成員函數被調用的時候編譯器在匯編代碼中加入了哪些額外的動作?虛函數的調用是如何實現的?這些東西恐怕在編程語言或編譯原理中都沒有詳細提到。但是,你是否有過好奇心去知道?最後,一些中國學生的大問題就是死記硬背,沒有學到某種演算法技術的根本原理,沒有應變和創新的能力。比如,有個問題是如何在不用額外內存的情況下把一棵樹的同一層節點都連起來。很多學生都能夠回答這是一個廣度遍歷的問題。但是,課本上說了廣度遍歷是一定要有額外數據結構輔助的(隊列)。所以,不給額外內存怎麼行?請看,課本上說的用隊列的方法記住了,但是就是不知道為什麼要用隊列。如果深刻掌握了這個隊列的作用,那麼這個問題是很容易的。

舉了這么多例子,我想說明的事,想成為一位好程序員(其實從事任何一個行業都是如此),重要的是要養成一個鑽研,好奇,創新,動手,合作,不滿足於填鴨,不滿足於考試交差,不滿足於表象的一種優秀的習慣。這不是學幾門課能夠一蹴而就的。當然,如果你的在校課程不能使你滿足,我以及論壇上的朋友可能能夠給你推薦一些書或科目。

我覺得要提高編程的能力,有一位良師很重要。這位良師可以是在編程方面比你走在前面的同學,也可以是學校里你幫他做項目的老師,也可以是校外公司里的老師或老闆。很多東西在實際的項目中,有一位良師察看你的程序,幫你指出不足,手把手地指導你調試,會對你很有幫助。所以,當學會了書本上的基本知識以後,可以努力尋找一些有實用性的項目,借機在項目中找到高手指導。這個項目可以在學校找,也可以到校外找。一開始不要計較報酬,甚至如果能夠尋到高手指點,白乾也行。

其次是讀好的源代碼。多讀好的源代碼就象多讀好的文章,會有利於自己寫作。能夠讀懂別人的代碼也是一門硬功夫。將來很多項目中你不會重頭做,而是在半途加入(一般文檔又不很齊全),因此需要能夠很快讀懂別人代碼和想法的能力。

再次是看一些編程方面的好書。WritingSolidCode是一本很經典的書。最近出的WritingSecureCode也不錯。在你熟練掌握C以後,可以學一下C並熟悉面向對象的程序設計思路。在掌握C的基礎上可以看一下DesignPatterns。

看你要把編程學到多麼專業。到一定程度,你會發現如果沒有學過數據結構,演算法原理,編譯原理和操作系統,可能在某些方面會遇到一些障礙。所以,如果有精力和條件的話,可以同時了解這些方面的知識。

最後,我要提醒你不要因為編程這一業余愛好而影響了你本專業的課程,除非你決定轉行。對很多在校學生來說,本專業的成績很重要,因為這個成績可能會影響到將來找工作,申請研究生院等等。英語也很重要。我讀翻譯的計算機書總覺得隔了一層,翻得不貼切。能夠直接閱讀英文資料更好。

㈤ 想學計算機編程但是不知道學什麼

1.首先剛入門的話,你要先明確目標選擇一門編程語言入門。個人建議選擇java或者C。在學習編程語言的時候,計算機有關的知識你也是需要涉及的,也要多多去了解一下,看一些書籍,在網上下載視頻邊看邊學效果會好一些。在你理論知識的基礎上學習起來會相對容易一些。當你熟悉掌握一門語言後,這個時候就可以有學習的目標了。自己對哪方面感興趣喜歡哪種語言就學哪門。

2.我這邊來簡單介紹一下java的學習內容吧。

①JAVA編程基礎(基礎語法、面向對象、和諧特性等)

②WEB應用開發(靜態網頁製作、Oracle資料庫、Java Web開發技術、Linux技術、網站性能與安全、軟體工程開發流程、Java Web和諧等)

③企業級框架開發(數據結構與演算法、SSH框架、JavaEE和諧等)

④項目實訓

3.如果你真的想學好編程語言,C語言也是蠻重要的。但是新手學C語言通常會出現一個問題,就是除了寫個排序演算法,似乎根本想不出來C語言有什麼用。這是因為我們的教科書講C語言的時候,只講這些基本演算法,甚至連讀寫文件都不去講,更不用說圖形界面處理了和網路操作了,沒有這些知識,想寫一個真正的應用那是不可能的。不過,書上沒有不等於學不了,文件操作和網路操作的講解網路上有著大把的講解,只要你找幾篇文章看看,具備了這些基礎知識,寫一個自己的WEB伺服器並不難。在逐步增加功能完善功能的同時,你的C語言基本上就可以達到相當牛人的水平了。

4.互聯網行業目前還是最熱門的行業之一,學習IT技能之後足夠優秀是有機會進入騰訊、阿里、網易等互聯網大廠高薪就業的,發展前景非常好,普通人也可以學習。

想要系統學習,你可以考察對比一下開設有相關專業的熱門學校,好的學校擁有根據當下企業需求自主研發課程的能力,建議實地考察對比一下。

祝你學有所成,望採納。

熱點內容
青島少兒編程哪家好 發布:2025-04-28 15:49:53 瀏覽:845
密碼箱密碼正確打不開怎麼辦 發布:2025-04-28 15:49:00 瀏覽:17
幼兒編程坑 發布:2025-04-28 15:48:56 瀏覽:550
php非同步同步 發布:2025-04-28 15:41:58 瀏覽:738
夢幻西遊腳本吧 發布:2025-04-28 15:38:29 瀏覽:590
愛奇藝怎麼緩存高清視頻 發布:2025-04-28 15:37:33 瀏覽:231
安卓手機一個圓點怎麼打 發布:2025-04-28 15:36:46 瀏覽:222
查找字元串linux 發布:2025-04-28 15:35:24 瀏覽:489
寶可夢伺服器電腦按鍵 發布:2025-04-28 15:35:11 瀏覽:566
扣扣寫密碼的在哪裡 發布:2025-04-28 15:31:37 瀏覽:983