那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

cat命令的源碼進化史

Linux愛好者 ? 來源:lq ? 2019-02-04 15:01 ? 次閱讀

有一次,我跟我的親戚有一場爭論,是關于讀一個計算機科學的學位是否值得。當時是我在大學里面臨是否選擇計算機科學專業的時候。我姑姑和一個表哥認為我不該選。他們覺得會編程當然是個既有用又合算的事情,但是他們也堅信,計算機科學更新太快了,當下學到的知識會很快被淘汰掉。所以最好是選一門編程的課程,然后主修經濟或者物理這種基本知識一輩子都適用的專業。

我并不相信他們的理論,并且選擇了主修計算機專業(抱歉了姑姑和表哥!)其實不難看出,為什么常人會認為計算機科學,或者軟件工程這樣的專業,每幾年就會更新換代。先是誕生了私人計算機,然后是網絡手機機器學習……科技永遠在變化,那么其潛在的技術原理當然也在變化了。當然,最讓人驚訝的是,這些基礎技術原理,其實基本沒變。我相信大部分人要是知道他們計算機中重要軟件到底有多老,肯定會震驚。我并不是說軟件的表面,畢竟我自己用的最多的火狐瀏覽器,兩周前才更新過。但是如果你打開幫助手冊查看grep之類的工具,你會發現它的上一次更新還是在 2010 年(至少 Mac 系統是這樣)。grep的初代誕生于 1974 年,那時候的計算機時代好比侏羅紀。現如今,人們(以及程序)在工作中仍然要依賴 grep 做很多事情。

我姑姑和表哥把計算機科技想象成一系列沙灘上的城堡,漲潮時潮水抹去舊的城堡,更加華麗的新城堡又會被建成。其實在現實中的很多領域,我們都是不斷地在現有的程序基礎上進行迭代。我們也許會時不時的修改這些程序來避免軟件崩潰,但是除此之外這些程序不需要額外的維護。grep是一個簡單的程序,它所解決的問題現在也有意義,所以它至今還存在。很多應用程序的編寫都起始于一個很高的角度,就像是在金字塔頂端的基礎上構建,而金字塔本身是由曾經解決問題的答案所建成的。現在看來很陳舊的,三四十年前的想法與概念,在很多時候都融入到了你現在計算機上安裝了的應用程序里。

我想仔細研究一個這樣的老程序,看看它從誕生到現在到底被修改了多少次,這肯定很有趣。我想用cat這個最簡單的 Unix 工具來作為例子。Ken Thompson 在 1969 年開發了初代cat。如果我跟別人說我計算機里有個 1969 年的程序,這準確嗎?cat在這幾十年里到底經歷了幾次迭代?我們計算機里的程序到底有多古老?

幸好有這個代碼倉庫,我們可以清晰地了解到,從 1969 年以來,cat是如何進化的。我接下來會主要聚焦于我自己 Macbook 上cat程序的歷史實現方式。你會看到,cat歷史從最初的 Unix 版本,到現在的 Mac 版本,這個程序被重寫了比你預想的還要多的次數,但是最終它所實現的功能幾乎跟五十年前一模一樣。

Unix實驗版本

1969 年,Ken Thompson 和 Dennis Ritchie 開始在 PDP 7 上開發 Unix。這是在 C 語言出現之前,所以早期的 Unix 程序都是用 PDP 7 上用匯編語言開發的。他們使用了專門針對于 Unix 的匯編版本,因為 Ken Thompson 開發了自己的匯編編譯器,他在 PDP 7 出廠商DEC 提供的編譯器基礎上添加了新的功能。Thompson 的改進文檔在初始Unix 編程手冊中有收錄,在as編譯器條目下面。

cat的初代實現使用了 PDP 7 匯編語言。我有添加一些注釋來解釋每行命令,但是除非你明白 Thompson 編寫匯編編譯器的一些擴展,不然這個程序還是很難理解。這里有兩個重要的點。第一,字符;可以被用于分隔同一行的聲明語句。根據 sys 指令的描述,;通常被用于在同一行使用系統調用參數。第二,Thompson 添加了數字 0-9 用于支持“暫存標記”。這些標記可以被整個程序重用,這就像 Unix 編程手冊所描述的,“對于程序員思維和匯編語言字符空間的縮減優化”。從手冊中,你可以使用nf來表示下一個標記n,用nb來表示上一個標記n。舉個例子,如果你有個標記為1:的代碼塊,你可以從相距很遠的下方代碼中使用jmp 1b來往上跳回標記代碼。(但是你不能往下跳到標記代碼,除非你使用jmp 1f。)

