编译器优化

JavaWeb(一):Java技术概览

試著忘記壹切 提交于 2019-12-06 07:03:52
一、Java技术体系 在早期,Java被称为Java开发工具包或JDK,是一门与平台(由一组 必需的API组成)紧密耦合的语言。 从1998年底的1.2版本开始,Java技术栈被分割为下面关键部分: Java是一门包含了严格和强类型语法的语言。 Java 2平台标准版本,被称为J2SE,指的是平台以及java.lang和java.io包中包含的类。它是构建Java应用程序的基础。 Java虚拟机或JVM是一个可运行编译后Java代码的软件虚拟机。因为被编译过的Java代码只是字节码,JVM将在运行代码之前,把字节码编译成机器码。JVM还负责管理内存,从而实现了应用程序代码的简化。 Java开发工具包或JDK。它包括了Java语言编译器、文档生成器、与本地代码协作的工具和用于调试平台类的Java源代码。 Java运行时环境或JRE曾经并且现在也仍是终端用户用于运行编译后Java应用程序的软件。它包含了JVM但不含任何JDK中的开发工具。而JDK包含了一个JRE(即jdk既包含开发工具又包含JRE)。 上述5个组件曾经都只是 规范 ,而不是实现。任何公司都可以通过规范实现Java技术栈,比如IBM有自己的JDK。开源社区则形成了OpenJDK项目,该项目提供Java栈的开源实现。 我们在Oracle网站下载的JDK,实际也是一种实现,sun公司最初就提供了Java、J2SE、JVM

PL真有意思(五):数据类型

喜你入骨 提交于 2019-12-05 20:13:15
前言 现在大多数程序设计语言中都有表达式和/或对象的类型概念。类型起着两种主要作用: 为许多操作提供了隐含的上下文信息,使程序员可以在许多情况下不必显示的描述这种上下文。比如int类型的两个对象相加就是整数相加、两个字符串类型的对象相加就是拼接字符串、在Java和C#中new object()隐含在背后的就是要分配内存返回对象的引用等等。 类型描述了其对象上一些合法的可以执行的操作集合。类型系统将不允许程序员去做一个字符和一个记录的加法。编译器可以使用这个合法的集合进行错误检查,好的类型系统能够在实践中捕获很多错误 类型系统 从编译方面的知识我们可以知道,计算机硬件可以按多种不同的方式去解释寄存器里的一组二进制位。处理器的不同功能单元可能把一组二进制位解释为指令、地址、字符、各种长度的整数或者浮点数等。当然,二进制位本身是无类型的,对存储器的哪些位置应该如何解释,大部分硬件也无任何保留信息。汇编语言由于仅仅是对一些二进制指令的“助记符号”翻译,它也是这种无类型情况。高级语言中则总是关联值与其类型,需要这种关联的一些原因和用途就如前面说到的上下文信息和错误检测。 一般来说,一个类型系统包含一种定义类型并将它们与特定的语言结构关联的机制;以及一些关于类型等价、类型相容、类型推理的规则。 必须具有类型的结构就是那些可以有值的,或者可以引用具有值得对象的结构

小白理解安卓虚拟机以及华为的'诺亚方舟'

佐手、 提交于 2019-12-05 17:20:40
虚拟机,提到虚拟机,大家可能第一反应就是java中好像有虚拟机这个玩意。但是安卓中的虚拟机是什么呢?是和java一样的吗?那么我们先来了解一下java中的JVM! JVM,搞java的肯定对它了解不少。JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才干够运行Java程序,JAVA在编译后会生成相似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编译成的汇编语言会直接在硬件上跑。但JAVA编译后生成的字节码是在JVM上跑,须要由JVM把字节码翻译成机器指令。才干使JAVA程序跑起来。JVM运行在操作系统上,屏蔽了底层实现的差异。从而有了JAVA吹嘘的平台独立性和Write Once Run Anywhere。依据JVM规范实现的详细虚拟机有几十种,主流的JVM包括Hotspot、Jikes RVM等。都是用C/C++和汇编编写的,每一个JRE编译的时候针对每一个平台编译。因此下载JRE(JVM、Java核心类库和支持文件)的时候是分平台的,JVM的作用是把平台无关的.class里面的字节码翻译成平台相关的机器码,来实现跨平台。 说白了,简单点,就是: Java .java文件 -> .class文件 -> .jar文件 最后执行是class文件,有的会被再次打包成jar文件。 了解了这些之后,我们再去了解Android 中的虚拟机。 一

