C语言编程的特点,使其变得独一无二(更好)

C编程语言是所有现代编程语言的母亲。如今,几乎所有使用的语言都包含一些最早出现在C语言中的功能。它已被广泛用于为最小的嵌入式微型计算机向最大的大型机和超级计算机编写软件。

用C编写的应用程序范围很广,从系统软件,桌面软件,企业软件,数据库等开始。您将非常了解C的基本知识,从而开始编程职业。

C的简要历史

C语言的开发与Unix密切相关。它是在1972年左右开发的,后来又增加了更多功能。

在开发C之前,PDP-7计算机使用其汇编语言开发了Unix操作系统。后来,再次使用汇编语言在该平台上构建了C编译器。这时,C旨在简化Unix本身的开发。使用该编译器,Unix用PDP-11计算机完全用C重写。再一次,C语言编译器用C重写(当然,借助于出色的 lex yacc 工具),从而完成了C / Unix引导程序。

使用C语言重写Unix的主要原因是为了可移植性。由于用于不同CPU架构的汇编语言不同,因此将Unix OS移植到每种操作系统将是一项巨大的工作。通过开发诸如C的系统语言,并用C重写Unix OS,这项工作减少了几个数量级。

一旦开发了该语言,它就被认可了。它可以用来编写比系统软件更多的东西。因此,C开始被用于编写文件服务器,数据库服务器,网络堆栈,桌面软件和(或更高版本)Web服务器等软件。

1978年,Brian Kernighan和Dennis Ritchie出版了《 The C Programming Language》一书。直到1989年C被ANSI正式标准化之前,这本书一直是非正式的 C语言规范。 C的最新版本是C11,于2011年发布。

现在让我们看看C的一些使其独特的功能。

C与C ++:它们是否相关?随着C语言开发更复杂的软件,人们认识到面向对象的概念(包括封装,多态等)将有助于管理复杂性。

C ++是通过添加某些功能来编写面向对象的软件,同时保持与C的兼容性而构建的。它是通过 progressive进行开发的。增强功能-对C语言进行兼容的更改,以便可以将C和C ++模块组合在同一程序中,并使用同一编译器进行编译。这样一来,就可以在使用面向对象概念编写的大型程序中以最小的更改来重用基于C的旧模块。

AC程序在理论上可以由C ++编译器编译,而无需进行任何更改。但是实际上,由C ++强制执行的更严格的类型检查会导致错误,需要对代码进行一些更改。

关键字数量少

C语言尽管是一种小语言的力量。这是因为它仅声明32个单词作为具有特定含义的关键字。相比之下,C ++声明了82个关键字,Java声明了50个保留关键字,而javascript声明了63个关键字。COBOL声明了多达357个关键字。想象一下,要记住和回避这么多的关键字会很头疼!

没有显式字符串类型

与大多数其他现代语言(例如Java,C ++和JavaScript)不同,C不会为字符串提供单独的类型。字符串被视为以 0个字符(表示为“ \ 0")结尾的字符数组。字符串的长度由约定表示:直到 0个字符的字符数。您可以随意忽略它,并计数或存储到“ \ 0"之后。缺乏适当的字符串类型和约定,多年来导致了无数错误,称为缓冲区溢出

事实上,第一个蠕虫病毒进入了互联网,莫里斯互联网蠕虫(Morris Internet Worm)是由于关键系统软件 finger daemon 中的此类错误导致的。

以下是此类错误的一个示例。它说明了在程序中引入此类错误有多么容易。该程序可以正常编译,但是由于缓冲区溢出而崩溃。

# include <stdio.h>main(){  char *buf = "hello world";  buf[12] = 'a';  printf("%s\n", buf);}

相反,大多数现代语言都提供了显式的字符串类型,这使得这种恶作剧成为不可能。甚至编译上述代码的C ++都提供了显式的 std :: string 类型。

指针操作

指针是对内存的引用位置。当读写任意内存位置时,C完全灵活。这种灵活性付出了巨大的代价,并且已经成为整个软件领域中许多错误的原因。最显着且影响整个Internet的包括Web服务器,邮件服务器和ftp服务器中的此类错误。即使在今天,偶尔也会有一些新闻报道,其中涉及到由于引用和更新无效的内存位置而导致的错误。

2014年发现的臭名昭著的 SSL HeartBleed 安全错误是由于对管理不当进行管理的结果指针位置,并说明了在C语言中正确进行指针管理的至关重要性。

即使在Windows系统上偶尔出现的BSOD(“死亡蓝屏")错误也可能是由于指针处理不当引起的。

C ++之外的其他语言不允许指针操作,因此不易受到此类错误的攻击。<​​

数组和指针可互换

在C数组引用和指针是可互换的。该语言允许在需要指针的地方使用数组引用,反之亦然。尽管这允许强大的操作,但它也导致了许多臭名昭著的错误。

广泛使用“定义"宏

宏用于将名称替换为其他扩展名。它们可用于在编译时更改名称的定义,或将较长的扩展名替换为简单名称。 C宏系统支持 ifdef 条件,该条件允许条件编译。这是将软件移植到不同体系结构和操作系统的一种方式。通用名称是在编译时定义的,并针对不同的条件用不同的扩展替换。

还可以包括或消除使用这些宏编译的整个代码节。

已弃用,但在C ++中可用。其他语言(例如Java,JavaScript,python等)没有提供类似的功能。

封装在文件中的模块

C没有类的概念,因此没有类的概念。支持分开的公共,私有和受保护可见性的概念。 C提供的唯一封装是文件封装。除非导出名称,否则源文件中定义的函数,全局变量和类型仅在该文件中可见。提供关键字 static extern 是为了控制变量和函数名称的可见性。

相比之下,其他语言(例如C ++,Java)和Python通常支持类,以及类的封装。

外部库

除了基本语言构造之外,C语言中更复杂的功能委托给外部库。字符串处理,数学,输入输出,联网等均由外部库提供。相比之下,其他语言通常会附带一个存储丰富的模块库,其中包含语言本身。

并且涵盖了C语言的一些基本特征,尤其是那些使其与其他语言区别开来的特征。

标签: