作者 | Brian Robert Callahan

编译 | 张洁

责编 | 屠敏

为了让挑战变得有意思,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 = 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 ;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 close
end ;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)end
end ;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 代码的真实外观,请尝试运行:

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

如果你感兴趣的话,不妨去试试上面的程序吧!

原文链接:Brian Robert Callahan

编程大师竟“玩”出了不像 C 的 C 程序相关推荐

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

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

  2. 卡牌大师怎么玩_lol10.10版本卡牌大师怎么玩 卡牌天赋出装详解

    lol10.10版本卡牌大师怎么玩呢?卡牌大师是一个主打对线支援的英雄,10.10版本中设计师减少了卡牌大招的蓝耗,在前中期卡牌可以更好的支援边路,下面一起来看看10.10版本卡牌大师该怎么玩吧. 天 ...

  3. 卡牌大师怎么玩_LOL2020卡牌大师符文出装推荐_2020卡牌大师玩法攻略介绍_求知软件网...

    现在英雄联盟这个游戏是很多小伙伴们最喜欢玩的游戏之一.LOL2020卡牌大师怎么玩,在游戏卡牌是一个打中单的,他远程支援性强,下面小编来给大家介绍一下吧!喜欢玩的小伙伴们一起来看看吧!谢谢 背景故事 ...

  4. 一颗椰子糖机器人_孩子编程启蒙机器人玩了不下10个,最推荐哪个呢?

    这一年多大大小小的编程启蒙机器人玩了不下10个了: 说实话真不太多,有的: 限制太多,只能按照固定的玩法.地图,开始孩子还感兴趣,过活儿就想自己鼓捣,结果机器人只会前进.转圈,一会儿孩子也就失去了兴趣 ...

  5. 新农人谋定新理念-农业大健康·李孟:“玩”出农业新花样

    新农人谋定新理念-农业大健康·李孟:"玩"出农业新花样 (记者谢锐佳.邹大鹏.王建.何山)新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 万赢信采 ...

  6. 编程大师论道:PHP的魅力和不足何

    编程大师论道:PHP的魅力和不足何在2008-07-01 来自:lizhe1985  [收藏到我的网摘] SOA 案例分析系列 学习和实验 SOA 的各方面知识.方法.技术及工具 Snort:入侵检测 ...

  7. 3D游戏编程大师技巧+源码

    首先win10的SDK里已经没有了<dmusici.h>和<dmusicf.h>,所以我在网上找了DirectX8 SDK下载下来(windows游戏编程大师技巧的源码当然也要 ...

  8. 编程大师论道:PHP的魅力和不足何在

    编者按:在编程领域有不少堪称经典著作,其中包括<Thinking In C++>和<Thinking In Java>,它们的作者是著名的计算机科学作家Bruce Eckel. ...

  9. 《Windows游戏编程大师技巧》(第二版)第11章

    第三部分:核心游戏编程   第11章 算法.数据结构.内存管理和多线程   第12章 人工智能   第13章 游戏物理   第14章 文字时代   第15章 综合运用:编写游戏! 第11章 算法.数据 ...

最新文章

  1. 京东涉足快递业加剧行业动乱
  2. WTL中CMemDC与CDC、CDCHandle的联系
  3. setuptools的package_data问题
  4. 【设计模式】—— 职责链模式ChainOfResponsibility
  5. 【目标检测】Faster RCNN算法详解
  6. 【NLP】大模型时代,我们真的不再需要分词了吗?
  7. 145. Binary Tree Postorder Traversal 二叉树的后序遍历
  8. java中怎么从键盘读取字符_java键盘读取字符
  9. CentOS 6.8下ELK+filebeat+redis 日志分析平台
  10. 从无到有axure原型设计_Axure|微信原型制作
  11. C语言——函数的调用
  12. ibm system x服务器重装系统,IBM X346服务器重装系统_xSeries 346阵列配置
  13. 请问ECSHOP首页站内快讯在哪里添加和修改?
  14. Cocos2dx游戏教程(十二):“见缝插针”,游戏结算界面和音效
  15. ASEMI场效应管12N65参数,12N65规格书,12N65特征
  16. OSChina 周四乱弹 —— 我看你TM像病毒
  17. 盘点那些互联网思维的餐饮新品牌
  18. (转载)7 .24张小龙内部讲座《通过微信谈产品》完整版
  19. 搭建一个颜值超高的发卡网站
  20. 坦克大战游戏Java网络版设计

热门文章

  1. 理解敏捷的价值观和原则
  2. OpenCV-Python Feature2D 特征点检测(含ORB/KAZE/FAST/BRISK/AKAZE)
  3. c语言 --- 指针
  4. git版本回退【快速上手】
  5. 朋友圈都在说的央行数字货币,究竟跟你有什么关系
  6. html视频怎么转换成图片,如何将小视频转换成GIF动图或将GIF动图转换成视频
  7. JavaScript实现拖动图片到指定位置验证码
  8. PCIE 设备在位检测机理
  9. 2022 年最受欢迎的 20 款黑客工具
  10. NOIP2018D1T3赛道修建