关于次世代C编程语言改进畅想

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、

时间: 2024-07-29 02:02:02

关于次世代C编程语言改进畅想的相关文章

编程语言历史

1940之前 第一个编程语言比现代的计算机还早诞生.首先,这种语言是种编码(en:code). 于1801年发明的提花织布机(或称甲卡提花织布机,英文:en:Jacquard loom),运用打孔卡上的坑洞来代表缝纫织布机的手臂动作,以便自动化产生装饰的图案. Ada Lovelace在1842年至1843年间花费了九个月,将意大利数学家Luigi Menabrea关于查尔斯·巴贝奇新发表机器分析机的回忆录翻译完成.她于那篇文章后面附加了一个用分析机计算伯努利数方法的细节,被部分历史学家认为是世

一 面向对象定义

一 面向对象的由来 一.概述 二.详细发展历史 二 什么是面向对象设计以及为什么要有面向对象 三 类与对象 四 属性查找 五 绑定到对象方法的特殊之处 六 对象之间的交互 一 面向对象的由来 一.概述 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 0 和 1 的序列来代表程序语言.例如:使用 0000 代表 加载(LOAD),0001 代表 存储(STORE)等. 机器语言由机器直接执行,速度快,

python 面向对象设计思想发展史

这篇主要说的是程序设计思想发展历史,分为概述和详细发展历史 一,概述 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的 指令和数 据.简单来说,就是直接编写 0 和 1 的序列来代表程序语言.例如:使用 0000 代表 加载(LOAD),0001 代表 存储(STORE)等. 机器语言由机器直接执行,速度快,但一个很明显的缺点就是:写起来实在是太困难了,一旦你 发现自己 写错了,改起来更蛋疼!这样直接导致程序编写效率十分低下,编写程序花

何为程序员思维

看到这个题目,我想起了很多很多........... 首先,我说明我为什么要写这篇文章了. 一个原因是逸惋惜峥嵘岁月岁月稠,当初读大学的时候,学习计算机技术的课程,我过多的走向了两种极端的状况.一种情况,我愿意把他归结于本末倒置,例如我学习<C++面向对象程序设计>的时候,更多的是研究C++的语法,却忽略了面向对象的思想,到头来,C++语法学会了,但是最重要的面向对象却没有理解,也不知道他能够真正的做些什么.另一个情况,我把它理解为目标很宏大,理解很困难,例如,我学习软件过程的时候,开始,课程

History of program

1950与1960年代 有三个现代编程语言于1950年代被设计出来,这三者所派生的语言直到今日仍旧广泛地被采用: Fortran (1955),名称取自"FORmula TRANslator"(公式翻译器),由约翰·巴科斯等人所发明: LISP,名称取自"LISt Processor"(枚举处理器),由约翰·麦卡锡等人所发明: COBOL,名称取自"COmmon Business Oriented Language"(通用商业导向语言),由被葛丽

history program(language)

1950与1960年代 有三个现代编程语言于1950年代被设计出来,这三者所衍生的语言直到今日仍旧广泛地被采用: Fortran (1955),名称取自"FORmula TRANslator"(公式翻译器),由约翰·巴科斯等人所发明: LISP,名称取自"LISt Processor"(列举处理器),由约翰·麦卡锡等人所发明: COBOL,名称取自"COmmon Business Oriented Language"(通用商业导向语言),由被葛丽

手机的次世代:科幻会成为现实吗?

当贝尔在1876年3月10日发明第一台电话机(另一观点认为意大利人安东尼奥·梅乌奇是电话机发明者)时,并没有人想到这个构建了便利通讯方式的工具,会对整个人类产生如此深远的影响. 因为在这之后的一百多年社会发展历程中,这种基于无线通信方式带来的人类文明变革,已经超越了所有历史中的文明时代.在今天的生活中,从普通电话到智能手机的演变过程,也已经将人类推向了一个全新的文明高度,并且在不久远的未来,以手机为主题的通讯设备将有望承载着一个新的时代. 这并非危言耸听,也并非遥不可及.事实上,一些已经逐渐面世

2015年你必须学习的编程语言和前端框架

各种前端开发库和前端框架在不断的更新,为了适应潮流的需要,你必须不断的学习新的东西.但是下面提到的编程语言和前端框架会在很长的时间内占据重要的位置,学习和掌握它们是值得的和必须的.从长远来看,它们是十分受欢迎的,被广大社区支持,并且提供很多的就业机会. JAVASCRIPT 如果你正在从事前端web的开发工作,那么不论你使用什么后台语言,前台开发中javascript使你必须掌握的语言.你可以在浏览器中.在服务器上.在移动app中.甚至是在可编程硬件上使用JS.ECMAScript 6将会使语言

Facebook为什么使用PHP编程语言?

当日本计算机科学家松本行弘决定创造一种名叫 Ruby (这种技术支撑了 Twitter.Hulu以及其他许多现代 Web 流行网站) 的程序语言时,他是从 1966 年一部名为 Babel-17 的科幻电影中获得了灵感.这本书主要讲的是一种新发明的语言能够让那些使用它的人升级自己的头脑思维.“Babel-17 是一种极精确的分析语言,几乎可以确保任何情况下的技术优势.”影片中的主人公有这样一句台词.通过发明 Ruby,松本行弘希望实现同样的效果:重编并改进程序员思考的方式. 这目标听起来很宏大,