關於計算機這一塊兒的認識

到目前爲止,對計算機也算有一個通透的認識了。也該總結一下了。
由於我很亂,不想按照寫程序的思路來寫成一篇博客,反而想輕鬆的說一說。不一定真實,但可以作爲參考。
windows早期爲了競爭pc領域,不想自己造輪子,而是基於DOS的API開發。DOS的系統調用當時明顯不夠,爲了支持更多的硬件,DOS的系統調用逐漸增多。隨着90年代計算機和互聯網的如火如荼,錢,驅使着人,微軟的人一下子變多了。
不斷選拔出的編程精英們,不斷優化着各種系統調用。開始有最早一批的架構師系統性的總結API,並進行歸類。並且必須做到的是可以迭代。舊的代碼一定可以複用。這是爲了使windows內部代碼的健康走向而不得不未雨綢繆的。那時候的架構師們,就像任正非一樣,有着遠見的目光。
爲了給員工們提氣,比爾蓋茨開始遊說當時各種著名的公司,頻繁的露臉使得這位年輕的BOSS逐漸在世人的目光。win的崛起依賴數億的軟件。當時gcc 90年代纔開發好,c只是一個標準,我們何不自己開發?win抱着這個想法寫了vc。爲了更好的配合windows的生態,造了IDE。各種硬件的加入,使得DOS系統內部打了許多驅動。還有一些不知名的硬件不得不給windows提供驅動纔行。這是捆綁的。
靠着office套件在中國大賣,一下子用戶體量得到了奠基。

故事還很長。


