Hoes of Tech

Conceptualization of Technology

  • Build Compiler with LALR(1) Parser Generator(III)

    在经过前两章的奋战之后, 我们对于Parser终于多少有了点理解——虽然还有一些遗留问题。至少现在已经可以把一门简单的语言编译成bytecode然后解析执行了。不过就像上一章里所说的,有些时候我们还希望能够把程序编译成可执行文件,在这一篇文章里我们就来做这件事情,不用担心,并不是所有的工作都是由compiler来做的。在这里,基于前一章编译出来的ByteCode,我们首先生成汇编代码,然后通过NASM编译成elf object,最后通过ld链接成可执行文件。

    首先来熟悉下最简单的汇编程序,比如一个Hello,World可以写成下面的样子:

    global _start
    section .text
    
    _print:
        push rdx
        push rax
        push rbx
        mov edx, 1
        mov eax, 4
        mov ebx, 1
        int 0x80
        pop rbx
        pop rax
        pop rdx
        ret
    
    _start:
        mov …
    Read more...

  • Build Compiler with LALR(1) Parser Generator(II)

    在上一篇文章里, 我们通过最简单的dunnart自带例子构建了一个计算器,并且对Parser Generator的结构做了说明,不过就像结尾时所说的一样,那个计算器只能进行简单的四则运算,无法保存输出,没有变量,并不怎么让人兴奋。因此,在这篇文章的前半段,我们会对之前的代码进行小小的修改,让它支持变量,然后会尝试让他支持循环——但这个事情并不是那么容易,因此在这次的后半段,会有另外一个小例子来了解下循环的构造。

    首先,从上次已经完成的计算器程序开始,我们希望添加变量之后能够实现下面的功能:

    a = 1
    b = 2
    a+b 
    (Output -> 3)
    

    简单来说就是任何第一次使用并且以字母或者下划线开头的字符串都是变量, 并且只能通过赋值的方式来定义。 现阶段为了例子简单,我们只考虑变量是浮点数的情况。在动手折腾lexer和parser之前,先来定义一个最简单的储存器,它的主要功能是指定一个String之后,能够储存或者读取相应的值。这并不是一个很难的事情,你可以用喜欢的任何Container来实现它,比如HashedList,LinkedList,甚至是RandomAccess的Stack。在这里我选用了最简单的Associative Array(内部实现也是HashedList):

    double[string] list;
    

    在有了这个储存设备之后,就可以真正的着手来添加功能了,首先我们需要定义Identifier的Token …

    Read more...

  • Build Compiler with LALR(1) Parser Generator(I)

    其实从几年前开始就一直想着自己写个编译器, 不管是用LLVM编译成native code还是基于自己写的VM。起因不仅仅是因为写个编译器很“酷”, 它还是很多东西的基础——比如游戏引擎,Machine Learning时的配置文件(因为很多Parameters是需要动态改变的)。之前已经试过数次,但都因为各种各样的原因放弃了。几年过去,现在又萌生了这个想法,反正都要从头来, 干脆把这些都记录下来,就算再扔掉也不会从零开始。

    之前曾经用过flex+yacc,也手写过LL(1)的Parser,但我并不喜欢C语言,也不打算折腾个底朝天,因为最近一直在用D语言,恰好DLang里有LALR(1)的Parser Generator - dunnart.于是以此为基础来试一试。

    如果你不了解D语言,也不需要担心,它的语法很像C/C++,比如一个最简单的Hello,World:

    import std.stdio;
    void main(string[] args){ 
        writeln("Hello, World!"); 
        return; 
    }
    

    如果后面遇到特殊的语法 …

    Read more...

  • A New Blog

    之前已经好多次想过建个博客, 把自己的想法写下来。之前用过现有的博客服务, 包括国内的博客圆, CSDN,还有LiveDoor和Tumblr, 感觉并不符合我的需求, 大部分博客网站都不支持LaTex,并且没有好的Code Highlighting,最终决定用Static Site Generator, 一个是可以自己自由的修改模板, 另外还可以用Pygments的实现漂亮的高亮。 折腾了两三天,最终选择了Pelican, 有MathJax插件,并且配合已经有的Bootstrap3 Theme看起来很简洁,基本满足了要求。

    Hosting在最初并没有过多去想,本来以为HTML无非就是提供一个小容量的httpd server,应该很容易找到服务商。实际找起来才发现并不多,能够考虑的似乎只有fc2, ninja和github。其中fc2已经取得了网络防火长城的认证,在国内不管怎么登录永远是链接被重置。最终用了ninja,看起来在国内也能正常访问,并且速度很快--比fc2稍微快一点:

    • Ninja: 0.029s
    • FC2: 0.317s
    • Github: 1.249s

    唯一的遗憾是会在页面末尾追加广告, 并且很长,不过如果我能坚持把博客写下去的话,也并不会在意每年花一千多去掉广告--当然,能坚持下去的话。

    毕竟1000块(日元 …

    Read more...