跳至主要内容

博文

目前显示的是 十月, 2009的博文

用C语言写解释器(一)

用C语言写解释器(一)——我们的目标 redraiment, 2009-10-18 起因   最近,我们学院老师联系我,希望我能提供一段用 C 语言编写的 BASIC 解释器,用于 C 语言课程设计教学。我前段时间也正好着迷于“语言”本身,本就有打算写一个解释器,这下正中我下怀,于是欣然接受。   以前在图书馆看过梁肇新的《编程高手箴言》,第四章“编程语言的运行机理”中就包含了一段 C 语言编写的 BASIC 解释器代码,但代码好像并不完整(我翻了好几遍,都没发现函数 get_token 的实现代码);再者,这次的代码还有其他用处,不宜牵涉版权问题;最后的原因是我有“想自己编码”的冲动 ^_^。综上所述,我要从零开始用 C 语言来编写一个 BASIC 解释器。 前置知识   1. 要编写解释器,首先就要明白什么是解释器(详细的解释请参看维基百科: http://zh.wikipedia.org/zh-cn/解释器 )。盗用《编程高手箴言》里的话: 解释程序就是一个字符串的解释器 (P165 解释语言的原理)。所以,如果仅仅是为我个人编写的话,我宁可会借助 lex & yacc 甚至 perl,而不会纯粹用 C 语言来写。   2. 在起因中已经提过,这个程序会在学弟学妹们学完 C 语言后作为综合实验。因此需要你熟悉 C 语言的语法、单链表添加/删除节点等操作以及栈的概念(这些内容大部分都能在 C 语言的教材中找到),一些相对冷僻的技术(例如 setjmp/longjmp)则不会出现在程序中。 关于语言   我在《 编程和语言之我见 》一文中提过,编程是一个很宽泛的概念。从某种意义上来说所有的软件都是一种特定的语言,但根据程序本身的灵活性可以分为“硬编码”、“可配置”、“可控制”和“可编程”四类(详见《 四类程序 》)。如果一个程序的灵活性达到了“可编程”,它的配置文件就可以被看作一种“编程语言”,而该程序本身也就是一个“解释器”。   要做到“可编程”,程序至少应该具备“输入/输出”、“表达式运算”、“内存管理”和“按条件跳转”四个功能(详见《 用DOS批处理来做数字图像处理 》)。这正好对应了冯·诺依曼计算机的结构:以运算器和控制器为中心,输入/输出设备与存储器之间的数据传输都要经过运算器。下面

庆中秋:用Windows XP桌面图标玩贪吃蛇(原理)

庆中秋:用Windows XP桌面图标玩贪吃蛇(原理) redraiment, 2009-10-04 到处都有好玩的玩意儿   计算机的世界里离散的:内存从 0 -> 2n 编号;整个屏幕的画面也是由许多颗像素点组成……如果你不介意的话,把脸尽量地贴近显示器(或者电视屏幕),你会看到整个屏幕是由一颗颗显示不同颜色的小颗粒拼成的。如果这样感受还不深,那你还记得小时候玩过的最初型掌上游戏机吗?如下图:   其中经典的飞机、坦克、俄罗斯方块等都是由一个个正方形的黑色方块拼成的。   放眼周边的世界,到处都有这样规则排列的、方方正正的“游戏元素”:摩天大楼的窗户、大教堂的座位、从楼上往下看的人群……当然还有今天要介绍的桌面图标!在优库上一搜索就会出现很多结果,有用寝室楼电灯玩贪吃蛇的、也有军训时集体玩 AK47 阵列的等等,原理都是这样~   在看完这篇文章后,你也可以尝试照样画葫芦,比如开启很多个“记事本”,将他们的窗口调整成四四方方的,然后用它们玩俄罗斯方块。 ^_^ 程序原理   我在优库上发布了视频——用 Windows XP 桌面图标玩贪吃蛇(视频地址为  http://v.youku.com/v_show/id_XMTIyODk2Njky.html ),一些朋友在评论中猜测程序原理:有人说是用批处理,还有人说是用汇编,甚至有人直接否定说是我用静态帧拼接起来的,呵呵。其实没大家想的这么复杂,我的程序主要是用 VB 开发的(为方便以后使用,移动桌面图标的代码用 C 语言写,并打包成 DLL 文件。程序的核心语句就是下面这句话: SendMessage ( hwnd, LVM_SETITEMPOSITION, i , MAKELPARAM( x , y ) );    SendMessage 是系统调用,可以向指定的窗口发送消息。整条语句的作用是向桌面发送消息,请求将第“ i ”个图标移动到坐标“ x,y ”位置。下面按照视频里播放的顺序依次介绍原理: 一、创建文件   在视频的最开始,我开启了一个命令提示符执行一条命令。可能正是因为这个原因让大家误以为这个程序是用批处理写的。如果你看了我上次的高清AVI版视频,就知道我命令是:“ for /l %d in (1,1,16) do echo. >%d.txt ”。正如网友“ Sypeace

迎国庆,DuplexPipe 发布 0.3.0 版

迎国庆,DuplexPipe 发布 0.3.0 版 redraiment, 2009-10-01   今天是中华人民共和国建国六十周年,普天同庆!作为一个程序员,当然是努力工作报效祖国啦~特地抽空完善 DuplexPipe ,主要更新如下: 实现了 UDP 通信模式; 增加了对多语言的支持,Download 中提供中文版,你还可以通过源码自行编译英文版; 修正了一些 v0.1.0 中的小错误。   最新版的源码以及 JAR 包请到项目主页( http://code.google.com/p/duplexpipe/ )下载。有了 UDP 模式,现在连接模式一共有以下四种: TCP 监听模式 TCP 连接模式 UDP 监听模式 UDP 连接模式   根据两个连接模式排列,可以得到 4×4=16 种模式。由于类似“ TCP 监听模式 -  TCP 连接模式”和“ TCP 连接模式 - TCP 监听模式”等模式属于同一种,排除重复项后总共剩下以下十种模式: TCP  监听模式 -  TCP  监听模式 TCP  监听模式 -  TCP  连接模式 TCP  监听模式 -  UDP  监听模式 TCP  监听模式 -  UDP  连接模式 TCP  连接模式 -  TCP  连接模式 TCP  连接模式 -  UDP  监听模式 TCP  连接模式 -  UDP  连接模式 UDP  监听模式 -  UDP  监听模式 UDP  监听模式 -  UDP  连接模式 UDP  连接模式 -  UDP  连接模式   到这里还没有结束。我们知道 UDP 属于非安全连接,通讯之前没有经过三次握手确认。因此在“ UDP 连接模式端”发送数据包到“ UDP 监听模式端”之前,“监听端”并不知道“连接端”的位置,所以也就无法主动给“连接端”发送数据。而我们的 DuplexPipe 只是一个数据转发工具,本身并不向两端程序发送任何多余的信息。因此第十种模式“ UDP 连接模式 - UDP 连接模式”并不能正常工作。于是,真正能建立通讯的模式就只剩下前面九种。我暂时想不出解决方法,如果其他朋友知道如何解决(当然不能让 DuplexPipe 主动发送冗余数据),欢迎联系我( redraiment@gmail.com ),谢谢! 相关