⑴ 如何开发一个符合 ansi-c 标准的c语言编译器

当今几乎所有的实用的编译器/解释器(以下统称编译器)都是用C语言编写的,有一些语言比如Clojure,Jython等是基于JVM或者说是用Java实现的,IronPython等是基于.NET实现的,但是Java和C#等本身也要依靠C/C++来实现,等于是间接调用了C。所以衡量某种高级语言的可移植性其实就是在讨论ANSI/ISO C的移植性。
C语言是很低级的语言,很多方面都近似于汇编语言,在《Intel 32位汇编语言程序设计》一书中,甚至介绍了手工把简单的C语言翻译成汇编的方法。对于编译器这种系统软件,用C语言来编写是很自然不过的,即使是像Python这样的高级语言依然在底层依赖于C语言(举Python的例子是因为Intel的黑客正在尝试让Python不需要操作系统就能运行——实际上是免去了BIOS上的一次性C代码)。现在的学生,学过编译原理后,只要有点编程能力的都可以实现一个功能简单的类C语言编译器。
可是问题来了,不知道你有没有想过,大家都用C语言或基于C语言的语言来写编译器,那么世界上第一个C语言编译器又是怎么编写的呢?这不是一个“鸡和蛋”的问题……
还是让我们回顾一下C语言历史:1970年Tomphson和Ritchie在BCPL(一种解释型语言)的基础上开发了B语言,1973年又在B语言的基础上成功开发出了现在的C语言。在C语言被用作系统编程语言之前,Tomphson也用过B语言编写过操作系统。可见在C语言实现以前,B语言已经可以投入实用了。因此第一个C语言编译器的原型完全可能是用B语言或者混合B语言与PDP汇编语言编写的。我们现在都知道,B语言的执行效率比较低,但是如果全部用汇编语言来编写,不仅开发周期长、维护难度大,更可怕的是失去了高级程序设计语言必需的移植性。所以早期的C语言编译器就采取了一个取巧的办法:先用汇编语言编写一个C语言的一个子集的编译器,再通过这个子集去递推完成完整的C语言编译器。详细的过程如下:
先创造一个只有C语言最基本功能的子集,记作C0语言,C0语言已经足够简单了,可以直接用汇编语言编写出C0的编译器。依靠C0已有的功能,设计比C0复杂,但仍然不完整的C语言的又一个子集C1语言,其中C0属于C1,C1属于C,用C0开发出C1语言的编译器。在C1的基础上设计C语言的又一个子集C2语言,C2语言比C1复杂,但是仍然不是完整的C语言,开发出C2语言的编译器……如此直到CN,CN已经足够强大了,这时候就足够开发出完整的C语言编译器的实现了。至于这里的N是多少,这取决于你的目标语言(这里是C语言)的复杂程度和程序员的编程能力——简单地说,如果到了某个子集阶段,可以很方便地利用现有功能实现C语言时,那么你就找到N了。下面的图说明了这个抽象过程:

那么这种大胆的子集简化的方法,是怎么实现的,又有什么理论依据呢?先介绍一个概念,“自编译”Self-Compile,也就是对于某些具有明显自举性质的强类型(所谓强类型就是程序中的每个变量必须声明类型后才能使用,比如C语言,相反有些脚本语言则根本没有类型这一说法)编程语言,可以借助它们的一个有限小子集,通过有限次数的递推来实现对它们自身的表述,这样的语言有C、Pascal、Ada等等,至于为什么可以自编译,可以参见清华大学出版社的《编译原理》,书中实现了一个Pascal的子集的编译器。总之,已经有计算机科学家证明了,C语言理论上是可以通过上面说的CVM的方法实现完整的编译器的,那么实际上是怎样做到简化的呢?这张图是不是有点熟悉?对了就是在讲虚拟机的时候见到过,不过这里是CVM(C Language Virtual Machine),每种语言都是在每个虚拟层上可以独立实现编译的,并且除了C语言外,每一层的输出都将作为下一层的输入(最后一层的输出就是应用程序了),这和滚雪球是一个道理。用手(汇编语言)把一小把雪结合在一起,一点点地滚下去就形成了一个大雪球,这大概就是所谓的0生1,1生C,C生万物吧?

