Go 1.8rc3 源代码学习:cmd go

2017-02-11
阅读 4 分钟
3.1k
前言 命令行工具 go 相关的代码在 <go-src>/src/cmd/go,目录结构 {代码...} main.go,入口函数 *_test.go,单元测试代码 internal,go 内部实现相关代码 internal 目录下基本上按照 go "子命令" 进行组织,可以看到常用的子命令比如 help, list, run .etc {代码...} main.go main.go 是 go 命令的入口,为了优雅...

Go 1.8rc3 源代码学习:parser

2017-02-10
阅读 2 分钟
3.7k
parser package 包含了 golang 语法分析相关的数据结构和方法,源代码位于 <go-src>/src/go/parser

Go 1.8rc3 源代码学习:scanner

2017-02-10
阅读 1 分钟
3.1k
scanner package 包含了 golang 词法分析器相关的数据结构和方法,源代码位于 <go-src>/src/go/scanner

Go 1.8rc3 源代码学习:token

2017-02-10
阅读 4 分钟
3.2k
token package 包含了 golang 词法分析相关的数据结构和方法,源代码位于 <go-src>/src/go/token

PHP-7.1 源代码学习:代码生成 之 函数定义

2017-02-09
阅读 5 分钟
2.6k
根据语法动作,这条函数定义规则会创建一个 ZEND_AST_FUNC_DECL 类型的 AST 结点,我们来看看 zend_ast_create_create_decl 方法:

Git Tips

2017-02-08
阅读 1 分钟
1.7k
前言 branch merge rebase fetch {代码...} pull tag 新建 {代码...} 提交 {代码...} 清除 {代码...} 加上 -i 选项进行交互式清除 总结

PHP-7.1 源代码学习:字节码在 Zend 虚拟机中的解释执行 之 概述

2017-02-07
阅读 2 分钟
2.5k
前言 本文简要介绍 zend 虚拟机解释执行字节码的基本逻辑以及相关的数据结构,关于 PHP 源代码的下载,编译,调试可以参考之前的系列文章 execute_ex 我们来看看执行一个简单的脚本 test.php 的调用栈 {代码...} 由于是执行脚本文件,所以 do_cli 调用了 php_execute_script 函数,最终调用 execute_ex 函数: {代码...}...

PHP-7.1 源代码学习:字节码生成 之 "$a = 1"

2017-02-07
阅读 3 分钟
2.4k
前言 本文通过分析 "$a=1" 这个 PHP 语句的编译和执行来窥探 php-cli 解释执行逻辑 准备 参考之前的系列文章,在 ubuntu 环境下下载,编译 PHP 源代码 将代码导入 idea clion IDE 中 编辑运行选项,增加运行参数:-f test.php 设置断点开始调试 test.php 是一个测试脚本,放在 sapi/cli/ 目录下,test.php 中只包含一条...

PHP-7.1 源代码学习:虚拟机字节码

2017-02-06
阅读 1 分钟
1.7k
前言 to be done 总结

PHP-7.1 源代码学习:字节码生成 之 概述

2017-02-06
阅读 3 分钟
3.5k
字节码生成(编译)的代码主要集中在 zend_compile.c ,文件中包含大量的 zend_compile_xxx 函数,基本上一个函数对应 语法规则文件 zend_language_parser.y 一个非终结符,zend_compile_top_stmt 函数是所有 zend_compile_xxx 函数的入口

PHP-7.1 源代码学习:php-cli 启动流程

2017-02-06
阅读 3 分钟
4.2k
configure & make 默认构建目标为 php-cli,相关代码在 sapi/cli 目录下,php_cli.c 文件中能够找到 main(入口)函数,大概流程如下:

LeetCode 318 - Maximum Product of Word Lengths

2017-02-05
阅读 2 分钟
1.7k
Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0.

Ruby 2.x 源代码学习:语法分析 & 中间代码生成 之 指令链表序列化

2017-02-02
阅读 3 分钟
3k
前言 回顾一下 Ruby 解释器处理流程 词法分析 语法分析 AST 生成 虚拟机指令生成 虚拟机指令有两种存储结构: 链式结构,通过 LINK_ELEMENT 链表节点 数组(线性)结构 解释器会先遍历 AST 生成链式结构存储的指令列表,但是虚拟机并不会直接解释执行该列表,而是进一步将指令列表“序列化”成字节数组,PC(指令指针)寄...

Ruby 2.x 源代码学习:内存管理 & GC

2017-01-29
阅读 5 分钟
3.5k
一个 slot 对应一个 RVALUE,gc_params.heap_init_slots 是解释器初始空闲 RVALUE 对象个数,HEAP_PAGE_OBJ_LIMIT 是一个 heap page 能够容纳的 RVALUE 对象的个数,所以两者一除就得到初始时需要添加多少个 heap page

PHP-7.1 源代码学习:词法分析

2017-01-27
阅读 2 分钟
3k
这里出现了两个新的数据类型 zval,zend_parser_stack_elem,从命名推测 zend_parser_stack_elem 是语法分析栈元素(语法分析树节点),搜索代码里面哪些地方引用了 zend_parser_stack_elem

PHP-7.1 源代码学习:语法分析 之 概述

2017-01-27
阅读 5 分钟
4.7k
php 使用 lex 和 bison 进行语法分析和词法分析,本文以 bison 语法定义文件为起点,使用 find, grep 等命令行工具搜索相关源码,以此来展示探索 PHP 语法分析源码思路

PHP 7.1 源代码学习:ubuntu 环境下载,编译源代码

