《编译原理之美》
0、为什么你要学习编译原理? 1、理解代码:编译器的前端技术 1.1 词法分析Lexical Analysis 通常,编译器的第一项工作叫做词法分析。就像阅读文章一样,文章是由一个个的中文单词组成的。程序处理也一样,只不过这里不叫单词,而是叫做词法记号,英文叫 Token。 也可以用词法分析器的生成工具来生成,比如 Lex(或其 GNU 版本,Flex)。这些生成工具是基于一些规则来工作的,这些规则用正则文法表达,符合正则文法的表达式称为正则表达式。生成工具可以读入正则表达式,生成一种叫有限自动机的算法,来完成具体的词法分析工作。 不要被正则文法(Regular Grammar)和有限自动机(Finite-state Automaton,FSA,or Finite Automaton)吓到。正则文法是一..
更多《精通正则表达式》
摘录与 《精通正则表达式》 一、正则表达式入门正则表达式(Regular Expression)是强大、便捷、高效的文本处理工具。正则表达式本身,加上如同一门袖珍编程语言的通用模式表示法(general pattern notation),赋予使用者描述和分析文本的能力。配合上特定工具提供的额外支持,正则表达式能够添加、删除、分离、叠加、插入和修整各种类型的文本和数据。 1.1 检索文本文件:Egrep egrep -i '^func' cache.go // 匹配 func 开头的 egrep -i '^$' cache.go | wc -l // 计算文件 空行数 egrep '\<ctx' cache.go // 含有 ctx 开头单词的行 egrep 'Get\>' cache...
更多《正则表达式必知必会》
摘录与 《正则表达式必知必会》 零、快速上手 [abc] 匹配单个字符a、b、c . 匹配除换行符(\n、\r)之外的任何单个字符。 [0-9]等价[0123456789] 含义是匹配一个数字,输入 123。 匹配三个结果 1、2、3。-(连字符)是一个特殊的元字符,它只有出现在[和]之间的时候才是元字符 \d 等价上面的[0-9]\w 匹配字母、数字、下划线。等价于[A-Za-z0-9_]。^[0-9]表示匹配一个非数字。^有取反的意思[A-Za-z0-9]等价[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]. * 匹配前面的子表达式零次或多次。例如,zo* 能匹配z以及zoo。* 等价于{0,}。 + 匹配前面的..
更多LLVM编译器基础知识
一、基础概念1.1 Interpreter 和 Compile Interpreter 解释器 Compile 编译器 程序步骤 1、创建代码 2、没有文件链接或机器代码生成3、源语句在执行过程中逐行执行 1、创建代码2、将解析或分析所有语言语句的正确性3、将把源代码转换为机器码4、链接到可运行程序5、运行程序 Input 每次读取一行 整个程序 Output 不产生任何的中间代码 生成中间目标代码 工作机制 编译和执行同时进行 编译在执行之前完成 存储 不保存任何机器代码 存储编译后的机器代码在机器上 执行 程序执行是解释过程的一部分,因此是逐行执行的 程序执行与编译是分开的,它只在整个输出程序编译后执行 生成程序 不生成输出程序,所以他们在每次执行过程中都要..
更多《Raft-分布式共识算法》
一、背景在分布式系统中,一致性算法至关重要。在所有一致性算法中,Paxos最负盛名,它由莱斯利·兰伯特(Leslie Lamport)于1990年提出,是一种基于消息传递的一致性算法,被认为是类似算法中最有效的。 Paxos算法虽然很有效,但复杂的原理使它实现起来非常困难,截止目前,实现Paxos算法的开源软件很少,比较出名的有Chubby、LibPaxos。此外,Zookeeper采用的 ZAB(Zookeeper Atomic Broadcast)协议也是基于Paxos算法实现的,不过ZAB对Paxos进行了很多改进与优化,两者的设计目标也存在差异——ZAB协议主要用于构建一个高可用的分布式数据主备系统,而Paxos 算法则是用于构建一个分布式的一致性状态机系统。 由于Paxos算法过于复杂、实..
更多分布式id几种生成方案
一、UUIDUUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前最广泛应用的UUID,是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、Mac OS X等等。另外我们也可以在e2fsprogs包中的UUID库找到实现。 UUID的标准形式包含32个16进制数字,以连字号分为五段,形式为8-4-4..
更多测试Protobuf在Http传输测试
Demo:https://github.com/fanlv/ProtobufOnHttpGo 一、编写Proto文件syntax = "proto3"; // 生成go代码 //protoc --go_out=. user.proto // 生成oc代码 //protoc --objc_out=. user.proto package user; message LoginRequest { string username = 1; string password = 2; } message BaseResponse{ int64 code = 1; string msg = 2; } message User{ string uid = 1; string..
更多高并发服务器IO模型
服务端IO模型总结 草稿 网络框架视角零、Nginx 一、Netty(主从Reactor)MainReactor负责客户端的连接请求,并将请求转交给SubReactor SubReactor负责相应通道的IO读写请求 非IO请求(具体逻辑处理)的任务则会直接写入队列,等待worker threads进行处理 二、GRPC-GO (Goroutine Per Connection)net.Listen -> Serve() -> lis.Accept() net库的accept -> 一个连接开个一个goroutine -> s.handleRawConn(rawConn) -> newHTTP2Transport(conn, authInfo) -> newH..
更多跨域请求的几种解决方案
需求背景最近做的Apigate优化,前端的同学要求能在配置后台页面上加上一键测试接口的功能,但是由于浏览器的同源策略防止跨域攻击,所以前端的页面默认是不能请求其他域名的接口。 方案一 Nginx配置代理location /proxy { if ($arg_url) { proxy_pass $arg_url?; } } 最开始为了简单就配置了一个简单的代理,通过url传入想要访问的接口例如: http://nginxserver/proxy?url=http://10.23.39.140:8080/app/list 这样前端需要什么测试什么接口只需要通过url传过来,Nginx会方向代理到对应的url上返回结果。 但是这个方法有个问题,url中的地址支持IP访问,不支持域名的..
更多Protobuf On HTTP 技术预研 (附代码)
Protobuf 技术预研Demo地址:https://github.com/fanlv/ProtobufOnHttp Demo地址:https://github.com/fanlv/ProtobufOnHttpGo 一、背景现在客户端与服务器通讯主要通过Json来做数据交互,本次调研主要比较Protobuf项目中使用的优缺点,和可行性。 二、Protobuf说明2.1 什么是ProtobufProtocolBuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。大部分IM通讯协议都是使用PB来传输。具体代表性的有支付宝、微信等App。 说白了,PB就是一种序列化协议,我们开发中想在什么场景中使用Protobuf做为数据交换的序列化协议,取决于自己的业务。 2.2 Pro..
更多