顯示廣告
隱藏 ✕
※ 本文為 MindOcean 轉寄自 ptt.cc 更新時間: 2020-09-07 09:44:57
看板 Gossiping
作者 jserv (松鼠)
標題 Re: [問卦] C 是怎麼被開發出來的?
時間 Mon Sep  7 05:15:58 2020


※ 引述《zuso (  )》之銘言:
: 大A賀,我是廢問大師

恁久好無?(客語,音標: anˋgiuˋhoˋmoˇ)
我是廢文大學的教師

以下展開雙「廢」的對談。

: 大家都知道很多程式的語言是C開發出來的,那大家也知道C語言是B語言開發出來的,那大
: 家也知道B語言是A語言開發出來的
: 那意思是說A語言是用機器語開發出來的囉?就是用打洞卡010101那樣戳出來的
: 請問大概是這樣子吧?

回覆 C 語言的由來之前,我們先來討論文化演化論。英國人類學之父泰羅 (Edward
Burnett Tylor) 爵士 [1] 提出「文化演化論」,指一種表示時間形式的過程,持續
而且通常會形成文化的累積與進步。在 1881 年出版的《人類學》(Anthropology)
一書中,他認為似乎在任何地方都可發現精緻的藝術品、深奧的知識及複雜的典章
制度等,都是從較早、較簡單、且較粗淺的階段逐漸發展或進化而來。文化演化論
認為文化的進化有下列兩種模式:


 1. 單一路線的進化:把人類文化視作單一的整體,即將整體的任何部分作為一個單位
    或體系而追溯其進化的歷程
 2. 多條路線的進化:把人類文化看作人為領域的範圍,如區域文化或民族文化,
    從而闡明某些文化及促進其進化的各種因素的交互作用,尋出其進化路線

儘管電腦程式語言的歷史相對很短 [2],但若用上述文化演化論的觀點來解析程式
語言發展仍相當貼切。


符合現代高階語言特性第一個程式語言是 Plankalkul [3],後者是德國工程師暨電子
計算機先驅 Konrad Zuse (以設計出 Z3 可程式化的電子計算機而聞名,曾為了融資
而在二戰期間和納粹德國合作) 在 1943 到 1945 年間所發展,比 1954 年開始發展
的 FORTRAN 程式語言早十年,但 Plankalkul 的設計直到 1972 年才被正式發表 (多
少與納粹德國的處境有關),而到第一個用於 Plankalkul 語言的編譯器著手實作,

已是 1975 年的事情。因此,如果談論完整開發並能運作的高階程式語言,FORTRAN
最古老的資格仍無人夠撼動。顯然 Plankalkul 幾乎掩沒於時代的長河,但具備了

數值指定 (assignment)、子程式 (subroutine)、條件判斷 (conditional)、浮點數

運算、陣列 (array)、階層方式結構、斷言 (assertion)、例外處理等等特徵,甚至
FORTRAN 還不見得全部擁有。FORTRAN 和 Plankalkul 不存在相互影響的關係,但
光看設計概念的話,卻可說趨同演化。用文化演化論的說法,這是多條路線的進化。

C 語言至今將近有 50 年歷史,但以程式語言演化的歷程來說,仍算是較晚才提出,
要論資歷,絕對要談 LGOL 60 [4]。ALGOL 是 Algorithmic Language (演算法所用的

語言) 的縮寫,提出巢狀 (nested) 結構和一系列程式流程控制,今日我們熟知的
if-else 語法,就在 ALGOL 60 出現。ALGOL 60 和 COBOL 程式語言並列史上最早
工業標準化的程式語言。


1950 年代末期,為滿足人們駕馭電腦所需,多種程式語言被提出,但這些程式語言
往往圍繞在 UNIVAC 電腦或 IBM 700 系列大型主機上,要跨越機器間交換或分享
程式 (注意,當時尚未有 "software" 的概念) 相當困難,無形中限制工業發展。

為此,1957 年 5 月 10 日國際電腦協會 (Association for Computing Machinery;

ACM) 受理「研究與開發適用於電腦主機無關的科學應用程式語言」的要求,並指派
隔年邀請相關學者專家在瑞士蘇黎世舉辦首度程式語言發展會議,ALGOL 是這背景的
產物,最初的版本叫做 ALGOL 58,源自於 1958 年 12 月的 ALGOL 報告,這啟發

