Plan9的C编译器

Plan9的C编译器有什么特别

对于分布式操作系统来说,需要能在那么多种CPU上进行运行,C编译器是尤其重要的。试想一下,如果你写了一个标准C的程序,需要在AMD64,ARM,Intel 86-32,MIPS,Motorola这么多CPU架构上都能运行,不是一个简单的事情。

plan9的C编译器要做的就是这么一个事情。How to Use Plan9 C Compiler http://doc.cat-v.org/plan_9/4th_edition/papers/comp 就是这么一篇文章详细说了Plan9的C编译器。

 

首先当然要给不同的CPU架构的不同的地方注册不同的信息。

Plan9的C编译器分为依赖系统的文件和不依赖系统的文件。依赖系统的文件有两个<ureg.h>和<u.h>。不同的CPU架构实质上不同的地方就在于寄存器和寻址方式。ureg.h就定义了不同的寄存器,u.h就定义了不同的寻址方式。

PS:在Go源码中的include文件夹下你会看到这两个文件。

其次是不同CPU架构的编译器名字

Plan 9 C Compiler http://doc.cat-v.org/plan_9/4th_edition/papers/compiler 这篇文章中有说到。其实Plan9的C 编译器实际上就包括了多个编译器,它给每个CPU架构起了一个单字母或者数字的名字,比如5是ARM,6是AMD64,8是Intel86-32。然后给编译器,汇编器,链接器分别取名c,a,l。于是就出现了8c,8l,8a这样的工具。

Buffer IO

操作系统的文件操作有两种:buffer IO和非buffer IO。buffer IO就是读取文件前都先将文件读取到内存中,然后从内存再输出或者从输入到内存中。由于内存的读写速度比磁盘快,所以Buffer IO是比非buffer IO快,但是有的不足是有可能会掉数据,这个也是由于内存中的数据是非持久化的。

标准的C库中是没有buffer IO的,于是plan9就有了一个<bio.h>专门负责buffer IO的功能。

PS: 在Go的inlude文件夹下你也会看到bio.h

Rune的概念

Rune是“字符”的概念。世界上的所有语言的字符在Unicode编码中已经分配了不同的编码,而且也有不同的字节长度。英语是1个字节长度,中文是3个字节长度。在plan9中不是使用char来表示字符,是使用rune来表示字符。字符是使用单引号来进行表示,比如"你"和'你'这两个是代表不同的含义,单引号的是你这个中文字符,双引号代表将你这个中文字符当作三个UTF-8的字符串。

Go和Plan9

Go语言的目标也是跨平台,和Plan9的目标是一样的,并且作者是同一个,所以Go的编译器和Plan9几乎是一样的,只是实现地并没有那么多CPU架构而已。预计以后也会支持越来与多架构的。

时间: 2024-12-21 09:18:24

Plan9的C编译器的相关文章

淘宝数据库OceanBase SQL编译器部分 源码阅读--Schema模式

淘宝数据库OceanBase SQL编译器部分 源码阅读--Schema模式 什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User?我们可以可以把Database看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的柜子,行和列就是柜子中的格子.User就是房间的主人.简单来说,Schema是包括表,列,索引,视图等数据库对象的集合. OceanBase中的强Sche

淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划

SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理执行计划.前两个步骤请参见我的博客<<淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树>>和<<淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划>>.这篇博客主要研究第三步,生成物理查询计划. 一. 什么是物理查询计划 与之前的阅读方法一致,这篇博客的两个主要问题是what 和how.那么什么是物理查询计划?物理查询计划能够直接执行并返回数据结果数

让UltraEdit成为java编译器

  1. ?        配置命令: 选择[高级]->[工具栏配置] ?        选择插入按钮进行命令添加: ?        依次填写命令内容: 解释:菜单项目名称:命令的名字,建议使用有代表性的文字.          命令行:在命令提示符下运行的命令,但是可以使用UltraEdit的参数.          工具栏位图/图标(文件路径):在工具栏显示的图标,最求美感的同志可以加上 我的配置如下: ?        在配置输出: 建议选择输出到列表框,默认为"追加到现有文件&q

如何设置c++ 编译器选线,禁用第三方库的警告

源地址:http://q.cnblogs.com/q/29557/ 问题描述: c++ 或者gcc选项如何设置,才能禁用第三方库的警告(比如boost库的警告).#pragma这种在源代码级别禁用警告的方法不算(这种方法不是我需要的).如果可以,cmake中如何设置(这个算另外一个问题吧.).(提问前,我已经google,baidu过了,没有找到有用的文献.) 解答: 建议的方式,在使用第三方库的时候创建一个新的头文件称为wrapper header ,包含第三方库的头文件,在你的wrapper

GCC编译器优化选项分析及具体优化了什么

问题 在使用gcc作为编译器.在设定编译条件时,在debug模式下生成的程序正常,但是在release模式下往往会出现很多种预料之外的结果,尤其在嵌入式环境中,程序在板子上运行的时候,问题就愈发明显. 为了了解具体为什么造成该问题,对两种模式下的配置做了对比 debug模式编译器参数为-O0 -g –Wall release模式编译器参数为-O2 -g –Wall 通过对比可以发现两种模式主要的不同在于编译器优化程度不同,那么编译器在两种优化下究竟做了什么优化那?现在我们来看看gcc编译器的优化

几款好的C/C++编译器(编译器而非IDE)

几个介绍IDE的博客: C/C++开发常用工具及系统编程 C/C++开发者必不可少的15款编译器+IDE C/C++圣战 大家说的都已经很多了,那么我在这里就不罗嗦口了,我着重讲下编译器. GCC(GNU Compiler Collection) 官方网站: https://gcc.gnu.org/ GCC有Windows移植版本,比较出名的就是MinGW和TDM-GCC MinGW :http://www.mingw.org/ TDM-GCC: http://tdm-gcc.tdragon.n

编译器的工作过程

源码要运行,必须先转成二进制的机器码.这是编译器的任务. 比如,下面这段源码(假定文件名叫做test.c). #include <stdio.h> int main(void) { fputs("Hello, world!\n", stdout); return 0; } 要先用编译器处理一下,才能运行. $ gcc test.c $ ./a.out Hello, world! 对于复杂的项目,编译过程还必须分成三步. $ ./configure $ make $ make

windows,c语言编译器,如何安装第三方库,

问题描述 windows,c语言编译器,如何安装第三方库, 具体来说,我在windows下给cfree安装xmllib2,下了个文件夹,里面有bin,include,lib三个文件夹,我的做法是,把这三个文件夹里的内容复制到cfree对应的文件夹里面去.果然需要用到库的代码可以编译通过了,但是在链接的时候报错,所有的库函数都提示未定义.例如"undefined reference to 'xmlReadFile'". 实在不知所措,求助. 解决方案 python在windows下安装第

GCC性能优越的多平台编译器详解

不经意间,GCC已发展到了4.3的版本,尽管在软件http://www.aliyun.com/zixun/aggregation/36661.html">开发社区之外乏人闻问,但因为GCC在几乎所有开源软件和自由软件中都会用到,因此它的编译性能的涨落会直接影响到Linux .Firefox 乃至于OpenOffice.org和Apache等几千个项目的开发.因此,把GCC摆在开源软件的核心地位是一点也不为过.另一方面,GCC4.3的出现,正在牵引着广大程序员们的心.如果我们非要用一个词来说