2017-01-27
阅读 1 分钟
2k
建议加上 --enable-debug 选项方便调试代码,如果在运行过程中出现缺少依赖库的错误,安装相应的库即可,比如 libxml2-dev

Netty 4.1 源代码学习:线程模型

2017-01-26
阅读 2 分钟
4k
前言 本文以 netty 4.1 自带的示例工程 netty-example 为例,简要介绍 netty 线程模型 EchoServer echo server 示例工程的代码位于 example/src/main/java/io.netty.example/echo EchoClient EchoClientHandler EchoServer EchoServerHandler EchoServer 很简单,仅包含一个 main 方法用于初始化 netty server 以及 hand...

Ruby 2.x 源代码分析:扩展 概述

2017-01-26
阅读 1 分钟
2.6k
我们知道 require 语句可以引入模块,就像 java 里面的 import 语句可以引入类,c/c++ 里面的 include 语句可以引入头文件甚至源文件。但是 Ruby 中的 require 与二者有着本质的不同,它实际上是一个方法(函数)调用,是运行期而非编译期的行为

Ruby 2.x 源代码学习:语法分析 & 中间代码生成 之 概述

2017-01-26
阅读 2 分钟
2.8k
rb_iseq_compile_with_option 函数是语法分析与中间代码生成的入口,这里仅列出和语法分析 & 中间代码生成相关的代码块

Ruby 2.x 源代码学习:RubyVM & InstructionSequence

2017-01-26
阅读 2 分钟
2.6k
引用 RubyVM::InstructionSequence 文档:RubyVM::InstructionSequence 类是对运行在 Ruby 虚拟机上的指令序列的抽象,使用该类,我们可以将 Ruby 源代码字符串编译成虚拟机内部的指令序列,以此来探究虚拟机内部的工作原理,同时通过灵活的编译参数,我们可以控制 Ruby 指令生成过程

Ruby 2.x 源代码学习:线程

2017-01-25
阅读 11 分钟
3.8k
前言 Ruby 使用 pthread 线程库来实现线程概念 本文涉及到的源代码: vm.c thread.c thread_pthread.c(linux/unix 平台) 线程类 Thread 参考 Ruby 2.x 源代码学习:bootstrap 这篇文章,Ruby 解释器在 bootstrap 阶段会调用一系列 Init_XXX 函数,和 线程相关的两个函数是位于 vm.c 文件中的 Init_VM 和位于 thread.c ...

Ruby 2.x 源代码学习:解释器概述

2017-01-25
阅读 4 分钟
5.4k
本文作为这一系列的开篇,简单介绍了 Ruby 解释器运行轨迹,为后续详细分析 Ruby 源代码提供一个纲领。之所以选择学习 Ruby 源代码主要是出于:

Ruby 2.x 源代码学习:词法分析

2017-01-25
阅读 6 分钟
3.9k
Ruby 没有使用 LEX 来实现词法分析,而是选择自己手写词法分析器,结合 YACC(BISON)实现语法分析,相关的源代码在 parse.y(YACC语法描述)文件中

Ruby 2.x 源代码学习:YARV 虚拟机 指令

2017-01-25
阅读 6 分钟
4.4k
YARV 大约有 90 多条指令,这些指令定义在 insns.def 文件中,编译 Ruby 源代码的时候会根据该文件生成 vm.inc 和 insns.inc 两个(include)文件,这两个文件会被包含在 Ruby 虚拟器核心代码里头

Ruby 2.x 源代码学习:语法分析 & 中间代码生成 之 数据结构

2017-01-25
阅读 9 分钟
2.9k
LINK_ELEMENT 是一个双向链表的"头"节点,包含指向前一个节点和后一个节点的指针,其它结构体通过将 LINK_ELEMENT 放在结构体的头部来将结构体组织成双向链表

Ruby 2.x 源代码学习:语法分析 & 中间代码生成 之 方法解析

2017-01-25
阅读 4 分钟
2.8k
parser.y 包含了 Ruby 语言所有的语法,下面是和函数相关的片段(parser.y 文件有 1 W 多行) 我们将注意力集中在 函数定义的语法上,先忽略掉 YACC 语法动作(下同)

Ruby 2.x 源代码学习:对象模型

2017-01-25
阅读 9 分钟
2.8k
Ruby 对属性访问做了优化,对象属性存储在 RObject 的 as 联合体内。如果属性个数小于 ROBJECT_EMBED_LEN_MAX 属性值将直接存储在 ary 数组内,属性索引存储在 RClass 中(见下文);否则属性值和索引都存储在 heap 结构体中,访问属性的过程如下:根据属性名在 iv_index_tbl 表中查询属性在 ivptr 中的索引,使用该索引...

Ruby 2.x 源代码学习:bootstrap

2017-01-25
阅读 4 分钟
2.7k
初始化目的 准备 Ruby 执行环境,包括主线程,线程堆栈,垃圾搜集器 初始化Ruby 内置的类和方法,Ruby 内置类型是通过 C 语言实现的,"固化"在解释器里面 流程 {代码...} ruby_sysinit ruby_sysinit 初始化 系统输入输出文件描述符 RUBY_INIT_STACK RUBY_INIT_STACK 宏定义用于获取 线程堆栈信息,包括堆栈开始地址及其...

Ruby 2.x 源代码学习:ubuntu 环境 下载,编译,调试 ruby 源代码

2017-01-25
阅读 1 分钟
3.6k
导入完成后,Clion 会自动创建一个 Run/Debug Configuration,将 executable 设定为 /usr/local/bin/ruby(make install 默认安装路径)