计算机组成原理课题讨论——编译器对程序的影响

发布于:2022-12-03 ⋅ 阅读:(252) ⋅ 点赞:(0)

一、引言

  本次课题研究题目由我的老师提出,研究成果以及结论均由我以及我的同学经过不懈的努力得出,仅供大家参考!

二、编译器的概念及工作流程

  编译器是一种计算机程序,负责把一种编程语言编写的源码转换成另外一种计算机代码,后者往往是以二进制的形式被称为目标代码,这个转换的过程通常的目的是生成可执行的程序。

  源程序通过编译器转换为目标程序:
在这里插入图片描述

三、常用编译器介绍

1、gcc/g++

  Linux,windows,mac.常用,跨平台支持处理。由于gcc不配合微软的开发,微软开发出来gcc微软版本,MinGW和TDM

2、Clang

  苹果系统下,Xcode最初使用GCC作为编译器,后来由于GCC的不配合,改用LLVM/Clang

3、vc

  Windows平台常用编译器

4、vs

  VS全名是Microsoft Visual Studio目前已经出到2017了,是很大的一个开发环境,包含很多高级语言的开发环境,VC、VB等,VC只是VS其中的一个开发环境

四、编译器对程序的影响有哪些方面

1、编译效率

  我们主要研究了Windows平台上编译器对程序编译效率的影响。

  既然要研究编译效率,那肯定要拿不同编译器进行对比。我们拿mingw两个不同的编译发行版进行测试,分别为:MinGW -GCCTDM-GCC ,而TDM-GCC 又分为debug版本、release版本和profiling版本,总共四个版本进行对比测试。

  测试方法为比较程序的运行时间,因为编译效率高的话,程序就会远行的快。

在这里插入图片描述

在这里插入图片描述

1、MinGw gcc 9.2.0

在这里插入图片描述

2、TDM-gcc 4.9.2 Debug

在这里插入图片描述

3、TDM-gcc 4.9.2 Release

在这里插入图片描述

4、TDM-gcc 4.9.2 Profiling

在这里插入图片描述

5、结论

  1、对于同种编译器,不同的发行版本,以及相同版本的不同型号对程序运行速度、调试方式、编译时间都有一定的影响。

  2、一般调试的时候用的是debug版本,这个速度快,正式发布的时候,用的是release版本,这个稳定。

  3、相同算法,计算时间越短,大致可认为该编译器优化越完善。

  4、在同一种操作系统下,对于不同的编译器来说,对程序运行速度、调试方式、编译时间都有一定的影响。

  5、同一种编译器,在不同的操作系统上,对程序的运行速度,编译时间等也会产生不同的影响。

2、语法格式支持度

1、什么叫语法格式支持度呢?

  打个比方说,就拿c语言来讲,比如c语言的语法有100种,我是假设,当然实际上不止这些。有一种编译器支持90种,而有一种编译器支持100种,这样的话对程序影响就很大了,有些程序甚至不能在这个编译器上进行编译,会一直报错。

2、对比一

在这里插入图片描述

3、是否支持动态数组

在这里插入图片描述
在这里插入图片描述

4、结论

  不同的编译器对同一种高级编程语言的语法支持度不同,对于不同编译器来说,如果某一个程序的代码中有这个编译器不支持的语法的话,那么这个程序就编译不通过,就会影响程序的正常运行

5、补充

  gcc编译器的功能强大,支持的语法也非常灵活,给我们在编程时带来了非常大的方便,也给移植代码时带来了一定的难度。

  1、 声明64位数据类型:

gcc: long long
vc: __int64

  2、 switch语法中的case语句:

gcc: case ‘0’ … ‘9’
vc: case 0:
case1:

  3、 寄存器变量的作用范围:

gcc: 可以把register变量声明为全局或局部的。
vc: 只能是局部变量。

  4、 有符号和无符号整形:

gcc: 在常量数字后面加LL或ULL,例如:无符号:0xffffffffffffffffULL有符号:0xffffffffffffffffLL

vc: 在常量数字前加强制转换。例如:无符号:(uint64_t)0xffffffffffffffff

3、编译器优化完善程度

  和二类似;

4、程序的输出

1、问题引出

1.对全局变量不赋初值
2.对局部变量不赋初值
3.对static变量不赋初值
分别输出这些变量,会得到什么?

2、对比

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、总结

  如果一个程序中,有一个或者多个未被初始化的局部变量的话,这个程序在不同编译器上执行,不同的编译器对这个变量的处理是不一样的,有的是自动赋值0,有的是赋值一个不确定的值,有的甚至直接报错,然后终止程序的运行,导致同一个程序的输出结果都不一样。

4、再次对比

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5、再次总结

  这个问题其实和编译器的语法支持度也有一定的关系,不过更关键的还是不同的编译器对某些特殊情况的处理,是不一样的,然后因为处理不一样,就会导致程序的输出结果也不相同,影响程序的正确性。

5、编译器对程序的优化

1、什么是优化呢?

  编译器最基本的工作就是把源语言翻译成目标语言并保证所表达的内容相同。编译的最基本要求其实就是两种不同语言所表达的内容是等价的,或者具体一点就是计算结果是一致的。

  而其实对于一段源语言代码来说,在保证等价的基础上,可以有很多种不同的翻译,所谓优化就是在里面找一种最好的结果。

2、展开探讨

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、总结

  编译器在编译过程,通过对程序中的源代码进行优化,可以有效地提升程序的性能。

6、总结

  1.编译效率

  2.语法格式支持度

  3.程序的输出

  4.编译器对程序的优化


网站公告

今日签到

点亮在社区的每一天
去签到