打印
[华山论剑]

【转载】为什么C语言执行效率高,运行快?

[复制链接]
9935|56
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2022-11-12 15:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

简述


都说C语言编写的程序执行效率比较高,那么到底高在哪里,我们一块来学习学习。

C语言由来


C语言源自于BCPL、B两种语言。

BCPL语言以及代码

1967年,剑桥大学的马丁·理察德(Martin Richards)以CPL编程语言为基础,发明了BCPL(Basic Combined Pogramming Language)编程语言。

我们在看一个用BCPL语言编写的计算阶乘的功能,代码如下:

view plaincopy to clipboardprint?

  • GET "libhdr"  
  • LET start() = VALOF  
  • { FOR i = 1 TO 5 DO writef("fact(%n) = %i4*n", i, fact(i))  
  •   RESULTIS 0  
  • }  
  • AND fact(n) = n=0 -> 1, n*fact(n-1)  

GET "libhdr"是包含标准库,LET start() = VALOF是程序运行时要调用的第一个函数。空括号()表示函数不需要任何参数,VALOF表示函数有返回值。

FOR i = 1 TO 5 DO是一个从1到5的循环。writef是字符格式化字符串函数,用来输出将i替换%n、fact(i)替换%i4格式化之后的字符串。*n表示换行,RESULTIS 0是返回值,用来告诉系统函数执行成功。

AND fact(n) =介绍了函数fact的定义,通过接受一个参数来实现n的阶乘。

n=0 -> 1, n*fact(n-1)则是阶乘的实现,当n等于0时候,返回1(0的阶乘是1),当n不等于0的时候则返回n*fact(n-1),

AND原文是下面这样说的,如下:

The word AND causes fact to available to the previously defined function

我的个人理解是支持嵌套,那么你认为呢?

当上述功能执行后将会在终端有如下输出:

view plaincopy to clipboardprint?

  • fact(1) =   1  
  • fact(2) =   2  
  • fact(3) =   6  
  • fact(4) =  24  
  • fact(5) = 120  

B语言以及代码

肯·汤普逊(Ken Thompson)简称“ken”,在贝尔实验室工作期间设计和实现了Unix操作系统。他基于BCPL创造了B语言。

同样的,我们来看一个用B语言实现进制转换功能。输入一个n转换为b进制,其中b在2和10之间。

view plaincopy to clipboardprint?

  • /* The following function will print a non-negative number, n, to
  •   the base b, where 2<=b<=10,  This routine uses the fact that
  •   in the ANSCII character set, the digits O to 9 have sequential
  •   code values.  */  
  •   
  • printn(n,b) {  
  • extrn putchar;  
  • auto a;  
  •   
  • if(a=n/b) /* assignment, not test for equality */  
  •   printn(a, b); /* recursive */  
  • putchar(n%b + '0');  
  • }  

C语言

在1972年,美国贝尔实验室的丹尼斯·里奇(D.M.Ritchie)在B语言的基础上设计出了新的言,他取BCPL的第二个字母作为这种语言的名字,这就是C语言的由来。

以下是用C语言实现的进制转换功能。

view plaincopy to clipboardprint?

  • #include<stdio.h>  
  •   
  • void printn(int n, char b) {  
  •   char a;  
  •   if(a=n/b) {  
  •     printn(a, b);  
  •   }  
  •   putchar(n%b + '0');  
  • }  
  •   
  • int main(int argc ,char **argv) {  
  •   printn(8, 2);  
  •   return 0;  
  • }  
  •   
  • Terminal: 1000  

跟B语言非常接近了吧。

编程语言


机器语言是二进制文件,汇编语言是符号语言,再往汇编之上是高级语言。下图是C编写的源文件,经过汇编和链接生成的汇编文件以及二进制文件。

机器语言

机器语言是一种指令集的体系,它是用二进制代码表示的语言,是计算机唯一可以直接识别和执行的语言,它具有计算机可以直接执行、简洁、运算速度快等优点,这是一件十分繁琐的工作。编写程序花费的时间往往是实际运行时间的几十倍或几百倍,而且直观性比较差,容易出错,程序的检查和调试都比较困难。

汇编语言