關于初代cat最有意思的是,它包含了兩個我們熟知的名字,分別是一個標記為是一個標記為getc,和一個標記為putc的代碼塊,這表示這倆名字要比標準 C 語言庫都要歷史久遠。初代cat實際上包含了這兩個方法的實現。這樣的實現方式使得輸入字符可以被寫入緩沖區,也就是說,讀和寫不需要以單個字符為單位完成。

初代cat并沒有存在很久。Ken Thompson 和 Dennis Ritchie 成功勸說了貝爾實驗室幫他們購入了一臺 PDP11,以便于他們對 Unix 系統進行擴展與提高。PDP 11 使用的是一種不同的指令集,因此他們不得不重寫cat。對于第二代cat代碼我也加了注釋。第二代使用了針對于新指令集的新版匯編助記符,也利用了 PDP 11中不同的地址模式。(那些源代碼中的括號和$符號,是被用來指代不同的地址模式的。)但是cat第二代中也同樣使用了初代中的;和暫存標記,這些功能一定是在 PDP 11 中移植as時被保留了下來。

cat的第二代源代碼遠比初代要簡潔很多。第二代也更加的”Unix-y”,因為它不再需要一串文件名作為命令參數,而是與如今的cat一樣,在沒有參數的情況下,從stdin讀取輸入。對于二代cat,你也可以使用參數來指定從stdin讀取輸入數據。

1973 年,為了準備發布第四版 Unix,很大一部分 Unix 系統都用 C 語言重寫了一遍。但是 C 語言版本的cat在 Unix 發布后過了一段時間才出現。第一個 C 語言版本的cat只出現在第七版 Unix 系統中。這個實現方法非常值得一讀,因為它非常簡單明了。與其他版本比較,這一版最能作為代表cat的 K&R C 語言教育演示版本。這段程序的核心就是如下兩行:

while((c = getc(fi)) != EOF)

putchar(c);

當然還有更多的代碼,但是除了這兩行以外,剩下的邏輯更多的是在確保用戶不會同時讀寫同一個文件。另一個有意思的地方是,這個版本的 cat 只認得一個標記,-u。這個 -u 標記可以被用于關閉輸入輸出緩沖區,不然 cat 會默認緩存 512 字節。

伯克利軟件套件/BSD

在第七版之后,Unix 催生了各種各樣的衍生品。MacOS 是基于 Darwin 系統的,而 Darwin 是基于伯克利軟件套件(BSD),因此 BSD 是我們最感興趣的 Unix 分支。BSD 最初是作為Unix附加功能的軟件合集,但是它最終成為了一個完整的操作系統。BSD似乎一直在用cat的初代版本,一直到第四版 BSD 發布為止。第四版 BSD 也就是 4BSD,它添加了對于新標記的支持。4BSD 版本的 cat 能明顯的看出是初代的衍生品,不過它添加了一些新的函數用來實現用新標記觸發的功能。4BSD 文件系統的命名方法是基于 fflg 這個變量的,fflg 用于標記指令的輸入是從文件,還是 stdin 讀取的。繼 fflg 之后,nflg、bflg、vflg、sflg、eflg 和 tflg 也被用于記錄程序中的標記是否被用到。這些命令行標記是 cat 添加的最后一批標記;如今至少在 Mac 系統中的 cat 命令行手冊有列出來這些標記。4BSD 是在 1980 年發布的,所以這一系列的標記有 38 歲了。