頗多學術和工業圈的程式語言發展,包含廣泛用於美國軍事系統的 JOVIAL [5],後者
廣泛用於 B-52 同溫層堡壘轟炸機、F-15 鷹式戰鬥機、F-16 戰隼戰鬥機等等。

值得一提的是,電腦科學系學生接觸到的 Backus normal form (BNF) [6] 就是
John Backus 為了ALGOL 58 特別發展,後來 BNF 在 Peter Naur 教授的改善後,
成為 Backus-Naur form,後者的命名,來自知名電腦科學家 Donald Knuth 教授的
建議。


ALGOL 60 是歐洲和美國境內科學家的共同創作,在 1960 年 1 月 11 日到 16 日之
間,以下出席者:

* 歐洲:
  Friedrich L. Bauer (慕尼黑工業大學,在北大西洋公約組織 [NATO] 1967 年的
  會議上,正式探討 'software engineering' 一詞,界定今日我們所見軟體工程的
  議題), Peter Naur, Heinz Rutishauser (瑞士數學家,程式語言常見的 for 迴圈
  就是他提出的,最初以德語介詞 fur,後來改寫為英語 for), Klaus Samelson (在
  ALGOL 58/60 扮演關鍵角色,程式的區塊結構和透過堆疊來處理執行資訊的手法,

  就由他提出), Bernard Vauquois, Adriaan van Wijngaarden (Edsger W. Dijkstra

  的博士班指導教授,兩人並肩為荷蘭首款電腦 ARRA 投入軟體開發。W-grammar 也是
  Wijngaarden 提出), Michael Woodger (英國國家物理實驗室 [NPL] 的電腦科學家,
  曾和 Alan Turing 合作開發 Pilot ACE 電腦,也是 Ada 程式語言共同設計者);

* 美國:
  John W. Backus, Julien Green, Charles Katz (和 Grace Hopper 准將合作在
  UNIVAC 電腦上發展程式語言), John McCarthy (人工智慧領域的開創者,在 1958
  年提出 LISP 程式語言,和 Dennis Ritchie 同樣在 2011 年過世), Alan J. Perlis
  (ACM 前主席,對編譯器設計有重大影響), Joseph Henry Wegstein (投入 COBOL
  程式語言的發展)

這華麗的出席者清單中,許多人是 Turing Award (圖靈獎,自 1966 年設立) 得主,
源自 ALGOL 的創新尚有 1966 年 Niklaus Wirth 與 C. A. R. Hoare 以 ALGOL X 為
基礎,提出改善的 ALGOL W,而 Niklaus Wirth 的研究成果最後導至他在 1970 年
創造 Pascal 程式語言。

經典的 Hello World 程式在 ALGOL 60 長得像這樣:

    BEGIN
      FILE F(KIND=REMOTE);
      WRITE(F, <"HELLO WORLD!">);
    END.

可以留意到,ALGOL 60 在語言層面沒有內建的 I/O 處理機制,所以需要由編譯器和
執行環境提供對應的 I/O 處理常式,這意味著沒有放諸四海皆準的 Hello World 通用
程式。有沒有發現這樣的限制和 C 語言很像呢?

除了 ALGOL 60,直接影響 C 語言的程式語言是 BCPL,後者是劍橋大學的 Martin
Richards 於 1967 年訪問麻省理工學院時期所設計。BCPL 程式語言的提出,是回應
同樣是劍橋大學發展的 CPL (最初的意思是 Cambridge Programming Language,後來
由於和倫敦大學合作,更名為 "Combined Programming Language",也被戲稱為

"Cambridge Plus London")。首篇提及 CPL 的論文發表於 1963 年,其設計接近硬體
,程式設計的門檻高,而且不容易實作其編譯器,拖到 1970 年才有首個 CPL 的編譯
器。


