作者 | Brian Robert Callahan
编译 | 张洁 责编 | 屠敏
为了让挑战变得有意思 , Brian Robert Callahan(纽约州北部伦斯勒理工学院信息技术和网络科学的讲师) 决定编写一个看起来一点也不像 C 的 C 程序 。 如果把 C 语言变成另一种语言 , 然后用那种语言去编写程序 , 那么使用 C 编译器编译程序会怎样?
能编写出以下程序 , Brian Robert Callahan 觉得是一件很光辉的事 。
procedure display( r,s,c) ? beginLOOPcall A( Z) ; call H( y,x) ; call B( Z) POOL ?
y ?= r; x ?= s;
call A( c) ; call H( y,x) ; call B( c) ;
call refresh( ) end ?
procedure fill( y,x,c,a) ? beginif( y< 0or y>w -1or x< 0or x>q -1or c = a or Z <> a )fill?= -1 ;
call draw( c) ; call fill( y+ 1,x,c,a ) ; call fill( y -1,x,c,a ) ; call fill( y,x -1,c,a ) ; call fill( y,x+ 1,c,a ) end ?
procedure save( r,s) ? begini ?= 0; while(i< 13) dobeginn[i] ?= 0; i ?= i+ 1end ?
call move( w>> 1,(q>> 1)-6) ; call printw( "Save: ") ; call echo( ) ; call getnstr( n, 12) ; call noecho( ) ;
call open( n, "w+") ; call writeChar( 83) ; call writeChar( w) ; call writeChar( q) ;
LOOPcall writeChar( Z) POOL ?
【end|编程大神竟“玩”出了不像 C 的 C 程序】y ?= r; x ?= s;
call close ;call move( y,x) end ?
procedure load( packed ? n) ? begincall open( n, "r") ; call check ;
LOOPreadln( c) ; call draw( c) POOL ?
c ?= 0;
call closeend ?
procedure m( ) ? beginl ?= 0; v ?= 1;
call A( c) ; call H( 0, 0) ; call B( c) ; call refresh( ) ;
while(v) dobeginread( inp) ? '/':l ?= not l; if(l) call draw( c) ; OK 'k':y ?= y -1; if(y< 0)y ?= 0; if(l) call draw( c) ; OK 'j':y ?= y+ 1; if(y>w -1)y ?= w -1; if(l) call draw( c) ; OK 'h':x ?= x -1; if(x< 0)x ?= 0; if(l) call draw( c) ; OK 'l':x ?= x+ 1; if(x>q -1)x ?= q -1; if(l) call draw( c) ; OK ' ': call draw( c) ; OK 'c':c ?= c+ 1; if(c = M)c ?= 0; OK 'd': call draw( 15) ; OK 'f': call fill( y,x,c,Z) ; OK 's': call save( y,x) ; OK 'q':v ?= 0; OK 'v':c ?= c -1; if(c = N)c ?= M -1; CALL display( y,x,c) endend ?
procedure main( I c,packed ? ? v) ? begincall start; call getmaxyx( stdscr,w,q) ; if(w>M)w ?= M ; if(q>M)q ?= M ; call start_color( ) ;
while(x<M) dobegincall init_pair( x,x,x) ; x ?= x+ 1end ?
LOOPcall draw( 15) POOL ?
if( c = 2)call load( v[c -1] ) ; call display( 0, 0, 0) ; call m( ) ; call endwin( ) end ?
call main.
通过这段代码 , 也许有很多网友直言 , 这并非是 C 代码 , 而是包含 Pascal 语言的所有特征 , 用分号作为语句分隔符而不是语句结束符 , 用“:=”表示赋值 , 也许还有一些 Algol(一种指令式编程语言)的 LOOP……POOL 语法 。 它甚至有 Pascal 语言的返回赋值 , 即给函数分配一个值 , 就是它的返回值 。
不过 , Brian Robert Callahan 对此解释道 , 最近听说 A+、K 和 Q 语言(它们是 APL 和 J 之类的数组编程语言)的开发者 Arthur Whitney 会使用 C 预处理器来创建自己的语言 , 然后用这种自定的语言来实现他的语言 。 于是 , 他决定尝试一下这个有趣的实验 。
Brian Robert Callahan 基于 PL/0 的自定义语言 , 编写了一个编译器 。 这个练习的亮点是 C 编译器将 UTF-8 字符理解为标识符的有效字符 。 Brian Robert Callahan 使用了很多看起来像 ASCII(美国信息交换标准代码)的字符 , 实际上并不是 ASCII , 最终还是被接受为有效的标识符 。 C 预处理器能很好地将这些标识符转化为相对应的指令 。 在这里可以看到隐藏起来的头文件 。
如果想查看 C 代码的真实外观 , 请尝试运行:
《 新程序员003 》正式上市 ,50余位技术专家共同创作 , 云原生和数字化的开发者们的一本技术精选图书 。 内容既有发展趋势及方法论结构 , 华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等30多家知名公司云原生和数字化一手实战经验!
? 从 40% 跌至 4% , “糊”了的 Firefox 还能重回巅峰吗?
? 微软若“无故”解雇暴雪 CEO , 将付 1500 万美元“分手费”
? 一年5个孵化项目来自于中国 , 佛系Apache如何帮助中国开源立足全球?
推荐阅读
- Nintendo|打工40年终于转正 任天堂宣布收购“株式会社SRD”
- IT|TrendForce:预估2022年新能源汽车将突破1000万辆 但俄乌冲突添变量
- 人物|为满足姐姐愿望:五年级弟弟用电脑编程造出“活的”冰墩墩
- 软件和应用|大神破解RTX 30全系挖矿限制 算力翻倍:闪电跑路
- 安全|僵尸网络Kraken轻松骗过Windows Defender并窃取加密货币钱包数据
- Intel|英特尔披露基于ARC GPU的Project Endgame低延迟云计算平台
- 苹果|Trendforce:苹果 AR 头显预计将采用每月订阅服务
- Raymond|微软大神“玩”出新花样,求平均值代码还能这样写?
- Nintendo|任天堂在美国和加拿大开设My Nintendo Store新商店
- Blender|英特尔官宣:13 代酷睿桌面CPU Raptor Lake 最高 24 核 32 线程