附上出处链接:http://www.csdn.net/article/2015-11-27/2826350

⑵ 什么是ANSI C,为什么学习C语言要以它为标准

ANSI即American National Standards Institute,美国国家标准学会。制定过很多的标准,为相关领域的科学与技术发展做出了巨大的贡献。
ANSI C即有由ANSI 制定的C语言的标准,最早的C语言的标准就是由ANSI所提出来的,该标准档后来被国际标准化组织(ISO)点赞并且ISO发布的修订版也被ANSI点赞了,所以名称ANSI C(而不是 ISO C)被广泛使用。
有了这样的标准,我们在一个平台或者语言工具里编写的C语言代码才可以几乎不做修改的在其他平台或者语言工具里运行出同样的结果来。
但是ANSI C仅仅包含C语言核心,与所运行的硬件平台几乎无关,从而难以完成在任何实际平台实用的应用程序的开发。因此,任何一个C语言的编译工具,如TC、VC等都对ANSI C进行了扩充,根据所在系统平台,加入了自己的规则和库之类的。

⑶ ansi在C语言里面是什么意思

C语言 由ANSI标准定义的32个关键字由ANSI标准定义的共32个 : auto double int struct break else long switch case enum register typedef char extern return union cons

⑷ 什么是ANSI C

ANSI C是美国抄国家标准协会(ANSI)对 C语言发布的标准。使用C的软件开发者被鼓励遵循ANSI C文档的要求,因为它鼓励使用 跨平台的代码。

C 的第一个标准是由ANSI发布的。虽然这份文档后来被国际标准化组织(ISO)点赞并且ISO发布的修订版也被ANSI点赞了,但名称ANSI C(而不是 ISO C)仍被广泛使用。一些软件开发者使用 ISO C,还有一些使用 Standard C。

(4)ansic语言扩展阅读:

主要编译器的支持

ANSI C现在被几乎所有广泛使用的编译器支持。现在多数C代码是在ANSI C基础上写的。任何仅仅使用标准C并且没有任何硬件依赖假设的代码实际上能保证在任何 平台上用遵循C标准的编译器编译成功。如果没有这种预防措施,多数程序只能在一种特定的 平台或特定的编译器上编译,例如,使用非标准库,例如图形用户界面库,或者有关编译器或平台特定的特性例如 数据类型的确切大小和字节序。

⑸ C语言里有ANSIC语言这个说法吗

这也就是C语言的了,就是如你所说的,国际标准的!ANSI是一个国际组织的,很多方面的相关规定都有它哦~~~要知道C也是很多种的,而各种C的类型风格多少也所不同,有的语法别的C允许,而另一种C又是禁止的,这样就会出现移植到不同平台的兼容性降低~~~~所以要有一种大家都认可的标准化的C,所以ANSI组织就Do it!呵呵,我知道就这么多了!

⑹ c语言中怎么把字符转成对应的ansic码

不用转……它在内存中就是以ASCII存的,你在printf的时候用%d输出就行了
例如
main()
{
char c='A';
printf("%c\n",c); //这行输出的是A
printf("%d\n",c); //这行输出的是65
return 0;
}
你可以直接把字符当成数字来用,这样说应该明白一点。

⑺ ANSI C语言标准

由ANSI标准定义的C语言关键字共32个 :
auto double int struct break else long switch
case enum register typedef char extern return union
const float short unsigned continue for signed void
default goto sizeof volatile do if while static
根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。
1 数据类型关键字
A基本数据类型(5个)
void :声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
char :字符型类型数据,属于整型数据的一种
int :整型数据,通常为编译器指定的机器字长
float :单精度浮点型数据,属于浮点数据的一种
double :双精度浮点型数据,属于浮点数据的一种
B 类型修饰关键字(4个)
short :修饰int,短整型数据,可省略被修饰的int。
long :修饰int,长整形数据,可省略被修饰的int。
signed :修饰整型数据,有符号数据类型
unsigned :修饰整型数据,无符号数据类型
C 复杂类型关键字(5个)
struct :结构体声明
union :共用体声明
enum :枚举声明
typedef :声明类型别名
sizeof :得到特定类型或特定类型变量的大小
D 存储级别关键字(6个)
auto :指定为自动变量,由编译器自动分配及释放。通常在栈上分配
static :指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
register :指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
extern :指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的韵蟮囊桓觥耙