BCPL 對 CPL 做了簡化,這個 "B" 字母就是 "Basic" 的意思,由於 BCPL 語言設計的
精簡,所以其編譯器可在 16 KB 的空間實作出來,也是最早 Hello World 程式出現的
程式語言 [7]。最初的 BCPL 編譯器被 Rudd Canaday 博士 (貢獻早期 UNIX 檔案系統

的實作,在 Bell Labs 退休後,創辦三間公司,而且在 2015 年加入矽谷的新創公司
Entefy [8],還用 Ruby on Rails 撰寫程式,真是活到老、學到老的典範!) 和 Bell
Labs 的同事移植到 Multics 作業系統和 GE-635 主機中的 GECOS 作業系統 [9]

GE-635 是 1960 年代奇異電氣 (General Electric; GE) 發展的 GE-600 系列大型
主機的一項產品 [10],1960 年代,在美蘇冷戰的時空背景,作為 Project MAC [13]
的執行者, AT&T, GE 及 MIT 合作開發 Multics 作業系統。在 1960 年代初期,MIT
設計的 CTSS (Compatible Time-Sharing System) 已相當成功,因此 1964 年啟動的
Multics 作業系統專案大幅延伸 CTSS 的成果,Multics 也採用 GE-635 大型主機。

UNIX 作業系統汲取 Multics 的養分,並且拋開 Multics 眾多笨重且難以在當時中
低階大型主機上實作的特徵,諸如動態連結和資料庫 (史上首個商業關聯性資料庫就

在 Multics 作業系統上開發)。終身只在 Bell Labs 工作的 Dennis Ritchie 在 1972

年到 1973 年間發展 C 語言及其編譯器,並在 1974 年發表經典論文 "The UNIX
time-sharing system" [12],彼時 UNIX 作業系統已用 C 語言重寫,並在 DEC PDP-11
硬體上驗證。

Bell Labs 的 Dennis Ritchie, Ken Thompson, Rudd Canaday 等人都在 1960 年代
涉入 Multics 專案的開發工作,1969 年 2 月 Bell Labs 因為不滿 Multics 發展
牛步化,決定退出和 MIT 及 GE 的合作。我們不難發現,原來開發 UNIX 和 C 語言
的這票 Bell Labs 工程人員不僅熟悉 Multics,也掌握 BCPL 程式語言。


