c语言

java

chlang 初版

关于chlang 这是个玩具解释器,通过完成它学习了许多关于编译器前端的知识点 github地址 本来这是个c语言项目,由于c语言实现实在过于繁琐,遂弃坑转为java,采用maven的项目管理结构 本语言主要参考了《自制编程语言》、c4的源代码 本文更新于2017.06.21 词法分析 词法分析器所在代码 主要有三个java文件构成,不讲一些自动机相关知识,默认已知 TOKEN_TYPE.java 1. 主要描述符号类型,带有RW开头的表示Reserved Word,也就是保留关键词 2. 最早期的开发比较简单,并没有 '>=' 这类的关系运算符,不会跟'='冲突产生太多的lookhead,这一部分是之后才加上的 3. 语言中只支持两种基础数据类型,整型(int)和字符串(string),当然为了实现闭包,还有函数这个数据类型,但不在这里体现 TOKEN.java

By chainhelen

c语言

extern c

函数签名 Function Signature,函数签名包含了一个函数的信息,包括函数名、它的参数类型、它所在的类和名称空间及其他信息。 编译过程中,编译器(或者链接器)处理符号时,他们使用某种名称修饰的方法,使得每个函数签名对应一个修饰后名称(Decorated Name)。 (内容主要摘抄《程序员的自我修养》) 以下表格是c++代码编译过后在gcc编译器下的符号名 函数签名 修饰后名称(符号名) int func(float) _Z4funcf float func(float) _Z4funcf int C::func(int) _ZN1C4funcEi int C::C2::func(int) _ZN1C2C24funcEi int N::func(int) _ZN1N4funcEi int N::C::func(

By chainhelen

c语言

编译clang

环境 windows10 vs2015update3 community版 cmake3.7.2 Python 3.5.3 GnuWin32 tools llvm4.0源码 安装过程 首先安装vs2015updaate3 community版,双击iso镜像文件,win10系统自动挂载,在虚拟镜像里面双击vs_community.exe,选择默认安装即可 python、cmake安装过程比较简单,但是确保安装完成后都在环境变量PATH里面 唯一不一样的地方是我并没有安装GnuWin32,我装了codeblock(默认有mingw),然后把lib,include,bin目录都加在环境变量PATH里面,接在再添加了环境变量include,lib 下载llvm-4.0.0.src.tar.xz源码,改名llvm,解压作为源码根目录 下载cfe-4.0.0.src.tar.

By chainhelen
c语言内存分配

编译原理

c语言内存分配

背景 网上的关于c语言内存分配的文章满天飞,先随便荡一份事例,但是从不同的角度讲一下这个案例 对于下面的代码生成的程序,基本采用如下命令反编译 objdump -M intel -s -d -x main.o | objdump -s -x -d -M intel a.out | nl -ba -M intel 输出intel寄存格式,便于阅读 -s 输出section的信息 -d 反汇编.text的逻辑 -x 尽可能反编译信息 全局/静态初始化 首先看看全局初始化过的变量,它应该在反汇编哪个地方呢? 就是代码中变量 a 所对应的 100 #include <stdio.h> int a

By chainhelen

c语言

C语言不完全类型、延迟定义

问题 今天看到《自制编程语言》里面的提到这个不完全类型,我还真不知道 细节 大概是这样的,不让别人知道我们代码内部实现细节 比如我们实现一个栈,我们把数据结构的定义放在头文件里面,然后别人include我们头文件的时候(并添加.o),就能看到具体细节,比如可能就会主动操作里面的num或者array,破坏封装性 #ifndef STACK_H #define STACK_H typedef struct Stack{ int num; int array[MAX_N]; }Stack; #endif 实现 按照如下实现就不会有这样的问题 //stack.h #include <stdio.h> #include<stdlib.h> #include<string.

By chainhelen

ollydbg

ollydbg 试手 问题:i = i++

问题 很久以前准备写的一篇blog,当时只写了题目,调试用ollydbg搞的,最近才想起来要填坑 大概是问,如下c系语言 int i = 0; i = i++; 那么最终 i 的值是多少 调试环境 本来应该是ollydbg,但是现在电脑是64位,还是用ida pro 1.6 64位 codeblocks 16.01 gcc version 4.9.2 windows10 main.cpp #include <stdio.h> int main() { int i = 0; i = i++; //为什么要加hello world,纯粹只是为了让调试的时候方便点 printf(

By chainhelen