认识C语言
C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程式设计中备受青睐,成为最近25年使用最为广泛的程式语言。目前,C语言编译器普遍存在于各种不同的作业系统中,例如Microsoft Windows、macOS、Linux、Unix等。C语言的设计影响了众多后来的程式语言,例如C++、Objective-C、Java、C#等。
C语言设计目标是提供一种能以简易的方式编译、处理低阶记忆体、产生少量的机器码以及不需要任何执行环境支援便能执行的程式语言。C语言也很适合搭配组合语言来使用。尽管C语言提供了许多低阶处理的功能,但仍然保持著良好跨平台的特性,以一个标准规格写出的C语言程式可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(微控制器或称MCU)以及超级电脑等作业平台。挟其强大的程式能力,相信C语言是值得学习的。
C语言最早是由丹尼斯·里奇(Dennis Ritchie)为了在PDP-11电脑上运行的UNIX系统所设计出来的程式语言,第一次发展在1969年到1973年之间。
在1980年代初期,C语言已成为Unix作业系统的主要程式语言,更深入了个人电脑、嵌入式处理器、与大型电脑等领域。广泛用于系统与应用软体的开发。
C语言很快,这或许是其被广泛使用原因之一,但是像Pascal或Fortran等语言也几乎与C语言一样快,那又为何非C语言不可。
但是,C语言不只是快,还具有指标,容易与组合语言连结,具有巨集、条件式编译、inline 函数、结构化、可以使用记忆体映射输出入,因此可以用高阶语言撰写低阶输出入驱动程式,还有撰写作业系统。
- 高效率的编译程式:C的执行效率与使用的普遍性,远胜于其他程式语言。还可以像组合语言那样直接存取硬体。
- 介于高阶与低阶的语言:C语言不但具有低阶语言的优点,同时兼具了高阶语言的易读性、易于除错等特性,故又称为“中阶语言”。此外C语言可以很容易与组合语言连结,利用低阶语言特长来提高程式执行效率。
- 可携性佳:程式语言可携性(Portability)极佳,可以在少量修改或甚至完全不修改即可在另一作业系统执行。当想跨越平台来执行C语言(如在Unix的C语言原始程式码移至Windows环境执行,通常只需要修改极少部分程式码,就可以再重新编译后执行。而且提供C编译器的系统近50种,从早期Apple II到超级电脑都有相容的C编译器。
- 专为程式设计师所设计:C最初在小型机器上实作,并且继承了一系列小语种程式语言的特点;与功能相比,C的设计者更倾向于简单和优雅。C提供了丰富运算子(Operator),使得C的语法得以简洁,而且方便的是,大多数C语言环境都提供撰写好的程式库(Library),内含多个函数供程式设计师使用,无须重新撰写程式码。[1]
C语言并非没有缺点的,实际上,C语言的缺点非常之多。举例而言,用C语言写程式很容易有bug,特别是在记忆体分配与回收这部份更是如此。
- C语言没有自动记忆体回收机制,没有垃圾收集功能,因此常常导致忘记释放记忆体,或者将同一个记忆体释放数次,因而造成错误。
- C语言的字串很原始,使用起来非常不方便。
- C语言的标准函式库甚至没有基本的资料结构,像是阵列、串列、堆叠、字典等相关结构的函式库。
- C语言的条件式编译让程式看起来很冗长,使用标头档
*.h
让你必需重复撰写函数表头,浪费许多时间。 - 更糟的是,由于C语言的标准函式库很小,因此在不同的平台上,每个厂商都实作出完全不同的函式库,这导致C语言的程式难以跨越平台执行,您必须位每个平台打造一份程式,而不像Java那样可以“一次编译,到处执行”(英语:Write Once,Run Anywhere)。
但是,即便有了这么多的缺点,C语言仍然历经四十年而不衰,这又是为甚么呢?
每个C语言的缺点,几乎都是伴随著其优点而来的,C语言的记忆体难以管理,是因为C语言具有强大的指标功能。字串函数很原始,是为了让您可以使用字元阵列的方式处理字串,而不需要使用动态记忆体配置。无法跨越平台,是因为C语言适合用来打造底层的嵌入式系统,可以直接连结组合语言协同工作。从这个角度看来,C语言的设计其实是相当精巧的,这也是C语言为何经历四十年而不衰的原因。[2]
- 参考
- m:w:zh:C语言 (导言)
- 《C语言教学手册 第4版》 作者:洪维恩著
- 专业级 C语言(CC授权)