BCPL 是首個引入 bracket (即 { } 和 [ ] 一類的表示法) 的程式語言,還提供單行
註解 (即 // ),BCPL 的 Hello World 程式長得像以下: [14]

    get "streams.d"
    external
    [
    Ws
    ]

    let Main() be
    [
    Ws("Hello World!*N")
    ]

其中開頭的 get "streams.d" 就如同 C 語言的 #include,而 external [Ws]
宣告外部函式,這裡的 Ws 是 write string 的意思,再往下就可見到熟悉的 Main(),
裡頭的 *N 是 C 語言的 '\n',即換行符號。

BCPL 在 1967 年發表,而 Ken Thompson 和 Dennis Ritchie 在 1969 年又將 BCPL
簡化,稱為 B 語言,確保得以運作在 PDP-7 [15]。BCPL, B 和 C 語言都可歸類於
ALGOL 60 風格的程式語言,格外適合系統軟體的開發,短小精悍且易於撰寫對應的
編譯器,值得注意的是,BCPL 的若干語法和語言處理機制比 B 語言或 C 語言來得
嚴謹,所以不用仰賴分號 (;) 來區分個別敘述、資料聲明,和副程式。


從上面的 BCPL 程式可見,BCPL 使用 global vector 機制,讓個別編譯的單元間,
得以存取到副程式和資料,程式設計者需要自行計算偏移量 (offset),也就是把重新
定位 (relocation) 的責任交給程式設計師,而後期的 B 語言和 C 語言則透過連結器
(linker),避開 BCPL 的 global vector 使用的不便。


"The Development of the C Language" [21] 一文詳盡地介紹 BCPL -> B -> New B
-> C 程式語言間的演化和考量點,強烈建議閱讀。

Unix 在 PDP-7 上首次運行後,1969 年 Doug McIlroy 在這之上發展第一個編譯器
定義工具 TMG,得以開發 top-down, recursive-descent 風格的編譯器。同樣在 Bell
Labs 的 Doug McIlroy 和 Robert (Bob) Morris 使用 TMG,為 Multics 開發早期的
PL/I 編譯器。Ken Thompson 則開始思考,既然有了 TMG,那麼 UNIX 上應該要有專門
開發系統軟體的程式語言,於是他著手簡化 BCPL 而開發出 B 語言,並搭配 TMG 工具
來產生早期的編譯器。


Ken Thompson 嘗試用 B 語言重寫 B 語言編譯器 (為了 self-hosting [17]),PDP-7
機器上的 B 語言編譯器不會產生機械碼,而是透過一個簡單的 stack-based 虛擬機器
來執行轉換過的 opcode,又因為 PDP-7 硬體太慢又有嚴苛的空間限制,所以除了 B
語言執行環境外,只有很少的程式能用 B 語言開發。後來 Dennis Ritchie 出手,
改寫 B 語言編譯器,允許輸出 GE-635 機械碼,也就是成為真正能用的編譯器,這
也是 B 語言編譯器支援 GCOS 作業系統的過程。


在 1970 年,這群 Bell Labs 的高手終於獲得 DEC PDP-11 主機,這個 16-bit
處理器對於日後 UNIX 發展相當重要:他們遇到硬體相容性的議題,萌生再次發展新
的程式語言的念頭。原本 BCPL 和 B 語言都是 word-addressed,即無論處理什麼
資料,都對應到硬體資料匯流排的寬度 (即 word),但在 PDP-11 完全不是這回事,
PDP-11 的設計是 byte 導向,因此 Dennis Ritchie 在 1971 年著手在 B 語言增添
char 型態,並改寫原本不能產生真正機械碼的設計,這樣擴充過的 B 語言被稱為

"New B",簡稱 NB。

對應的 B 程式語言手冊可參照:
* "Users' Reference to B" [18]: 針對 16-bit 的 PDP-11
* "USERS' REFERENCE TO B ON MH-TSS" [19]: 針對 36-bit 的 Honeywell 6000 系列
                                          [20] 大型主機

New B 沒有存在多久,很快就被後續的 C 語言取代,後者重新定義完整的資料類別,
在C 語言之前的 BCPL 和 B 語言都沒有型態 (type) 的觀念,但 C 語言明確規範,
卻又不會因為類別系統太複雜,導致對應的 C 編譯器不容易實作,這樣的設計也反映
到指標的變革。


上述程式語言演化的家族史,是為了破除單一路線發展的迷思,也就是說,不存在
「機械碼 -> A 語言 -> B 語言 -> C 語言」這樣的路線,在 C 語言之前就有好幾
個高階語言,甚至比 C 語言高階許多,這些程式語言可用來打造各式工具,如組譯
器 (而且要考慮交叉組譯的需求,也就是 cross-assembler,如上討論)、原始碼對
原始碼的轉換器 (pre-processor 就是一種類型)、連結器 (linker),最後才會是
今日我們普遍認定的編譯器。


至於如何一步一步建構編譯器自身的過程,也就是 self-hosting,值得大書特書,
編譯器專案 shecc - Self-Hosting and Educational C Compiler [22] 示範如何用
尋常的 C 語言編譯器 (針對 x86_64) 產生執行檔,接著產生出支援 Arm 架構的 C
語言編譯器,最終可直接在 Arm 的環境運作並依據輸入的 C 程式去產生原生執行檔
—— 完全不需要其他工具的輔助,這樣逐步建構編譯器自身。


最後,引用 Dennis M. Ritchie 的話來解釋 C 語言的成功:

: C is quirky, flawed, and an enormous success. While accidents of history
: surely helped, it evidently satisfied a need for a system implementation
: language efficient enough to displace assembly language, yet sufficiently
: abstract and fluent to describe algorithms and interactions in a wide
: variety of environments.
(C 語言很彆扭又缺陷重重,卻異常成功。固然有歷史的巧合推波助瀾,但也的確是因
 它能滿足於系統軟體實作的程式語言期待:既有相當的效率來取代組合語言,又可充分
 達到抽象且流暢,能用於描述在多樣環境的演算法。」

在 C 語言之前就存在的「直系」親屬:
* A: ALGOL 60
* B: BCPL, B

就語法來說,C 語言的確長得很「古怪」,不若之前那些程式語言貼近數學表示法或英文
書寫方式,但得益於 C 語言做的許多取捨,可成功地運作在多種不同的硬體環境、支援
多樣的作業系統,從而讓 UNIX (或相容的) 作業系統及 C 語言編譯器的組合,深刻地
影響你我所處的數位世界。


如果你讀到這裡,還對 C 語言和 UNIX 作業系統充滿興致,千萬不要錯過「Linux 核心
設計」課程:
    https://wiki.csie.ncku.edu.tw/linux/schedule
以及
「進階電腦系統理論與實作」課程:
    http://wiki.csie.ncku.edu.tw/sysprog/schedule

這裡有大量線上教材、對 GNU/Linux 和相關實作探討,還有跟你一同學習的小夥伴。

[1] https://en.wikipedia.org/wiki/Edward_Burnett_Tylor
[2] https://en.wikipedia.org/wiki/Timeline_of_programming_languages
[3] https://en.wikipedia.org/wiki/Plankalkül
[4] https://en.wikipedia.org/wiki/ALGOL_60
[5] https://en.wikipedia.org/wiki/JOVIAL
[6] https://en.wikipedia.org/wiki/Backus–Naur_form
[7] https://www.catb.org/jargon/html/B/BCPL.html

 
[8] https://www.prnewswire.com/news-releases/ \
All News Releases Distributed by PR Newswire
[圖]
Current news releases distributed by PR Newswire including multimedia press releases, investor relations and disclosure, and company news. ...

 
    co-inventor-of-unix-dr-rudd-canaday-joins-palo-alto-tech-startup-entefy-300024608.html
[9] https://en.wikipedia.org/wiki/General_Comprehensive_Operating_System
[10] https://en.wikipedia.org/wiki/GE-600_series
[11] DTSS: https://en.wikipedia.org/wiki/Dartmouth_Time_Sharing_System
[12] UNIX: https://dl.acm.org/citation.cfm?id=361061
[13] Project MAC: https://multicians.org/project-mac.html
Project MAC
The history of MIT Project MAC, 1963-2014. ...

 
[14] https://www.righto.com/2016/06/hello-world-in-bcpl-language-on-xerox.html
[15] 重建過的 B 語言編譯器和在 PDP-7 上運作的 UNIX 原始程式碼,可見:
     https://github.com/DoctorWkt/pdp7-unix
GitHub - DoctorWkt/pdp7-unix: A project to resurrect Unix on the PDP-7 from a scan of the original assembly code
[圖]
A project to resurrect Unix on the PDP-7 from a scan of the original assembly code - DoctorWkt/pdp7-unix ...

 
https://github.com/sergev/b-compiler/tree/master/pdp7
b-compiler/pdp7 at master ·  sergev/b-compiler ·  GitHub
[圖]
B language compiler. Contribute to sergev/b-compiler development by creating an account on GitHub. ...

 
[16] TMG: https://multicians.org/tmg.html
TMG
The source of Bob McClure's TMG. ...

 
[17] https://en.wikipedia.org/wiki/Self-hosting
[18] https://www.bell-labs.com/usr/dmr/www/kbman.html
[19] https://www.bell-labs.com/usr/dmr/www/bref.html
[20] https://en.wikipedia.org/wiki/Honeywell_6000_series
[21] https://www.bell-labs.com/usr/dmr/www/chist.html
[22] https://github.com/jserv/shecc
GitHub - jserv/shecc: A self-hosting and educational C compiler
[圖]
A self-hosting and educational C compiler. Contribute to jserv/shecc development by creating an account on GitHub. ...

 

--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.246.163 (臺灣)
※ 文章代碼(AID): #1VLL6KAI (Gossiping)
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1599426964.A.292.html
sx4152: 推...1F 09/07 05:17
gorilla823: 推2F 09/07 05:19
Scathach: 深夜(?)優文3F 09/07 05:20
jserv: @Scathach, 明明就是早起 (?)4F 09/07 05:20
kkkkkktw: jsvr5F 09/07 05:21
alex5262: 推老師的課 學到很多6F 09/07 05:21
www17010: 推7F 09/07 05:25
jserv: @kkkkkktw, UNIX 風格的推文 (笑)8F 09/07 05:26
syk1104: 阿鬼說中文啦QQ9F 09/07 05:27
jserv: @syk1104, 9 月 16 日才鬼門關,現在讓阿鬼好好揮灑10F 09/07 05:28
amovie: 人肉一下  這成大課程教授的花名與這ID關係匪淺11F 09/07 05:28
jia106: 只能推了12F 09/07 05:31
hsu1999a1: 大認真了吧13F 09/07 05:32
he02789222: <(_ _)><(_ _)><(_ _)>14F 09/07 05:32
jserv: @hsu1999a1, 我只是上來打課程廣告,請不要介意15F 09/07 05:34
rickphyman42: 跪推大神16F 09/07 05:34
damody: 詳細17F 09/07 05:35
jason1596t: 先推假裝看得懂18F 09/07 05:37
woaifafewen: 又釣到了19F 09/07 05:38
kis28519: 推20F 09/07 05:39
qqwer0309: 跪21F 09/07 05:41
jimmy0524: 受益匪淺22F 09/07 05:43
cliff2102: 請收下我的膝蓋23F 09/07 05:51
rex44391: 推24F 09/07 05:52
stin: 推25F 09/07 05:52
asdkmm5050: 拜大神,都在fb看你的文章26F 09/07 05:54
Xaymaca: 習近平:    給我用中文寫機器看的懂的程式27F 09/07 05:57
donkilu: 推jserv大28F 09/07 05:59
mickey94378: 推29F 09/07 05:59
jserv: @asdkmm5050, 感謝捧場,這時我該說「反正我很閒」30F 09/07 06:00
zzyyxx77: 有什麼地方可以學sql31F 09/07 06:01
zzyyxx77: 突然公作要用到 超級大外行
olctw: [問卦] C語言離C罩杯有多遠33F 09/07 06:07
lobotime: 優質文必推34F 09/07 06:09
angerD: 早安35F 09/07 06:10
wayne841227: 推36F 09/07 06:18
pemit: 優文必推!37F 09/07 06:19
[圖]
Jim Huang
@jserv
我接觸過 C 語言、C 罩杯、C-class (賓士),此生無憾了
amethystboy: 有趣39F 09/07 06:24
Wangdy: 看不懂啦,教授不要當我40F 09/07 06:25
jserv: @olctw, 課程的 FAQ 中,我一直想加上關於罩杯的討論,但..41F 09/07 06:25
jserv: 似乎是假命題,老婆懷孕後,罩杯自動會升級。問題圓滿回覆
L1ON: 老師好43F 09/07 06:29
chayoung: 推44F 09/07 06:31
jserv: @zzyyxx77, 在家(地方?)就可學 SQL,搭配 SQL Fiddle 練習45F 09/07 06:33
jserv: http://sqlfiddle.com/ # 線上練習 SQL 語法
SQL Fiddle
Application for testing and sharing SQL queries. ...

 
Ricey: 謝謝分享。47F 09/07 06:34
youngglasses: 幹嘛google 剪貼48F 09/07 06:38
POCARI5566: 老師  搶不到課了你還推銷49F 09/07 06:39
bobbyac01: 太早了50F 09/07 06:39
NciscalA: 推51F 09/07 06:40
jserv: @youngglasses, 我只是派發廣告傳單,順便抬槓52F 09/07 06:42
cerberi: 推53F 09/07 06:42
jserv: @POCARI5566, 通常只有第一週教室比較擠,之後就涼爽通風54F 09/07 06:43
rs6000: 推55F 09/07 06:47
sazabik: 推56F 09/07 06:51
observer0117: 推57F 09/07 06:54
VENIVERSUM: 好文推~ 遙想曾用fortran畫函數的日子...58F 09/07 06:55
lbjstar: 大師 你好59F 09/07 06:55
phant: 重要的C89呢?(敲碗)60F 09/07 07:06
tosakashiron: 老師推61F 09/07 07:06
whiteheart: 推62F 09/07 07:06
jserv: @phant, 你要發另一篇問卦文,讓我接球63F 09/07 07:07
maxwellbkwt: 推64F 09/07 07:10
silentduke: 推65F 09/07 07:12
moment1129: 推66F 09/07 07:14
dangerousair: 推喔67F 09/07 07:17
hans1461: 推68F 09/07 07:17
iorittn: 推69F 09/07 07:19
zexd: 未看先推70F 09/07 07:20
SanyaMyBride: 原來如此71F 09/07 07:21
solitary0: 推推,謝謝72F 09/07 07:21
utdsml: 推73F 09/07 07:28
chris112358: 先推再看74F 09/07 07:28
MattOwl: 推75F 09/07 07:29
saskuran: 跟我想的一樣76F 09/07 07:32
spector66: 推77F 09/07 07:32
ckid: 推78F 09/07 07:32
jimjim951357: 先推再看79F 09/07 07:34
tommytyc: 讚讚80F 09/07 07:40
s9234032: 先推再看81F 09/07 07:41
wertes: 推82F 09/07 07:41
GentleGolem: 雖然是廣告但是內容很優,給過83F 09/07 07:45
shallmay: 用心的優文推84F 09/07 07:47
jserv: @GentleGolem, 感謝教授給分!85F 09/07 07:47
goldie: 推86F 09/07 07:48
limbo3014: 未看先推87F 09/07 07:49
tweence:88F 09/07 07:51
Sunofgod: 老學長好 醉資心還在時看過學長們討論過你神蹟的文章89F 09/07 07:52
jserv: @Sunofgod, 不用急著叫我「學長」,等我畢業要叫你們學長姐90F 09/07 07:53
r51211214: 推好文91F 09/07 07:59
jixiang: 推92F 09/07 08:01
yunyhi: 好用心93F 09/07 08:03
mikemiao1492: 66694F 09/07 08:08
unlearn: 推推95F 09/07 08:14
turtlebj4: 推 雖然有很多看不懂QQ96F 09/07 08:16
jserv: @turtlebj4, 補習班廣告都要讓你無法一眼看穿,才有效果97F 09/07 08:16
slidezhen: dy98F 09/07 08:17
Sacral: 推!!!!!99F 09/07 08:18
mike40709: 牛逼100F 09/07 08:18
jserv: @mike40709, 沒錯,C語言的前身是New B,簡稱NB(牛逼)101F 09/07 08:20
sses60802: 推102F 09/07 08:27
notneme159: 看不懂還是推103F 09/07 08:28
snalvc: 朝聖104F 09/07 08:29
j19871001: 老師五點就上課了105F 09/07 08:29
johnson35762: 厲害厲害 推推106F 09/07 08:31
Skasila: 還是第一次上早五的課107F 09/07 08:35
yuiweq1999: 推108F 09/07 08:37
AInnor: 你發廢文比你的學生多 有想過我們的感受嗎109F 09/07 08:43
e12518166339: 老師真用心110F 09/07 08:46
dreamyi: 專業好文111F 09/07 08:48
LierX: 推112F 09/07 08:49
wooshot: 詳盡113F 09/07 08:49
kokunmai:114F 09/07 08:58
sammy6314: 推115F 09/07 09:00
eric17195: 老師有開碩班的課嗎116F 09/07 09:01
octopuz: 推推推117F 09/07 09:02
summerleaves: 優質 清新 專業 推老師118F 09/07 09:15
fakeimage: 推大神119F 09/07 09:24
v2266514: 太神啦120F 09/07 09:26
ashs92223: 推推121F 09/07 09:31
atbb: 先推122F 09/07 09:32
dantevergil: 朝聖123F 09/07 09:33
a410006108: 推124F 09/07 09:35
ikenaka: 我還不推爆116125F 09/07 09:38
lunawalker: 感謝教學126F 09/07 09:38
jserv: @AInnor, 發廢文不落人後127F 09/07 09:39
JHNJHNJHN: 說到C 我只能想到 CC檸檬128F 09/07 09:40
jengjye: 推推129F 09/07 09:41

--
※ 看板: Gossiping 文章推薦值: 5 目前人氣: 0 累積人氣: 1850 
分享網址: 複製 已複製
( ̄︶ ̄)b lolki, clisan, Vince63624, et79210 說讚!
1樓 時間: 2020-09-07 11:14:24 (台灣)
  09-07 11:14 TW
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