inline,宏定义,static,extern

梦想与她 提交于 2019-12-05 16:50:17
inline一般用于定义代码简洁,耗时短,不像宏定义是在预编译阶段替换,inline是在汇编阶段替换,效果一样。 一般编译器进行优化的时候会对简短方法进行这种优化,不进行声明也会进行inline,如果显示的声明为inline,会增大最后代码的大小。最终是否优化由编译器决定,这样声明了可以在头文件中定义,不用担心重复定义。 static是告诉链接器,当前文件定义的方法和变量只有当前模块可用,不能被其他的模块使用。 注意,对于 include 方式进行包含的没有影响。 include 实际是对整个文件进行包含。这个一般是对于库与库,或者 .o 与 .o 之间,可见范围由编译器进行分隔。 extern是告诉编译器,如果当前项目没有定义相关的变量, 不需要报错,在链接阶段一定会有相关的定义的。 和static 有些类似,也是使用于模块与模块之间的。 宏定义是在预编译阶段就进行替换。 可以通过 g++ -E source.cpp 的方式查看替换后的代码。 /* [root@localhost definecompile]# g++ -E test.cpp # 1 "test.cpp" # 1 "<built-in>" # 1 "<命令行>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<命令行>" 2 # 1 "test.cpp" */ int

Linux安装gcc编译器详解(CentOS 6.5 64位系统)

痴心易碎 提交于 2019-12-05 12:14:47
本次安装针对CentOS 6.5 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器。 使用yum安装gcc 对于配备了yum的Linux发行版而言,安装gcc编译器就变得so easy。我们只需要分别执行如下命令即可: #安装gcc、c++编译器以及内核文件 yum -y install gcc gcc-c++ kernel-devel 自行安装gcc 不过使用yum安装的gcc并非当前的最新版本,目前gcc的最新版本为4.9.0(gcc 4.8开始全面支持C 11和C++ 11的新特性)。如果我们想要安装最新版本的gcc,那么就需要自行安装gcc。 笔者初次安装gcc时,在网络上搜寻了大量的gcc安装配置教程,许多教程的内容非常之多,结果把自己搞晕了,编译安装的时候还老是出现各种错误。最后查阅官方文档才发现,自行安装新版本的gcc并不复杂,根本没有那些教程中说的那样繁琐(有些教程居然还要修改几个配置文件)。 1、下载gcc安装文件 在安装gcc当然要先拿到gcc的安装文件。在这里我们直接通过官方下载gcc-4.9.0.tar.bz2(86 MB)。当然,你也可以下载gcc-4.9.0.tar.gz(110 MB),不过该压缩文件要大出不少。 2、编译前的准备工作 想要安装gcc 4.8及以上版本,你需要先安装C标准库和头文件,以及旧版本的c

LLVM 编译器基础架构

前提是你 提交于 2019-12-05 06:16:47
LLVM 编译器基础架构 1. LLVM 概述 2. LLVM特性 3. LLVM系统的优势 4. LLVM 用处 5. 最新 LLVM 发行版 6. 了解更多 本文为译文,点击 此处 查看原文。 1. LLVM 概述 LLVM 项目是模块化、可重用的编译器和工具链技术的集合。尽管名为 LLVM,但它与传统虚拟机几乎没有什么关系。名称 “LLVM” 本身并不是缩写;它是项目的全称。 LLVM 最初是 伊利诺伊大学 的一个 研究项目 ,其目标是提供一种现代的、基于 SSA 的编译策略,能够支持任意编程语言的静态和动态编译。从那时起,LLVM 已经成长为一个由许多子项目组成的伞形项目,其中许多子项目被各种各样的 商业和开源项目 用于生产,并被广泛用于 学术研究 。LLVM 项目中的代码是在 “Apache 2.0许可下使用 LLVM 例外” 许可的。 LLVM的主要子项目有: LLVM Core 库提供了一个现代的独立于源和目标的 优化器 ,以及对许多流行 CPU(以及一些不太常见的CPU)的 代码生成支持 !这些库是围绕一个 良好指定 的代码表示构建的,该代码表示称为 LLVM 中间表示( “LLVM IR” )。LLVM Core 库有很好的文档说明,而且特别容易发明自己的语言(或移植现有编译器)来使用 LLVM 作为优化器和代码生成器 。 Clang 是一个“LLVM 原生” C

LLVM编译原理和使用

