<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 第一章-編程所謂何物 簡單點來說,編程就是編制程序(呵呵,這不是廢話么...)。程序是讓計算機發揮功能的命令的集合,大體上有兩種形式,讓計算機真正執行的是電脈沖形式,叫機器碼,譬如0101這種二進制數字。程序員編制的通常是文本形式,叫源代碼。使用一個稱為編譯器/解釋器的工具,可以把源代碼轉變為機器碼。而編程就是產生那些源代碼的工作。這個工作類似于譜曲、編菜譜、寫工作手冊。我們知道,譜曲和菜譜并不是一蹴而就的,往往需要反復的修改,直到最后滿意為止,編程也是一樣。 ### 編程的對象——計算機 一般來說,如果你看到的這篇文章是電子版的話,你眼前的東西就是計算機,也就是俗稱電腦的東西。這樣的說法對普通用戶來說是已經足夠了,但是電氣工程師認為一堆電路板、纜線、馬達、和機殼的組合才算,聯想的銷售人員認為他們賣的那些方塊才是計算機,而中央軍委的人大概覺得銀河V才能稱得上。程序員的看法和他們并不完全相同,在程序員看來,只要能自動計算的東西,就是計算機。這個說法的重點在于自動和計算這兩個詞。廣義的計算是指能對外界的某種輸入做出反應,不一定就是數學運算。比如電梯就可以對按鍵做出反應,所以它也是能計算的。自動是說計算是通過自身的運作來完成的,不需外界干預。 在有電的時候,電梯就可以自動運行,這樣看來電梯也是計算機。算盤雖然能計算,但不是自動完成的,不過如果把打算盤的人一起算上,那就是不錯的計算機了。使用指紋或虹模的智能鎖、秦始皇陵里的機關和自動鋼琴似乎也都是一種計算機,情況確實是這樣,計算無處不在,計算機也無處不在。甚至可以把我們的世界看作一臺巨大的計算機,然后就覺得我們是生活在Matrix里,這是一個很有意思的哲學問題,有興趣就去看看黑客帝國三部曲吧。通常在實際編程中,程序員只考慮現代數字電子計算機,也就是使用電能為動力,在運算時以電子電路和邏輯代數為基礎的計算機。他們用途廣泛,種類也是極其繁多,手機、PC、服務器是比較常見的樣子,電梯、收銀臺、智能門禁則是各種隱藏的版本。雖然設備的外在形式千變萬化,但現代電子計算機的基本原理和體系結構并沒有太大的變化。 ### 為什么要使用二進制 從計算機導論課程(或其他相關課程)我們知道在計算機底層是用二進制來表示各種信息的,有些人肯定會問計算機底層為什么不用咱們熟悉的十進制來進行各種運算?這樣不是更接近人類的思考習慣么?這種想法還是不錯的,你看咱們人類多聰明,讓計算機使用十進制它是不是同樣會變得很聰明呢?很遺憾的告訴你,不會,至少目前不會,那樣只會拖累它,想想地球上有一半人改用火星文進行溝通,會出現什么情況?計算機的全稱為電子計算機,既然是基于電子組成的,它就得遵循電子世界的規矩。 在數字電路中一般用0表示低電平,1表示為高電平。電平是個邏輯量(就是聰明的人類根據自己的思維邏輯定義的一種東西),只有邏輯高、邏輯低兩種值,但邏輯的高低是用電壓的大小來表示的。譬如與電源負極的電壓差值很小的某一點可以表示為邏輯低電平——0,電壓差值很大的那一點則可以表示為邏輯高電平——1。在目前的電路結構中,判斷邏輯高、低電平兩種狀態是很容易做到的,而要判斷多于兩種狀態則比較麻煩。 ### 為什么需要編程 編程這件事存在,完全是迫不得已,人類發明了計算機,想讓它做事,僅此而已。但機器有三大特點,使得如果要讓機器做事,完全不像吩咐人那么簡單。 ### 第一個特點就是機器很傻 很多人希望自己像計算機一樣聰明,真要是那樣你就完了,趕緊卷好被子回家吧,不過待在竹園實驗室也許是個不錯的選擇,至少還有你的難兄難弟陪著你——值班桌上那臺破破爛爛的電腦。For example, 從三個數里選出最大最小值,人類可以一眼就看出,但機器只能先從兩個里找出最大的,再把這個最大的和第三個比較,然后再這樣重復一遍找出最小值。如果是七個八個數,機器也是這樣反復操作,O(∩_∩)O~是不是想到了冒泡排序?這就類似工地上搬磚,人類的做法一次搬很多很多磚,用推車或者別的運輸工具把磚碼得高高的然后運到目的地,但計算機的做法是每趟只搬一塊磚,你沒看錯,每趟一塊,一塊只需998!998,抱回家! =_= 那為什么計算機這么厲害呢? ### 它的第二個特點,快而不亂 機器可以不知疲倦地用同一方法,重復重復再重復地做某件事,而且每次重復都相當的快。這一點是人類做不到的,讓一個人搬一堆磚,也許沒什么問題,但是一車磚就會讓人疲憊不堪,如果有一火車皮的磚,想必大多數人想都不想就放棄了,即使有堅持去做的人,他的動作質量也只會越來越差。但機器不同,他搬磚不是每趟一塊么,但他每趟來回的時間很短,比如少于0.00...001秒,不管磚頭有多少,十萬塊也好,十億塊也罷,按同一方法處理,既沒有差別也不會厭煩,直到全部處理完。真是不怕苦、不怕臟、不怕累,新時代的勞動模范呀!所以從總體來比較結果,機器就比人強了。還是以選最大最小數為例,人可以用肉眼檢視三四個數,但超過100個數就要用其它的方法。對機器來說,三個和三萬個數只是重復次數的差別,單調快速的重復,這就是機器的訣竅。想想金庸筆下的絕招都是啥?——把最簡單的招數練到極致,那就是絕招呀!!! ### 更重要的一點,機器和我們言語不通 就是說,我們不可能一抬手一挑眉毛就吩咐它做事。不要和我抬杠說你可以用鼠標畫圈讓機器做事,也可以聲控,那都已經不是純粹的機器了。機器和我們處在不同的感知空間,所以它不能理解我們的言語。我們要命令它,必須用它能夠理解的形式。從根本上來說,就是電脈沖——也就是節 [為什么要使用二進制](#) 所說的數字信號「0」和「1」。 基于以上這三個特點,要讓機器做事情,就必須讓把我們的要求轉化成最簡單適于重復的命令集合,而且是電脈沖形式。比如我們要讓機器在屏幕上顯示一幅圖,首先我們要把這幅圖分解成很多很多的小方格,也就是所謂像素,每個像素只有一個顏色,每個顏色都用一個很長的數字表示,然后所有這些數字轉化成內存里的電平信號,再用另外的電路信號來一個個的把這些電平送到顯像電路。所有這些電平和信號的集合就是程序,而編程,就是制造這些程序的工作。 也許有一天,我們不再需要編程序,程序員這個職業也將不復存在。不過我想如果那天到來,那就是機器已經能完全理解人類的語言和思想的時代了。在肉眼所及的范圍里,似乎還看不到哩 :) ### 為什么要學編程 這個問題有兩層意思。首先是編程為啥要學,很簡單,因為這玩意不是生來就會,就像木匠活一樣屬于一門手藝,自然要通過學習才能掌握。你怎么也得花上幾年來學英語不是么?第二層涵義才是重點,為啥我要學它?答案自然是因人而異: 1. 能提升和挑戰自己的智力 1. 非常有趣兒 1. 編程是一門藝術 1. 造物主一般的感覺 以上幾種都屬于自虐一族... 再來看看以下幾種 1. 學校的必修課程... 1. 可以賺好多好多錢 1. 一種莫名的優越感 1. 等等等等... 在我眼中,學習編程的意義更多的在于可以利用現代計算機技術來推動本專業和社會的發展,通過計算機(這里泛指廣義的計算機)這個平臺可以相對便利地實現自己的想法,說白了它就是一個很好的工具——「造物主一般的感覺」。對于非計算機專業的學生來說,了解一點編程的基礎知識也是十分有利的——可以自己親手實現那些天馬行空的想法。現代的高級語言如 Python 玩起來就異常地爽,各種第三方庫數都數不清。 ### 編程到底是個什么玩意兒 計算機本身什么也做不了,必須依靠程序來指揮他做事。程序就是操作流程的順序,或者說是順序排列的多個操作過程,它是方法的描述,同時又往往包含著《孫子兵法》中**分而治之&&各個擊破**的思想。 Long long ago, 有一個叫張三的人,是一個木匠,老本行是做家具的。一次李四讓他幫做張搖椅,于是乎張三先把原木分割成木條木板,再把木條木板彎曲到指定的形狀,然后把他們放置到適當的位置,接著設法固定他們,最后雕花拋光和上漆,一張漂亮的搖椅就做好了。這整個的流程如果記錄下來,就是一個程序。 任何程序都有三個要素,執行者、操作對象(也稱為資源)和操作方法(指令)。在做搖椅的這個程序里,張三就是執行者,木頭就是他所對付的資源,在指令的持續作用下,木頭(資源)的狀態(如形狀大小、顏色位置等)不斷發生變化,最后,在程序結束時,木頭變成了漂亮的搖椅。 電腦程序和上面一樣,是方法的描述。只是這些程序的執行者不再是人,而是CPU,命令也變成了CPU的指令,而資源則是CPU可以改變其狀態的東西,通常是內存,當然端口、硬盤等也是,不過一般的應用程序都只使用內存就可以完成工作。有的時候會聽到別人說:「我的電腦內存是500G的,怎么玩起DOTA來還是很卡呢?」如果這種事情真的發生在你的電腦上,那我只能說:「恭喜你的電腦成功完成穿越,該電腦的準確生產年代不是史前,那應該就是在2014年之后。」一般來說個人電腦內存不超過8G,硬盤500G倒是比較普遍了。CPU并不直接從硬盤讀取數據,而是通過內存間接獲取。 有一點要注意,CPU其實并不知道自己在做什么,是程序在指揮CPU的運作。這一點比較難理解,讓我們來看看算盤是如何完成計算的。 ![紅木算盤](https://box.kancloud.cn/2015-10-26_562db8ef629f1.jpg) 要使用算盤,只需要一件東西:口訣。記熟口訣(當然還有它對應的操作),就可以用算盤計算。在這個用算盤計算的過程里,口訣就是程序,指導著計算過程。算盤自身并不知道自己在計算,他只產生了物理上的一些變化(算珠位置的變化),做珠算的人同樣也不需要知道,他只需要按照口訣調整算珠的位置。當程序結束的時候,算珠必定會處在某個位置上,這個位置的狀態可以按照某種約定被讀出,被讀成某個數值,比如下面4個算珠全都在中檔而上面的珠子沒有落下的狀態就是4。 操作和儲存狀態的設備并不需要知道狀態是怎么轉換成信息的,轉換由閱讀者來完成。舉個不是非常準確的例子,顯示器在顯示圖像的時候,在顯示屏上總是按照如下的規則進行: ~~~ 坐標(1,1)黑色、(1,2)白色、(1,3)白色、(1,4)白色、(1,5)白色、(1,6)白色、(1,7)白色、(1,8)白色、(1,9)白色、(1,10)黑色... 坐標(2,1)黑色、(2,2)黑色、(2,3)黑色、(2,4)白色、(2,5)白色、(2,6)白色、(2,7)白色、(2,8)白色、(2,9)白色、(2,10)黑色... ~~~ 雖然顯示器只是在適當的坐標顯示黑色或是白色,但我們卻在顯示器上看到了文字、圖片和動畫,你不會認為顯示器知道這些是鳥山明的漫畫吧?如果你能造出這樣的顯示器,那真是太有才了! 計算機也是一樣。比如計算圓周率的程序,CPU只是不斷地對某一塊內存進行操作,當程序結束的時候,這塊內存恰好處在某種特殊的狀態。而按照事先的約定,這個狀態在被讀出來的時候,它正好和圓周率相同,于是我們可以說,算出了圓周率。其實CPU只是在那里象手指頭一樣撥動內存的算珠而已。這種算珠極其簡單,他只有兩個位置,0和1,撥動它也很方便,電流就可以,但這種算珠實在太多,使得他們能組合起來表示很復雜的信息,就像只有黑白兩色的屏幕點當數量足夠多的時候,就可以用來表現有趣的漫畫。 所以程序代表人期望電腦能做的事(注意不是電腦要做的事,這一直混淆著許多人),當人需要做這些事時,人提供指令,再給出某些資源以期電腦能對其做正確的改變。程序只是方法的描述,本身是不能發生任何效用的,直到它被執行,人為給定它一塊內存,告訴它計算結果的精度及計算結果的存放位置后,他通過控制CPU才改變人為給定的這塊內存的狀態以表現出計算結果。 通常,我們把計算機的物理實體部分稱為硬件,包括電路板、機箱、鍵盤鼠標等,而把不可見的非實體部分稱為軟件,軟件大體就是程序和主要由程序產生的數據。廣義的說,樂譜、菜譜、工作手冊、儀器的操作說明也是某種程序,我們不妨稱之為類程序。 ### 編程語言又是怎么回事 如果以上所說的就是編程,那編程語言(比如C語言)又是怎么一回事? 菜譜、儀器的操作說明可以用法語來寫、也可以用中文來寫,不影響實質效果。因為人類生存在同一個四維物理時空中,具有相同或類似的感知。雖然人類的語言五花八門,但都可以通過翻譯得到正解。 儀器操作說明、一般的菜譜,所描述的都是人類世界的事物,人類可以理解,因此它們可以用人類的語言來描述。但計算機程序顯然與菜譜有不同,他是指揮計算機用的。首先CPU所能感受到的物理空間和與人類的感受嚴重不同,很多概念根本無法傳達,其次沒有大腦的計算機并不懂得人類的語言,何況人類的語言并不那么完美,很多事不能精確的描述,所以人類的語言不論英語還是中文都不能勝任這個任務。這個情況和音樂有點類似,解決方案是發明一種人造語言專門用于這個領域。比如五線譜就是一種專門的供音樂使用的人造語言(數字簡譜也是,由于它與中國的工尺譜相當接近,所以在中國得到了最大程度的發揚光大,有點地方話的味道)。于是就有一些專門的純粹用于計算機的語言被創造出來。 其中最早的一種基于電路原理,直接用0和1來表示電路的開關通斷,不斷的撥動開關,就形成了程序。這種語言就是機器語言,它可以直接被計算機聽懂,但遺憾的是,人類雖然可以看懂這種語言,但它不符合我們通常的交流習慣,很難被人所閱讀,更不要談設計和修改了。 人類的智慧總是無窮的,后來人們提出這樣一個方案,我們可以先按某種方法和規則,生成一個我們能看懂的指令序列(就是源代碼),再通過某個轉化的工具(就是編譯器),把它變成機器可以運行的指令(也就是可執行程序)。這個我們能看懂的指令序列的規則的總和(也就是詞匯和語法[[1]](#)),就是我們通常說的計算機語言。為了和機器語言相區別,被稱為高級語言。 章節開始所說文本形式的源代碼其實是有些規定的,就像我們和老美用英語交流。首先你得說英文單詞,不能冒法語詞匯日文假名出來,其次你得按語法講話,不能一個個單詞往外蹦。程序也同樣有詞匯和語法上的一些規定,這些規定就構成一門語言。顯然任何一門編程語言都是人造語言,既然是人造的東西,因發明人的想法而不同,就形成了不同的語言。當然,編程語言的區分遠不止以上所說的詞匯和語法上的不同,還有其運行機制也不完全一樣。 常見的編程語言有很多種,靜態語言如 C & C++ & JAVA, 前三種語言近幾年幾乎一直占據著TIOBE編程語言排行榜的前三甲,其他著名語言有Python, Ruby, Perl和Golang等。他們各有所長,在不同的領域發揮著各自的作用。但由于計算機的體系結構大致相同,這些語言也大同小異,具有共通之處。這情況很好理解,通常真實世界的拳法看起來都有點相似,只有漫畫這類幻想作品里才會有手腳飛出或者口吐火焰眼下噴水這種怪異的事情發生。 ### 編譯器所謂何物 前邊不少地方提到編譯器,那是什么東東?——代碼翻譯機,前面的章節中或多或少地解釋了這個東西。不過這里不介意再解釋一次,是的,前文中提到過,程序其實是電脈沖形式的指令的集合——對機器這是絕對正確的。但你認為人類可以直接操作電脈沖么?——當然不能。所以最早的時候,程序員們是通過反復的撥動開關或者插拔插頭來做這件事的,就像老電影里的電話接線員和發報員。下圖為給ENIAC寫程序的兩只程序媛。 ![給ENIAC寫程序的兩只程序媛](https://box.kancloud.cn/2015-10-26_562db8ef7f92b.jpg) 后來技術進化了,人們可以把脈沖信號設置在打了孔的紙帶上,然后讓紙帶穿過有燈管的感應器,有孔電路就通,沒有就是斷,由紙帶機實現了在電脈沖和紙帶之間轉換。老電影里的工程師們經常拿起一條長長的紙帶來閱讀——真是高深莫測啊!不過即使這樣,要理解程序還是很困難,更別說閱讀編寫和修改了,人畢竟不是機器。下圖為80列、矩形孔的標準的IBM打孔卡片,相當于存儲器。 ![IBM打孔卡片](https://box.kancloud.cn/2015-10-26_562db8efa588e.png) 其實人們最習慣用來表達思想的方法是文字,于是人們設想能否直接寫出文字形式的程序。通過不懈的工作,這個目標實現了。今天人們可以寫出文本形式的稱為源代碼的程序,然后再利用特定的工具把代碼轉換成機器能理解的電脈沖形式,也就是目標程序。這種轉換工具就叫做編譯器,作用相當于翻譯,以前是純粹的機電設備,到了現代它也成了程序的一種。 從某種角度來說,其實沒有任何人能被稱為程序員,編譯器才是真正的程序制造者。人所制造的只是源代碼,從這個角度往下想的話,其實是程序在制造程序,換言之,程序在借助人類之手自我進化。還記得前邊說過的Matrix么? 在這里順便講解下編譯和解釋的差別。編譯器的工作本質上類同于翻譯,而我們知道其實翻譯有口譯和筆譯兩種工作模式。程序員寫完所有的源代碼,由編譯器一次性轉為可執行文件留待以后執行,這種類似筆譯的模式我們稱為編譯。程序員每次輸入一行或數行代碼,編譯器馬上把他轉換并執行,接著等待程序員的后續輸入,這種類似即時口譯的方式就稱為解釋,此時編譯器就被叫作解釋器。C/C++ & Pascal等語言是編譯型的,Perl & Python等語言就是解釋型的,Java語言很特殊,他先編譯成一種中間代碼,然后在不同的機器上邊解釋邊執行,這樣就能實現跨平臺運行,稱為半編譯模式,微軟的.NET也是這種機理。現代的新型解釋性語言很多都是半編譯的——兼顧了運行效率和跨平臺性。一般來說,編譯型要比解釋型的運行效率高些——因為不需要等待程序員的輸入,也便于系統優化。但解釋型在編程的時候容易排錯,界面友好,而且通常程序編寫比較方便,比如Python。但不管用哪種語言編程,你總需要一個編譯/解釋器。 現代的編譯器,往往不止是編譯器,它還會包含有著色和搜索等功能的代碼編輯器,支持單步調試并行調試的調試器,能夠讀入文件的多個版本并進行比較分析的版本控制,編輯圖標等的資源編輯器,在大型項目中用于統一協調的項目管理,和用于自動化代碼生成的向導工具等等。這樣的編譯器,我們就稱它為集成開發環境(IDE:Integrated development environment ),代表就是[開放源代碼](http://zh.wikipedia.org/wiki/%E5%BC%80%E6%94%BE%E6%BA%90%E4%BB%A3%E7%A0%81)的[Eclipse](http://zh.wikipedia.org/wiki/Eclipse)和稍微有點軟那個公司的[Visual Studio](http://zh.wikipedia.org/wiki/Visual_Studio)系列。 ### Notes [[1]]() 關于語言詞匯和語法上的詳細說明可參考[程序的基本概念-自然語言和形式語言](http://songjinshan.com/akabook/zh/intro.html#intro-naturalformallang)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看