看了以后,依然很佩服····
不过我原先以为你会进入ms的编译器部门,没想到最后去了不同的部门。
re: 关于C++之“复杂”[未登录] 白开水 2010-07-08 00:05
我发现我刚才发表的帖子 后半部分貌似例题了···,你讨论的是C++的复杂性,我写成了C++和C的优劣性。LZ和各位朋友请自动无视后面那部分。
不过,既然是讨论C++的复杂,那我要说句,确实太TMD的复杂了,我看到就头大·····
re: 关于C++之“复杂”[未登录] 白开水 2010-07-07 23:59
我听过比较多的关于C++复杂的理论,主要集中在无法根据C++的代码,判断生成最终汇编代码的形式,而C不会有这个问题。很容易就能根据写的C代码,脑子里自动生成GCC O2级别的汇编。
关于C++的争议,最有水平的该是linus早期对其的一些评价。其中就有07年,著名的C++狗屎论:
http://lwn.net/Articles/249460/中文版:
http://blog.csdn.net/turingbook/archive/2007/09/07/1775488.aspx其中的有一段话很有趣:
C++会导致非常非常糟糕的设计选择。你们这些C++程序员总是一上来就用语言的那些‘漂亮的’库特性比如STL、Boost和其他彻头彻尾的垃圾,这可能对你们的程序有所‘帮助’,但是却会导致:
“——当库无法工作时无穷无尽的折磨(别跟我说什么STL尤其是Boost很稳定而且可移植性很好,那全是屁话,而且一点都不可笑)
"——低效的抽象编程模型,可能在两年之后你会注意到有些抽象效果不怎么样,但是所有代码已经依赖于围绕它设计的‘漂亮’对象模型了,如果不重写应用程序,就无法改正。
”也就是说,使用优秀的、高效的、系统级的和可移植的C++的唯一方式,最终还是限于使用C本身具有的所有特性。项目限制只用C,意味着参与的人不会捣乱,也意味着会得到许多真正懂得底层问题,而不会折腾那些白痴‘对象模型’垃圾的程序员。
好的技术贴不见人讨论,八卦贴上倒是塞了满满一票人。
看到这个文章,突然感觉很怀念,真正把我编程带入门的文章。
转眼就两年了。
正则表达式引擎到了后面效率可能会卡在内存的吞吐上,一般的PC配置(这个一般我也不太确定),极限应该在30MB/S.
这个东西热爱计算机编程的人都该尝试去做下。非常考基本功。基本的数据结构,stack, avl tree, map, bit-vector, list都有牵涉,而算法那块也逃不出一般算法书的经典算法部分,编译原理也有部分涉及。假如你是个学生,又不知道该做点啥,那么这个东西,你该试着做做。
re: 正则表达式——一点小插曲 白开水 2009-03-22 17:38
LSS的,你把一份C文件,用gcc -E 跑一次后,在粘贴个几十次,基本就OK了
@陈梓瀚(vczh)
它的语法分析器不是自己写的话,这里有个移进,规约的冲突,估计它都用规约优先了。
不过说实在的```,确实挺奇怪的~~~。该指明结合方向的。
re: 如何手写语法分析器 白开水 2008-07-03 12:45
看了小V这么多文章,最不喜欢这篇。
1. 不该带进太多的实现细节。只用指出关键的数据结构或者接口就可以。
2. 不中不西的,既无可配置词法分析文章的理论优美,又无设计正则表达式引擎灌水文的实际设计雄厚功力。
3. 无法跟自己前两篇关于词法分析的文章和好的结合起来,否则在这里不用自己实际分析字符串,只用ReadToken下就可以了。
优点当然也有,比如那个struct Expression的设计,带进了错误处理就给了我不少启发。另外实现的细节,也许对某些人确实比较有用吧````。
re: 《构造正则表达式引擎》新鲜出炉啦! 白开水 2008-07-01 16:53
日哦,我写了N多的评论,一下就没了。
正则表达式的引擎的扩展部分,我还是没写```,人懒没办法。过几天最后几门考试考完了后开始看看语法分析部分了。
写这份代码总出过一个大BUG,一个小BUG,大BUG是自己一边调试一边想别的,结果一开始调试了6个小时,后来又调试3个小时总算搞定``,出错的地方很简单就是使用iterator的时候,next到下一个元素的时候,数组变长用了realloc后,指针变了```。哎,我郁闷到了。后来看设计模式的书,发现就讲了这点,删除和重新分配必须得保证那iterator一直正确才行```,羡慕用c++的,我用C,发现设计模式有些地方看不懂,特别是代码部分。
小BUG是昨天晚上出的,结果虽然都出来了,突然发现标记都错了。```,花了两个小时左右搞定。
算了不写了```,小v的文章简单易懂,大家该多看看。
re: 《构造正则表达式引擎》新鲜出炉啦! 白开水 2008-07-01 16:35
词法分析部分写好了,不过扩展正则表达式部分懒的写,想先写语法分析器了。
用正则表达式的引擎提供了一套接口给词法分析器。测试了下
测试的内容如下,然后自己把一份代码粘帖了10几次,扩充到3MB,然后分析了下。大约44W标记每秒
AddMoreType( scanner, L"ID", L"[_a-zA-Z][a-zA-Z0-9_]*" );
AddMoreType( scanner, L"ID.IF", L"if" );
AddMoreType( scanner, L"ID.BOOL", L"true|false" );
AddMoreType( scanner, L"ID.ELSE", L"else" );
AddMoreType( scanner, L"ID.WHILE", L"while" );
AddMoreType( scanner, L"ID.DO", L"do" );
AddMoreType( scanner, L"ID.BREAK", L"break" );
AddMoreType( scanner, L"ID.CONTINUE", L"continue" );
AddMoreType( scanner, L"ID.FOR", L"for" );
AddMoreType( scanner, L"OPERATOR", L"\\+|\\-|\\*|/|%|<|>|=|<=|>=|==|!=|!|&&|\\|\\||\\^|;|\\(|\\)|\\{|\\}|,|\\[|\\]" );
AddMoreType( scanner, L"OPERATOR.NOT", L"!" );
AddMoreType( scanner, L"OPERATOR.ADDMINUS", L"\\+|\\-" );
AddMoreType( scanner, L"OPERATOR.MULDIVMOD", L"\\*|/|%" );
AddMoreType( scanner, L"OPERATOR.COMPARE", L"<|>|<=|>=|==|!=" );
AddMoreType( scanner, L"OPERATOR.ASSIGN", L"=" );
AddMoreType( scanner, L"OPERATOR.AND", L"&&" );
AddMoreType( scanner, L"OPERATOR.OR", L"\\|\\|" );
AddMoreType( scanner, L"OPERATOR.XOR", L"\\^" );
AddMoreType( scanner, L"OPERATOR.LEFT", L"\\(" );
AddMoreType( scanner, L"OPERATOR.RIGHT", L"\\)" );
AddMoreType( scanner, L"OPERATOR.BEGIN", L"\\{" );
AddMoreType( scanner, L"OPERATOR.END", L"\\}" );
AddMoreType( scanner, L"OPERATOR.SPLITER", L"," );
AddMoreType( scanner, L"OPERATOR.ARRBEGIN", L"\\[" );
AddMoreType( scanner, L"OPERATOR.ARREND", L"\\]" );
AddMoreType( scanner, L"OPERATOR.FINISH", L";" );
AddMoreType( scanner, L"NUM", L"[0-9]+" );
AddMoreType( scanner, L"REAL", L"([0-9]+\\.[0-9]*)|([0-9]*\\.[0-9]+)" );
AddMoreType( scanner, L"STRING", L"\"([^\\\\\"]|\\\\\\.)*\"" );
AddMoreType( scanner, L"COMMENT.discard", L"#[^\\n]*" );