当前位置:首页 » 编程软件 » c0编译器怎么用

c0编译器怎么用

发布时间: 2024-03-13 22:39:39

A. c语言如何把一个字符串格式的二进制数转化为整数型的十进制数

首先要说,在计算机里面不存在十进制数。我们看到的输出的十进制数,其实是C编译器把真正的二进制数的数值以十进制形式显示在屏幕上。如果说计算机里面有十进制数的话,那么BCD数可以算是一种形式的十进制数。
而题目中的字符串格式的二进制数,也就是一串的'0','1'字符;转化为整数型其实就是求得其实际数值,最后以十进制形式输出。
#include <stdio.h>
int main()
{
long int m;
char c0[50],*c ;
while(scanf("%s",c0)!=EOF){
m = 0;c=c0;
while(*c)
m += (m + *(c++)-'0');
printf("%d\n",m);
}
return 0;
}

B. C语言这么厉害,它自身又是用什么语言写的编写过程被称为自举

来自一个小白的提问: “C语言本身用什么语言写的?”

换个角度来问,其实是:C语言在运行之前,得编译才行,那C语言的编译器从哪里来?用什么语言来写的?如果是用C语言本身来写的,到底是先有蛋还是先有鸡?

我们假设世界上不存在任何编译器, 先从机器语言说起,看看怎么办。

机器语言可以直接被CPU执行,不需要编译器。

然后是汇编语言, 汇编语言虽然只是机器语言的助记符,但是也需要编译成机器语言才能执行,没办法只能用机器语言来写这第一个编译器了(以后就不用了)。

汇编语言的问题解决了,就往前迈进了一大步,这时候就可以用汇编语言去写C语言的编译器,我们说这是C编译器的老祖宗。

有了这个老祖宗,就可以编译任意的C语言程序了,那是不是可以用C语言本身写一个编译器?只要用老祖宗编译一下就可以了。

OK, 这么一层层上来,终于得到了一个用C语言写的编译器, 真是够麻烦的。

到这个时候,之前那个汇编写的C语言编译器就可以抛弃了。

当然,如果在C语言之前,已经出现了别的高级语言,例如Pascal,那就可以用Pascal来写一个C语言的编译器。

第一个Pascal的编译器据说使用Fortran写的。而作为第一个高级语言的Fortran,它的编译器应该是汇编语言写的。

关于编译器,这里边有个有趣的传说:

传说Unix 发明人之一的 Ken Thompson在贝尔实验室,大摇大摆的走到任何一台Unix机器前,输入自己的用户名和密码,就能以root的方式登录!

贝尔实验室人才济济,另外一些大牛发誓要把这个漏洞找出来,他们通读了Unix的C源码,终于找到了登录的后门, 清理后门以后编译Unix , 运行, 可是Thompson 还是能够登录进去。

有人觉得可能是编译器中有问题,在编译Unix的时候植入了后门, 于是他们又用C语言重新写了一个编译器,用新的编译器再次编译了Unix, 这下总算天下太平了吧。

可是仍然不管用, Thompson 依然可以用root登录,真是让人崩溃!

后来Thompson 本人解开了秘密,是第一个C 语言编译器有问题, 这个编译器在编译Unix源码的时候,当然会植入后门, 这还不够,更牛的是,如果你用C 语言写了一个新编译器,肯定也需要编译成二进制代码啊,用什么来编译,只有用Thompson写的那第一个编译器来编译,好了, 你写的这个编译器就会被污染了,你的编译器再去编译Unix , 也会植入后门 :-)

说到这里我就想起了几年前的XcodeGhost 事件,简单来说就是在Xcode(非官方渠道下载的)中植入了木马,这样XCode编译出的ios app都被污染了,这些app就可以被黑客利用做非法之事。

虽然这个XCodeGhost和Thompson的后面相比差得远,但是提醒我们,下载软件的时候要走正规渠道,从官方网站下载,认准网站的HTTPS标准,甚至可以验证一下checksum。

可能有人问:我用汇编写一段Hello World都很麻烦,居然有人可以用它写复杂的编译器?这可能吗?

当然可能,在开发第一代Unix的时候,连C语言都没有, Ken Thompson 和 Dennis Ritchie 可是用汇编一行行把Unix敲出来的。 WPS第一版是求伯君用汇编写出来的, Turbo Pascal 的编译器也是Anders 用汇编写出来的,大神们的能力不是普通人能想象得到的。

对于编译器来说,还可以采用“滚雪球”的方式来开发:

还是以C语言为例,第一个版本可以先选择C语言的一个子集,例如只支持基本的数据类型,流程控制语句,函数调用...... 我们把这个子集称为C0。

然后用汇编语言写个编译器,只搞定这个语言的子集C0,这样写起来就容易不少。

