编译器优化

C++ this指针

丶灬走出姿态 提交于 2019-11-28 07:30:23
1. this 指针的用处 :   一个对象的 this 指针并不是对象本身的一部分,不会影响 sizeof( 对象 ) 的结果。 this 作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上 this 指针,编译器在编译的时候也是加上 this 的,它作为非静态成员函数的隐含形参,对各成员的访问均通过 this 进行。   例如,调用 date.SetMonth(9) <===> SetMonth(&date, 9) , this 帮助完成了这一转换 . 2. this 指针的使用 : 一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this ;另外一种情况是当参数与成员变量名相同时,如 this->n = n (不能写成 n = n )。 3. this 指针程序示例 : this 指针存在于类的成员函数中 , 指向被调用函数所在的类实例的地址。   根据以下程序来说明 this 指针    #include    class Point    {    int x, y;    public:    Point(int a, int b) { x=a; y=b;}    void MovePoint( int a, int b){ x+=a;

并发编程与高并发解决方案(一):并发编程相关基础知识

人走茶凉 提交于 2019-11-28 01:49:53
并发编程与高并发解决方案(一):并发编程相关基础知识 【原文链接】 www.ronglexie.top 目录 基本概念 CPU多级缓存 CPU多级缓存-缓存一致性协议(MESI) MESI协议中的状态 MESI状态转换图 CPU多级缓存-乱序执行优化 Java内存模型(JMM) JVM对Java内存模型的实现 硬件内存架构 Java内存模型和硬件架构之间的桥接 共享对象的可见性 竞争现象 支撑Java内存模型的基础原理 指令重排序 数据依赖性 as-if-serial语义 内存屏障(Memory Barrier) happens-before原则 Java内存模型中线程和主内存的抽象关系 Java内存模型中同步的操作与规则 同步操作 同步规则 并发的优势与风险 基本概念 并发(Concurrency):并发是指同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时”存在“的,每个线程都处理执行过程中的某个状态,如果运行在多核处理器上,此时,程序中的每个线程都将分配到一个处理器上,因此可以同时运行。 高并发(High Concurrency):高并发是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。 CPU多级缓存 CPU多级缓存配置(演变): 数据的读取和存储都经过高速缓存

CLR基础

自作多情 提交于 2019-11-28 00:36:06
读《CLR via C# 》之后感觉对.net 的理解有了一个飞跃(虽然大部分内容还要慢慢消化和吸收),对CLR,JIT编译器,垃圾回收,多线程使用,和锁等概念都有了更深的认识。我从四月末开始看,直到八月初才看完,有几节跳过了,像WinRT 觉得过时了就没看,毕竟Microsoft 目前大力推广.net core。能让我坚持看完的原因很大一部分是作者 Jeffrey 的文字平易近人,描述细腻,让人感觉作者确实是想把毕生所学倾囊相授。就像译者周靖在结尾评价的那样:"字里行间,全是殷勤叮嘱。无浮夸之文字,倾心血而写就"。 以后我将逐步整理看完此书的习得,也是对书中难理解的地方做一下回顾。 第一篇 CLR 基础 1 将源代码编译成托管模块 公共语言运行时(Common Language Runtime ,CLR) 是一个可由多种编程语言使用的“运行时”。CLR的核心功能(比如内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。 只要编译器是面向CLR的,可以用任何语言编译出托管模块。 托管模块 是标准的32位Microsoft Windows 可移植执行体(PE32)文件,或者是标准的64位Windows可移植执行体(PE32+)文件,它们都需要CLR才能执行。 元数据: 每个托管模块都包含元数据表,主要有两种表:一种表描述源代码种定义的类型和成员

从零写一个编译器(十):编译前传之直接解释执行

泄露秘密 提交于 2019-11-28 00:07:45
项目的完整代码在 C2j-Compiler 前言 这一篇不看也不会影响后面代码生成部分 现在经过词法分析语法分析语义分析,终于可以进入最核心的部分了。前面那部分可以称作编译器的前端,代码生成代码优化都是属于编译器后端,如今有关编译器的工作岗位主要都是对后端的研究。当然现在写的这个编译器因为水平有限,并没有优化部分。 在进行代码生成部分之前,我们先来根据AST来直接解释执行,其实就是对AST的遍历。现代解释器一般都是生成一个比较低级的指令然后跑在虚拟机上,但是简单起见我们就直接根据AST解释执行的解释器。(原本这部分是不想写的,是可以直接写代码生成的) 这次的文件在interpreter包里,这次涉及到的文件比较多,就不列举了 一个小问题 在开始说解释器的部分前我们看一下,认真观察之前在构造符号表对赋初值的推导式的处理是有问题的,但是问题不大,只要稍微改动一下 在github源代码的部分已经改了,改动如下: case SyntaxProductionInit.VarDecl_Equal_Initializer_TO_Decl: attributeForParentNode = (Symbol) valueStack.get(valueStack.size() - 3); ((Symbol) attributeForParentNode).value = initialValue;

