1. 程式人生 > >10、C_程序員和編譯器之間的關系

10、C_程序員和編譯器之間的關系

換位思考 空行 yacc 過程 處理 設計時 三目運算 不用 軟件工程

編程工作的演進史

CPU需要的只是1和0組成的二進制數據
  • 不管編程怎麽變,最終編程得到的可執行二進制程序都是給CPU運行的。CPU需要的只是按照CPU設計時的規律(機器指令)排布的一串二進制1和0組成的數字(機器碼),CPU根本不關心這些二進制是怎麽來的。
  • 這些二進制可能是一個很厲害的程序員直接用1和0拼出來的;也可以是用匯編語言編寫最終編譯得到的;也可以是用C語言編寫最終編譯得到的;也可以是用java C# php bash等語言編寫然後解釋得到的;
  • 編程工作的演進其實一直是在處理上一個層次段落:就是使用何種語言編寫程序(用某種語言進行編程),然後如何把這種程序源代碼轉成二進制(編譯器的發明)。
  • CPU接收到一串1010序列後如何工作達到目的,這就是設計制造CPU的公司要考慮的事情了,與軟件工程師完全無關。
早期的紙卡打孔編程者
  • 最早期的時候,CPU也很簡單,指令集很少,二進制位數也不多。那時候編譯器也沒被發明,編程語言也沒被發明,那時候就是用二進制直接編程的。
  • 總結:最早的編程沒有語言也沒有編譯器,程序員直接使用二進制和機器(CPU)對話。
  • 這種方式的壞處就是不容易擴展,隨著CPU的進一步復雜化,指令的變多,指令位數的變多,編程難度呈幾何倍數增長。人的大腦慢慢就跟不上這個節奏。
編程工作的第一次革命:由二進制機器碼到匯編語言
  • 第一次革命就是:發明了匯編語言。匯編語言的本質就是用一個符號來代替一串二進制。
  • MOV 10101010101010
  • SUB 01010101010101
  • 有了匯編語言之後,程序員就不用再去記憶二進制序列了。編程時只需要用匯編指令來編程即可,匯編指令就是一個符號(符號就是由文字構成的,如MOV)。因為人類大腦天生對文字符號更加友好,因此用符號編程更簡單。
  • 用匯編語言編寫的源程序不能直接給CPU運行,必須通過一個翻譯過程,把源代碼翻譯成二進制序列才能給CPU。這個翻譯的過程就叫匯編,執行翻譯動作的就是匯編器。
編程工作的第二次革命:由匯編語言到C語言
  • 匯編語言也有一些不盡如人意的地方,譬如:沒有可移植性。在這個CPU上寫的匯編程序無法直接在另一個CPU上運行。因此匯編語言是和CPU一一對應的。
  • 為了可移植性於是乎發明了高級語言。第一個高級語言就是C語言。C語言進一步靠近人的思維,為人的思維發明了很多CPU沒有的東西,譬如數組。最終的目的就是降低編程難度,讓高級語言更接近人的思維,然後通過編譯器、匯編器等的翻譯將這些源代碼變成二進制然後給CPU運行。
革命無窮盡、層次變更多
  • 在C語言之上還有更高級語言,譬如:C++、Java、C#、bash等。越往上越靠近人的思維,越往上語言本身提供的封裝越多,越往上編程難度越低、語言的掌握越容易。
程序員、編譯器、CPU之間的三角戀 CPU只認識二進制機器指令
  • CPU是最終幹活的,而CPU只認識只接受二進制。
人類喜歡符號而不是二進制
  • 人類的大腦本身不喜歡二進制而喜歡符號、文字。
  • 人類和機器之間天生有代溝,於是乎編程不容易。
連接人(程序員)與機器(CPU)的橋梁:編譯器
  • 編譯器降低了編程難度。編譯器的代表就是編程語言,每一種編程語言都有對應的編譯器,這個編譯器的作用就是把這種語言的源文件編譯成可執行程序。
  • 關鍵是:有了編譯器(高級語言)之後,我們程序員就不再盯著CPU(二進制),而是改為盯著編譯器(編程語言、編程語言的語法),所以我們學習編程的關鍵變成了學習編譯器的習性,也就是編程語言的語法。
發明一門語言關鍵就在於發明它的編譯器
  • 編譯語言的關鍵就是編譯器。yacc和lex工具就是用來發明編程語言的。
高級語言與低級語言的差別
  • 越高級的語言越靠近人類思維;越低級的語言越靠近機器的需要。
  • 人與機器總勞動量(總復雜度)守恒。人要是復雜一點機器就可以簡單一點;人簡單一點機器就需要復雜一點。這個規律描述的就是:編程語言越簡單,人使用起來越簡單,編譯器設計起來就更復雜;編程語言越復雜、程序員使用起來越麻煩,則編譯器設計越簡單,CPU執行效率越高。
像編譯器一樣思考吧 語法是什麽?語法就是編譯器的習性
  • (1)編譯器反應在編程中就是語法。
  • 譬如1:
  • for (i=0; i<10; i++);
    {
        xxx;
    }

  • 譬如2:
  • int i; !!i;
  • 解析:!在C語言中是邏輯取反的意思,邏輯取反意思就是0取反就是1,不是0的數取反就是0.
  • 問題:讓你用C語言編程實現:如果一個數i是0則返回0,如果不是0則返回1
  • 一般實現: if (i == 0){return 0;} else{return 1;}
  • 或者可以用三目運算符: (i==0)?(0):(1);
  • 極客式寫法: !!i;
習得一門語言就像認識一個朋友
  • 從新開始認識一個人到成為好朋友,這裏面要經歷:時間、共事。
  • 學習一門編程語言也需要:時間、實踐(共事)
學習編程語言要懂得換位思考
  • 預處理中處理程序註釋、空行。
註意實踐中的摸索和總結
  • 要點一:在實踐中
  • 要點二:摸索
  • 要點三:總結

10、C_程序員和編譯器之間的關系