标签:
C语言诞生于1970年,当时在AT&T实验室由Dennis Ritchie主导开发的。据说当时仅用了一周的时间就做好了C语言编译器,所以尽管C语言从90年正式纳入ISO标准委员会,其编号为ISO/IEC 9899。尽管经历了C99与C11标准的修改历程,但为了向前兼容,有一些比较古怪的特性依然被保留。
现在除了C语言,还诞生了许许多多的其它高级编程语言,而且大多都具有面向对象的特性。而C语言以其间接、灵活、干练而得到了系统级应用开发的首选编程语言,尤其是嵌入式系统上应用更多。然而,为了使原本已经设计精良的C语言能在整个语法体系上更具完备性,并且更与时俱进,我这里畅想一下二十一世纪的新C语言应该考虑改良的语法特性,我暂时先把这个划时代的C语言称为CNeo。这里不考虑与现有C语言的语法兼容,但一定能做到二进制兼容。CNeo的源文件后缀名暂时用.cn来表示。
CNeo编程语言将更直观地基于对象,但它仍然不是一门面向对象的编程语言,然而这使CNeo更适合于底层的系统级编程,并且仍然能保持对汇编API的良好兼容性。此外,CNeo将引入C++11标准中的类型推导特性以及Swift那种后置类型设计。CNeo中将引入关键字obj来声明一个对象,每个对象会有系统内置的属性可用于查询获取相关的地址、类型、类型名、占用存储大小等。下面将举一些例子来说明一下。
obj a = 100; // 对象a的类型为int obj f = 10.5f; // 对象f的类型为float obj d: double = -10; // 对象d的类型为double printf("size of a is: %ul\n", a.size); printf("address of f is: %ul", f.address.value); printf("type of d is: %s\n", d.typename); obj c: f.type = f + a; // 声明了一个对象c,其类型为float
下面将简单介绍一下CNeo其它一些主要特性:
1、真正的布尔类型:在C99标准中就引入了_Bool关键字,并引入了头文件,使得C语言也有了布尔类型。但其骨子里仍然没有真正的布尔类型。就好比说下面代码:
obj a = 10; // a不是一个布尔类型对象,但仍然能作为if、while等表达式来用 if(a) a--;
所以,我打算在CNeo中真正引入布尔类型——bool,并且它是一个原生类型,不需要这样的头文件。除此之外,在整个语法体系中只有布尔类型表达式才能作为if、while语句的表达式。比如以下代码:
obj a = 10; if (a) // 这里error!a不是一个布尔类型,不能作为if语句的表达式 a++; if (a > 0) // 这里OK! a++; obj b: bool = a > 10; if (b) // 这里OK!布尔对象可以作为if语句的表达式 a++;
2、更规范的整数与浮点类型:现在对整数类型的定义比较杂乱。由于早些时候C语言中使用int、short、char、long、long long等来表示一个整数对象的长度的。这里,对于不同系统环境,对这些类型的长度可能各不相同。比如在一个8位单片机中,一个int才1个字节;一个long类型为2个字节;而在现在32位系统中,一个int为4个字节;一个long也为4个字节;而在64位系统中又复杂了,在VC中,long仍然为4字节,但在GCC、Clang编译器中,long则为8个字节。正由于这种系统不确定性,所以在C99标准中引入了头文件,其中定义了int8_t、int16_t、int32_t、int64_t以及它们对应的无符号形式来指明当前整型对象的长度。
在CNeo中,去除了这种头文件,并仅引入这些整数类型——uint8、int8、uint16、int16、uint32、int32、uint64、int64、uint、int、ulong、long、intptr。这些类型分别表示无符号8位整数、带符号8位整数、无符号16位整数、带符号16位整数、无符号32位整数、带符号32位整数、无符号64位整数、带符号64位整数、能用于快速计算的最大无符号整数、能用于快速计算的最大带符号整数、当前环境可表示的最大无符号整数、当前环境可表示的最大带符号整数、能用于存放地址值的无符号整数。这样一来就可以把神马size_t、ptrdiff_t等杂七杂八的类型全都剔除了。使得整个基本整数类型变得干净、整洁。
这里,对于存在系统差异性的就两对类型,一对是uint和int,另一对是ulong和long,还有一个是intptr正如上面所描述的,uint和int一般表示当前处理器的寄存器宽度,如果寄存器是32位的且能做快速的算术逻辑计算,那么它就是32位的;倘若在8位的单片机中,寄存器宽度是8位的,那么它们就是8位的。通常在32位系统下,uint和int为32位;在64位系统下,它们仍然为32位。而ulong和long用于存放当前系统的最大可表示的整数值。intptr则用于存放当前系统的指针值和地址值,一般在32位系统下,地址值为32位,所以它们为32位;而在64位系统下,地址值为64位,所以它们为64位。
除此之外,字符类型分别为:char、char16与char32,分别表示UTF-8、UTF16与UTF-32编码格式。
浮点类型则分别为:half、float、double、quad。其中,float与double分别表示传统的单精度与双精度浮点。而half与quad分别表示IEEE754-2008标准中新引入的半精度与128位精度浮点。此外,quad也用于取代之前的long double,可用于存放x87 FPU的扩展双精度浮点数(80位)。
3、引入当前Objective-C已经使用的module机制。这个在很大程度上能防止名字空间的污染。不过,module机制主要以一种特殊的库的形式出现。在应用程序中使用import关键字来引用模块,倘若引入的几个模块含有相同名称的函数名以及外部自定义类型名,那么可以使用模块名 . 符号名来引用特定模块的符号。比如:
import moduleA; import moduleB; func main(argc: int, argv: ptr<ptr<const char>>) { // 假定funcA是moduleA模块独有的 funcA(); // 假定funcB是moduleA和moduleB都有的 moduleA.funcB(); // 调用moduleA的funcB moduleB.funcB(); // 调用moduleB的funcB }
4、更直观的指针形式。在C语言中用星号表示对指针对象的声明,在表达式中则用于表示间接操作符。而在CNeo中,我们直接用ptr关键字来表示指针对象。比如,C语言中的int *p,在CNeo中可用ptr<int> p来表示。我们下面来例举一些例子来说明新指针形式的使用方式以及其特性。
obj a = 100; obj p: ptr<int> = a.address; // 这里,ptr<int>表示指向int的指针类型;a.address则表示a的地址值 p.memory = 200; // 这里相当于C语言中的*p = 200; 此时a对象的值变为200 object q = a.address; // 这里也可以用object,如果指针所指类型能被推导出来的话 obj c: const int = 20; obj cp: ptr<const int> = c.address; // cp为指向一个const int对象的指针 obj co: const ptr<int> = a.address; // co为指向一个int对象的常量指针 obj cop: const ptr<const int> = c.address; // cop为指向一个const int对象的常量指针 // pp表示为一个指向ptr<int>对象的指针,即相当于C语言中的int **pp obj pp: ptr<ptr<int>> = p.address; // 一个指针对象具有value属性,表示该指针的值,即该指针所指对象的地址 obj addr: intptr = p.value;
5、
标签:
原文地址:http://www.cnblogs.com/zenny-chen/p/5385257.html