为了解决机器语言难以理解和**的缺点,于是就出现了汇编语言。用易于理解和**的名称和符号表示机器指令中的操作码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言;于是汇编语言亦称为符号语言。

高级语言

高级语言又主要是相对于汇编语言(机器语言)而言的,它是高度封装了的编程语言;是较接近自然语言和数学公式的编程,基本脱离了机器的硬件系统,用人们更易理解的方式编写程序。

例如java,c,c++,C#,python都是高级语言。

C为何快速


越高级的语言,越人性化,机器负担就重。因为机器帮你处理了常见的问题,需要一些额外开销。而C语言是一门非常干净的语言,相当于裸奔,被设计之初就将速度大于安全之上,它不会检查数组索引是否会越界,不会检查内存是否泄漏,也不会检查指针是否是野指针。

在制定C标准时指出C代码是能够可移植的,但是如果要为了更快的执行效率,可以牺牲可移植性。C完全相信程序员,不会阻止程序员要做的事情。

C语言经过编译优化生成的机器码和和直接写汇编生成的机器码是相当的,所以C非常高效。


使用特权

评论回复
沙发
1988ChenSir| | 2022-11-23 10:30 | 只看该作者
C语言源自于BCPL、B两种语言。
BCPL语言以及代码

使用特权

评论回复
板凳
uiint| | 2022-12-1 17:02 | 只看该作者
它比其它类型的语言更接近硬件,能够直接访问操作内存和进行内存的地址运算。

使用特权

评论回复
地板
febgxu| | 2022-12-1 18:18 | 只看该作者
C语言运行效率最高,C语言就是以它的高效而出名,它可以像低级语言一样对地址进行操作,所以效率高。

使用特权

评论回复
5
juliestephen| | 2022-12-1 18:56 | 只看该作者
程序设计语言中汇编语言速度最快,c语言效率最高,执行效率高。

使用特权

评论回复
6
tabmone| | 2022-12-1 19:34 | 只看该作者
C语言的执行速度真的那么快吗               

使用特权

评论回复
7
sdlls| | 2022-12-1 20:25 | 只看该作者
汇编语言的执行效率高               

使用特权

评论回复
8
cemaj| | 2022-12-1 21:04 | 只看该作者
高质量的c代码编译后生成的汇编代码比人工写的 高质量汇编代码效率相差不超过20 所以 c 语言适合编写大型系统

使用特权

评论回复
9
yeates333| | 2022-12-1 21:46 | 只看该作者
优先提高全局效率 只有整个程序的执行效率提高才有意义

使用特权

评论回复
10
febgxu| | 2022-12-2 19:37 | 只看该作者
C语言编写的程序运行速度最快               

使用特权

评论回复
11
janewood| | 2022-12-2 20:19 | 只看该作者
C语言是高级语言,编译后生成可执行程序。它的执行速度一般来说,比要通过解释执行的语言快。但比汇编语言慢。

使用特权

评论回复
12
hilahope| | 2022-12-2 21:00 | 只看该作者
c语言效率比大多数高级语言效率要高

使用特权

评论回复
13
tpgf| | 2022-12-8 14:36 | 只看该作者
这个得看应用场合吧  也不能绝对的这样定义

使用特权

评论回复
14
八层楼| | 2022-12-8 15:14 | 只看该作者
选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。

使用特权

评论回复
15
guanjiaer| | 2022-12-8 15:29 | 只看该作者
对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高

使用特权

评论回复
16
观海| | 2022-12-8 15:41 | 只看该作者
能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。

使用特权

评论回复
17
heimaojingzhang| | 2022-12-8 15:52 | 只看该作者
在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现

使用特权

评论回复
18
keaibukelian| | 2022-12-8 16:04 | 只看该作者
位操作只需一个指令周期即可完成,而大部分的C编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。

使用特权

评论回复
19
robertesth| | 2023-1-9 14:19 | 只看该作者
C语言就是以它的高效而出名,它可以像低级语言一样对地址进行操作,所以效率高。

使用特权

评论回复
20
jtracy3| | 2023-1-9 15:42 | 只看该作者
程序设计语言中汇编语言速度最快,c语言效率最高,执行效率高。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1327

主题

3831

帖子

0

粉丝