cat 最后一次被重寫是為了 BSD Net/2,這主要是為了避免軟件許可證問題,因此所有 AT&T Unix 衍生代碼都被替換為了新代碼。BSD Net/2 在 1991 年發布。最后一次重寫是由 Kevin Fall 完成的,Kevin Fall 于 1988 年畢業于伯克利,之后他花了一年的時間在計算機系統研究院(CSRG)工作了一年。Fall 告訴我,用 AT&T 代碼寫的 Unix 工具集列表被掛在了 CSRG 的一面墻上,員工們被告知可以選擇感興趣的工具重寫。Fall 選擇了 cat 和 mknod。在如今 Mac 系統的默認 cat 版本中,Fall 的名字排在開發者名單前列。他所編寫的 cat,雖然是個很簡單的程序,但是直到今年還有數百萬的用戶在使用。

Fall 所寫的 cat 源代碼比我們之前看到的版本要長許多。除了支持 -? 幫助標記,這一版并沒有添加新的功能。理論上來說,這一版代碼與 4BSD 版本非常相似。代碼之所以長,是因為 Fall 分開了“舊版”和“新版”的邏輯。“舊版”是典型的 cat;它一個字符一個字符的輸出。“新版”的 cat 包括了 4BSD 命令行選項。這樣的分割很有道理,但是使得代碼在第一眼看上去比實際復雜很多。代碼的最后有個華麗的錯誤處理方程,這也增加了代碼長度。

MacOS

2001 年,蘋果公司發布了 Mac OS X 系統。這次發布對于蘋果公司來說非常重要,因為他們花了很多年,走了不少彎路,為了研發能夠取代存在了很多年的舊版 Mac OS 系統。蘋果公司內部曾經有過兩次研發新系統的嘗試,但是最終都沒能成功;后來,蘋果收購了史蒂夫·喬布斯的公司 NeXT,他們公司開發了一款名為 NeXTSTEP 的,基于面向對象編程框架的操作系統。蘋果決定使用 NeXTSTEP 作為Mac OS X 的基礎。NeXTSTEP 的一部分是基于 BSD 開發的,所以用 NeXTSTEP 作為 Mac OS X 的基礎,同時也給蘋果系統帶來了 BSD 代碼風格。

新發布的第一版 Mac OS X中包含了來自 NetBSD 項目的 cat 代碼實現。NetBSD 項目如今仍在不斷開發中,它最初是來自 386BSD 的分支。而 386BSD 是直接基于 BSD Net/2 的。所以 Mac OS X 上的 cat 就是 Kevin Fall 所寫的 cat。唯一變化的是,Kevin Fall 寫的錯誤處理函數 err() 被替換成了 err.h 中的 err()。err.h 是 BSD 基于 C 語言標準庫的擴展。

NetBSD 版本的 cat 在不久之后被 FreeBSD 版本取代了。根據維基百科,蘋果從 Mac OS X 10.3 (Panther)開始,使用 FreeBSD 來取代 NetBSD。但是 Mac OS X 版本的 cat,根據蘋果的開軟發布記錄,一直到 2007 年發布 Mac OS X 10.5 (Leopard) 才被取代。蘋果為了發布 Leopard 而引進的 FreeBSD 的實現版本一直被沿用到了今天。從 2007 一直到 2018 年,這一版沒有做過任何升級或者改變。

所以說 Mac OS 中的 cat 是古老的。實際上 cat 的出現,比 2007 年的正式發布時間還早兩年。2005 年的改動,在 FreeBSD 的Github 鏡像中可以看到,是 cat 被移植到 Mac OS X 之前 FreeBSD 版的最后一次更新。所以 Mac OS X 中 cat 實際上有 13 年的歷史了,它并沒有與 FreeBSD 的 cat 進行同步更新。這里有過一個辯論,軟件到底被改動過幾次才算是一個新的軟件呢;就 cat 這個個例來看,它的源代碼從 2005 年開始就完全沒有改變過了。

如今 Mac OS 系統中的 cat 與 Fall 在 1991 年為 BSD Net/2 所寫的版本并沒有太多不同。最大的不同是添加了一個新的函數用來支持 Unix 上的套接字。一個 FreeBSD 的開發者認為 Fall 所寫的 raw_args() 函數應該與 cook_args() 合并為一個函數 scanfiles()。除此之外,最核心的部分還是 Fall 的代碼。