C0这个语言可以工作了,然后我们扩展这个子集,例如添加struct,指针...... ,把新的语言称为C1。

那C1这个语言的编译器由谁来写? 自然是C0。

等到C1可以工作了,再次扩展语言特性,用C1写编译器,得到C2。

然后是C3, C4...... 最后得到完整的C语言。

这个过程被称为bootstraping , 中文叫做自举。

对于热爱编程的人来说,有一群一起学习一起解答的小伙伴很重要!

这里有一个 C/C++编程学习交流俱乐部 (群),私信我【01】进入!

还有编程学习文件(源码,零基础教程,项目实战教学视频),欢迎初学者和正在进阶中的小伙伴们!

C. 在DSP的TMS320F2812编程中c编译器の作用是什么。在连链接器中使用的cmd文件的作用是什

DSP芯片以其极高的精度,性能及运算速度等无与伦比的优点使它得到了十分广泛的应用,TMS320F2812是TI公司生产的到目前为止用于数字控制领域的最好的DSP芯片,在对它的仿真开发过程中,编译器生成的代码和数据要由链接器分配到合适的存储空间,通常链接器的命令文件.cmd文件是由用户自己编写的,编写不当,就会使仿真开发不能进行,TI公司虽然在《TMS320C28x Optimizing C/C++ Compiler User’s Guide 6》和《TMS320C28x Assembly Language Tools User’s Guide 6》做了介绍,但内容却比较散乱而且要求读者对整个开发系统要有较全面的认识,这对于初学者来说是比较困难的。下面以TMS320F2812芯片为例,结合具体的仿真调试实例加以说明使大家能够既快速又准确的掌握.cmd文件的分配方法。

1存储空间的配置
TMS320F2812的DSP存储器分为三个独立选择的空间-程序空间、数据空间和I/O空间,其中程序存储器存放待执行的指令和执行中所用的系数(常数),可使用片内或片外的RAM、ROM或EPROM等来构成;数据存储器存放指令执行中产生的数据,可使用片内或片外
的RAM和ROM来构成;I/O存储器存放与映象外围接口相关的数据,也可以作为附加的数据存储空间使用。表1是TMS320F2812的存储空间分布。

2CMD文件的分配方法
TI公司新的汇编器和链接器创建的目标文件采用一种COFF(通用目标文件格式),该目标文件格式更利于模块化编程,为管理代码段和目标系统存储器提供了强有力和灵活的编程方法。用户可以通过编写链接命令文件(.cmd文件)将链接信息放在一个文件中,以便在多次使用同样的链接信息时调用。在命令文件中使用两个十分有用的伪指令MEMORY和SECTIONS,来指定实际应用中的存储器结构和进行地址的映射。Memory用来指定目标存储器结构,Memory下可以通过PAGE选项配置地址空间,链接器把每一页都当作一个独立的存储空间。通常情况下,PAGE0代表程序存储器用来存放程序,PAGE1代表数据存储器,用来存放数据。由编译器生成的可重定位的代码和数据块叫做“SECTIONS”(段),SECTIONS用来控制段的构成与地址分配。对于不同的系统配置,“SECTION”的分配方式也不相同,链接器通过“SECTIONS”来控制地址的分配,所以“SECTIONS”的分配就成了配置.cmd文件的重要环节。以下是对“SECTIONS”的定义及分配的详细介绍。
(1)
被初始化的“SECTIONS”(包括数据表和可执行代码)
.text它包括所有的可执行代码和常数,必须放在程序页;
.cinit它包括初始化的变量和常量表,要求放在程序页;
.pinit它包括全局构造器(C++)初始化的变量和常量表,要求放在程序页;
.const它包括字符串、声明、以及被明确初始化过的全局和静态变量,要求放在低地址的数据页;
.econst它是在使用大存储器模式时使用的,包括字符串、声明、以及被明确初始化过的全局变量和静态变量,可以放在数据页的任何地方。
.switch它包括为转换声明设置的表格,可以放在程序页也可以放在低地址的数据页。
(2)未被初始化的“SECTIONS”(为程序运行中创建和存放的变量在存储器中保留空间)
.bss它为全局变量和静态变量保留空间。在程序开始运行时,C导入路径把数据从.cinit节复制出去然后存在.bss节中,要求放在低地址的数据页;
.ebss它是在远(far)访问(只用于C)和大存储模式下使用,它为全局变量和静态变量保留空间。在程序开始运行时,C导入路径把数据从.cinit段复制出去然后存在.ebss节中,可以放在数据页的任何地方;
.stack为C系统堆栈保留空间,这部分存储器为用来将声明传给函数及为局部变量留出空间,要求放在低地址的数据页;
.system动态存储器分配保留空间。这个空间用于malloc函数,如果不使用malloc函数,这个段的大小就是0,要求放在低地址的数据页;
.esystem动态存储器分配保留空间,这个空间用于外部malloc函数,如果不使用外部malloc函数,这个段的大小就是0,可以放在数据页的任何地方。