你说的曾经没有我的故事 提交于 2019-12-05 06:16:34
LLVM 简介: LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。 LLVM最早的时候是Illinois的一个研究项目,主要负责人是Chris Lattner,他现在就职于Apple. Apple 目前也是llvm项目的主要赞助者之一。 在理解LLVM时,我们可以认为它包括了一个狭义的LLVM和一个广义的LLVM。广义的LLVM其实就是指整个LLVM编译器架构,包括了前端、后端、优化器、众多的库函数以及很多的模块;而狭义的LLVM其实就是聚焦于编译器后端功能(代码生成、代码优化、JIT等)的一系列模块和库。 LLVM 优势: 传统编译器分三个阶段: 前端(Frontend)-- 优化器(Optimizer)-- 后端(Backend) 前端负责分析源代码,可以检查语法级错误,并构建针对语言的抽象语法树(AST);抽象语法树可以进一步转换为优化,最终转为新的表示方式,然后再交给让优化器和后端处理; 最终由后端生成可执行的机器码。 llvm 也分三个阶段,但是设计上略微的有些区别, LLVM不同的就是对于不同的语言它都提供了同一种中间表示:

GCC,LLVM,Clang编译器对比

倾然丶 夕夏残阳落幕 提交于 2019-12-05 06:16:16
在XCode中,我们经常会看到这些编译选项(如下图),有些人可能会有些茫然,本文将对GCC4.2、LLVM GCC 4.2、LLVM compliler 2.0三个编译选项进行一个详细的介绍。 GCC GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划的关键部分,亦是自由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器。 GCC 原名为 GNU C 语言编译器,因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语言。 LLVM LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种语言编译器的后台来使用。如果这样还比较抽象的话,介绍下 Clang 就知道了:Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。 LLVM历史 Apple

iOS编译过程的原理和应用

浪子不回头ぞ 提交于 2019-12-05 06:15:56
[http://blog.csdn.net/Hello_Hwc/article/details/53557308] 科普文,转载备用 前言 一般可以将编程语言分为两种, 编译语言 和 直译式语言 。 像C++,Objective C都是编译语言。编译语言在执行的时候,必须先通过编译器生成机器码,机器码可以直接在CPU上执行,所以执行效率较高。 像JavaScript, Python 都是直译式语言。直译式语言不需要经过编译的过程,而是在执行的时候通过一个中间的解释器将代码解释为CPU可以执行的代码。所以,较编译语言来说,直译式语言效率低一些,但是编写的更灵活,也就是为啥JS大法好。 iOS开发目前的常用语言是:Objective和 Swift 。二者都是编译语言,换句话说都是需要编译才能执行的。二者的编译都是依赖于Clang + LLVM. 篇幅限制,本文只关注Objective C,因为原理上大同小异。 可能会有同学想问,我不懂编译的过程,写代码也没问题啊?这点我是不否定的。但是,充分理解了编译的过程,会对你的开发大有帮助。本文的最后,会以以下几个例子,来讲解如何合理利用XCode和编译 __attribute__ Clang警告处理 预处理 插入编译期脚本 提高项目编译速度 对于不想看我啰里八嗦讲一大堆原理的同学,可以直接跳到本文的最后一个章节。 iOS编译

简述 LLVM 与 Clang 及其关系

此生再无相见时 提交于 2019-12-05 06:15:39
随着 Android P 的逐步应用,越来越多的客户要求编译库时用 libc++ 来代替 libstdc++。libc++ 和 libstdc++ 这两个库有关系呢?它们两个都是 C++ 标准库,libc++ 是针对 Clang 编译器特别重写的 C++ 标准库,而 libstdc++ 则是 GCC 的对应 C++ 标准库了。从 Android 市场来说,Android NDK 已在具体应用中放弃了 GCC,全面转向 Clang,正如很早前 Android NDK 在 Changelog 中提到的那样: Everyone should be switching to Clang. GCC in the NDK is now deprecated. Android NDK 从 r11 开始建议大家切换到 Clang,并且把 GCC 标记为 deprecated,将 GCC 版本锁定在 GCC 4.9 不再更新; Android NDK 从 r13 起,默认使用 Clang 进行编译,但是暂时也没有把 GCC 删掉,Google 会一直等到 libc++ 足够稳定后再删掉 GCC; Android NDK 在 r17 中宣称不再支持 GCC 并在后续的 r18 中删掉 GCC,具体可见 NDK 的版本历史。 接下来,简要的介绍一下 Clang。Clang 是一个 C、C++