再谈CSHELL对C程序员的价值
几个礼拜前,介绍了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程序员的价值的更多相关文章
- 浅谈Android移动开发程序员的职业发展之路
现在几乎每个it公司都在开发移动产品,我最早知道Android还是在09年成都某学院上大学的时候,从新闻上知道有这么一家公司,创始人安迪·鲁宾很有名,但安卓到底是做什么的,我并没有关注. 到2010年 ...
- 浅谈月薪3万 iOS程序员 的职业规划与成长!(进阶篇)
前言: 干了这么多年的iOS,虽然接触了许多七七八八的东西.技术,但是感觉本身iOS却没有什么质的飞越,可能跟自己接触的项目深度有关,于是决定在学习其他技术的同时,加强自己在iOS方面的学习,提高自己 ...
- 月薪3万的程序员告诉你:这样工作才能拿高薪(转 IT之家)
习惯即刻回报 他不懂得只有春天播种,秋天才会有收获.刚刚付出一点点,甚至还没有付出,就想要得到回报.技术刚刚掌握,能一边百度一边干活了就觉得该拿到多少多少钱了.找工作先想着多少多少钱,入职了没干几个月 ...
- 谈谈Java程序员进阶的那些知识和方向
谈谈Java程序员进阶的那些知识和方向 记得前段时间看过一篇文章谈到一种程序员叫野生程序员,战斗力极强,可以搞定一切问题,但是通常看问题抓不到本质,或者说是google/baidu/stackover ...
- PHP 程序员危机(转载)
感谢有这样的机会,能和大家一起来聊聊开发者的那些事儿. 其实程序员危机是一个真实存在的问题.也有人说是互联网行业的下滑或者互联网行业已过了风口等等.我在这儿主要谈的是 PHP 程序员的危机,而这种危机 ...
- 程序员需要经纪人吗?10x 最好的程序员其生产力相当于同行的 10 倍~
原文地址 10x 起源于技术界一个流行的说法,即最好的程序员是超级明星,其生产力相当于同行的 10 倍: Google 园区以好玩的设施闻名:小憩舱.球坑.按摩.干洗.随便吃到饱的自助餐.(为了拍人才 ...
- 9大行为导致Java程序员薪资过低, 你有几个?
Java程序员薪水有高有低,有的人一个月可能拿30K.50K,有的人可能只有2K.3K.同样有五年工作经验的Java程序员,可能一个人每月拿20K,一个拿5K.是什么因素导致了这种差异?本文整理导致J ...
- DevStore分享:月薪3万的程序员都避开了哪些坑
程序员薪水有高有低,有的人一个月可能拿30K.50K,有的人可能只有2K.3K.同样有五年工作经验的程序员,可能一个人每月拿20K,一个拿5K.是什么因素导致了这种差异?我特意总结了容易导致薪水低的九 ...
- 程序员段子:世界上最大的同性交友平台github
程序员(又名程序猿)因为总是冲锋在网络的最前端,还有程序猿的各种特殊性,大家在茶余饭后都有很多关于程序员的段子流传.大多都是程序员自黑的,先说在前面,程序猿还是很好的!下面看看你有没有中枪的那一条呢? ...
随机推荐
- 关于 The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine. 异常处理
导入Excel在本地环境没有问题,但部署到服务器上后出现异常. 经排查,是系统问题,因为本地是32位系统,而服务器上则是64位系统. 解决方法: 1.打开IIS管理器 2.右击应用程序所在的连接池 3 ...
- TCP、UDP、IP 协议分析(转)
http://blog.chinaunix.net/uid-26833883-id-3627644.html
- Android之ProgressBar
今天复习一下以前的知识,补充一下ProgressBar控件 progressBar是进度条组件,通常用于用户展示某个耗时操作完成的进度,而不让用户感觉是程序失去了响应,从而更好地提升用户界面的友好性. ...
- (引用)Python 元素、元组、列表、字典的区别
转载:http://www.th7.cn/Program/Python/201407/231060.shtml 元素: 元组:tuple=('nice','to','meet','you') 列表:l ...
- [转] AIX lv 4k偏移量
转自:http://www.aixchina.net/Question/29969 前几天在客户数据库做巡检的时候,在警告日志中发现有如下警告:引用WARNING: You are creating ...
- 联系人按照A~~~Z排列
// 01 创建可变字典,存储每一个key对应的数据列表 NSMutableDictionary *nationWithCodeDicList = [NSMutableDictionary dicti ...
- OC基础语法之方法
看惯了c#的代码再去看Object-C的代码,总感觉有点懵逼,记录下OC的方法用法: 在OC中一个类中的方法有两种类型:实例方法(类似于非静态函数),类方法(类似非静态函数). 实例方法前用(-) ...
- Visual Studio 2015 下 编译 libpng
libpng https://github.com/glennrp/libpng zlib https://github.com/madler/zlib/releases https://github ...
- linux环境下jdk的安装步骤
JDK的安装步骤:1. 把jdk文件cp到服务器上2. 加权限 chmod +x 文件3. 执行 ./4.修改配置 vi /etc/profile 最后一行添加:export JAVA_HOME=/ ...
- C#数据结构选择
选择一个合适的数据结构会对程序的性能有着显著的提高 线性表和链表: 1.LinkedList<T>:适合于元素数组不固定,存在大量列表的头尾添加动作场合.其它可使用List<T> ...