⑻ ansic c语言和turbo c语言有什么区别

ANSI C 是美国 American National Standards Institute (ANSI) 出版的C语言标准。

凡只用ANSI C 写的程序,所有编译器,MS VC++, Turbo C 等都支持。

Turbo C 除支持ANSI C外,还增加了许多别的东西(别的库函数),例如绘图函数。TC 的绘图函数 TC 支持, 别的编译器不支持。同样 MS VC++ 增加的绘图函数,TC 不支持。

可以说 ANSI C 是基础的 简单的 “标准的” C,其它的 C 是扩充扩展了的C.

⑼ ANSI C编程什么意思,跟我们现在学的c/c++有什么不同

ANSI C是一个标准,美国国家标准协会制定的一个C语言的标准~

补充:C语言与C++的区别有很多:
1,全新的程序程序思维,C语言是面向过程的,而C++是面向对象的。
2,C语言有标准的函数库,它们松散的,只是把功能相同的函数放在一个头文件中;而C++对于大多数的函数都是有集成的很紧密,特别是C语言中没有的C++中的API是对Window系统的大多数API有机的组合,是一个集体。但你也可能单独调用API。
3,特别是C++中的图形处理,它和语言的图形有很大的区别。C语言中的图形处理函数基本上是不能用在中C++中的。C语言标准中不包括图形处理。
4,C和C++中都有结构的概念,但是在C语言中结构只有成员变量,而没成员方法,而在C++中结构中,它可以有自己的成员变量和成员函数。但是在C语言中结构的成员是公共的,什么想访问它的都可以访问;而在VC++中它没有加限定符的为私有的。 4,C语言可以写很多方面的程序,但是C++可以写得更多更好,C++可以写基于DOSr程序,写DLL,写控件,写系统。
5,C语言对程序的文件的组织是松散的,几乎是全要程序处理;而c 对文件的组织是以工程,各文件分类明确。
6,C++中的IDE很智能,和VB一样,有的功能可能比VB还强。
7,C++对可以自动生成你想要的程序结构使你可以省了很多时间。有很多可用的工具如加入MFC中的类的时候,加入变量的时候等等。
8,C++中的附加工具也有很多,可以进行系统的分析,可以查看API;可以查看控件。 9,调试功能强大,并且方法多样。

⑽ c语言标准是什么意思,什么ansi utf8是什么

ANSI C是美国国家标准协会(ANSI)对C语言发布的标准。使用C的软件开发者被鼓励遵循ANSI C文档的要求,因为它鼓励使用跨平台的代码。

C语言 由ANSI标准定义的32个关键字由ANSI标准定义的共32个 : auto double int struct break else long switch case enum register typedef char extern return union cons

UTF8是一种储存和传送的格式,如前所述,每个Unicode/UCS字符都以 2或4个bytes来储存,看看以下的比较:

以"I am Chinese"为例
用ANSI储存:12 Bytes
用Unicode/UCS2储存:24 Bytes + 2 Bytes(header)
用UCS4储存:48 Bytes + 4 Bytes(header)

以"我是中国人"为例
用ANSI储存:10 Bytes
用Unicode/UCS2储存:10 Bytes + 2 Bytes(header)
用UCS4储存:20 Bytes + 4 Bytes(header)

由此可见直接以Unicode/UCS的原始形式来储存是一种极大的浪费,而且也不利于互联网的传输(中文稍为合算一点^_^)。

有见及此,Unicode/UCS的压缩形式--UTF8出现了,套用官方网站的首句话『UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.』,由于UTF也适用于编码UCS,故亦可称为『UCS transformation formats (UTF)』

UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中。