几个礼拜前,介绍了CSHELL。http://www.cnblogs.com/hhao020/p/4974542.html今天再试着介绍下,希望能有更多C程序员留意到它,从中获益。

很多年前,我在调试程序或是排查系统故障的时候,就希望有个SHELL。理想中,它应该是这个样子:

从exe文件读取elf符号,在内存中生成符号表表;
开启一个SHELL交互界面,接受修改变量或是函数的命令行;
要能够允许用户使用复杂的C语法,做到C程序编程一样;
用户回车后,自动从符号表找到相关函数,或是变量对应地址,然后执行;
函数的参数列表会被正确解析;
所有的非静态或内联的函数,变量,只要是代码里有的,都应该能在这个界面使用;
最好,能支持脚本,批量执行函数。

那些年,哥苦苦研究,但限于技术面的不足,始终未能找到入手方法。最接近的,也就是让在编码时,hardcode一组函数;而SHELL界面,则是如一般SHELL技术那样,要求按照严格的格式输入,依赖strcmp等字符处理技术判断如何调用函数。其中的限制和无奈,在此不赘述。

再后来,哥开始做VxWorks开发。做过vxWorks的人都应该知道WindShell,那东西真心好,让无数程序员爱不释手。哥也很喜欢啊,它就是理想中的那个SHELL,写上几个函数,编译一下,就能在SHELL下直接运行测试,真的方便的很;甚至有时候,要计算点东西,也会用WindShell,特别是编程过程中查16进制和10进制数的转换,或是某个字符的ascii值。

但哥终究是不那么容易被满足的程序员,很快就研究明白windshell的原理。涉及几个主要知识:
1,编译技术,比如LEX 词法分析、YACC 语法生成等;
2,ELF文件格式,以及GCC编译过程和链接技术;
3,某个脚本语言,处理文本必需要。
当然,C语言知识和Makefile知识是必须的,当然,C语言或是Makefile不过关的也没做SHELL的需求。

这三块技术,只有ELF格式和编译链接技术略有研究,另外两项都需要潜心研究。

脚本语言,哥选择了Perl入手,最开始的时候,是考虑Java和Python来着,因为算是有点基础;但很快改变了想法,对于复杂的文本处理来说,Perl可能才是王道。这期间,断断续续经历了好几个月,才算学成Perl,虽然不能说随心所欲的用Perl和正则表达式,但终于不再磕磕碰碰了。下次给大家介绍个自己用Perl做的Lex,Yacc,证明下哥没撒谎。

编译技术就没么容易了,首先要学理论。惭愧,工作后发现大学错过了两样东西:数学和编译原理。高等数序和离散数学没学好,让前些年做系统分析时缺了支柱;幸好编译原理要容易点,自学了一段时间后,终于有所领悟。说到这,倒是提醒玩正则表达式的同学们,记得学点编译原理的词法技术,否则写正则表达式很难摆脱花拳绣腿的尴尬。

接下来,是研究LEX和YACC的运用。这个挺难,网上有很多很多介绍的,十有八九是抄来抄去的一样的东西,偶尔不一样的,也只是谈及皮毛,根本没什么参考价值,跟小编写出来骗大爷大妈的医学养生文章一个水平。当然也就牛叉的,讲的云里雾里,可就是没个实例,全是理论介绍,再仔细一瞧,丫的所谓原创竟然是把LEX和YACC的技术文档摘录翻译出来。就这样,大概挣扎了几个月,一步步积累后,哥终于明白LEX和YACC怎么用了。

接下来的过程就比较自然了,用了一两个周末和晚间休息时间,哥终于做出了CSHELL。最开始规划的时候,还预留了if,while这些逻辑控制,以及cshell下的宏操作支持;但后来发现,价值不是很大,实现需要的时间也蛮多的,就暂时放弃了。或许将来会做吧!

为了方便cshell移植,又花了一个周末将其模块化,整合到项目makefile里。然后,又花了个把钟头,把p_readelf.pl从perl版的zlib中独立出来,以便于大家更容易的移植cshell到自己的项目中。

哥前两天写的trace文章,阅读量破千,但CSHELL却没几个。其实,如果trace是一屌丝,那CSHELL绝非一般高富帅,它们所能带来的价值也是天上地下!

献上cshell的词法文件,供有志于研究lex的同学参考:
http://files.cnblogs.com/files/hhao020/cshell.l.rar

欢迎lex学习者留言探讨。

