非專業coding教程2:與機器對話

在很多人眼中,電腦是一個很厲害的存在:它可以幫你統計大量的數字,可以給你提供大量的信息,可以把遙遠距離的信息展現在你的面前,可以做各種人類無法做到的事情。

很聰明很神奇對不對!~才怪啦!

在你面前的這個電腦,在擁有軟件之前,就只是一堆電路板混合物。但是它有個很重要的特點:它擁有記錄信息以及操控信息的能力。想象一下,電腦就像一個富豪家出生的孩子,身邊是各種跑車游艇直升機。但是它什么都不懂,這些東西對它來說就一點用都沒有。人類中的程序員,便是教會它知識的人,教會這個富二代怎么一步一步啟動它的跑車:插鑰匙,開引擎,掛檔踩油門,呼!~

電腦是個聽話的學生,它可以把學到的知識記得很牢,所作所為都是所學到的知識的反映。所以說,你面對的不是一臺單純的電腦,里面保存著數不盡的人類的思想,你所遇到的,都是人類思想的映射。信息保存在硬盤里,嗯,你可以拆開硬盤看看人類的思想長什么樣。(騙你的。)

在現實生活中,人類用語言表達自己的思想,不同國家地區的人使用不同的語言。為了方便不同語言的人的交流,我們使用一些國際通用的語言,比如說英語。一個意大利人可以用英語跟日本人交談,當他們這么做的時候,實際上是

1. 意大利人把自己的想法翻譯成英語,

2. 日本人聽到英語,把這段信息翻譯成日語并加以理解。

你好,歪果仁

人類跟電腦的交談也是差不多一樣的方式,可能比較復雜點。

初中或者高中的計算機課,希望你們在聯機打游戲刷網站發呆之余,還能記得老師講過,電腦的信息是二進制存儲的。也就是說,電腦只認得“10101001010101001”這樣的語言。所以程序員與電腦的對話類似于下圖:

“幫我計算1+1等于幾”

注:這幅圖中間的“云朵”,其實包括了很多“層次”在里面。

在最開始的時候,那時候的程序員還被叫做計算機科學家(大概吧),他們是“直接”跟計算機進行對話的。嗯,你沒有看錯,就是直接寫101100100110這樣子,這便是機器語言。那時候的編程是通過在紙條上戳洞來完成的,大概是遇到0就戳一個洞吧,最終的程序的樣子就是:

程序員需要靈活的雙手——來戳洞……

可想而知,寫出來的東西不僅別人看不懂,他們自己其實也看不懂啦。之前說過的,程序員就是千方百計想著偷懶的人,這么難懂的機器語言當然沒人想繼續用。而一般來說,抓到規律的東西就可以用自動化的機制來代替人工。機器語言便是非常有規律的東西,于是科學家們在那之上,又創造了一門語言:匯編語言。有了匯編語言,科學家們就可以用比較易懂的方式來控制電腦了。比如說要電腦計算1+1,那么步驟大概是這樣的(二進制數是亂寫的,各位看官別當真):

在存儲器上寫個1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1000110010010110

在存儲器上再寫個 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1101001001001010

放到加法器上加起來 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1101010101101111

由于每個步驟都對應著一串固定的二進制指令,所以可以很方便地進行映射。負責這項工作的程序就叫做匯編程序。好了,有了匯編語言,科學家們就可以告訴電腦把大象放進冰箱要怎么做了,只要把步驟想好告訴電腦就行了。

但是懶惰的科學家還是覺得這不夠:為什么我只是想算一算1+1等于幾,但是我卻需要控制電腦一步一步去完成,而且,計算1+1這個過程是固定的,為什么不繼續用自動化的東西來完成?于是在匯編語言之后,科學家們有創造了一種更高級的語言,而且懶得取名了,直接稱為高級語言。從此以后,科學家們只需要寫“1+1” 就可以自動轉變成0和1的長串,傳輸給電腦讓它去計算了。完成這個轉變過程的程序,叫做編譯器。編程,也變成了難度少了很多的工作,隨著計算機進入尋常百姓家,寫程序的人再也不只是科學家了,專業寫程序玩家,被稱之為程序員。

有一個重點需要注意。機器語言是跟計算機本身相關的,匯編語言也是跟計算機的工作原理相關的,當前我們使用的電腦的基本原理跟設計都是差不多的,所以機器語言、匯編語言也是固定那樣子。但是高級語言因為不用在乎具體硬件細節,可以更關注于表達思想,而人類思想百花齊放,所以高級語言也有很多種。

我在大學的時候一開始學的是一種叫C++的語言,后來轉向Java。然后很多人都會說C或者C++是“面向過程”的語言,Java是“面向對象”的語言。直到畢業之后還有人問我,到底什么是“面向對象”編程。那時候我想了一下,說,其實這是一種思維方式,一種編程里面的世界觀。

很高深對不對~~~

由于高級語言可以直接表達編程人員的思想,人類的思維方式千差萬別,人類的世界觀更是不盡相同,于是便有了各種各樣形式各異的編程語言了。其目的,就是為了貼合思維方式,從而可以方便地把想法轉換為代碼。如果你認真學過不同的人類語言,你就會發現不同人類語言中也包含著不同文化不同國家的人的不同的思想。作為一個例子,所謂的“面向對象”編程,其思維方式就是認為問題里出現的“東西”,都可以抽象成一個一個的“對象”,通過這樣的抽象,把問題簡單化,模型化。相對的,另一種編程模型,“面向過程”編程,則是認為問題都可以分解為一個一個的步驟,所謂的解決問題,就是想好每個步驟按部就班地完成。

以上是我個人的理解,偏頗之處,我才不管啦!

下一節課,我們開始拿起槍,扛起炮,正式寫代碼!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容