幾個禮拜前,介紹了CSHELL。http://www.cnblogs.com/hhao020/p/4974542.html 今天再試着介紹下,但願能有更多C程序員留意到它,從中獲益。html
不少年前,我在調試程序或是排查系統故障的時候,就但願有個SHELL。理想中,它應該是這個樣子:程序員
從exe文件讀取elf符號,在內存中生成符號表表;
開啓一個SHELL交互界面,接受修改變量或是函數的命令行;
要可以容許用戶使用複雜的C語法,作到C程序編程同樣;
用戶回車後,自動從符號表找到相關函數,或是變量對應地址,而後執行;
函數的參數列表會被正確解析;
全部的非靜態或內聯的函數,變量,只要是代碼裏有的,都應該能在這個界面使用;
最好,能支持腳本,批量執行函數。正則表達式
那些年,哥苦苦研究,但限於技術面的不足,始終未能找到入手方法。最接近的,也就是讓在編碼時,hardcode一組函數;而SHELL界面,則是如通常SHELL技術那樣,要求按照嚴格的格式輸入,依賴strcmp等字符處理技術判斷如何調用函數。其中的限制和無奈,在此不贅述。shell
再後來,哥開始作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學習者留言探討。