我問過 Fall,有幾百萬蘋果用戶在使用你所寫的 cat,還有很多程序直接或者間接依賴 cat,對此你有什么感想。如今已經是顧問兼最新版 TCP/IP 協議合作者的 Fall 表示,人們對他開發 cat 的經歷如此的感興趣,讓他覺得非常驚訝。Fall 曾經在計算領域工作過很久,并且有過很多有影響力的項目經歷。但是似乎人們對于他在 1989 年開發 cat 的那六個月更加感興趣。

百歲程序

縱觀歷史上各種偉大的發明,計算機的歷史并沒有很久。我們仍然在使用有著百年歷史的照片和膠卷。但是計算機軟件是另外一個類別——目前仍屬于高新科技。至少現在的軟件是這樣。隨著計算機產業日漸成熟,我們會不會有一天發現,我們在使用有著百年歷史的軟件呢?

計算機硬件最終也會更新換代,現在的軟件想必是沒法跑在一個世紀以后的硬件上。也許高級語言設計的進步,也會導致在將來沒有人會使用 C 語言,而 cat 也會被其他的語言重寫。(不過 C 語言已經存在了五十年了,估計短期內也不會被取代。)不考慮以上這些的話,不如我們就一直用現在這版 cat 吧。

我認為,cat 的歷史告訴我們,在計算機科學領域有一些思想是非常耐用的。實際上,對于 cat,它的代碼和思想都是很多年前出現的。要說我計算機中的cat是1969年的其實并不準確。但如果說我計算機中的 cat 是 1989 年 Fall 開發的,就準確多了。很多軟件都很古老。也許我們不能單純的認為計算機科學和軟件開發是不斷更新換代的領域。我們所開發的系統都是基于歷史基礎的。在某些時候,我們在開發新代碼的同時,也需要去花時間去理解和維護歷史代碼。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • UNIX
    +關注

    關注

    0

    文章

    296

    瀏覽量

    41577
  • 源碼
    +關注

    關注

    8

    文章

    652

    瀏覽量

    29452
  • cat
    cat
    +關注

    關注

    1

    文章

    75

    瀏覽量

    21334

