Archive for 算法-编程

啃了python源代码,从python.c开始慢慢看到token获取,学到很多东西,但是我看到python源代码也有很多可以优化的地方。很多参数、变量可以不要的,同样的判断在不同地方使用的不同方法,我靠看的我晕头转向。一到晕头转向的时候,我就重新从有疑问的地方再走一遍,认真看关键代码,然后才能看懂这一部分的功能。 语言的基本语法想个差不多了,天马行空了一下,与开始想的差距太大。

Continue

n久前就有这样的冲动,这次读了淫神的代码后,决定还是动一下手。 语言语法主要类似python的,靠缩进来定义代码块,动态语言/静态语言还没想好0 0(应该会静态类型)。 以前想做的时候看过,flex,yacc/bison什么的,看了淫神的代码突然想自己实现一下,问题是难免的,出现问题解决问题。不下手不会知道问题会出在哪,这也是成长过程。看了淫神的代码开始想使用python写,后来觉得有必要复习一下c了,c语言用的太少了,是时候提高一下水平了。 再一个临时的决定是使用llvm,虽然现在还不是很懂其中的奥秘,看看文档慢慢来吧。这也是发现现在好多语言都在用来提示速度,dropbox也在搞py的实现,期待能达到更快的速度。 感觉如果用flex,bison ,llvm 写一个语言应该超简单。。。当然是写一个玩的而不是用的。 我看了淫神的代码 ,然后去翻python的源代码parse部分,无从下手,打眼也抽不出来各部分功能,然后就放弃了,自己慢慢搞。汗 更新 周末,屋里又看了一下python parser部分的源代码,找到了基本流程,开始基本就在Parser/pgenmain.c和P

Continue

1 安装 下载的最新的3.4, http://llvm.org/releases/download.html#3.4 Clang source code (.sig) LLVM source code (.sig) Compiler RT source code (.sig) 官方安装文档:http://llvm.org/docs/GettingStarted.html#getting-started-quickly-a-summary 下载的源码主要解压到正确目录就行了. mkdir build cd build ../configure make make install 编译的二进制文件在llvm-3.4/build/Release+Asserts/bin 搞定了 clang --version clang version 3.4 (tags/RELEASE_34/final) Target: x86_64-unknown-linux-gnu Thread model: posix 源里边最新的是3.3的 2 写一个c的hello

Continue

好吧,我先把yin语言的java代码看了个差不多才想编译一下,主要原因还是想打印点测试的东西,并不是想写点什么。 总的来说像淫神说的,写得代码却是容易阅读。我java只是上学的时候开过课,再没用过,看的过程中只查了两三个的函数就看完了。看完了发现写个括号语言不算太难0 0,我的意思仅仅是学习知识不是编写一个可以用的语言。编译原理的课也开了,都是理论,传说中的龙书又是啥书的,我几分钟看来一遍,感觉和课本没什么区别。看一个编写初期的代码更容易理解一些东西。以前也想自己实现过,想想解析代码的复杂程度就怕了。 环境需求,参照github的wiki上。 java jdk 1.7,ubuntu12.04自带好像是openjdk 我以前搞安卓游戏的时候换过了。 maven 3.2 我直接从官网下载的二进制版本,http://maven.apache.org/download.cgi。解压到/opt/maven-3.2.1,vim /home/a0x55aa/.bashrc,添加export PATH=/opt/maven-3.2.1/apache-maven-3.2.1/bin:$P

Continue

函数 <pre lang="rust">fn line(a: int, b: int, x: int) -> int { return a * x + b; }</pre> 使用fn定义个函数,参数是在括号里边的name:type对,->后面跟返回值类型。 最后一行没有分号,可以省略return,将最为整个代码段的值返回。返回空或者(),可以不写返回类型。函数参数支持模式匹配。 <pre lang="rust">fn first((value, _): (int, f64)) -> int { value }</pre> 析构函数 析构函数用来定义处理文件,socket,对内存的释放。当不再访问之后,对象的析构函数将被调用,防止访问释放的资源可能会产生的动态错误。当一个任务失败,在任务中的所有对象析构函数将被调用。 定义一个链表 <pre lang="rust"> enum List { Cons(...), Nil } enum List { Cons(u32, ~List), Nil }</pre>

