几个礼拜前,介绍了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. String类的构造方法详解

    package StringDemo; //String类的构造方法详解 //方法一:String(); //方法二:String(byte[] bytes) //方法三:String (byte[] ...

  2. SpringMVC+Freemarker+JSTL支持

    前提: 网页编程中,我的思路是,通用的模块不仅仅只有后台代码,前端页面也可以独立为模块. 这个和asp.net中的UserController很像 比如有个人员基本信息的展示界面,需要在多个界面中嵌入 ...

  3. 在ubuntu16编译安装nginx-1.10.2(full)完全自带组件

    第一步:先安装全部用到的包 apt install gcc libpcre++-dev libssl-dev make \ libxml2-dev libxslt-dev libgd-dev libg ...

  4. sql server 还原数据库后,删除用户,提示数据库主体在该数据库中拥有架构,无法删除解决方法

    将另一台服务器上的数据库备份文件,在现在用的这台服务器上还原之后,再创建相同的用户名,提示用户已存在 想将之前的用户先删除掉,却提示“数据库主体在该数据库中拥有架构,无法删除解决方法” 在网上找到方法 ...

  5. android opengl es代码功能

    /* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Versi ...

  6. mysql备份文件注释乱码处理工具

    我们有时候需要做mysql数据库的注释,可是备份出来的是乱码,怎么办呢? 本工具软件来帮你的忙. 将GBK库备份后的文本文件中夹带的UTF8乱码转换为GBK编码,就不再乱码了. http://down ...

  7. C# 用POST提交json数据

    public void GetResponse(string url, string json) { Encoding encoding = Encoding.UTF8; byte[] data = ...

  8. android Handler机制详解

      简单运行图:    名词解析: Message(消息):定义了一个包含描述以及随意的数据对象可以被发送到Hanlder的消息,获得消息的最好方法是Message.obtain或者Handler.o ...

  9. nginx编译模块详解

    –prefix= 指向安装目录–sbin-path 指向(执行)程序文件(nginx)–conf-path= 指向配置文件(nginx.conf)–error-log-path= 指向错误日志目录–p ...

  10. jvm 原理和优化

    在csdn 上看到的,觉得很好,收藏了: 原博文地址: 濤子 http://blog.csdn.net/ning109314/article/details/10411495/ JVM工作原理和特点主 ...