gcc Makefile 入门

久未见 提交于 2019-11-27 22:15:19
使用 make 命令编译项目文件 入门 目录: 一、 make 命令的运行过程 二、基本gcc编译命令 三、简单Makefile文件的编写 四、实例 一、 make 命令的运行过程 在shell的提示符号下,若输入" make ",则它会到目前的目录下找寻Makefile这个文件.然后依照Makefile中所记录的步骤一步一步的来执行.在我们写 程序的 时候,如果事先就把compiler程式所需要的步骤先写在Makefile中的话,想要compiler 程序的 时候就只要打入 make 的指令.只要程序无误的话,就可以获得所需要的结果了! 在项目文件中,如果有成百上千个源程序,每次修改其中的一个都需要全部重新编译是不可想象的事情.但通过编辑Makefile文件,利用 make 命令就可以只针对其中修改的源文件进行编译,而不需要全体编译.这就是 make 命令在编译项目文件时体现出来的优势.能做到这点,主要是基于Makefile文件的编写,和 make 命令对Makefile文件的调用.Makefile文件作为 make 命令的默认参数,使一个基于依赖关系编写的结构文件. 大家经常看到使用 make all, make install, make clean等命令,而他们处理的目标都是一个Makefile文件,那么all、install

C++中的C

雨燕双飞 提交于 2019-11-27 20:24:08
前言 因为C++是以C为基础的,所以要用C++编程就必须熟悉C的语法。 C语言的学习可以学习K & R C的《C程序设计语言》 创建函数 Q: 函数原型? A: 标准C/C++有一个特征叫函数原型(function prototyping)。调用函数时,编译器使用原型确保正确传递参数并且正确处理返回值,如果调用函数时程序员出错,编译器就会捕获这个错误。 A: 下面是一个声明函数原型的例子: int translate(float x, float y, float z); 在函数原型中声明变量时,对于同样形式的变量,不能写成 translate(float x, y, z) 这种形式,而必须指明每一个参数的类型。在函数声明中,下面的形式是可以接受的: int translate(float, float, float); 因为在调用函数时,编译器只会检查类型,所以使用标识符只是为了使别人阅读代码时更加清晰。 Q: 空参和可变参数列表? A: 如果有一个空的参数列表,可以在C++中声明这个函数为func(),它告诉编译器,这里有0个参数。应该意识到这只意味着C++中是空参数列表,在C中它意味着不确定的参数数目,这是C语言中的漏洞,因为在这种情况下不能进行类型检查。 A: 在C/C++中,声明func(void)都意味着空的参数列表。 A: 可变的参数列表(variable

从零写一个编译器(一):输入系统和词法分析

六眼飞鱼酱① 提交于 2019-11-27 14:59:19
前言 从半抄半改的完成一个把C语言编译到Java字节码到现在也有些时间,一直想写一个系列来 回顾整理一下写一个编译器的过程 ,也算是学习笔记吧。就从今天开始动笔吧。 项目的完整代码在 C2j-Compiler 一开始会先写一个C语言的解释器,直接遍历AST直接执行,再之后会加入生成代码部分,也就是编译成Java字节码 支持C语言的大部分使用,具体可以到上面的链接去看,当然依旧是比玩具级还玩具级的编译器。 正式开始 完成一个编译器大抵上主要有这几部分 词法分析 一般用有限状态自动机或者手工编写来实现,这一步输出的是token序列 语法分析 主要分为自顶向下和自底向上的语法分析,一般有递归下降,LL(1),LR(1),LALR(1)几种方法实现。这一步输出的是语法树 语义分析 语义分析主要任务是生成符号表,并且发现不符合语义的语句,这一步输出的还是AST 代码生成 这里一般会生成一个与平台无关的较为贴近底层的中间语言(IR),这一步输入AST,输出的是IR 代码优化 这一步的工作和名字一样,就是进行代码的优化,提升性能等等 目标代码生成 这一步的任务就是生成平台相关的汇编语言了 以上差不多就是整个通用意义上来说的编译器了,但是也可以把包括调用链接器汇编器来生成可执行文件 水平时间有限C2j-Compiler里对于后三步是直接遍历AST生成目标Java字节码的,没有任何优化

C++开源库大全

删除回忆录丶 提交于 2019-11-27 12:22:57
C++开源库大全 程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。 标准库 C++ Standard Library :是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。 Standard Template Library :标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准委员会 框架 C++通用框架和库 Apache C++ Standard Library :是一系列算法,容器,迭代器和其他基本组件的集合 ASL :Adobe源代码库提供了同行的评审和可移植的C++源代码库。 Boost :大量通用C++库的集合。 BDE :来自于彭博资讯实验室的开发环境。 Cinder :提供专业品质创造性编码的开源开发社区。 Cxxomfort :轻量级的,只包含头文件的库,将C++ 11的一些新特性移植到C++03中。 Dlib :使用契约式编程和现代C++科技设计的通用的跨平台的C++库。 EASTL :EA-STL公共部分 ffead-cpp :企业应用程序开发框架 Folly :由Facebook开发和使用的开源C++库 JUCE :包罗万象的C++类库

JIT晚期(运行期)

不羁的心 提交于 2019-11-27 07:35:43
1. Java的编译和执行 编译 包括两种情况: 1,源码编译成字节码 2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行 也包括两种情况: 1,源码解释执行 2,字节码解释执行 解释和编译执行的区别是: 是否产生中间本地机器码。 即时编译生成机器相关的中间码,可重复执行缓存效率高。解释执行直接执行字节码,重复执行需要重复解释。 2. 编译原理 在执行前先对程序源码进行词法解析和语法解析处理,把源码转化为抽象语法树。 其中绿色的模块可以选择性实现。 上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript), 而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程。 对于一门具体语言的实现来说: 词法和语法分析乃至后面的优化器和目标代码生成器都可以选择独立于执行引擎,形成一个完整意义的编译器去实现,这类代表是C/C++语言。 也可以把抽象语法树或指令流之前的步骤实现一个半独立的编译器,这类代表是Java语言。 又或者可以把这些步骤和执行引擎全部集中在一起实现,如大多数的JavaScript执行器。 3. 三个编译器 JVM的编译器可以分为三个编译器: ( 1) 前端编译器 : 把.java转变为.class的过程 。如Sun的 Javac 、Eclipse JDT中的增量式编译器( ECJ )。 ( 2) 后端编译器