Continue

结构体<pre lang="rust">struct Point { x: f64, y: f64 } let mut mypoint = Point { x: 1.0, y: 1.0 }; let origin = Point { x: 0.0, y: 0.0 }; mypoint.y += 1.0; // `mypoint` is mutable, and its fields as well origin.y += 1.0; // ERROR: assigning to immutable field match mypoint { Point { x: 0.0, y: yy } => println!("{}", yy), Point { x: xx, y: yy } => println!("{} {}", xx, yy) } match mypoint { Point { x, .. } => println!("{}", x) } </pre> 如果结构体变量是可变的,那么结构体里边的变量也

Continue

if语句的判断式必须是bool类型的,不能有隐式的转换。如果if分支里边最后是一个值,那么每一个分支都必须是一个值。 match语句类似c的switch。当找到一个匹配项,只执行改分支,不需要加一个break。一个分支匹配多个不同的值用“|”分隔。可以用“<code>M..N</code>”表示两个数字值范围。下划线匹配任何单个值。 每一个分支之间用逗号分隔,如果用大括号包含就可以省略逗号。 <pre lang="rust">match my_number { 0 => println!("zero"), 1 | 2 => println!("one or two"), 3..10 => println!("three to ten"), _ => println!("something else") }</pre> <pre lang="rust">use std::f64; use std::num::atan; fn angle(vector: (f64, f64)) -> f64 { let pi = f6

Continue

好久没写博客了,越来越懒。碰到问题,文档上有的,或者可以搜索到的就懒得总结了,也经常要找多次。准备经常更新。 rust很早之前看过,那时候感觉标准库太少了,特别网络相关的根本找不到。0.9的时候我看好像有了,现在0.1了网络相关的已经有了,准备学习一下rust语言。 hello.rs &nbsp; <pre lang="rust">fn main() { println!("hello?你好"); }</pre> custc hello.rs ./hello rust所有的声明必须在函数里边,rust可以编译成库文件被别的程序包含,甚至是非rust程序。 println!这种标示符后面跟一个叹号的是宏调用。宏调用感觉好强大,还没仔细看。先记几个连接 http://static.rust-lang.org/doc/0.10/guide-macros.html http://static.rust-lang.org/doc/master/std/fmt/index.html#%3Ccode%3Eformat_args!%3C/

Continue

不定义的话默认差不多有一分钟,具体不知道 一种方法:engine = sqlalchemy.create_engine(db_connect_str, connect_args={'connect_timeout': 10}) 还可以直接写到db_connect_str后边,connect_args就是连接字符串后面跟的参数。 <pre><code>"mysql://user:password@host/test?connect_timeout=1"</code></pre>

Continue

蒙提霍尔问题的规则是 参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车或者是奖品,选中后面有车的那扇门就可以赢得该汽车或奖品,而另外两扇门后面则各藏有一只山羊或者是后面没有任何东西。当参赛者选定了一扇门,但未去开启它的时候,知道门后情形的节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率? 我今天在微博上看到分享http://www.geekfan.net/7241/。然后区维基百科查了一下游戏的规则,开始我认为概率都是50%,然后又仔细看了作者的代码和结果,感觉我的感觉是错的0 0。我就仔细想了一下,发现却是错了。高中的时候就挺喜欢概率题,感觉挺有意思的 如果你不换,但是中奖,那就是你开始的选择, 三选一 。 如果你换,中奖,说明开始你选择错误,三选二。其实也是,像作者想的差不多,主持人帮你排除一个,相当于从bc选择了两次(选了b并且选了c)。 说白了好像是一个,你第一次选择错误的概率是多少。

Continue