• http://veryzhang.cn/?p=135

  • blog搬家了

    2008-12-29

    分类:

    新的地址在这里:

    http://veryzhang.cn

     

  • 关于 weak symbol

    2008-12-14

    分类:

    最近看到的一些关于weak symbol的东西,先记下来,回头再整理:

    1.ARM C库里面的函数都是默认定义为weak symbol的,这样用户可以自己重新定义这些接口,而无需重新编译C库;

    2.如果一个变量定义时没有赋初值,那么它也是weak symbol,链接时会被strong symbol所代替(即赋初值的变量定义)

  • http://www.quut.com/c/ANSI-C-grammar-y.html#storage-class-specifier

    http://www.quut.com/c/ANSI-C-grammar-l-1998.html

  • 什么是unary

    2008-12-10

    分类:

    经常看到这个词,一直不明白是什么意思,今天google了一下,原来是单目,一直以为是跟数组相关的什么东西呢,呵呵

    http://en.wikipedia.org/wiki/Unary_operator

  • 最近在学习相关的内容,转一篇相关的文章放在这里。今天翻了一下arm连接器的用户手册,发现scatter文件也是用的BNF文法,真是意外的收获,呵呵。 

    原文地址在这里:

    http://blog.csdn.net/Goncely/archive/2005/12/24/560810.aspx

    对于文法G=(V, T, S, P),如果产生式的形式如下:

    A -> xB
    A -> x

    其中A, B属于V,x属于T*,则称为右线性文法;相似的,如果产生式的形式如下:

    A -> Bx
    A -> x

    则称为左线性文法。右线性文法和左线性文法统称为正则文法

    正则表达式的表达能力等价于正则文法,正则表达式的定义如下:

    字母表中的任意字母是正则表达式,空串和空集也是正则表达式;
    如果r, s是正则表达式,那么r|s, rs, r*, (r)也是正则表达式。

    正则表达式的扩展

    r+:一个或多个重复
    .  :任意字符
    [a-z]:字符范围
    [^abc]:不在给定集合中的任意字符
    r?:可选

            正则表达式只能使用终结符(字母表中的字符),因而很容易变得复杂又难懂,实际中,经常使用正则描述,正则描述允许使用非终结符定义表达式,很像EBNF,但是它限制在未完全定义之前,不能使用非终结符,也就是说不允许递归或自嵌套。

            像正则表达式的表达能力等价于正则文法一样,BNF范式的表达能力等价于上下文无关文法。BNF是“Backus Naur Form”的缩写。John BackusPeter Naur首次引入一种形式化符号来描述给定语言的语法。

    BNF的元符号:

     

    ::=  表示“定义为 ”,有的书上用-->
    |    表示“或者”
    < >  尖括号用于括起非终结符。

    BNF的扩展EBNF

    可选项被括在元符号“[”和“]”中
    重复项(零个或者多个)被括在元符号“{”和“}”中
    仅一个字符的终结符用引号(")引起来,以和元符号区别开来

        上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述EBNF。除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。

     

        如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:

    U =>* xUy

    那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。

     

        如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:

    U =>* xUy

    那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。

    BNF的扩展EBNF

    可选项被括在元符号“[”和“]”中
    重复项(零个或者多个)被括在元符号“{”和“}”中
    仅一个字符的终结符用引号(")引起来,以和元符号区别开来

        上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述EBNF。除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。

     

        如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:

    U =>* xUy

    那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。

            如上所述,上下文无关文法的递归性,对其分析方法也有很大影响。首先,用作识别这些结构的算法必须使用递归调用或显式管理的分析栈。其次,用作表示语言语义结构的数据结构现在也必须是递归的(通常是一颗分析树),而不再是线性的(如同用于词法和记号中的一样)了。

    在程序设计语言中,通常用正则表达式描述词法规则。但是正则表示式的表达能力有限,她无法表达括号配对等语法形式,因而,需要引入表达能力更强的上下文无关文法。编译程序中常用正则文法表示词法,用上下文无关文法表示语法。那么程序语言中那些属于词法哪些属于语法呢?一个简单的办法,把所有能用正则文法表示的规则成为词法,即我们用尽可能的使用正则文法表示更多的东西,那些无法用正则表示式表示的成为句法,如C语言中的{ statement; }语法形式。语言中有些规则使用上下文无关文法仍然无法描述,例如变量的定义在使用之前,类型匹配等等,这些通常称为(静态)语义,它们在编译程序的静态语义检查阶段进行检测。

     

        如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:

    U =>* xUy

    那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。

  • 如何调试gcc

    2008-12-04

    分类:

    先写一下如何编译和安装:

    1。下载gcc的源代码;

    2。解压缩后,在根目录下建立一个build目录;

    3。进入build目录,运行下面的命令:

        ../configure --enable-languages=c --enable-debug

       make

       make install

    4。这样就可以在系统里安装编译过的gcc,包括编译器和相应的库文件,这里只打开了C语言的支持,并且打开了调试选项。

    但是这样作还有一个问题,因为系统中的gcc被替换成了自己编译之后的,在调试的过程中难免会搞出一些不稳定的版本,这样就可能造成系统出现问题,比如系统默认的gcc版本是4.3,然后你安装了一个3.4,结果所有依赖libc2.6的程序都无法运行了.

    解决方法就是先下载一个与系统版本相同的gcc,用默认选项编译,然后做好备份,当自己的gcc程序出现问题之后,在备份目录下直接运行make install就可以了.

  • 怎样才算好的代码?

    2008-11-22

    分类:

    最近将维护了近一年的一个模块重写了一遍,用在一个新的平台上,感触很多。

    刚开始做这个东西的时候什么都不懂,只希望能有一个demo出来,能用就可以了。后来慢慢的在这个demo上加功能,然后因为效率或者内存等等的原因,重写过几次,自己感觉很不错了,有些地方也觉得很懂了,但是最近重写才发现,原来我对这些东西的理解很肤浅,尤其是一些经验值,非常不准确,因为没有做过详细的profile和analyze。

    这次的改动其实只有两天在写代码,其他的时间都在读程序,获取数据,分析图表,整个分析下来,发现每分析一个环节,都有新发现,都有新的思路,新的认识,最后的代码也是水到渠成,甚至比预想的结果还要好。

    现在想一下,以前做东西,真的是在蒙,没有足够的理论分析和宏观上的思考,很多细节也扣的不够细,总而言之,太山寨了。

    今天对着新写的代码又看了一遍,突然有所感悟,以前我总觉得自己的代码乱,再怎么整理还是乱,今天终于想明白了,因为很多代码都是修改了很多遍,到最后的时候就所有的逻辑都掺杂在一起,很多的分支让人很难看懂真正的含义,或者一个具体的功能在很多处分散开,简单点说,就是没有做很好的封装,将最底层的一些逻辑,封装成一个单元,函数名就是最好的注释,这样既能保证代码的可读性,也可以在实践层面上保证系统架构的合理性。

    话说的有点乱,但大概就是这个意思。明天希望能把这次重写的代码整理一次,封装成具体的单元,逻辑要清晰,而且没有歧义。

  • 关于选择

    2008-11-18

    分类:

    toplanguage总是能给人惊喜,往往一个不起眼的话题就能引出很多睿智的讨论,进而让你的思维受到冲击。

    最近一次是关于读研还是就业的讨论,大家没有给出明确的结论,而是尝试着给出选择的方法。

    我没有看所有的thread,但是有几条感触颇多:

    1.pongba说的,数学期望对于人生的选择没有意义,因为人生只有一次,所以要考虑worst case;

    2.关于询问的技巧,对一个重要的选择来说,只有那些客观的记录或者描述是有用的,其他的主观描述或者感受都是必须忽略的,往往只有哪些对自己没有信息,没有主见,非常在于别人对自己看法的人,才会很在意别人的主观感受,做出并不适合自己的选择。

  • 关于民工

    2008-11-18

    分类:

    最近一直在思考,啥叫民工?怎样才不算民工?

    以前我没有考虑过这个问题,觉得自己过的还算happy,每天都在折腾新东西,时不时有些收获,充实的很。但是前一阵子看了孟岩的一片文章, 中间提到了第四类人,即还处在出卖劳动力的阶段,我突然有所触动,开始思考民工这个问题。

    我暂且把民工就定位在“出卖劳动力的人”,或者借用大O表示法的话,民工的劳动时间和产出比是O(N),这里的前提就是我假定付出和所得是相等的,即你的价值和老板给你的钱是相等的,毕竟这是老板的问题。

    那么在一个团队中,如果一个民工每工作一小时,能解决一个问题,那么他工作12个小时,最多只能解决12的问题,这就是民工的本质特性,他可以并且只能通过延长劳动时间来增加自己的价值。

    那么非民工具有哪些特性呢?按照我肤浅的理解,非民工的劳动时间和产出比应该是非线性的,比如O(N^2),当然这个曲线的增长是有上限的。

    更具体一点讲,比如某民工,每天工作12个小时,平均每天解决掉10个以上bug,十分勤奋,但是坦率的说,该民工应该是一个维修工,因为他只是在修补,或者为一些某些状态不能工作的元件做一些保护,这种工作换了谁都不能做到非线性,除非他研究了一个AI出来,可以自动解bug。

    但是该民工可以尝试着做一些调试工具,无论是什么形式的,比如运行时的出错报警工具,检测工具,引入一些保护机制等等,最终花了一天时间解决了几十个bug,那么在暂时的这个状态下,他应该超越了民工的层次,因为他发明了工具。

    再比如该民工业余时间刻苦学习,努力了解系统的深层知识,发现了现有系统设计的一些误区,然后引入新的设计,提高了效率或者增加了稳定性或者引入了feature,那么在暂时的这个状态下,他应该超越了民工的层次,因为他做了新的设计,或者说在系统层次上做了大的创新。

    暂时只想到这么些,不知对错,让时间去检验吧。

    不过我唯一坚信的一点就是,必须做最好的民工,才有可能超越民工。因为即使你成了老板,还是要靠民工吃饭。