Re: [问卦] C 是怎么被开发出来的?

楼主: jserv (松鼠)   2020-09-07 05:15:58
※ 引述《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%C3%BCl
[4] https://en.wikipedia.org/wiki/ALGOL_60
[5] https://en.wikipedia.org/wiki/JOVIAL
[6] https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form
[7] https://www.catb.org/jargon/html/B/BCPL.html
[8] https://www.prnewswire.com/news-releases/ \
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
[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
https://github.com/sergev/b-compiler/tree/master/pdp7
[16] TMG: https://multicians.org/tmg.html
[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
作者: sx4152 (呵呵)   2020-09-07 05:17:00
推...
作者: gorilla823 (狗瑞拉)   2020-09-07 05:19:00
作者: Scathach (师匠)   2020-09-07 05:20:00
深夜(?)优文
楼主: jserv (松鼠)   2020-09-07 05:20:00
@Scathach, 明明就是早起 (?)
作者: kkkkkktw (195643678)   2020-09-07 05:21:00
jsvr
作者: alex5262 (Pytorch)   2020-09-07 05:21:00
推老师的课 学到很多
作者: www17010 (locat)   2020-09-07 05:25:00
楼主: jserv (松鼠)   2020-09-07 05:26:00
@kkkkkktw, UNIX 风格的推文 (笑)
作者: syk1104 (ONENO)   2020-09-07 05:27:00
阿鬼说中文啦QQ
楼主: jserv (松鼠)   2020-09-07 05:28:00
@syk1104, 9 月 16 日才鬼门关,现在让阿鬼好好挥洒
作者: amovie ( )   2020-09-07 05:28:00
人肉一下 这成大课程教授的花名与这ID关系匪浅
作者: jia106   2020-09-07 05:31:00
只能推了
作者: hsu1999a1 (hsu8907)   2020-09-07 05:32:00
大认真了吧
作者: he02789222 (边缘人)   2020-09-07 05:32:00
<(_ _)><(_ _)><(_ _)>
楼主: jserv (松鼠)   2020-09-07 05:34:00
@hsu1999a1, 我只是上来打课程广告,请不要介意
作者: rickphyman42 (neutrino)   2020-09-07 05:34:00
跪推大神
作者: damody (天亮damody)   2020-09-07 05:35:00
详细
作者: jason1596t (Jasonngu)   2020-09-07 05:37:00
先推假装看得懂
作者: woaifafewen (woaifafewen)   2020-09-07 05:38:00
又钓到了
作者: kis28519 (空白也好)   2020-09-07 05:39:00
作者: qqwer0309 (qqwer0309)   2020-09-07 05:41:00
作者: jimmy0524 (吉米牌花生酱)   2020-09-07 05:43:00
受益匪浅
作者: cliff2102 (AD)   2020-09-07 05:51:00
请收下我的膝盖
作者: rex44391 (Rex)   2020-09-07 05:52:00
作者: stin   2020-09-07 05:52:00
作者: asdkmm5050 (Mr xx)   2020-09-07 05:54:00
拜大神,都在fb看你的文章
作者: Xaymaca (夏)   2020-09-07 05:57:00
习近平: 给我用中文写机器看的懂的程式
作者: donkilu (donkilu)   2020-09-07 05:59:00
推jserv大
作者: mickey94378 (Holy)   2020-09-07 05:59:00
楼主: jserv (松鼠)   2020-09-07 06:00:00
@asdkmm5050, 感谢捧场,这时我该说“反正我很闲”
作者: zzyyxx77 (讨嘘大师77)   2020-09-07 06:01:00
有什么地方可以学sql突然公作要用到 超级大外行
作者: olctw (k.olc.tw)   2020-09-07 06:07:00
[问卦] C语言离C罩杯有多远
作者: lobotime (lobo)   2020-09-07 06:09:00
优质文必推
作者: angerD (丹佐)   2020-09-07 06:10:00
早安
作者: wayne841227 (waynEast)   2020-09-07 06:18:00
作者: pemit (城拔比)   2020-09-07 06:19:00
优文必推!
楼主: jserv (松鼠)   2020-09-07 06:20:00
作者: amethystboy (紫晶男)   2020-09-07 06:24:00
有趣
作者: Wangdy (蒙古人)   2020-09-07 06:25:00
看不懂啦,教授不要当我
楼主: jserv (松鼠)   2020-09-07 06:25:00
@olctw, 课程的 FAQ 中,我一直想加上关于罩杯的讨论,但..似乎是假命题,老婆怀孕后,罩杯自动会升级。问题圆满回复
作者: L1ON (Fake)   2020-09-07 06:29:00
老师好
作者: chayoung (扎马尾的中年台客)   2020-09-07 06:31:00
楼主: jserv (松鼠)   2020-09-07 06:33:00
@zzyyxx77, 在家(地方?)就可学 SQL,搭配 SQL Fiddle 练习http://sqlfiddle.com/ # 线上练习 SQL 语法
作者: Ricey (Shovel Bum)   2020-09-07 06:34:00
谢谢分享。
作者: youngglasses (今月的夜色真美阿)   2020-09-07 06:38:00
干嘛google 剪贴
作者: POCARI5566 (水德)   2020-09-07 06:39:00
老师 抢不到课了你还推销
作者: bobbyac01 (Chien)   2020-09-07 06:39:00
太早了
作者: NciscalA   2020-09-07 06:40:00
楼主: jserv (松鼠)   2020-09-07 06:42:00
@youngglasses, 我只是派发广告传单,顺便抬杠
作者: cerberi (cerberi)   2020-09-07 06:42:00
楼主: jserv (松鼠)   2020-09-07 06:43:00
@POCARI5566, 通常只有第一周教室比较挤,之后就凉爽通风
作者: rs6000 (正义的胖虎)   2020-09-07 06:47:00
作者: sazabik (SAZABI)   2020-09-07 06:51:00
作者: observer0117 (ob)   2020-09-07 06:54:00
作者: VENIVERSUM (vengance, vendetta)   2020-09-07 06:55:00
好文推~ 遥想曾用fortran画函数的日子...
作者: lbjstar (忙着活)   2020-09-07 06:55:00
大师 你好
作者: phant   2020-09-07 07:06:00
重要的C89呢?(敲碗)
作者: tosakashiron (翰)   2020-09-07 07:06:00
老师推
作者: whiteheart (生活需要艺术)   2020-09-07 07:06:00
楼主: jserv (松鼠)   2020-09-07 07:07:00
@phant, 你要发另一篇问卦文,让我接球
作者: maxwellbkwt (maxwellbkwt)   2020-09-07 07:10:00
作者: silentduke (沉默公爵)   2020-09-07 07:12:00
作者: moment1129 (摸门特)   2020-09-07 07:14:00
作者: dangerousair (hihi)   2020-09-07 07:17:00
推喔
作者: hans1461 (小憨吉)   2020-09-07 07:17:00
作者: iorittn (IORITTN)   2020-09-07 07:19:00
作者: zexd (yousheng)   2020-09-07 07:20:00
未看先推
作者: SanyaMyBride (\桑妮雅最高/)   2020-09-07 07:21:00
原来如此
作者: solitary0 (孤)   2020-09-07 07:21:00
推推,谢谢
作者: utdsml (阿边肥)   2020-09-07 07:28:00
作者: chris112358 (彭啊拓)   2020-09-07 07:28:00
先推再看
作者: MattOwl (麥特貓頭鷹)   2020-09-07 07:29:00
作者: saskuran (beyourguard)   2020-09-07 07:32:00
跟我想的一样
作者: spector66 (天气预报)   2020-09-07 07:32:00
作者: ckid (可可)   2020-09-07 07:32:00
作者: jimjim951357 (v54dt)   2020-09-07 07:34:00
先推再看
作者: tommytyc (75303301)   2020-09-07 07:40:00
赞赞
作者: s9234032 (WhiteWater)   2020-09-07 07:41:00
先推再看
作者: wertes (MINE凤)   2020-09-07 07:41:00
作者: GentleGolem (绅士魔像)   2020-09-07 07:45:00
虽然是广告但是内容很优,给过
作者: shallmay (施小妹)   2020-09-07 07:47:00
用心的优文推
楼主: jserv (松鼠)   2020-09-07 07:47:00
@GentleGolem, 感谢教授给分!
作者: goldie (阿良)   2020-09-07 07:48:00
作者: limbo3014 (ken)   2020-09-07 07:49:00
未看先推
作者: Sunofgod ( )   2020-09-07 07:52:00
老学长好 醉资心还在时看过学长们讨论过你神蹟的文章
楼主: jserv (松鼠)   2020-09-07 07:53:00
@Sunofgod, 不用急着叫我“学长”,等我毕业要叫你们学长姐

Links booklink

Contact Us: admin [ a t ] ucptt.com