操作系統到底有什麼奧義?拋開復雜性不提,系統最核心的就是內核。這點linux已經驗證,無需多言。
你想過用c語言實現一個printf麼?平時你不寫這種代碼,但當你寫操作系統時才能明白需要寫這樣的代碼。
你想過怎樣實現麼?printf()後面的可變參數又是怎樣寫的?你一定煩了吧。你還覺得c語言的標準輸入輸出麻煩呢。不如python的1句print(),不如java的一句syso,不如c++的一句cout。qdebug。確實,這些函數的調用是不是很爽啊,但只能讓你雲裏霧裏。你也寫過程序,你也知道你不喜歡寫文檔。你造個輪子後,需要讓別人使用,你肯定嫌麻煩,不會將文檔寫的面面俱到,你會來一句,看代碼吧。在你看來,別人的抱怨就是他們懶得瞧你寫的代碼。我個人覺得早期接觸編程看代碼的文檔是一件不可能的事。我剛學c的時候那時候也是剛接觸編程。老師給我們一本電子書,好傢伙,我當時也是看了十幾頁的人,但是實在枯燥,不看。後來老師發了chw,還是中文的,但是,這函數說的啥意思啊。啥是內存地址?啥是初始化?…啥都不明白的我,當時也是直接把那個軟件仍一邊了。真的是…自己笑自己,哈哈。就是這樣的年代,我接觸了Java。怎麼說呢?我記得我學得很遠,一直學到了微服務。你得承認有的人他雖然對電腦感興趣,但他有時的思維也不是很適合搞算法之類的。Java給人的最大好處就是懶。我們是被上帝寵的孩子,還遠看不到編碼的冰山一角。我之前寫過一篇很短,但非常有趣的文章。for循環。仔細研讀就會發現裏面的奧妙。我們可以知道Java在封裝數據時的邊界以及越界了怎麼處理。完全是計算機科學導論裏面講的嘛。導論難學,幸好我遇到了個有趣的老師,我不認爲他很難,只要潛心研究。大學裏只是教我們有這門課,和真實的機器怎麼聯繫還是得看課下的功夫。而我認爲我遠遠沒有達到。代碼啊,一行一行。寫的適合沒感覺,就加個for就3,4行了。問我自己,怎麼做到的。爲什麼一下的功夫就多了這門多代碼?每啥,就是腦子裏靈光閃過,就形成了代碼唄。代碼說穿了就是要幹什麼幹什麼。有時候涉及到相關的內容了,查查文檔,資料啊,複製拷貝代碼就上去了。如果你去研究github上neovim項目的代碼貢獻度,你會發現一個很有意思的事情。github上貢獻代碼最多的,也是刪除代碼最多的。我不想搞什麼Unix哲學,可是事實就是這樣。而這就關乎了代碼質量。同時養活了幾門學科,什麼數據結構啊,軟件工程啊。我雖然每寫過大型C項目。我也知道,按照C的特色,到最後代碼上升到萬行後,怕是如果沒有好的數據結構來支撐,自己都不想多看一眼。甚至眼一瞪,大叫一聲,老子不幹了,轉行轉行。這時候Java,C++可能就會被垂愛。可能還不放棄的,叫囂着重拾數據結構,於是就有了一遍遍地掙扎…青春,也在掙扎中消逝。這個故事沒人給我講過,我只是模擬一下,故事也可能只是虛擬。
可這就是生活啊。我們在代碼中耗費我們大量時間。於是,有人去研究了更底層的事情。教育水平也在不斷推進着。
學校的任務啊,我覺得,最重要的事情啊,就是要讓你儘可能的看到事情的全貌。可能今後你掙扎着的那塊領域你會不屑學校的膚淺,可是不必恨啊。因爲如果你沒學過編譯原理,會不會聽信了別人代碼一定要寫成這樣的風格的鬼話?第1是所有代碼進編譯器一致對待。第2是你可以寫一個程序,然後格式化你的代碼啊。我用vim寫java的時候,只要保存就會默認給我加上縮進。我不覺得這是很難的技術。甚至是談不上編譯原理前端的一部分。關鍵是你得知道一些歷史上關於\n,\r,\n\r,\t等字符的處理。不同的系統有不同的處理。學到正則你還會驚喜的發現,這些統統可以用\s來代替。所以,在某些不是那麼花的課程上下點功夫,哪怕你只是記記筆記,多年後再重拾這門學科,也可以啊。這些擴寬了我獨立思考的深度。
等到接觸腳本後,才發現這又是一個新的世界。我睡着的時候就可以幫我下載電影,然後自動關機。這在以前一定是高大上,到後來才發覺不過是腳本的妙用罷了。我在目前覺着有幾點十分重要,需要着重說明的,不包含在這篇聊天範圍內的,就是,代碼要保存好。面向對象調用類頭花時要記得思路,然後保存代碼。永遠永遠看官方文檔是最好的。英文?別搞笑了。我用linux,現在有道都出linux了。雖然啓動有點慢。。。但屏幕取詞什麼的該有的都有了。這當然只能是忠告。因爲按照我的德行,當初死活不聽別人的忠告,忠告,也只能是忠告了。唉。寫軟件裏面的也不乏異類。他們寫代碼完全上升到了哲學的高度。他們對編程語言甚至稱之爲實現範式。關鍵是人一開始就這樣指導自己的編程了。我不知道這對於他們度過數據結構,算法那段枯燥期有沒有幫助,但他們的視野肯定不會太差。寫出來的代碼是有靈魂的。不像我,一開始只是把別人給的代碼敲了一邊,到現在也只是學會了別人的風格,還差的遠呢。有的人真的是廢棄忘食的寫了。當然我聽到的大多是10年之前的例子。時間是很重要的參考條件。
怎麼說呢?編寫那些底層的代碼真的不難。我大大小小也算見過豬跑的人了。對於一些底層的問題,我會向一些立志本科寫操作系統的人建的QQ羣提問。如果你沒進,推薦可以搜一下進1個,對你是很有幫助的。我就是問了很多問題啊。
其實OS就是管理你硬件的。硬件什麼的也是有API的。這是硬件廠商本身的進化。所以他給你提供的API操作系統的人肯定就要默默的搞了。在這個API基礎上封裝一個系統的API。比如,print,如果是OS的,就是printk。最後一個k是kernal內核的意思。你說,這又什麼難的?大家不要小看這個函數,OS人必須保證別人掉這個函數是沒問題的。
接着就是開發一下常用的軟件了。比如shell。ls,pwd。之類的。而且他們需要遵循一個約定,GNU的好像,是一個開發操作系統所遵循的標準,雖然是參考性的,但還是很多開發OS的人遵守了。不爲別的,就爲標準。硬件這樣做了,軟件也這樣做了,大家才能各自幹好自己的事。我見過挑戰標準最成功的例子就是微軟,到最後自己成了標準。牛逼。
然後給別人提供進入你係統的內存地址。也就是系統調用。封裝一下,成爲API。供開發者開發。就是這了。
所以你寫的#include <stdio.h>其實不就是系統有這個庫嘛?或者是gcc有。反正肯定是有對應函數實現的,至於到底這個函數已經變成了二進制文件還是其他的,我沒研究過。不過結合我使用這麼長時間linux來看,肯定是stdio.h對應函數的事先早已變爲二進制。反正糾結個這也沒啥意思。
這就是這啊。至於怎麼獲取你的音箱,鼠標,甚至遊戲手柄,在linux下就一個設備文件的事兒。別人都抽象好文件了,會文件讀寫不就會操作了?
當然你說爲什麼抽象稱文件?他們怎麼做到的。很簡單,就是OS開發者不斷的寫結構體,不斷的寫,不斷的抽象,恩,就成了。
你有興趣可以看一下維護可以說是這個世界上最大C項目的人–linus,他最常用的軟件。emmm。我不敢說現在,我覺得過去他一定經常用gdb作爲調試工具。是的,就是那個帶超級多參數的CLI界面的工具。人家用的。linus還是對很多GNU的東西保持好感的,比如gcc。他可沒有自己去搞套gcc啊。
我所說的真的是事實啊。因爲我加入的OS羣,看源碼的化,會發現很多OS相關的概念,進程,等都是代碼裏的數據結構啊。然後就是相關算法。
啊。。。
好吧。
就是這樣了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章