编译原理
持续更新…
一、概述
一个编译器的结构
词法分析:词法分析(lexical analysis)是编译器的第一个步骤,它负责读入组成源程序的字符流,并将它们组织成为更有意义的词素(lexeme)序列,对于每个词素,词法分析器产生一个二元组形式的词法单元(token)作为输出
语法分析:语法分析(syntax analysis)使用由词法分析生成的词法单元来构建树形的中间表示,通常为一个语法树(syntax tree)
语义分析:语义分析器(semantic analyzer)使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致。 它可时也收集类型信息,并提这些信息存放在语法树或符号表中,以便在随后的中间代码生成过程中使用
中间代码生成器
代码优化器
代码生成器
二、词法分析
1 词法分析介绍
1.1 词法分析的主要任务
词法分析是编译的第一个阶段。它的主要任务是读取源程序的输入字符,识别出各个单词,将它们组成词素,生成并输出一个词法单元(token)。词法分析器通常要和符号表进行交互,当词法分析器发现了一个标识符的词素时,它将这个词素添加到符号表中。在某些情况下,词法分 ...
c指针杂谈
一、基础概念
1 变量
关于C语言的变量,在我的另一篇文章redis源码分析第一章有介绍,由于本文的主要内容是指针,因此对于C语言的基本数据类型,请参考上述链接文章中的内容提前了解。
2 C语言程序内存布局
了解C程序的内存布局,有助于从宏观上理解变量和常量在内存中的存储。
C程序的典型内存表示包括以下部分,分别是STACK(栈段),HEAP(堆段),BSS(以符号开头的块),DS(数据段)和TEXT(文本段):
123456789101112131415161718192021222324252627High Addresses ---> .----------------------. | Environment | |----------------------| | | Functions and variable are declared | ...
clion远程gdb调试配置
1 安装cmake gcc gdbserver
首先安装所需工具:
1yum install cmake gcc-c++ gdb-gdbserver wget -y
2 源码编译gdb
由于yum安装的gdb版本较低,这里我选择的是源码安装:
首先去这个网址找到所需的gdb版本,我这里选择的是9.2,然后下载:
1wget http://ftp.gnu.org/gnu/gdb/gdb-9.2.tar.xz
解压并进入目录:
1tar -xvf gdb-9.2.tar.xz && cd gdb-9.2
安装所需依赖:
1yum install texinfo libncurses5-dev -y
确认安装目录,编译安装:
1234mkdir buildcd build../configure --prefix=/usr/local/gdb9make && make install
等待编译完成后,删除旧版本,给新版本建立软连接:
12rm -f /usr/bin/gdbln -s /usr/local/gdb9/bin/gdb /usr/bin/gdb
使 ...
爬虫技术基础
前言,本篇文章是我几年前开始陆陆续续记录最初学爬虫时的笔记,现在发出来(水一篇文章)。较为基础,有些地方也比较简陋,仅供参考。如有纰漏之处,欢迎指正。
一、基本介绍
1 爬虫的基本流程
模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中
对每一个步骤进行分析:
12345678910111213141516#1、发起请求使用http库向目标站点发起请求,即发送一个RequestRequest包含:请求头、请求体等#2、获取响应内容如果服务器能正常响应,则会得到一个ResponseResponse可能是:html,xml,json,图片,视频或者加密格式#3、解析内容解析html数据:正则表达式(re),第三方解析库如Beautifulsoup,pyquery等解析json数据:json模块解析二进制数据:以b的方式写入文件#4、保存数据数据库文件
2 robots协议
Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页 ...
numpy快速入门
安装
1pip3 install numpy
numpy快速入门
数组是 NumPy 库的核心数据结构。创建数组的最简单方法之一是使用array函数。
1 创建数组
123456789import numpy as np x = np.array([[1,2,3],[2,3,4]]) print(x)"""输出:[[1 2 3][2 3 4]]"""
array函数可以在列表甚至嵌套列表上调用。 由于此处输入的嵌套级别是2,因此生成的数组是二维的。 这意味着可以使用两个整数集对数组进行索引。 计算数组维数的最简单方法是检查数组的ndim属性,也可以通过检查数组的shape属性,数组中的元素总数使用size查看:
123456789print(array.ndim)print(array.shape)print(array.size)"""输出:2(2, 3)6"""
创建初始值为0、为1、空值(随机值)的数组:
123456789101112array=np.zero ...
pandas快速入门
安装
1pip3 install pandas
pandas快速入门
1 pandas擅长处理哪些数据
在处理表格数据时,例如存储在电子表格或数据库中的数据,pandas是适合您的工具。pandas将帮助您探索、清理和处理数据。在pandas中,数据表称为DataFrame。
要加载pandas包并开始使用它,请导入该包。社区一致使用的pandas别名是pd,因此将pandas加载为pd是所有pandas文档的标准做法:
1import pandas as pd
2 创建DataFrame
下面是一个简单的示例:
1234567891011121314import pandas as pdmydataset = { 'sites': ["aaa", "bbb", "ccc"], 'number': [1, 2, 3]}myvar = pd.DataFrame(mydataset)print(myvar)"""输出: sites n ...
redis源码分析
redis源码分析
持续更新…
一、C语言基础
本节参考资料:
1、C Primer Plus(第6版)中文版
2、stdint.h
3、编译器特性 attribute_((packed))
redis基于C语言编写,因此在阅读之前,先对C语言的相关语法进行简单回顾。
1 变量
1.1 整型
整型一般使用int定义,它占用一个机器字长,现在一般的个人计算机使用32位(4字节)来储存一个整型的数据。
除此之外,还有其它的附属关键字来定义整型:
short或short int,它占用16位(2字节)存储一个整型数据。
long或long int,它占用32位(4字节)或64位(8字节),具体占用多少取决于什么样的操作系统。
long long或long long int,它占用64位(8字节)存储整型数据。
在上述关键字的基础上,使用unsigned可以定义无符号整型,如unsigned int、unsigned short等,它的占用和对应的关键字占用相同,但表示的范围不同(非负)。
1.2 字符型
字符型char实际上也是一个整型,它实际存储的是整数而不是字符。根据不同的字 ...
twisted快速入门
一、介绍
twisted是基于事件驱动的网络引擎框架,事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。
twisted支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。
twisted的架构与单线程、多线程的对比如下:
和asyncio一样,twisted的编程模型可以在单线程下实现并发编程,即事件驱动版本的程序中,多个任务交错执行,但仍然在一个单独的线程控制中。当处理I/O或者其他耗时的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。回调描述了该如何处理某个事件。事件循环轮询所有的事件,当事件到来时将它们分配给等待处理事件的回调函数。这种方式让程序尽可能的得以执行而不需要用到额外的线程。事件驱动型程序比多线程程序更容易推断出行为,因为程序员不需要关心线程安全问题。
二、反应堆reactor
1 hello world
12345678910from twisted.internet import reactor# ...
对于TCP的一次抓包分析
一、TCP基础
1 TCP介绍
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它建立在IP层之上,用于解决可靠传输、有序传输等问题。
TCP包又称TCP报文段,报文段分为TCP首部和TCP数据两个部分。TCP首部最小为20B,最大为60B,如图:
其中:
源端口和目的端口字段:各占2B(2^16-1=65535,这是端口号的上限)
序列号字段:占4B,TCP是基于字节流的通信协议,在传输数据流时,要为每个字节编号。比如一个TCP报文的序列号字段为101,总共占100B,则代表这个TCP报文的最后一个字节序号为200,下一个TCP报文的起始序号字段就为201。
确认号字段:占4B,表示期望收到的另一个TCP报文的序列号,ack=seq+1(期望收到的下一个seq)。比如:我收到了一个TCP报文,其seq为301,长度为300B,此时我正确接收了301-600序号的数据,接下来期望收到seq为601的TCP报文,于是我把自己的ack置为601。
数据偏移:占4bit,它表示首部长度,即:TCP数据部分距离TCP整个报文的首部偏移量为多少,数据偏移以4B为单位,最小为(01 ...
scrapy源码分析
一、初出茅庐
1 架构总览
Scrapy的基础架构:
关于架构,很有趣的一点是在Scrapy文档里的问题:
Did Scrapy “steal” X from Django?
Probably, but we don’t like that word. We think Django is a great open source project and an example to follow, so we’ve used it as an inspiration for Scrapy.
We believe that, if something is already done well, there’s no need to reinvent it. This concept, besides being one of the foundations for open source and free software, not only applies to software but also to documentation, procedures, policies, etc ...