热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

编程大神竟“玩”出了不像C的C程序

作者|BrianRobertCallahan编译|张洁责编|屠敏出品|CSDN(ID:CSDNnews)为了让挑战变得有意思,

a19e8a042082c247ce3aa8316e0c0473.gif

作者 | Brian Robert Callahan

编译 | 张洁            责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

为了让挑战变得有意思,Brian Robert Callahan(纽约州北部伦斯勒理工学院信息技术和网络科学的讲师) 决定编写一个看起来一点也不像 C 的 C 程序。如果把 C 语言变成另一种语言,然后用那种语言去编写程序,那么使用 C 编译器编译程序会怎样?

能编写出以下程序,Brian Robert Callahan 觉得是一件很光辉的事。

#include"cpaint.h"var a, b, c, h, i, l, v, x, y, q, w, p size 65535 ,
packed n size 13 ꞉integer ;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<0 or y>w-1 or x<0 or x>q-1 or c &#xff1d; a or Z &#xff1c;&#xff1e; a)fill꞉&#xff1d; -1 ;call draw(c) ;call fill(y&#43;1,x,c,a) ;call fill(y-1,x,c,a) ;call fill(y,x-1,c,a) ;call fill(y,x&#43;1,c,a)
end ;procedure save(r,s) ;
begini ꞉&#xff1d; 0 ;while(i<13)dobeginn[i] ꞉&#xff1d; 0 ;i ꞉&#xff1d; i&#43;1end ;call move(w>>1,(q>>1)-6) ;call printw("Save: ") ;call echo() ;call getnstr(n,12) ;call noecho() ;call open(n,"w&#43;") ;call writeChar(83) ;call writeChar(w) ;call writeChar(q) ;LOOPcall writeChar(Z)POOL ;y ꞉&#xff1d; r;x ꞉&#xff1d; 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 ꞉&#xff1d; 0;call close
end ;procedure m() ;
beginl ꞉&#xff1d; 0 ;v ꞉&#xff1d; 1 ;call A(c) ;call H(0,0) ;call B(c) ;call refresh() ;while(v)dobeginread(inp) ;&#39;/&#39;:l ꞉&#xff1d; not l ; if(l)call draw(c) ; OK&#39;k&#39;:y ꞉&#xff1d; y-1 ; if(y<0)y ꞉&#xff1d; 0 ; if(l)call draw(c) ; OK&#39;j&#39;:y ꞉&#xff1d; y&#43;1 ; if(y>w-1)y ꞉&#xff1d; w-1 ; if(l)call draw(c) ; OK&#39;h&#39;:x ꞉&#xff1d; x-1 ; if(x<0)x ꞉&#xff1d; 0 ; if(l)call draw(c) ; OK&#39;l&#39;:x ꞉&#xff1d; x&#43;1 ; if(x>q-1)x ꞉&#xff1d; q-1 ; if(l)call draw(c) ; OK&#39; &#39;:call draw(c) ; OK&#39;c&#39;:c ꞉&#xff1d; c&#43;1 ; if(c &#xff1d; M)c ꞉&#xff1d; 0 ; OK&#39;d&#39;:call draw(15) ; OK&#39;f&#39;:call fill(y,x,c,Z) ; OK&#39;s&#39;:call save(y,x) ; OK&#39;q&#39;:v ꞉&#xff1d; 0 ; OK&#39;v&#39;:c ꞉&#xff1d; c-1 ; if(c &#xff1d; N)c ꞉&#xff1d; M-1 ; CALL display(y,x,c)end
end ;procedure main(I c,packed ʌ ʌ v) ;
begincall start ;call getmaxyx(stdscr,w,q) ;if(w>M)w ꞉&#xff1d; M ;if(q>M)q ꞉&#xff1d; M ;call start_color() ;while(xend ;call main&#xff0e;

通过这段代码&#xff0c;也许有很多网友直言&#xff0c;这并非是 C 代码&#xff0c;而是包含 Pascal 语言的所有特征&#xff0c;用分号作为语句分隔符而不是语句结束符&#xff0c;用“:&#61;”表示赋值&#xff0c;也许还有一些 Algol&#xff08;一种指令式编程语言&#xff09;的 LOOP……POOL 语法。它甚至有 Pascal 语言的返回赋值&#xff0c;即给函数分配一个值&#xff0c;就是它的返回值。

不过&#xff0c;Brian Robert Callahan 对此解释道&#xff0c;最近听说 A&#43;、K 和 Q 语言&#xff08;它们是 APL 和 J 之类的数组编程语言&#xff09;的开发者 Arthur Whitney 会使用 C 预处理器来创建自己的语言&#xff0c;然后用这种自定的语言来实现他的语言。于是&#xff0c;他决定尝试一下这个有趣的实验。

Brian Robert Callahan 基于 PL/0 的自定义语言&#xff0c;编写了一个编译器。这个练习的亮点是 C 编译器将 UTF-8 字符理解为标识符的有效字符。Brian Robert Callahan 使用了很多看起来像 ASCII&#xff08;美国信息交换标准代码&#xff09;的字符&#xff0c;实际上并不是 ASCII&#xff0c;最终还是被接受为有效的标识符。C 预处理器能很好地将这些标识符转化为相对应的指令。在这里可以看到隐藏起来的头文件。

如果想查看 C 代码的真实外观&#xff0c;请尝试运行&#xff1a;

$ cc -E cpaint.c | clang-format | less

如果你感兴趣的话&#xff0c;不妨去试试上面的程序吧&#xff01;

原文链接&#xff1a;https://briancallahan.net/blog/20220220.html

fabfa1aab5ae252aa2920e82f70a1740.gif

《新程序员001-003》全面上市&#xff0c;对话世界级大师&#xff0c;报道中国IT行业创新创造&#xff01;

ac6815d78ee3135df1070e0e3738d86b.png

1cabb715cec58fbc786ce7085164d57c.gif

☞《程序员做饭指南》霸榜 GitHub&#xff01;不仅有量筒、烧杯&#xff0c;还用上了数学公式&#xff1f;

☞永远不要辞职&#xff0c;除非……

☞乔布斯诞辰67周年&#xff0c;他的这些思想仍值得我们学习


推荐阅读
author-avatar
果子露强逼_604
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有