再谈CSHELL对C程序员的价值的更多相关文章

  1. 浅谈Android移动开发程序员的职业发展之路

    现在几乎每个it公司都在开发移动产品,我最早知道Android还是在09年成都某学院上大学的时候,从新闻上知道有这么一家公司,创始人安迪·鲁宾很有名,但安卓到底是做什么的,我并没有关注. 到2010年 ...

  2. 浅谈月薪3万 iOS程序员 的职业规划与成长!(进阶篇)

    前言: 干了这么多年的iOS,虽然接触了许多七七八八的东西.技术,但是感觉本身iOS却没有什么质的飞越,可能跟自己接触的项目深度有关,于是决定在学习其他技术的同时,加强自己在iOS方面的学习,提高自己 ...

  3. 月薪3万的程序员告诉你:这样工作才能拿高薪(转 IT之家)

    习惯即刻回报 他不懂得只有春天播种,秋天才会有收获.刚刚付出一点点,甚至还没有付出,就想要得到回报.技术刚刚掌握,能一边百度一边干活了就觉得该拿到多少多少钱了.找工作先想着多少多少钱,入职了没干几个月 ...

  4. 谈谈Java程序员进阶的那些知识和方向

    谈谈Java程序员进阶的那些知识和方向 记得前段时间看过一篇文章谈到一种程序员叫野生程序员,战斗力极强,可以搞定一切问题,但是通常看问题抓不到本质,或者说是google/baidu/stackover ...

  5. PHP 程序员危机(转载)

    感谢有这样的机会,能和大家一起来聊聊开发者的那些事儿. 其实程序员危机是一个真实存在的问题.也有人说是互联网行业的下滑或者互联网行业已过了风口等等.我在这儿主要谈的是 PHP 程序员的危机,而这种危机 ...

  6. 程序员需要经纪人吗?10x 最好的程序员其生产力相当于同行的 10 倍~

    原文地址 10x 起源于技术界一个流行的说法,即最好的程序员是超级明星,其生产力相当于同行的 10 倍: Google 园区以好玩的设施闻名:小憩舱.球坑.按摩.干洗.随便吃到饱的自助餐.(为了拍人才 ...

  7. 9大行为导致Java程序员薪资过低, 你有几个?

    Java程序员薪水有高有低,有的人一个月可能拿30K.50K,有的人可能只有2K.3K.同样有五年工作经验的Java程序员,可能一个人每月拿20K,一个拿5K.是什么因素导致了这种差异?本文整理导致J ...

  8. DevStore分享:月薪3万的程序员都避开了哪些坑

    程序员薪水有高有低,有的人一个月可能拿30K.50K,有的人可能只有2K.3K.同样有五年工作经验的程序员,可能一个人每月拿20K,一个拿5K.是什么因素导致了这种差异?我特意总结了容易导致薪水低的九 ...

  9. 程序员段子:世界上最大的同性交友平台github

    程序员(又名程序猿)因为总是冲锋在网络的最前端,还有程序猿的各种特殊性,大家在茶余饭后都有很多关于程序员的段子流传.大多都是程序员自黑的,先说在前面,程序猿还是很好的!下面看看你有没有中枪的那一条呢? ...

随机推荐

  1. 如何在cmd下切换不同版本的Python

    (1)分别安装python-2.7.12.amd64.msipython-3.5.2-amd64.exe(python官网下载的)顺序无所谓(为了看着方便,我把安装路径修改统一了)(2)配置环境变量D ...

  2. chrome调试hove等类似事件

    前台开发过程中经常会用chrome调试代码.但是有的时候,hover或者js控制的属性显示不全 解决办法有两种: 1.根据chrome版本不一样(检查两个字)可能会有所差别 2.图中有标记

  3. c++ 对象的内存布局

    之前介绍过了普通对象比如系统自带的int等对象的对齐方式,在学习类型转换的时候遇到了自定义类型的继承体系中的downcast与upcast. 于是顺藤摸瓜,摸到了这里.发现还是 陈皓的博客里面写的最早 ...

  4. js-我理解的闭包

    一:什么是闭包 <JS高级程序设计>指出:闭包是指有有权访问另一个函数作用域中变量的函数. 二:闭包的使用 闭包的常见的创建方式是 子函数嵌套在父函数的内部,这样,子函数就可以访问父函数中 ...

  5. SAP 采购订单行项目中科目分配被隐藏,发现行项目设置中显示字段长度为0

    1.sm30 维护 视图 TCVIEW 修改对应字段的显示长度

  6. 总结--解决 mysql 中文乱码

    首先分析一下导致mysql 中文乱码的原因: 1.建表时使用了latin 编码 2.连接数据库的编码没有指定 3.写入时就已经乱码(这种情况需要自己检查源数据了) 解决方法总结: 1.创建库时指定编码 ...

  7. Monkeyrunner小脚本关于camera的使用

    一下代码涉及自动执行camera,属性一个小设置,恢复初始值,并在中间添加截屏功能 将两个截屏进行前后对比,并返回值 适合初学者,刚刚了解monkeyrunner 的人员来看 注意:一下脚本如果不能执 ...

  8. java8中CAS的增强

    注:ifeve.com的同名文章为本人所发,此文在其基础做了些调整.转载请注明出处! 一.java8中CAS的增强 前些天,我偶然地将之前写的用来测试AtomicInteger和synchronize ...

  9. 【如何快速的开发一个完整的iOS直播app】(原理篇)

    原文转自:袁峥Seemygo    感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...

  10. linux下的redis安装以及php添加redis扩展

    一.redis的安装 win版本详见: 下面是linux版本的安装步骤: step1.下载 http://redis.io/download下载完后直接make然后make install,注意sud ...