3举例说明.cmd文件的分配方法
以下是仿真调试串行通信接口SCI时的.cmd文件的分配,已经在TMS320F2812仿真调试中得到了很好的应用。
MEMORY

{PAGE0:
/*ProgramMemory*/

RAMH0:origin=0x3F8000,length=0x001000

RAML0:origin=0x008000,length=0x001000

RAML1:origin=0x009000,length=0x001000

ROM:
origin=0x3FF000,length=0x000FC0

RESET: origin="0x3FFFC0",length=0x000002M

VECTORS:origin=0x3FFFC2,length=0x00003EM

PAGE1:/*DataMemory*/

RAMM0:origin=0x000000,length=0x000400

RAMM1:origin=0x000400,length=0x000400

RAMH0:origin=0x3F9000,length=0x001000
,,,
}

SECTIONS
{/*Allocateprogramareas:*/

.cinit
:>RAMH0
PAGE=0

.pinit
:>RAMH0
PAGE=0

.text
:>RAMH0
PAGE=0

.reset
:>RESET,PAGE=0,TYPE=DSECT

Vectors :>VECTORS,PAGE=0,TYPE=DSEC

/*:*/

.stack
:>RAMM0
PAGE=1

.ebss
:>RAMH0
PAGE=1

.esysmem :>RAMH0
PAGE=1

.econst :>RAMM1
PAGE=1

.switch :>RAMM1
PAGE=1

,,,
}
为充分利用18k×16位的SARAM,本例将高地址的8k×16位的H0 SARAM区分成两部分,一部分用做存放程序放在PAGE0里,一部分用做存放数据放在PAGE1中以达到合理的分配;对实际仿真调试过程中的外围帧frame0,frame1,frame2等的分配因为篇幅问题就不做具体介绍了。
4查看段的分配及使用情况
在cmd文件中包括各种各样的链接器选项,每种选项代表不同的含义。其中,使用-m选项可以创建一个扩展名为.map的链接器(存储器)分配映射文件,其语法为:-m filename(文件名)。链接器的map文件描述以下内容:
存储器结构输入和输出段的定位在重新定位后外部符号的地址
通过map文件可以查看各段的分配情况,包括段的起始地址,使用的字节数等配合cmd文件的使用,可确定各个段的使用情况,从而保证程序的正常运行和最小的空间使用。
5 VisualLinker可视化链接器
TI公司出品的DSP软件开发环境CCS还提供了一种可视化生成存储器配置文件的工具:VisualLinker可视化链接器。如果程序原来包含了一个链接器命令文件(.cmd文件),则当创
建可视化链接文件的时候,原来cmd文件中的内存配置仍然会被使用。如果读者想修改内存配置,双击.rcp文件就会在CCS中打开可视化链接器的图形界面,调整每个内存模块的大小,直到认为合适,然后只需要重新连编,程序即可生成新的输出文件,重复上面的步骤,直到出现满意的结果。

D. C语言是由什么语言编写而成的

我想,你问的是 C语言编译器 是用什么语言写的。
概括说,当今几乎所有的实用的编译器/解释器都是用C语言编写的,有一些语言比如Clojure,Jython等是基于JVM或者说是用Java实现的,IronPython等是基.NET实现的,但是Java和C#等本身也要依靠C/C++来实现,等于是间接调用了C。
世界上第一个C语言编译器,是在B语言基础上,用B语言与PDP汇编语言 编写的。开发过程是先用汇编写了一个最基本功能的子集C0,利用自编译Self-Compile功能,或虚拟机CVM(C Language Virtual Machine)功能,增添新的东西,变C1, 按此法多次增添发展,滚雪球般用汇编把小雪球揉到一起,1生2,2生3,...成了C。C 再生万物。
这里,该向C语言之父Dennis Ritchie(丹尼斯·里奇)致敬。

热点内容
vb软件加密 发布:2024-11-15 21:17:23 浏览:595
本地ip可以搭服务器吗 发布:2024-11-15 21:04:27 浏览:162
阿里巴巴python 发布:2024-11-15 20:56:25 浏览:783
博图脚本编辑 发布:2024-11-15 20:41:06 浏览:313
带密码的箱子钥匙在哪里 发布:2024-11-15 20:40:12 浏览:236
两个次梁相交怎么配置 发布:2024-11-15 20:27:35 浏览:373
android关机实现 发布:2024-11-15 20:26:42 浏览:56
木糠压缩原理 发布:2024-11-15 20:22:53 浏览:654
编译原理难以理解的问题 发布:2024-11-15 20:11:25 浏览:131
安卓9是什么水平 发布:2024-11-15 20:06:57 浏览:185