談談計算機和程式語言
總有人和我說計算機真神祕,程式語言很難學,各種不懂。個人感覺其實如果不是去研究那些複雜的演算法,基礎的程式語言還是很容易學習的。很多童鞋們在學習程式語言的時候沒有搞清楚來龍去脈,只是簡單死記語法,沒有站在計算機的全域性角度來學習計算機語言。工欲善其事,必先利其器,這裡我說說自己對計算機和程式語言的粗淺理解。
計算機其實一點都不神祕,作為人類先賢的偉大發明之一,它和人其實很像。簡化點說計算機和人一樣,大家都有配套輸入核心,中央處理核心,輸出處理核心以及把這些部件連結起來的鏈路和讓部件工作的能量 。人需要靠五官接收外界資訊(輸入核心),然後經過大腦加工處理(中央處理核心),通過人的行為言語表情(輸出核心)給出反饋。計算機也是一樣的,通過鍵盤,滑鼠等裝置接受資訊(輸入核心),然後經過CPU+記憶體(中央處理核心)按照規定的規則解析,再通過顯示器或者其他裝置(輸出核心)給出反饋。只不過人類的五官接受資訊複雜,人腦的加工處理充滿變數,同一個問題在不同環境不同心情的反饋可能完全不一樣,而計算機只要是相同輸入則是固定反饋,除非硬體故障。人對同樣的問題為啥變數無數只能問上帝:),可能來自於輸入的模糊性,大腦的複雜性。計算機的世界
PS:一臺計算機不是隻有CPU一個處理核心,實際上所有的計算機部件都有自己的處理核心,這也和人一樣,人的五官都有自己的處理系統,只是把處理之後的資訊傳輸給大腦。計算機每個部件的核心也是按照自己和CPU約定好的規則交流。
既然計算機只能認識0和1(二進位制),那麼計算機是如何理解我們的輸入,又是如何進行處理,怎麼給出絢麗多彩的視訊顯示呢?不得不說人類太聰明瞭,這裡照搬了人與人交流的方法。想想現在碰到一個原始人,你要怎麼和他交流呢?首先當然教會他語言,大家在同樣的channel上才能交流。人與計算機的交流也是一樣,為了兩者可以溝通,必須要有一種大家都懂的中間語言。作為硬體電路的計算機,只有高低電平(0/1)的概念,是個笨學生,當然無法像原始人一樣直接學習人類的語言。所以人作為比較聰明的一方,就需要幫助計算機建立自己的語言,用這種建立的語言,達到和計算機通訊的目的。
PS:計算機雖然很笨,但是他很勤快,比人類計算速度快了N多倍,名副其實:計算機。計算機存在的意義是代替人類做一些靠人手很難處理過來的事情,比如複雜運算。
為計算機設計語言,其實和人類的自己用的交流語言一樣,定義語法(怎麼輸入),定義語義(語法表達什麼意思,就是說語法會怎樣處理,得到什麼結果)。由於計算機只能認識0和1,所以設計出來的語言自然全部都是0和1組成的,這種語言就是傳說中的機器語言(全部都是0和1組成的語言)。比如說對人來說1+2=3,如何翻譯成對應的機器語言呢?人們告訴CPU說如果你收到0000000000000001就代表資料1,收到0000000000000010就代表資料2,收到101010101010101010101010代表操作+,那麼對於+這個語法,你要把收到的2個數據的進行合併操作,把結果3 0000000000000011作為輸出。
PS:這裡的指令都是亂編的,只是講個大概,真的要實現這個對人來講很簡單的語義對計算機器件核心還有很多複雜的地方。比如既然機器語言裡面所有資料都是0和1,計算機如何確定執行1+2呢,如何階段輸入1,+,2呢,資料儲存在什麼地方接受輸入,又是從什麼地方反饋輸出呢?簡單點說處理核心通常是有很多條線路來接受輸入的,還會有輔助線路來幫忙提示輸入的起始和結束。輸出當然也會有很多條線路,資料是放在處理核心的暫存器裡面做處理。更復雜的大家可以自己去找資料看,我這裡就不誤人子弟了。
既然是給計算機制定語言,問題就來了,到底是讓處理核心只實現一些簡單的加,移位操作就好呢,還是說讓處理核心儘可能會做更多複雜的事情呢?這就是當年響噹噹的精簡指令集和複雜指令集之爭。
現在用機器語言寫程式碼的非常非常少了。因為這種語言實在是太難記了,先賢們決定來些簡化,於是乎組合語言出現了。組合語言使用了很多對人類來說較為可讀的語法,來代替複雜的機器語言語法,比如說引入加法符號,使用10進位制,其實本質上就是增加了一層組合語言到機器語言的自動翻譯功能。現在計算機核心CPU的廠商,都會在自己的CPU的文件裡面給這款CPU或者這個系列的CPU定義了一套匯編語言,告訴大家要這款CPU的聰明程度。組合語言很好,不過可以執行的命令通常都非常少,而且經常要對資料做位操作,從編碼效率上來說實在是不敢恭維。在計算機硬體效能飛速發展的黃金歲月裡,如此低的開發效率實在無法讓人忍受。先賢們又開始想辦法了,在組合語言上面再套一層,包裝更加可讀,可重用,更容易編碼的新語言,於是我們看到了偉大的C語言誕生了。當然還有些其他語言,在C面前大部分都被打倒了。在增加了C語言到機器語言的自動翻譯之後,計算機軟體開始迅速發展。很多人把C語言作為高階語言的標識,其實發展到今天,C已經被很多語言作為了底層包裝,比如Java,Erlang,Perl,Python等等。
所有這些語言其實都是做一件很簡單的事情,告訴大家基於我這個語言,你要和計算機交流。基本上就是你可以使用什麼樣的語法,然後就可以得到什麼樣的結果。程式是用來和計算機溝通的工具,雖然千變萬化,各自程式語言層出不窮,本質上都是在做翻譯,把自己的程式語言翻譯成計算機能夠懂的機器語言。比如說C++說要計算機在螢幕給出一條輸出"hello world",那麼你就要用C++編寫一條語句cout<<"hello world",對於Java來說語法就是System.out.print("hello world")。所以學習程式語言,首先就是要和學習外語一樣,背熟基本語法,然後把自己想計算機做的事情,按照計算機語言的語法翻譯過去,就大功告成了。當然由於計算機是非常笨的,基本語法一般都不是很多,所有通常有人會把一些基本語法比如輸入輸出,迴圈,加減乘除處理的語法組合在一起,形成按一定條件輸入引數就能得到某種規則的結果的可重用函式庫,這些讓世界變的越來越美好的東西,也是需要努力記住,這樣就可以成為一個基本的碼農了。要想變成更加高階的碼農,涉及的東西就非常非常多了,作業系統,網路知識,資料儲存知識,資料探勘,系統安全,系統架構,系統調優,高效可重用開發,這裡就不展開了。
當然由於計算機比較笨,我們簡單的一條cout命令是不可能讓計算機能夠在螢幕上給你顯示hello wold的。這後面除了其他的可重用函式庫,還有一個很重要的軟體在幫你做很多翻譯工作——作業系統。什麼是作業系統呢?計算機需要輸入輸出裝置,需要中央處理CPU,需要記憶體,需要儲存裝置,需要電源,需要電路版把這些裝置連結起來,而這些裝置都各有各的核心,每種裝置都有很多廠商生產,不同廠商給各自的核心定義的處理規則也不一樣。人們使用計算機當然是作為一個整體,給計算機一個輸入,然後期望一個輸出。如果每次都要自己把所有器件整合起來,顯然是很多重複勞動,而且可能為了一個簡單輸出就要寫n多行程式碼。為了把計算機作為一個整體來管理使用,先賢們為計算機編寫了高度可重用,可擴充套件的軟體——作業系統。作業系統作為計算機開機之後啟動的軟體,管理好了計算機所有硬體資源的協作和操作,把直接的複雜硬體操作簡化為一些簡單的程式語言語法操作(翻譯機功能,主流作業系統windows,linux,unix都是提供c語言語法操作)或者作業系統自己定義的命令列操作,代替硬體和碼農互動,讓碼農的生活變得美好,高效起來,當然作業系統不是這麼簡單的翻譯機功能,還有很多系統排程,系統調優等等功能。
計算機的效率是那麼的高,大家都希望它可以為人類做更多的事情,可是如果人人都要去學習命令列語言才能和計算機交流那也太難為大家,而且耗時長,效果不一定好。於是乎偉大的視覺化來了,包裝程式語法的輸入輸出成圖形介面,鍵盤,滑鼠操作,計算機的使用從此迅猛普及,不懂程式語言一樣可以用電腦做很多事情,PPT,上網頁瀏覽資訊,看網路電視。感謝偉大的視覺化操作。
我們可以看到,計算機的發展其實是一層一層包裝的發展,從簡單的0/1處理的機器語言,到複雜的視覺化介面操作,中間有n層自動翻譯機才實現了人與計算機的簡單交流。一步一個腳印,世界才會更美好,有點敏捷開發的影子,先做出核心功能,再慢慢完善。
計算機的世界千變萬化,每天都有很多新東西湧現出來,要學的東西很多,但是道生一,一生二,二生三,三生萬物,萬變不離其宗。程式是用來和計算機溝通的語言,雖然千變萬化,各自程式語言層出不窮,本質上都是在做翻譯,把自己的程式語言翻譯成計算機能夠懂的機器語言。多去思考為什麼,對於快速學習理解新東西很有幫助。
相關推薦
談談計算機和程式語言
總有人和我說計算機真神祕,程式語言很難學,各種不懂。個人感覺其實如果不是去研究那些複雜的演算法,基礎的程式語言還是很容易學習的。很多童鞋們在學習程式語言的時候沒有搞清楚來龍去脈,只是簡單死記語法,沒有站在計算機的全域性角度來學習計算機語言。工欲善其事,必先利其器,這裡我說說
計算機和程式語言的發展歷史
計算機的發展歷史 在第二次世界大戰中,美國政府尋求計算機以開發潛在的戰略價值。這促進了計算機的研究與發展。1944年霍華德.艾肯(1900-1973)研製出全電子計算器,為美國海軍繪製彈道圖。這臺簡稱 Mark I 的機器有半個足球場大,內含500英里的電線,使
從程式設計師視角和程式語言角度看【中醫】:一種生命健康程式語言
開篇,我們來問幾個問題,相信是個程式都知道: 比如,0,1 代表什麼?比如,A,B,C,D,E 代表什麼? 0,1是數值,是二進位制位; ABCDE是符號,可以作為變數。 如果不懂,可以繼續看下面的虛擬碼: vA=""; vB=""; vC=""; vD=""; vE="";
H5 遊戲主流引擎和程式語言
引言: 最近微信新版本,主推小程式中的小遊戲模組,一個 “跳一跳” 的 H5 遊戲瞬間爆火,雖然很多傳言說 H5 真正盈利的時機未到,因為它的突出作品大多是簡單的小遊戲,好玩但不吸引付費。然而,H5 遊戲巨大流量和強大的日活躍還是可以轉化為利潤的。最近
指令碼語言和程式語言的區別
程式語言 計算機語言的種類非常的多,總的來說可以分成機器語言,組合語言,高階語言三大類。 計算機所能識別的語言只有機器語言,即由0和1構成的程式碼。但通常人們程式設計時,不採用機器語言,因為它非常難
為什麼中國開發不出流行的作業系統和程式語言
# 為什麼中國開發不出流行的作業系統和程式語言 Stitch/2020-2-21 ## 引子 知乎有兩個帖子很有意思, [中國能不能寫出作業系統?](https://www.zhihu.com/question/274446721/answer/377395235) [中國為什麼沒有自己的程式語言](
計算機二級-C語言-程式填空題-190112記錄-結構體的遍歷和結構體的資料的交換處理,檔案的操作。
//程式設計題:學生的記錄由學號和成績組成,N名學生的資料已在主函式中放入結構體陣列s中,請編寫函式fun,它的功能是:把分數低的學生資料放在b所指的陣列中,注意:分數最低的學生可能不止一個,函式返回分數最低的學生人數。 //重難點:結構體的定義。結構體的使用。檔案指標的定義。對檔案的操作。輸出格式‘%4d
從華為養豬說起,聊聊我對中國計算機發展的一個遺憾--為和我們沒有開發出自己的程式語言
節日最後一天,沒什麼事情,想聊聊我對中國計算機技術發展的一個遺憾,為什麼我們沒有開發出自己的程式語言 1.華為推“智慧養豬”,或許暗示方向有變 近日,華為機器視覺總裁在微頭條爆料稱,華為機器視覺推出了智慧養豬方案。養殖業的發展方向是數字化、智慧化和無人化。此前任正非接受媒
深入理解計算機系統(3.1)------匯編語言和機器語言
找到 生產 有著 shu 符號 ces pc機 高效率 機器語言 《深入理解計算機系統》第三章——程序的機器級表示。作者首先講解了匯編代碼和機器代碼的關系,闡述了匯編承上啟下的作用;接著從機器語言IA32著手,分別講述了如何存儲數據、如何訪問數據
計算機基礎知識--容量和其他語言簡介
cape 命名 lis gin 特點 ada ets 使用 jar 1、計算機容量 1位 = 1bit 8bit = 1byte = 1字節 1024bytes = 1kbytes =1KB 1024個字符,小文檔 ,幾百k可以表示一張圖片 1024KB = 1
程式語言的底層描述(2)——棧指標esp和幀指標ebp
程式語言的底層描述(2)——棧指標esp和幀指標ebp 2014年10月11日 17:43:57 coreyspomu 閱讀數:3062更多 個人分類: 資訊標識和處理 本節我們重點討論棧指標esp和幀指標ebp,圍繞這兩個重要的暫存器,推匯出函式棧幀結構。
計算機程式語言的種類
程式語言主要由以下幾種分類方法:1、編譯型和解釋型2、靜態語言和動態語言3、強型別定義語言和弱型別定義語言 第一種劃分方法是,編譯型和解釋型:之所以這麼劃分,是因為計算機不能直接理解高階語言,僅僅能直接理解機器語言(相對來說比較低階),所以必需要把高階語言翻譯成機器語言,計算機才能執行高階語言編寫的程式。翻
程式語言的發展歷史和未來展望
人類第一臺 電 子 計 算 機,即“埃 尼 阿 克(ENIAC)” 問世於1946年,由大量的電子管組成,用 於 進 行 彈 道 計算。自埃尼阿克的面世以後,電子計算機經歷了電子管 - 晶 體 管 - 集 成 電 路 - 超大規模積體電路的階 段,執行速度越 來 越 快,而體積和成本也越來越低,從 早期只能手
列了一些自己會但是不怎麼精通的程式語言和知識,做個記錄,空餘時間加強學習
程式語言: C, C++, VB, VBA, Java, Python 前端基礎: HTML5, CSS3, JavaScript, TypeScript, AngularJs, Vue 程式設計知識: 資料結構與演算法 離散數學 概率論 正則
Java學習(一):第一章 計算機、程式和Java概述
第一章 計算機、程式和Java概述 (1)匯流排--》 儲存裝置、記憶體、CPU、通訊裝置、輸入裝置、輸出裝置; (2)語言: 機器語言: 二進位制形式
深入理解計算機系統——程式結構和執行
前言 第一部分 程式結構和執行 正文 1.資訊儲存 虛擬記憶體:是一個非常大的位元組陣列 記憶體的地址:記憶體的每個位元組都由一個唯一的數字來標識 虛擬地址空間:所有可能地址的集合 2.十六進位制的表示法 插播一下 進位制的轉化,(數學渣)會進位制
C語言RL78 serial bootloader和C#語言bootloader PC端串列埠通訊程式
瞭解更多關於bootloader 的C語言實現,請加我QQ: 1273623966 (驗證資訊請填 bootloader),歡迎諮詢或定製bootloader(線上升級程式)。 前段時間完成的hyperboot_rl78, 是專門為Renesas 16-bit微控制器RL78 通
剛從阿里面試回來,想和程式設計師們談談(想進阿里的必看)
最近面試了多家網際網路公司,最終收到了阿里offer,面試前在網上也蒐集了面試題目, 但有些不是過時的,就是題目雜亂,歸納不繫統。 這次面試過後,我把面試上阿里的面試過程整理了一下,當做是一個總結,後來有朋友問我要面試記錄,索性發布出來,跟大家一起分享
如何學習一門計算機程式語言
計算機程式設計是一個實踐性很強的“遊戲”,對於新入門者,好多人都在想,哪一門程式語言最好,我該從哪開始呢?我的回答是:語言不重要,理解程式設計思想才是最關鍵的!所有程式語言都支援的那一部分語言特性(核心子集)才是最核心的部分。所以從實際情況出發,選一門你看著順眼,目前比較貼近你要做的工作或學習計劃的
#Java又和Go語言槓上了!程式設計師:10年了!擡走,下一個
隨著IT行業越來越火,有很多小夥伴也就入了程式設計的坑。IT行業就業前景好使毋庸置疑的,從事IT行業的人,就算是跳槽再就業也是不會有什麼難度的,與其他行業相比,IT行業只要有技術,其他的就都微不足道了。 如果有想學習java的程式設計師,可來我們的java學習扣qun:72340,3928免