浅谈消息队列

天大地大妈咪最大 提交于 2019-11-27 02:50:34
1.写在前面 本来一年前的时候还打算以那篇面经为契机,开始自己写博客的习惯,结果后来一拖再拖,虽然evernote里面积攒了不少东西,但是发现想整理成博客真的是太累了,毕设的时候觉得累没整理,刚到公司做mini项目觉得累没整理,后来刚进工作室熟悉环境觉得累没整理,不知不觉就一年没写博客了,囧。 为什么想起来写这样一篇文章呢?其实主要还是两周前有一个知乎问题突然火起来了,传说中的 水货程序员之问 。这篇知乎问题真是一个大宝库,刚一出来,海量平时在知乎上各种高调的大神(棍)和海量低调的真大神都出来冒泡,让我们这些弱菜开了眼界。水货程序员之问是个好问题,问题不是说好在水货程序员这篇文章到底黑的对不对准不准,而是印发的讨论像钓鱼一样钓出了一水儿神棍。 那怎么区别神棍和大神呢?方法很简单,我们一个一个浏览答案,从高票到低票,哪个答案或者跟着的评论里屁代码没有,还说的煞有介事的,一般都是神棍;哪个答案全程干货,各种分析,那就是大神。 举个比较简单的例子,某高票答案「妄议」了下云风,说后者解决问题的路子太野大家学不来,并且推荐了一票路子「不野」的大神(?)。我们不管这些大神(?)之前的知乎回答质量如何,但是我们从这个水货程序员之问里可以发现,这一票路子不野的大神(?)没有一个是来抖干货的,全是来玩SNS的。人家原po说云风的消息队列写的不行,那你们这些大神(?)既然来「妄议」了