原文標題:cat 命令的源碼進化史

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    [圖文] 蘋果iOS系統平臺進化史回顧

    在過去的幾年之中,iOS發生了巨大的改變。iOS已經從一款簡單的觸控操作系統轉變為強大的移動操作系統。明天蘋果將發布iOS 6,現在讓我們一起回顧一下iOS進化的過程吧!
    發表于 09-19 10:13 ?3249次閱讀

    自動駕駛V2X技術中DSRC和C-V2X技術的進化史

    近幾年,V2X技術的發展不能說是不快,至少現在已經能夠在路面上看到量產的V2X技術了。本文主要介紹了V2X中,DSRC和C-V2X兩種技術的進化史
    的頭像 發表于 02-24 18:45 ?2.1w次閱讀
    自動駕駛V2X技術中DSRC和C-V2X技術的<b class='flag-5'>進化史</b>

    #SpaceX 星艦進化史

    航空航天行業芯事時事熱點
    rainflute
    發布于 :2022年01月11日 18:03:40

    什么是版本控制?git代碼為什么需要版本控制

    系列之嵌入式開發-git代碼管理第一章 [嵌入式開發-git代碼管理之git的安裝]文章目錄系列之嵌入式開發-git代碼管理前言一、為什么需要版本控制?1.什么是版本控制2.版本控制進化史3.我們如何使用二、1.[git的下載和安裝]本地建立git庫2.
    發表于 12-21 07:25

    iPhone主板芯片及整機配置的進化史

    iPhone主板芯片及整機配置的進化史。iPhone主板芯片的進化史,很詳細的配置清單升級過程,很專業很詳細。
    發表于 08-24 08:03 ?1244次閱讀

    平板電腦進化史

    據國外媒體報道,雖然當今社會處于平板電腦和應用程序發明創新大爆炸的時代,但是這些創新和發明也不是一蹴而就的。實際上,早在上世紀70年代就有很多人嘗試著開發一臺類似現在
    發表于 10-16 16:55 ?1.3w次閱讀

    海信激光電視發展歷程回顧

    從CRT電視、液晶平板電視再到激光電視,中國電視產業和技術的“進化史”,也正是中國40年的一部變遷
    發表于 12-17 16:29 ?4312次閱讀

    OPPOFindX和iPhoneX哪個最好

    如果縱觀整個的發展歷程,那么手機屏幕的進化史幾乎等同于手機的進化史。從黑白液晶到彩色,從電阻屏到多點觸控。技術在不斷發展的同時,手機屏幕的尺寸也一直隨著人們的需要而不斷增加。如何在有限的面積上放入更多的顯示區域成了各個品牌亟待解決的問題。
    的頭像 發表于 01-10 10:32 ?6596次閱讀

    即時聊天進化史

    即時聊天是指通過特定軟件來和網絡上的其他同類玩家就某些共同感興趣的話題進行討論,常用的即時聊天軟件。
    的頭像 發表于 01-23 14:54 ?1w次閱讀

    從“人機角力”到“人機融合”,流水線的百年進化史

    導讀 在流水線生產的百年進化史中,最大的改變是人機角力。人機角力的上半場核心是將人當機器用,還是將機器當人用,下半場核心是人機融合。多年以來,中國制造業持續推進產業升級以尋求競爭力提升,而具體做法
    的頭像 發表于 02-28 11:43 ?5030次閱讀

    三星Note系列S-Pen進化史

    系列,如果用一句話來概括,我想“Note之所以是Note,是因為有S Pen”這句話應該最能體現三星與其它產品的區別。作為每一代Note系列的標配,S Pen已經成了三星Note系列的精髓。從某種意義上,S Pen甚至成為了三星Note系列的身份證。因此,我們今天就來回顧這些年S-Pen的進化史
    的頭像 發表于 03-29 11:12 ?4031次閱讀

    淺談LED車燈受歡迎的六大原因

    汽車進化史也是一部車燈進化史,從早期的鹵素燈,到后來亮度超強的氙氣燈,再到如今的LED燈大行其道。
    的頭像 發表于 03-16 13:39 ?4063次閱讀

    Linux cat命令詳解

    `cat`命令是Linux中最常用的命令之一,`cat`命令的名稱來自于con**cat**en
    的頭像 發表于 12-14 17:24 ?1w次閱讀

    大學寢室門的進化史:RFID的寢室門禁系統

    電子發燒友網站提供《大學寢室門的進化史:RFID的寢室門禁系統.rar》資料免費下載
    發表于 11-08 09:19 ?7次下載
    大學寢室門的<b class='flag-5'>進化史</b>:RFID的寢室門禁系統

    斧工智能電批:淺談螺絲刀到智能電批的進化史

    斧工智能電批:淺談螺絲刀到智能電批的進化史 提起螺絲刀,率先出現在我們腦海中的是日常生活中比較常見的手動螺絲刀。但在當今這個飛速發展的時代,科技革新的浪潮勢不可擋,不斷推動著各行各業向前發展。無論是
    的頭像 發表于 01-11 11:39 ?647次閱讀
    大发888娱乐场官方下载| 公安县| 百家乐官网顶| 百家乐的桌布| 百家乐官网视频游戏盗号| 永利高百家乐会员| 自贡百家乐赌场| 巨野县| 蓝盾百家乐代理打| 百家乐官网二游戏机| 雅加达百家乐的玩法技巧和规则| 澳门百家乐官网实战| 威尼斯人娱乐城信誉最好| 哪里有百家乐官网游戏下载| 菲律宾太阳城网| 真人百家乐试玩游戏| 澳门百家乐官网单注下限| 娱乐城注册送18体验金| 百家乐怎么玩了| 澳门百家乐官网赌场网址| 申博太阳城官方网站| 優博百家乐官网客服| 元游棋牌下载| 摩纳哥百家乐的玩法技巧和规则| 亚洲百家乐官网博彩的玩法技巧和规则| 网上娱乐城开户| 最好的百家乐娱乐场| 伯爵百家乐官网娱乐场| 六合彩综合资料| 大三巴百家乐的玩法技巧和规则| 百家乐斗牛稳赚| 网上百家乐官网真钱游戏| 云顶国际网| 威尼斯人娱乐城网络博彩| 海王星百家乐技巧| 澳门百家乐下注最低| 百家乐官网游戏开发软件| 澳门百家乐官网职业赌客| bet365网站地址器| 娱乐场游戏| 淘金盈娱乐城|