c程序设计作业(精选8篇)
c1=97;
c2=98;
printf(“c1=%c,c2=%cn”c1,c2);
printf(“c1=%d,c2=%dn”,c1,c2);
return 0;}(1)运行时会输出什么信息?为什么?(2)如果将程序第4,5行改为
c1=197;c2=198;运行时会输出什么信息?为什么?(3)如果将程序第3行改为
int c1,c2;运行时会输出什么信息?为什么?
答:(1)程序运行不了,因为程序存在错误。正确的程序为:
#include
char c1,c2;
c1=97;
c2=98;
printf(“c1=%c,c2=%cn”,c1,c2);
printf(“c1=%d,c2=%dn”,c1,c2);
return 0;}
(2)如果将程序第4,5行改为
c1=197;c2=198;
运行时会输出:
(3)如果将程序第3行改为
int c1,c2;运行时会输出:
因为int表示整型,%c是输出字符,a的ASCLL代码是97,b的是98,所以输出c1=a,c2=b.%d是表示输出十进制整型,所以输出c1=97,c2=98
2、用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。问在键盘上如何输入?
#include
int a,b;
float x,y;
char c1,c2;
scanf(“a=%db=%d”,&a,&b);
scanf(“%f%e”,&a,&y);
scanf(“%c%c”,&c1,&c2);
return 0;} 答:输入如图:
1 学生学习C/C++语言时面临的问题
1.1 不能熟练掌握C/C++语法
学生在对照输入参考资料的过程中, 要一面看书一面敲键盘, 出现此类现状的原因是由于学生对程序本身不甚熟悉, 因而如果不进行对照会出现字母输错的情况, 例如, 经常出现的问题是大小写、中英文、字母漏写等情况。对于初学者, 如果不能清楚了解其中的语法, 那么就不能快速的找到语法错误, 在没有教师指导的前提下, 会感觉不知所措, 长此以往学生就容易失去学习信心和学习兴趣。
1.2 不熟悉开发环境
学生在不熟悉开发环境的基础上, 联系过程中不能很好的结合开发环境开发程序, 更不能很多的开展练习, 所以操作不当引发很多不必要的错误, 并且出现问题会不能做出妥善处理[1]。
1.3 参考书不准确
学生在学习时会借助参考书等书籍, 但是现在很多市面上的参考书本身就存在错误, 因而学生不但不能提升自己的语言开发能力, 还会带来适得其反的效果。
2 系统设计概述
针对以上提出的问题, 针对初学者设计一套C/C++语言的编程练习系统, 在学生登陆系统以后, 可以从数据库内下载程序题, 让学生练习。其中练习库能够将学生输入的源代码、编译、连接最后生成EXE程序, 通过调用该程序, 让练习者灵活的运用该系统。
2.1 系统流程设计
该系统流程主要是练习者登陆系统后, 运用练习者输入的用户名和密码查找数据库内的服务器, 如果存在该用户, 就证明登陆成功, 并且能够根据后台操作了解该用户类型是学生或者是管理员, 判断结束后给该用户分配应有的使用权限。
如果是学生用户, 可以从服务器下载编辑好的样例程序, 根据选择的相应程序代码, 在显示屏幕上面选择源代码, 让学生输入相关信息。输入过程中要求系统时刻监听键盘, 对比输入的代码和样例程序, 用明显的颜色标识出错误代码。输入完成后, 把输入的代码保存到临时建立的文件夹里面, 并且调用C编译器, 编译存储的文件, 生成EXE程序, 调用不断执行。管理用户设置是要求增加样例程序, 可以查看学生的练习情况[2]。
2.2 功能模块的设计
为了适应系统功能的各项要求, 需要将系统功能划分为3个重要模块, 分别是系统管理、学生练习和教师管理。系统管理模块主要的工作职责是判断用户登录情况, 学生练习模块主要是统计学生开展练习的时间情况, 控制学生的各项练习数据。教师管理模块能够管理练习分数查询学生的具体练习情况。
2.2.1 系统选项模块的设计
该模块的控制方式用户设置模块、管理员模块和推出模块, 用户控制模块可以实现用户口令的修改, 保障整个体统平台的安全性, 避免非法用户进入系统中破坏系统内的各类质量。管理元设置模块字更高一级的模式控制, 主要是在该模块中添加一部分合法用户, 或者删除一部分用户, 或者当用户忘记密码后, 可以通过管理员密码进行查询[3]。
2.2.2 试题维护模块
试题维护模块主要涉及内容是增加试题、浏览和删除试题, 并且对应模块中还有不同的对应操作模块, 运用试题增设模块可以随时随地的补充试题, 并且添加不同类型的视图, 浏览和删除试题模块是在浏览过程中删除没有必要存在或者重复试题。
2.2.3 试题打印模块
该模块的主要构成是选择题、填空题和程序改错题, 通过不同模块的组合了解不同题型, 根据题型应答不同的操作。
2.2.4 试题生成模块
该模块的主要构成部分是2部分, 包括自动生成试卷和人工生成试卷。自动生成模块主要是针对试卷的难易程度, 分为简单、适中和较难3类, 通过随机组合生成一张标准的试卷, 借助于浏览和打印等工作流程。人工生成试卷模块主要是用户根据自己的实际需求, 要求生成难易不同和类型不同的试卷。
在试卷模块中如何针对不同类型题目选择试卷, 满足学生的实际需求, 这是该模块开发的重点内容, 其中随机产生的试卷作为开发的重点也是开发的难点。
该系统主要是根据试卷的具体难易程度和试题难度设置不同参数, 实现试卷的随机性抽取, 对于同一张试卷其难易度更趋向多维合理性, 评价方式是需要借助于学生参与考试的成绩或者其他的参数做出综合测评, 根据参数试卷能够被划分为简单, 就是试卷内容很简单没有任何难度, 适中就是难易程度在学生可以接受的范围内, 较难就是有一定的难度。
为了区分开试卷的难易情况, 在系统运行是要求从系统中找到大致的难度系数, 这样做的目的是在生成试卷的过程中, 系统有效的筛选出题库中的题目, 对系统的难度规定系数如下。
难度系数范围集中在0.3~1.0之间, 难度系数范围可以分为以下几个档次:
A档主要的难度系数定在0.3~0.4之间, 通过对C类语言试题考察可以了解, 这部分试题没有太大的难度, 属于基本档。B档的难度系数主要定位在0.5~0.6之间, 此范围内的语言知识是需要通过考虑, 就能得到分数的。C档主要是0.7~0.8, 该档有着一定的难度系数和综合性。D档难度系数在0.9~1.0档, 该档的难度系数较大, 主要考察学生的综合能力, 要求学生对C语言知识有着深刻的认知和理解。考察学生的C语言知识, 要求考察学生的基本程序知识, C语言基础知识和阅读等方面的知识, 让学生可以对该项知识有着深入浅出的理解, 为了使用时更好的实现试卷的随机性, 就要求在试卷生生成过程中有较大的随机性, 通过取舍试卷系统随机产生RAND () , 让系统每一次产生随机的RAND () 不同, 用以赛选试题的不同表现方式。
2.3 学生编辑练习功能
该功能区主要是让学生选择合理的样例程序, 将各类源代码显示在屏幕上面, 让学习对照练习。练习中样例程序输入某一代码时, 系统需要用反色表示, 这样可以便于学生对照。学生在完成编辑以后可以继续编译其他的练习程序。学生开始练习以后要求学生从数据库内下载样例程序, 或者从本地文件找样例程序进行编辑。学生整体输入区域的控制件是Rich Eidt实现。前面的反色目的是为样例程序添加背景颜色, 并且设置好Rich Edit的字体样式, 其中用到字体的结构和设置的文字背景色[4]。
函数原型的如下:
typdedf struct charformat
UINT cb Size://定位特殊字节的大小
DWORD dw Mask://设置相关文字属性信息内容
DWORD dw Effeets;//具体的文字设定效果
LONG y Height://文字的高度
LONG y Offset://文字的偏移情况
COLORREF er Text Color;//文字颜色
BYTE b Char Set;//字符集
BYTE bpitch And Family:??字体家族和间距情况
cf.cbsize=sizeof (charformat2)
cf.dwmask=cfm backcolor
cf.crbackcolor=rgb (0、255、0) //背景颜色是红色
m richedit setsel (0.2) //设置处理的区域
m richedit setsel message (EM SETCHARFORMAT.SCF SELECTION. (LPARAM) cf)
2.4 正确率统计设计
学生将相关内容输入编辑框的同时, 也会引发很多其他项目的变化, 并且容易触发相应实践, 学生通过响应时间可以回刁函数中的内容, 读取学生输入的部分程序内容, 逐一与模板进行对比, 最终判定录入的字母数与模板程序的具体长度比率成为判读学生正确率的 标准。
3 结论
本教学系统的开发为学生学习C/C++语言提供良好的平台, 学生通过该平台能够快速的掌握C/C++语言编程的各类语法知识, 并且在后期训练中提升自己的运用熟练度, 增大学生的学习兴趣, 也可以为后续的课程学习打下坚实基础。
参考文献
[1]吴皖赣, 董华青, 蒋一君, 等.中小学个性化网络练习系统的设计与开发[J].中国教育信息化, 2011 (4) :21-22.
关键词:C++;程序设计;教学方法;教学改革
0引言
C++语言运用范围非常广,在软件设计、网络通讯、游戏娱乐等等领域都能涉及到,也是当前世界上使用最广的编程语言。但是行业的发展受到多方面局限,人才的缺失是行业发展最大的阻碍,许多高校都意识到这个问题,相继的开始《C++语言程序设计》课程,主要就是让计算机专业的人才能够多涉及这方面课程,提高学生的自主学习与独立思考能力,增加就业的几率。传统教学方式,存在教学目标不清晰以及教学方式古板的问题,很多学生对这门学科的重要程度认知不足,教学方式与内容的乏味让学生对此课程并无多大兴趣。本文是根据多年来的经验总结以及市场调查,从教学目标与内容多方面进行研究,以此追求有效的教学改革。
1教学中存在的普遍问题
1.1学生学习目标不明确
教学的主要目的是为了培养学生的兴趣以及软件编程能力,提高学生的独立思考、分析与解决问题的能力,提高就业的几率。以往的课程都是由不同教师来传授,每一个教师都只关注自己本科教学,并没有从全局效果分析,学生对自己的学习目标不明确,导致学习兴趣降低。没有目标的学生犹如行驶中迷失了方向的帆船,不知所措。当学生对自己的学习有了清晰的规划,就会不断朝着目标的方向努力前进。
C++涉及的概念都是较为复杂的,在学习过程中灵活多变,出错可能性非常大,可以说想要学好此课程是相对较难,所以很多学生都产生退却念头;同时C++不仅是纯对象语言,当中还涉及到程序设计语言,面对对象并不是单一的。这种特性导致了C++语言与C语言能够兼容存在。两种语言之间有时不需修改就能够使用,所以在刚开始学习时,学生觉得相对简单。[1]。然而,这两种语言也必然存在不能共通之处,学生要真正掌握两种不同的语言,就必须对其进行对比,找到其相同之处和不同点。
1.2教学重点偏向语法,课后延伸匮乏
在语言教学中侧重与语法[2]。在传统的教学当中,不管是老师教授还是教材讲解,都是先把概念推从出去,再理解规则,最后用案例讲解。概念知识相对来说不仅枯燥,要想记住也是较难的,在教学过程中,要引起学生兴趣非常难。虽然传统教学中有案例分析,但是案例分析都是各自孤立的,只是针对某一部分的知识,学生无法从中感受到实际运用价值。枯燥无味的文字不仅不能引起学生的学习兴趣,反而会让他们觉得反感。被动地接受理论知识只会让学生很快就忘记了教学内容,只有生动的教学方式才能激发起学生的兴趣。
教材课程中有课时限制,所以教学过程基本上都是从语法、规则、案例等等形式来落实。每一堂课讲解的时间都有限,再加上教师的课前准备不足,那么这堂课的实际效用就非常低。如果在课后没有进行延伸与巩固,那么学生要掌握更深层次的知识是不可能的。在这种情况下,学生掌握的知识只是皮毛,甚至可以说有些接收能力比较差的学习是掌握不了课堂知识。如果没有进行课后巩固,基本上这堂课的知识就是一闪而过了。对于老师传授的知识,学生不可能过目不忘,因此,只有不断对知识进行巩固和复习,才能让学生牢牢记住知识。
1.3教学方式无结合企业实际需要
学生在C++语言的学习中,通常都是局限在一部分知识中,并没有顾全大局的理念。传统的教学都是采用循序渐进的形式,每一节课都给学生灌输新概念、新规则,学生没办法从所有学习的知识中进行融合使用。[3]。就算是在教学中加入了大量的实验课程,也只是围绕某一个章节某一个知识进行实验安排。这种实践课程也只是一时兴趣,学生在学习一段时间后就会产生厌倦,学到的知识进而就无法使用到企业公中。单调的教学模式显然已经让学生失去了兴趣,这对于提升学生的思考能力和动手能力毫无帮助。每一个学生在毕业后都会步入社会,因此,了解社会环境和企业对于人才的要求对于学生来说尤为重要。如果教师一味地向学生传授课本知识,即便学生能够牢牢记住这些理论知识,也不知道如何将其应用到实际操作中。因此,在教学过程中,教师应该注重理论与实际的相互结合,把学生培养成为综合型的人才。
2教学改革策略
针对上述对C++语言教学存在问题的概述,本文从以下几个方面进行策略研究,在实际使用中也取得了不错的反馈。
2.1明确学习与教学目的
学习的动机是学生能够持续进行的基础,完成整个学习与巩固过程都需要学习动机来维持。现在大学生在学习过程中会考虑到今后就业方向,如果在课堂当中能够开展与今后就业相关的内容,那么学生会非常重视这次学习,效果自然就非常明显。对于不同的教学内容,学生往往会表现出不一样的兴趣程度,因此,老师首先要了解学生在学习过程中最为关注的问题,并且针对这些问题设计和安排教学内容。学生对于感兴趣的教学内容往往会表现出更强的积极性和主动学习性,学习效果也会有所提高。结束校园学习后的学生都会走向社会,他们对于未来的就业环境和企业的人才需求表现出更强的兴趣,因此,老师在教学过程中可以适当插入这部分的内容。
2.2教学内容要结合整体与具体两个方面
教材的编排几乎都是从概念、规则、举例这样的形式,但是知识的分散导致每一个章节的内容都联系不上,学生感受不到整体的编程效果。所以,在教学当中,应该注重整体到具体的方式,让学生能够先了解整个C++编程过程,然后再在每一个程序中融入教学内容,把教学具体到每一个知识点中,巩固学生的知识能力,学生在学习完所有知识后就已经完成整个设计。这种教学思路对程序类型的课程学习有极大作用。教学首先必须具备清晰的规划,才不会显得杂乱无章。教师应当确定一个大致的教学方向,然后再对教学内容展开详细的安排,在规划教学内容时,必须充分考虑不同学生对于教学任务的完成程度,从而对教学内容的难度进行适当的调整,尽可能地让更多的学生掌握教学内容。
2.3教学方法注重同中求异、异中求同
教学当中注重同中求异,异种求同的话,能够让学生抓住事物的本质,对事物的理解加深,有利于思维拓展。为了能够让学生的学习更加深入,可以用对比学习的方式,这样的教学效果会更加好。比如说,把c++语言与C语言进行对比教学,这样学生不仅能够学习到新内容,还能够巩固旧知识,得到双收益效果。其实两种语言在设计思路上有较大差异,一种是面对程序语言,把数据与数据捆绑起来,另一种是面对整个过程的语言设计,用分块的模式教学。教学内容的不同并不是意味着教学方法也截然不同,把相似的内容集中起来教学,有利于学生更好地把握知识,采用不同的方法对相同的内容进行教学,有助于老师找到教学中的平衡点,发现更合适的教学方法。
2.4校园学习与企业联合,为就业作准备
很多计算机相关专业的学生为了能够快速就业,在校园里就会选择去外面机构培训。当然培训并不意味就是能提高就业率,主要还是看学生的态度以及掌握情况。如果在高校的C++语言学习中,可以用校园与企业合作的方式来教学,在教学当中可以加入机构培训的方式;在每一次学完知识后就加入实践活动,对于今后的就业帮助极大。同时,提高学生的学习能力以及适应能力方面也有很大帮助。学校更加注重的是理论知识的传授,而企业更加注重的是实际的操作,企业提出人才要求,学校能够更加有针对性地为学生制定学习任务,从而让学生更好地掌握相关的专业技能,让自己离开校园后尽快适应到社会的工作中。
3结语
本文提出了《C++语言程序设计》课程的教学改革思路,通过教学方法、模式的改变,来激发学生的学习兴趣与能力培养,用校企联合的方式来为今后就业奠定基础,累积学生经验的同时还能提前模拟就业。有教学实验证明,这些教学改革方式是能够在一定程度上提高教学效果,并且对编程类型的课程来说都有极大的借鉴作用。传统的教学方式显然已经不能满足人们日益增长的需求,社会环境是不断进步的,竞争是越来越激烈的,为了使学生具备更强的社会竞争力,学校必须转变教学方法,一方面要让学生掌握基础的理论知识,另一方面需要注重学生的操作能力培养。总体来说,就是要理论知识与实践操作相互结合,培养全能型的学生,对他们的知识掌握以及今后的就业都有极大帮助。
参考文献:
[1]杨庚.面向对象程序设计与C++语言[M].北京:人民邮电出版社,2012.
[2]杨杰,陈雪兆.《C++程序设计》教学中存在的问题及改进建议[J].湖南科技学院学报,2013,11(26):190191.
printf(“Please input the right score!n”);else {
switch(score/10)
{
case 10:
case 9:
printf(“An”);
break;
case 8:
printf(“Bn”);
break;
case 7:
printf(“Cn”);
break;
case 6:
printf(“Dn”);
break;
default:
printf(“En”);
} } }(2)if语句实现 #include
printf(“Please input a right score!n”);else {
if(score/10>=9)
printf(“An”);
if(score/10==8)
printf(“Bn”);
if(score/10==7)
printf(“Cn”);
if(score/10==6)
printf(“Dn”);
if(score/10<=5)
printf(“En”);} } 3,#include
printf(“The number is out of compass!”);else {
a=number%10;
if(a==number)
{
printf(“The number is 1.n”);
printf(“%dn”,a);
printf(“%dn”,a);
}
else
{
b=number/10%10;
if(b==number/10)
{
printf(“Yhe number is 2.n”);
printf(“%d %dn”,b,a);
printf(“%d %dn”,a,b);
}
else
{
c=number/100%10;
if(c==number/100)
{
printf(“The number is 3.n”);
printf(“%d %d %dn”,c,b,a);
printf(“%d %d %dn”,a,b,c);
}
else
{
d=number/1000%10;
if(d==number/1000)
{
printf(“The number is 4.n”);
printf(“%d %d %d %dn”,d,c,b,a);
printf(“%d %d %d %dn”,a,b,c,d);
}
else
{
e=number/10000;
printf(“The number is 5.n”);
printf(“%d %d %d %d %dn”,e,d,c,b,a);
printf(“%d %d %d %d %dn”,a,b,c,d,e);
}
}
}
} } } 4,#include
x=a;
a=b;
b=x;} if(c
if(c
printf(“%d %d %dn”,a,c,b);
else
printf(“%d %d %dn”,a,b,c);} } 5, #include
m=(a+b+c)*(a+b-c)*(a+c-b)*(b+c-a);
s=sqrt(m)/4;
printf(“%fn”,s);
if(a==b&&b==c)
printf(“DengBianSanJiaoXing”);
else
{
if(a==b||b==c||c==a)
printf(“DengYaoSanJiaoXing”);
else
{
if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a)
printf(“ZhiJiaoSanJiaoXing”);
else
printf(“YiBanSanJiaoXing”);
}
} } else
printf(“Error!n”);} 6, #include
} printf(“Please input the salary:n”);scanf(“%f”,&salary);if(salary>850&&salary<=1500)salary=salary-0.01*salary;else { if(salary>850&&salary<=2000)
salary=salary-0.015*salary;else {
if(salary>2000)
单选题
1.1、《百年孤独》被誉为“再现拉丁美洲历史社会图景的鸿篇巨著”,也是拉丁美洲()文学作品的代表作。全书近30万字,内容庞杂,人物众多,情节曲折离奇,再加上神话故事、宗教典故、民间传说以及作家独创的从未来的角度来回忆过去的新颖倒叙手法等等,令人眼花缭乱。作家以生动的笔触,刻画了性格鲜明的众多人物,描绘了这个家族的孤独精神。
A 魔幻现实主义
B 现实主义
C 浪漫主义
D 民族
单选题
2.3、文章起笔,故居门内一线微弱的灯光照着照壁上“长宜子孙”四个大字。
由“此”念及:欧洲古老传说之一——爱尔克的灯光,追忆已经逝去的姐姐,揭露封建家庭、封建礼教窒息青年的生命与青春的罪恶。笔锋直指:封建家庭及其制度的腐朽没落、摧残人才、吞噬青年(噬shì),并不能“长宜子孙”。家庭及其财富并不能“长宜子孙”,青年人应该走出(),到广大的世界里寻求光明,实现“大我”——体现着人的社会价值和意义的人,是在历史中行动着完整的人。
A 自我B 小圈子
C “温室”
D “小家”
单选题
3.1、竺可桢1936年起任浙江大学校长,在国步艰危、颠沛流离之中,他执掌浙大13年,以“求是”为校训,身为表率,包容兼蓄,教授云集,培育出一大批精英良才。浙江大学从此崛起为全国名牌大学,被誉为“东方剑桥”,蜚声中外。《唐宋诗中的物候》选取了()这个独特的角度,介绍物候的有关知识。借助唐宋诗中月、露、风、云等之咏,揭示大自然的本质,进一步分析了唐宋诗中描写出植物和候鸟等物候特点及其反映出的物候规律。
A 气候
B 植物候鸟
C 唐宋诗
D 月、露、风、云
单选题
4.4、《雨巷》写于1928年大革命失败后的白色恐怖时期。诗人以象征之笔,通过对黑暗现实(雨巷)中希望与理想(女郎)的找寻和与她的失之交臂,表达了诗人对现实不满、失望又找不到出路的()情绪。
A 悲哀
B 焦急
C 热切
D 苦闷
单选题
5.1、《登高》中杜甫登高抒怀伤时忧国之情。盛唐伟大诗人,与李白同为我国诗歌史上的“双子星座”,并称“李杜”。杜甫生活于唐王朝由盛转衰、祸乱迭起的时代;在政局日趋腐败的形势下,其“致君尧舜上,再使风俗淳”的理想彻底破灭。坎坷困顿、颠沛流离的生活,使他对民生疾苦、社会矛盾以及国事危艰,有深刻的观察与切身的感受。其诗全面而忠实地反映了所处时代广阔的社会生活,充满强烈的忧国忧民感情,被誉为“诗史”。风格以“沉郁顿挫”为主而兼具多种色调。古近律绝、长篇短制等各体皆精,尤其对七律的发展作出了杰出贡献。今存诗一千四百余首。传世名作有《望岳》、《兵车行》、《自京赴奉先县咏怀五百字》、《春望》、《北征》、“三吏”、“三别”诸诗以及《登高》、《秋兴》、《登岳阳楼》等。本诗写于大历二年秋天(767),杜甫在夔州所写。全诗通过登高所望夔州秋江的景色,倾诉了自己常年漂泊、老病孤愁的复杂心情。诗歌慷慨激越,动人心弦,八句全对,一气流转,给人均齐对称的美感而不见斧凿之痕。体现了杜甫沉郁顿挫的诗风和严谨的格律,诗人把()与国恨紧密交织,把个人命运与国家命运休戚相关,更让人感到这位诗人伟大的人格。前四句写登高所见,后四句抒登高所感。所览之景苍凉雄浑,所抒之情沉郁悲抑,情景交融,浑然一体。悲壮而不伤感,愁苦而不消沉,是一曲卓绝千古的秋之歌。
A 秋景
B 漂泊心情
C 家愁
D 人生感悟
单选题
6.3、胡适在中国哲学史、文学史、古典小说和古籍整理等各个领域的研究中,都有重要成果。主要著作有:《胡适文存》(共三集)、《中国哲学史》、《白话文学史》、《中国章回小说考证》等。其《尝试集》为中国现代文学史上第一部()集。
A 政论
B 学术著作
C 新诗
D 话剧作品
单选题
7.1、“江畔何人初见月,江月何年初照人”《春江花月夜》中诗句交织着对宇宙和人生的探索,()曾将此诗誉为“诗中之诗, 顶峰上的顶峰”。
A 闻一多
B 艾青
C 徐志摩
D 冯至
单选题
8.2、艾青早年在法国留学,受法国的印象主义绘画和象征主义诗歌的影响很大。印象主义绘画讲究画家个人对光、影的感受,将实物的瞬间印象呈现于画布之上;而象征主义诗歌则注重营造充满暗示和象征意义的意象。另外,中国传统的诗画结合理论也给了艾青以启示。所以艾青的诗歌很有()。诗人从“感觉”出发,捕捉瞬间的印象,然后渗入自己的主观情感,创造出具有象征意义的视觉形象。《北方》体现了诗人深厚的爱国主义情感,在《北方》一诗中,“土地”作为一个整体的意象特别突出,它既象征着祖国,也象征着生活在土地上的人民。其他的景物:冻结的村庄、山坡、河岸,在风沙中前行的孤单行人、负重的驴子、惊惶的雁群„„可以说是北方“土地”整体意象之下的一个个分意象,它们联结起来,构成了一幅寒风和风沙肆虐下的北方画卷。
A 画面感
B 历史感
C 意象感
D 沧桑感
单选题
9.2、《**》在人物描写上,善于借助性格化的()描写,揭示人物潜在的心理活动,勾勒人物的精神特征,展现复杂深微的人际关系。所有出场人物都栩栩如生,包括着墨不多的九斤老太和八一嫂,都给人以深刻印象。
A 性格
B 细节
C 肖像
D 心理
单选题 10.3、组织管理的技术——系统工程是一篇宏观性质的科普作品,不像科学小品,可从科学现象点滴生发开去;也不能如科幻作品,展开幻想翅膀高飞。它既有严格的科学性,用准确、通俗的文字高度概括地介绍系统工程的知识;又深入浅出,(),寓繁于简,以鲜明的观点、丰富的内容、醒目的标题豁人耳目,使外行乐意领教。
A 通俗易懂
B 以一总万
C 大题小做
D 另辟蹊径
单选题
11.2、巴金《爱尔克的灯光》文中“灯光”的象征性和抒情氛围。
“灯光”是全文的核心意象。作者写了几种灯光,旧居的灯光,爱尔克的灯光,心灵的灯光,分别象征了昏昏欲睡、了无生气的旧家庭的命运,对被旧家庭葬送而无缘再见的姐姐的思念,和作者追求新的生活、新的理想的心理动力。整篇文章始终以()为线索,最后又以灯光作结,结构严谨,笔墨集中,构成了一个完美的意象整体。
A 行踪
B “灯光”
C 情感
D 家事
单选题
12.4、巴金的《家》、《春》、《秋》合称为()。
A 激流三部曲
B 爱情三部曲
C 青春三部曲
D 叛逆三部曲
单选题
13.1、下文运用了()等修辞手法,语言洗炼,容量大,含义深,耐人寻味。如: 即便是站在海边礁石上,也没有像这里这样强烈地领受到水的魅力。海水是雍容大度的聚会,聚会得太多太深,茫茫一片,让人忘记它是切切实实的水,可掬可捧的水。这里的水却不同,要说多也不算太多,但股股叠叠都精神焕发,合在一起比赛着飞奔的力量,踊跃着喧嚣的生命。这种比赛又极有规矩,奔着奔着,遇到江心的分水堤,刷地一下裁割为二,直窜出去,两股水分别撞到了一道坚坝,立即乖乖地转身改向,再在另一道坚坝上撞一下,于是又根据筑坝者的指令来一番调整„„也许水流对自己的驯顺有点恼怒了,突然撒起野来,猛地翻卷咆哮,但越是这样越是显现出一种更壮丽的驯顺。已经咆哮到让人心魄俱夺,也没有一滴水溅错了方位。阴气森森间,延续着一场千年的收伏战。水在这里,吃够了苦头也出足了风头,就像一大拨翻越各种障碍的马拉松健儿,把最强悍的生命付之于规整,付之于企盼,付之于众目睽睽。看云看雾看日出各有胜地,要看水,万不可忘了都江堰。
A 拟人
B 比喻
C 白描
D 特写
单选题
14.2、21世纪是开放、兼容、共享的新时代,数字技术更使影视与电脑网络联成一体,世界成名副其实的“地球村”。重视知识创新和传播是今天知识经济的显著特征。当你进入社会从事职场工作时,你不仅要处理各种专业事务,而且必须应对纷繁的相互关系。沟通,将对你事业的成功与个人的幸福极为重要:成功之径,构通起步。沟通(communication)是人们分享信息、思想和情感的任何过程。沟通的起点是()与博爱。
A 和谐
B 包容
C 认同
D 共识
单选题
15.2、《前赤壁赋》中作者写景抒情由情入理生动地抒发的不重得失的豁达乐观的情怀。文中他以()阐明变与不变的哲理:
客亦知夫水与月乎?逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎?且夫天地之间,物各有主。苟非吾之所有,虽一毫而莫取。惟江上之清风,与山间之明月,耳得之而为声,目遇之而成色。取之无禁,用之不竭。是造物者之无尽藏也,而吾与子之所共适。
A 主客问答
B 清风明月
C 人生感悟
单选题
1.《再别康桥》诗中的波光、柳树、青草、清泉、榆荫、彩虹、划船撑篙者的身影,有的是实物描写,有的是景物与情感结合的点染勾勒。开头、结尾中“轻轻的”、“悄悄的”,与“挥袖”、“云彩”的结合,把内心情感投射于客观物象,融情于景,含蓄地表达对康桥的依依惜别之情。使诗歌具有的画面感,充分体现了()。
A 三美 B 建筑美 C 绘画美 D 音乐美
正确答案:C 单选题
2.《将进酒》是李白的代表作之一。它慨叹“古来圣贤皆寂寞”,表现出一种鄙弃世俗、蔑视()的傲岸精神。但由于内心的矛盾无法排遣解决,因而诗中也流露出人生苦短、及时行乐的消极情绪。全诗以河水急下、直泻入海的气魄,和笔酣墨饱、豪迈狂放的风格,着力表现了此时的豪纵心情。《唐诗别裁》云:“读李(白)诗者于雄快之中,得其深远宕逸之神,才是谪仙人面目。”此篇足以当之。
A 权威 B 官场 C 陈见 D 富贵
正确答案:D 单选题
3.孝道是我国传统文化的精髓之一,孝敬长辈、尊老抚幼既是中华民族的传统美德,也是我们整个中华民族得以()和发展的重要根基。从热爱父母亲、让亲情更加融洽做起,继而把这种淳朴高尚的感情逐步升华为爱他人、爱社会、爱祖国、爱人类,在家行孝,在国尽忠。
A 建立 B 生息 C 凝聚 D 生存
正确答案:C 单选题
4.下文运用了()等修辞手法,语言洗炼,容量大,含义深,耐人寻味。如:即便是站在海边礁石上,也没有像这里这样强烈地领受到水的魅力。海水是雍容大度的聚会,聚会得太多太深,茫茫一片,让人忘记它是切切实实的水,可掬可捧的水。这里的水却不同,要说多也不算太多,但股股叠叠都精神焕发,合在一起比赛着飞奔的力量,踊跃着喧嚣的生命。这种比赛又极有规矩,奔着奔着,遇到江心的分水堤,刷地一下裁割为二,直窜出去,两股水分别撞到了一道坚坝,立即乖乖地转身改向,再在另一道坚坝上撞一下,于是又根据筑坝者的指令来一番调整……也许水流对自己的驯顺有点恼怒了,突然撒起野来,猛地翻卷咆哮,但越是这样越是显现出一种更壮丽的驯顺。已经咆哮到让人心魄俱夺,也没有一滴水溅错了方位。阴气森森间,延续着一场千年的收伏战。水在这里,吃够了苦头也出足了风头,就像一大拨翻越各种障碍的马拉松健儿,把最强悍的生命付之于规整,付之于企盼,付之于众目睽睽。看云看雾看日出各有胜地,要看水,万不可忘了都江堰。
A 拟人 B 比喻 C 白描 D 特写
正确答案:A 单选题
5.《组织管理的技术——系统工程》是一篇宏观性质的科普作品,不像科学小品,可从科学现象点滴生发开去;也不能如科幻作品,展开幻想翅膀高飞。它既有严格的科学性,用准确、通俗的文字高度概括地介绍系统工程的知识;又深入浅出,(),寓繁于简,以鲜明的观点、丰富的内容、醒目的标题豁人耳目,使外行乐意领教。
A 通俗易懂 B 以一总万 C 大题小做 D 另辟蹊径
正确答案:C 单选题
6.《**》在人物描写上,善于借助性格化的()描写,揭示人物潜在的心理活动,勾勒人物的精神特征,展现复杂深微的人际关系。所有出场人物都栩栩如生,包括着墨不多的九斤老太和八一嫂,都给人以深刻印象。
A 性格 B 细节 C 肖像 D 心理
正确答案:B 单选题
7.《金锁记》这篇小说名称的含义:金钱成为七巧的枷锁。七巧被金钱支配的包办婚姻所害。七巧婚后不幸的遭遇。七巧为金钱所异化,心理变态。最后,七巧以其一生幸福换来钱,但除了一点钱,她(),一生戴上金钱枷锁,又用这枷锁害人害己。
A 一无所有 B 虚度人生 C 痛苦一生 D 苦不堪言
正确答案:A 单选题
8.读莫言之前必须做好心理准备,他的作品中除了有精彩的关于爱、自然和善良的描写外,还有极其暴力、残酷、血腥的描写,比如反映20世纪中国被日本占领时期的作品。莫言的创作视野宽阔,几乎涵盖所有领域。尽管他的作品中描写的是自己故乡的小村庄,但让读者感受到的却是人类共有的情感体验。莫言曾用43天时间写了一部47万字的小说,为什么写得这样快?因为他抛弃了电脑,重新拿起了笔,他写的这部小说是()。
A 《生死疲劳》 B 《透明的红萝卜》 C 《红高粱家族》 D 《丰乳肥臀》
正确答案:A 单选题
9.钱钟书《论快乐》阐述快乐是人类的一种基本(),它是短暂的,无法永远,却是人生永远的诱惑与希望。
A 追求 B 信念 C 感情 D 愿望
正确答案:C 单选题 10.1889年,23岁的()遇见了美丽的女演员茅德·冈,并对她一见钟情。尽管这段爱情最终夭折,但强烈的爱慕之情却给诗人带来了无穷的灵感,此后诗人创作了许多有关爱情的诗歌。《当你老了》就是其中一首。
A 拜伦 B 普希金 C 雪莱 D 叶紫(芝)
正确答案:D 单选题
11.人非草木,谁能无情?在人生的道路上,友情是风,亲情如灯,珍惜你身边无私的()与同伴的友谊吧,别对它们视而不见,不与理睬。它们是风中的声音,需要你倾听,更需要你呵护。
A 关爱 B 亲情 C 帮助 D 支援
正确答案:B 单选题
12.巴金《爱尔克的灯光》文中“灯光”是全文的核心意象。作者写了几种灯光,旧居的灯光,爱尔克的灯光,心灵的灯光,分别象征了昏昏欲睡、了无生气的旧家庭的命运,对被旧家庭葬送而无缘再见的姐姐的思念,和作者追求新的生活、新的理想的心理动力。整篇文章始终以()为线索,最后又以灯光作结,结构严谨,笔墨集中,构成了一个完美的意象整体。
A 行踪 B 灯光 C 情感 D 家事
正确答案:B 单选题
13.沈从文《鸭窠围的夜》中“原汁”“原味”“原生态”——独到的艺术表现手段与美学追求,通过对()的人生现象的描写,流溢着生命的诗意。
A 世态 B平凡 C 日常 D 原生态
正确答案:B 单选题
14.青早年在法国留学,受法国的印象主义绘画和象征主义诗歌的影响很大。印象主义绘画讲究画家个人对光、影的感受,将实物的瞬间印象呈现于画布之上;而象征主义诗歌则注重营造充满暗示和象征意义的意象。另外,中国传统的诗画结合理论也给了艾青以启示。所以艾青的诗歌很有()。诗人从“感觉”出发,捕捉瞬间的印象,然后渗入自己的主观情感,创造出具有象征意义的视觉形象。《北方》体现了诗人深厚的爱国主义情感,在《北方》一诗中,“土地”作为一个整体的意象特别突出,它既象征着祖国,也象征着生活在土地上的人民。其他的景物:冻结的村庄、山坡、河岸,在风沙中前行的孤单行人、负重的驴子、惊惶的雁群……可以说是北方“土地”整体意象之下的一个个分意象,它们联结起来,构成了一幅寒风和风沙肆虐下的北方画卷。
A 画面感 B 历史感 C 意象感 D 沧桑感
正确答案:A 单选题
15.国学大师王国维把“昨夜西风凋碧树。独上高楼,望尽天涯路。”“衣带渐宽终不悔,为伊消得人憔悴。”“众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。”这三句词喻作为古今成就大事业大学问必经的三种境界,并赋予了全新含义:他认为第一种境界是站得高、看得远、立下宏伟志向;第二种境界是要为了自己的志向而努力,即使衣带渐宽也终不悔;第三种境界是坚持自己的理想,要耐得住()、淡泊。
A 寂寞 B 艰辛 C 挫折 D 孤独
正确答案:A 单选题
16.胡适在中国哲学史、文学史、古典小说和古籍整理等各个领域的研究中,都有重要成果。主要著作有:《胡适文存》(共三集)、《中国哲学史》、《白话文学史》、《中国章回小说考证》等。其《尝试集》为中国现代文学史上第一部()集。
A 政论 B 学术著作 C 新诗 D 话剧作品
正确答案:C 单选题
17.规模宏大,结构严谨,情节复杂,塑造了众多具有典型性格的艺术形象,其思想性和艺术性,均堪称我国古代长篇小说的巅峰的名作是()。
A 《三国演义》 B 《水浒传》 C 《红楼梦》 D 《金瓶梅》
正确答案:C 单选题
18.《生命不能承受之轻》是昆德拉才华得到集中体现的一部作品。他从一两个关键词以及基本情境出发构成了小说的人物情节。作者以一个哲人的睿智将人类的生存情景提升到形而上的高度加以考虑和审视,成功地把握了()与性爱两个敏感领域。但他拒绝得出结论,他认为世界并没有绝对的真理,只有一大堆相对的问题。因此在这里他反复提出轻、重;灵、肉;记忆、虚弱等一系列的生存暗码,并与人各自的生存状态一一对应,展现了心灵与肉体的两重性。
A 政治 B 经济 C 道德 D 文化
正确答案:A 单选题
19.《老人与海》这部小说是根据一位古巴渔夫的真实经历创作的:一个孤独的老人单身出海捕鱼,与大鱼周旋,但他捕获的大鱼又被鲨鱼吃掉。小说描写了人奋斗中的心路历程:面对失败仍顽强拼搏、绝不屈服的意志。作者是海明威,他是()作家。
A 英国 B 美国 C 古巴 D 巴西
正确答案:B 单选题
20.《长沮桀溺耦而耕》通过孔子()遭讥讽的事例,表现了尽管傲睨孤高的隐士对孔子冷嘲热讽,但他却仍心忧天下,积极进取,并不因人嘲讽而改初衷,执着地坚持自己的人生追求。
A 寻问渡口 B 打听友人 C 评论时政 D 迷路问路
正确答案:A 单选题
21.《百年孤独》被誉为“再现拉丁美洲历史社会图景的鸿篇巨著”,也是拉丁美洲()文学作品的代表作。全书近30万字,内容庞杂,人物众多,情节曲折离奇,再加上神话故事、宗教典故、民间传说以及作家独创的从未来的角度来回忆过去的新颖倒叙手法等等,令人眼花缭乱。作家以生动的笔触,刻画了性格鲜明的众多人物,描绘了这个家族的孤独精神。
A 魔幻现实主义 B 批判现实主义 C 浪漫主义 D 民族
正确答案:A 单选题
22.竺可桢1936年起任浙江大学校长,在国步艰危、颠沛流离之中,他执掌浙大13年,以“求是”为校训,身为表率,包容兼蓄,教授云集,培育出一大批精英良才。浙江大学从此崛起为全国名牌大学,被誉为“东方剑桥”,蜚声中外。《唐宋诗中的物候》选取了()这个独特的角度,介绍物候的有关知识。借助唐宋诗中月、露、风、云等之咏,揭示大自然的本质,进一步分析了唐宋诗中描写出植物和候鸟等物候特点及其反映出的物候规律。
A 气候 B 植物候鸟 C 唐宋诗 D 月露风云
正确答案:C 单选题
23.《工作与人生》中,王小波提出的生活方式是“回到日常,超越日常”,这是一篇(),严肃而又精辟地阐明了人生要义。
A 短篇小说 B 抒情散文 C 文学评论 D 思想随笔
正确答案:D 单选题
24.《登高》写于大历二年秋天(767),杜甫在夔州所写。全诗通过登高所望夔州秋江的景色,倾诉了自己常年漂泊、老病孤愁的复杂心情。诗歌慷慨激越,动人心弦,八句全对,一气流转,给人均齐对称的美感而不见斧凿之痕。体现了杜甫沉郁顿挫的诗风和严谨的格律,诗人把()与国恨紧密交织,把个人命运与国家命运休戚相关,更让人感到这位诗人伟大的人格。前四句写登高所见,后四句抒登高所感。所览之景苍凉雄浑,所抒之情沉郁悲抑,情景交融,浑然一体。悲壮而不伤感,愁苦而不消沉,是一曲卓绝千古的秋之歌。
A 秋景 B 漂泊心情 C 家愁 D 人生感悟
正确答案:C 单选题
25.《前赤壁赋》中作者写景抒情由情入理生动地抒发的不重得失的豁达乐观的情怀。文中他以()阐明变与不变的哲理:客亦知夫水与月乎?逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎?且夫天地之间,物各有主。苟非吾之所有,虽一毫而莫取。惟江上之清风,与山间之明月,耳得之而为声,目遇之而成色。取之无禁,用之不竭。是造物者之无尽藏也,而吾与子之所共适。
A 主客问答 B 清风明月 C 人生感悟 D 以景拟人
正确答案:A 加入错题集 关闭
关键词:运行时优化,LLVM,java虚拟机
0 引言
随着计算机体系结构和硬件技术的发展, 应用程序的代码量逐年增加, 其程序行为在整个执行期间变化复杂并支持动态扩展和更新, 甚至有些模块需要多种语言协调实现。有些程序的运行时间主要集中在几个热点之上, 而有些程序的运行时间分布比较均匀。因此, 笔者认为支持对程序整个生命期的分析和转换是最大化所有程序的效率的有效手段。整个生命期的代码优化技术包含链接时的过程间优化、装载时的与平台相关优化、运行时的动态优化和空闲时的剖析 (profiling) 指导反馈优化。
通常, 我们把优化技术分成两类:静态优化和动态优化。静态优化技术的成熟, 使得静态优化对程序性能提升的空间越来越小;而动态优化目前主要集中在对动态语言程序如Java、Ruby、Python等的优化。C/C++程序是静态编译优化的典型代表, 文章以它们为讨论对象, 在研究java虚拟机中运行时优化机制的基础上, 结合LLVM架构讨论了面向C/C++程序的运行时优化技术。
1 静态优化和动态优化
从技术角度来看, 静态和动态优化技术不应该是相对立且竞争的, 应该综合利用静态和动态编译技术的各自特点, 在面向动态环境的同时, 能获取静态编译的优势。从发展的角度来看, 随着多核技术的发展, 运行时的剖析机制和反馈指导优化技术将会成为优化技术的主流。动态编译系统通常可以分为3类:静态多版本、参数化、运行时代码生成和动态重编译。
静态多版本技术是指编译器在编译时为指定的程序段利用不同算法或不同优化技术生成多个版本, 在运行时根据输入数据集或执行环境等选择一个最佳的版本执行。Autotuner工具进一步拓展该技术, 依据运行时的数据收集, 在版本之间进行切换。静态多版本技术受限于编译时的可见信息, 并且为了避免代码爆炸, 影响指令cache性能, 编译器产生的版本有限。
为了克服静态多版本的限制, 参数化技术允许编译器产生的代码可以根据程序执行的值进行重构。该技术多用于循环转换技术, 使许多标准的循环转换可以在运行时利用参数来决定是否采用。
运行时代码生成和动态重编译[6,7]在程序执行过程中, 利用程序以往的行为和执行环境, 针对程序关键路径进行优化, 生成新的可执行代码。和静态多版本以及参数化技术相比, 运行时代码生成和动态重编译能够更有效地利用程序运行时信息优化程序, 具有更大的灵活性和可扩展性, 重新生成的代码更适应当前的执行环境。动态重编译的关键是对热路径的识别以及收益和开销的计算。多线程技术使得动态重编译的开销变得不再重要, 比如Mihai BurceaD1等提出了面向OpenMP的运行时优化系统stOMP。
Java虚拟机中的运行时优化系统, 为我们研究如何支持C/C++的运行时优化提供了很好的学习平台。下面首先介绍java虚拟机中的运行时优化技术。
2 java虚拟机中的动态优化技术
动态编译技术按照目的可以分为两大类: (1) 选择性编译:主要关注何时选择程序哪一部分代码进行动态编译和优化; (2) 基于反馈的优化:利用剖析信息来指导动态编译器来做何种级别的编译优化。
2.1 选择性编译
基于一个被广泛认同的现实:程序80%的时间消耗在20%的代码上。很多虚拟机采用了选择性动态编译, 即将编译资源主要用在那些经常被执行的代码上, 这部分代码又被称作“热点 (hotspot) ”。动态编译器通常支持两种执行方式:一种是解释执行或无优化的编译器编译执行;一种是优化编译, 对热点路径进行重点优化。动态编译器中的编译优化工作是在程序运行状态中进行, 编译开销包含在程序的运行开销中, 对热点路径代码进行重点优化使得虚拟机没有把时间浪费在编译那些不经常执行的代码上。因此, 选择哪些代码段作为热点方法进行动态优化以及怎样权衡动态优化的开销和性能收益, 是每一个动态编译器需要考虑的问题。这却又是个NP完全问题。通常用公式:ΔToverall=Tcompile-N× (Tunopt-Topt) 来评估选择优化后的性能。其中ΔToverall表示由于动态优化而导致代码段运行时间的变化, Tcompile指动态优化编译所需的时间开销以及维护新版本可执行代码的开销, Tupopt是优化之前热点的平均运行时间, Topt是热点的新优化版本的平均运行时间。ΔToverall为正数表示动态优化的开销大于收益, ΔToverall为负数意味着收益大于开销。
通过上述分析可以看出, 热点代码段主要有两类:一类是运行时间很长 (Tunopt很大) 、一类是该部分代码被经常调用 (N很大) 。
计数和采样技术是选择性优化编译中的两类主要技术。计数方法是为每一个方法设置一个计数器, 用来记录方法的调用次数, 有时也可以用来获取循环的迭代次数;采样技术是周期性的中断系统, 记录当前调用栈中栈顶的一个或多个方法。基于对计数器和采样数据的简单分析, 系统中的决策模块决定某个方法是否是需要进一步优化的热点方法。许多系统采用的启发方式就是一个简单的分水岭策略:当方法的调用次数或者执行时间达到某个临界值时, 就对该方法进行重点优化。
2.2 基于反馈的动态优化技术
动态编译器不仅可以选择对哪些代码做编译或者优化编译, 而且还可以在程序的运行中采集程序的运行信息, 主要包括程序的循环深度、程序输入以及运行环境 (操作系统、体系结构) 等。利用这些运行时信息, 动态编译器可以更好地决定采用何种编译优化策略对程序进行编译优化。动态剖析技术使得多级优化编译成为可能, 每一级采用特定的优化策略, 热点的性能更容易得到提升, 这就是基于反馈的动态优化技术 (FDO) 。
基于反馈的动态优化技术主要通过对程序插桩, 利用插入的代码收集需要的程序信息, 然后将它们按照一定的格式组织起来进行分析, 从而指导优化器进行重编译。通常采用公式ΔToverall= (Tcompile+Tmeasure) -N× (Tunopt-Topt) 来评估基于反馈的动态优化效果。其中, Tmeasure表示收集、组织、分析剖析信息需要花费的时间。从公式可以看出, Tmeasure是一个影响动态优化性能的一个主要方面, 怎样减少Tmeasure是每一个基于反馈的动态优化技术的动态优化编译器需要考虑的问题。一个主要的原则是减少插桩代码的运行时间, 通常采用的方式是对早期未经过优化编译的版本进行插桩, 当收集到所需信息后立即重编译代码并执行新版本的代码。对早期代码进行插桩的主要好处是:
(1) 插桩带来的开销相对比较小;
(2) 越早获取剖析信息就可以越早地进行高效精确的重编译。
不过, 这种方式也容易导致后续的编译策略错误, 一方面早期获得的信息可能不会准确反映程序的主要特征, 程序的运行特征在中后期可能会发生很大变化;另一方面很多有用的程序信息很难在早期未经优化的代码中获得, 例如Inline优化会改变程序结构, 导致后期程序的热点路径发生变化。
3 C/C++的runtime优化研究
对于C/C++应用程序, 通常采用静态编译器针对运行平台编译优化成可执行程序, 没有运行时优化。静态编译器对程序的静态分析, 只能得到程序的近似解, 不能符合所有情况;静态优化器也有采用剖析技术进行重编译, 其采样的输入数据有限, 有些情况下, 程序会变得更慢。因此, 如何运行时的优化来弥补静态编译的不足, 成为当前研究的热点。
3.1 支持C/C++运行时优化的LLVM编译架构
LLVM架构是美国伊利诺斯大学开发的开放源代码编译器架构, 它把程序的生命周期分成5个阶段:编译 (compile) 、连接 (link) 、加载 (install) 、运行 (run) 和空闲 (idle) 。LLVM支持程序整个生命周期的分析和优化, 其系统框架图如图1所示。
静态编译器前端生成LLVM的中间表示IR;链接器基于IR进行链接时的优化, 例如过程间优化;在程序的链接或加载阶段生成特定平台的本地码;为了支持运行时优化, LLVM的IR也保存在本地码中。本地码生成器在代码生成阶段插入轻量级的插桩指令, 用于程序运行时的热点探测, 优化器对程序热点进行运行时优化。运行时的剖析数据收集面向终端用户的程序行为, 依据剖析数据在程序的空闲阶段对程序进行优化并链接成新的可执行程序。
LLVM提供两种代码生成方式: (1) 静态生成高效的包含IR的可执行代码; (2) 生成LLVM的字节码 (bytecode) 。LLVM提供JIT动态优化器和可选的字节码解释器来运行字节码。JIT以函数为单位进行运行时的优化和代码生成。第一种代码生成策略主要面向程序空闲阶段的重编译, LLVM中的优化器依据程序执行时收集的剖析信息对IR进行重优化并链接成可执行程序。这种优化策略的问题是基于上一次运行时剖析信息的优化不一定适用于下一次程序运行。第二种方法使得程序执行过程类似于java的动态优化过程。当程序执行时, 通过剖析方法定位出程序的热点路径:静态插入的插桩代码能够定位出代码中经常执行的循环区域, 运行时的插桩库在该循环区域进一步插桩找出区域内的热点路径。当热点路径找到后, JIT拷贝该路径的LLVM的字节码, 并进行优化生成本地码后放到软件管理的路径cache中, 在原代码中插入分支指令跳转到新生成的本地码。运行时的优化对时间比较敏感, 需要计算优化后的收益大于优化的时间开销, 并且程序的第一次执行需要的时间开销比较大。
3.2 支持C/C++运行时优化存在的问题
如何发挥多核多线程的技术优势, 克服LLVM编译架构中存在的技术不足, 是研究设计支持C/C++程序运行时优化的一个难点。如何使程序从热路径的当前执行点切换到优化后新版本的执行点, 是一个值得研究的问题。目前LLVM采用在程序空闲阶段对热点或整个程序进行重编译并链接成可执行程序, 在程序下一次执行时, 调用该新版本的程序。这种策略的效果依赖于程序前后两次执行的输入集的相似度, 它和基于静态剖析技术反馈的重编译技术没有本质区别。
4 模拟测试
对静态优化和动态优化的性能比较测试, 我们用java程序SPECjvm98基准测试级进行模拟, 测试平台如图2所示:静态优化编译器采用gcc 4.2.0版本3级优化, java虚拟机采用JDK1.6缺省运行模式。
SPECjvm98基准测试级共8个应用程序, 其中_200_check用于java的功能检测不作为性能比较, _228_jack程序没有通过gcj测试, 所以我们只对其中的6个程序进行比较测试, 测试结果如表1所示。
表1虽然不能说明C/C++程序静态和动态优化的性能比较, 却很好地说明了java程序动态优化的优势, 6个程序无一例外, JDK的平均性能比gcj的静态优化性能高81.22%。
5 结束语
文献[9]通过热点路径剖析发现大约的20%路径是不连续的, 甚至不在一个虚拟内存页内, 因此, 笔者认为运行时优化的重点是对热点路径的探测和优化以提高代码的局部性和编译指导的分支预测的正确性。随着多核技术的发展, 运行时的优化开销将被忽略, 编译优化器将成为应用程序执行中的一个服务线程。对C/C++程序的运行时优化技术的研究为提高C/C++程序性能开辟了新的途径。
参考文献
[1]CHRIS LATTNER, VIKRAM Adve.LLVM:A Compilation Frame-work for Lifelong Program Analysis&Transformation.In2th Int’l Symposium on Code Generation and Optimization, 2004.
[2]MICHAEL J.Voss, Rudolf Eigenmann.High-Level Adaptive Program Optimization with ADAPT.PPOPP′01, 2001.
[3]M.BYLER, J.R.B.DAVIEW, C.HUSION, et al.Multiple Version loops.Int’l Conf on Parallel Processing, 1987.
[4]M.FRIGO, S.G.JOHNSON.The Design and Implementation of FFTW3.Proceedings of the IEEE, vol.93, no.2, 2005.
[5]RAJIV GUPTA, RASTISLAV BODIK.Adaptive loop transformations for scientic programs[J].In IEEE Symposium on Parallel and Dis-tributed Processing, October1995.
[6]R.GUPTA, R.BODIK.Adaptive Loop Transformations for Scientific Programs[J].IEEE Symp on Parallel and Distributed Processing, 1995.
[7]X.ZHANG.Z.WANG.N, GLOY, et al.System Support for Automatic profiling and Optimization[J].Proc16th ACM Symp on Operating Systems Principles, 1997.
[8]V BALA, E DUESTERWALD, S.BANERJIA, Dynamo:A Transpar-ent Runtime Optimization System.ACM SIGPLAN2000Conf on Programming Language Design and Implementation, 2000.
[9]DUANE MERRILL, KIM HAZELWOOD.Trace Fragment Selection within Method-based JVMs.In4nd Conference onVirtual Execution Environments, 2008.
关键词 递归;循环;C语言
中图分类号 TP 文献标识码 A 文章编号 1673-9671-(2010)121-0031-01
递归作为一种正对实际问题的程序设计解决方案,在整个编程语言学习及程序设计方面有着极其重要的地位。而在实际的教学环节中对于这样一种具有很高使用价值的编程技术,在讲解上和学生理解上还存在着一定困难。
1 递归的基本条件
循环结构是结构化程序设计的三种结构之一,主要应用在处理某些需要重复执行特定语句的情况下,通常在使用循环时我们需要明确三个重要条件:
1)循环的初始条件。可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的问题的规模有规律地递减。也就是说解决问题的方法相同,调用函数的参数每次不同(有规律地递减),如果没有规律也就不能运用递归方法求解。
2)循环的中止条件(或在什么情况下循环运行)。每个子问题必须比原来问题的规模更小,即使小一号也行,如果能够迅速减小规模更好。
3)程序有趋于结束的趋势。必定要有一个明确的结束递归的条件。当问题的规模达到一定程度时(一般的时候应该是规模足够小),问题的解是已知的,在这个地方能结束递归调用,不然可能导致系统崩溃或陷入死循环。
而递归作为一种算法,在数学上我们时这样定义它的,以n的阶乘为例:
0!=1(*)
n!=n*(n-1) 当n>0时 (**)
其中(*)称为基本实例(基本实例的值必须是直接获得的);(**)称为递归归约。递归被定义为:自身定义为一种含有自身简化的形式。那么从形式上我们可以清楚的看到:①每个递归定义必须有一个(或者多个)基本实例;②递归归约最终归结到基本实例;③在基本实例处停止递归。从中我们不难发现递归的算法形式条件和循环的条件是非常类似的。
那么在运行递归函数时,逻辑上我们可以认为递归函数有无限的自身拷贝,完成某个递归调用后,控制返回到先前的调用环境。这同循环算法在思想上也是异曲同工的。所以我们也完全可以编写一个循环结构来替代递归。
造成这种可替代性的主要原因是因为目前为止的编译系统处理递归函数时,在编译之后都是自动将递归转化为循环的。但是和循环不同的是,编译后的递归需要创建一个内存栈来存储递归过程中的临时变量,对于递归函数的调用和返回操作,则分别对应栈的入栈和出栈。
因此任何一个递归程序都可以通过引入堆栈的形式来转化为循环,这种转化其实就是模拟计算机实现递归的过程。你可以考虑人脑来计算递归的过程:先倒过来向前递归,到达最初点以后再正过来向后递推,堆栈的作用就是记住过程中的临时变量。虽然这样做只不过是模拟递归的执行过程,将原来由编译器实现的事情在程序中用代码实现了一遍,但是确实可以通过循环和堆栈的数据结构特性来实现递归的算法和递归函数的功能。
2 递归问题分析
递归程序最少有两种方法可以写出。第一种是想办法把问题转化为数学表达式,能用数学表达式写出的,可以直接把数学表达式变为程序;第二种是按照递归的基本条件,分析所给问题的结构,一个问题总具有一定的规模,想办法把规模变小,使小规模的问题与原问题具有相同的解法,当规模足够小时,该问题的解是已知的,这时可以套用后面所讲的一般递归程序的结构来写递归程序。
例1:求n!。经过分析n!可以表示为
假定n!是一个long型,则直接写出程序如下:
long func(int n) //求n!
{if(n==1 || n==0)
return 1;
return n*func(n-1);
}
例2:求Fibonacci数列(非波纳契)的第n项,该数列表示如下:
按照例1的方法,写出程序如下:
longfib(int n)
{ if( (n==1||(n==2) )
① return 1;
else
② return fib(n-1)+fib(n-2);
}
如输入n=4,程序(具体程序用行标号代替)的执行过程如图1所示,通过分析以上程序,大部分学生对递归函数的执行过程有了较为清晰的认识。
例3:用递归的方法将一个正整数n按位输出,如输入2008,输出2 0 0 8,n的位数不确定,可以是任意正整数。
分析:①函数应该是处理整数n,并且是输出,用PrintNum(int n)来实现这一功能;②如果n的规模很小(只有1位),可以直接输出后结束程序;(这里应该知道n的位数是问题的规模);③把问题的规模变小,去掉n的某1位(在实际讲解时是去掉个位,因为去掉个位比较容易一些,我们用k=n%10保存个位,n=n/10就可以去掉个位),余下位形成一个新的规模比原数小的数,再在新数上递归调用函数,这个新数按要求输出后,去掉的这一位因为是个位,所以应该把它输出到新数的后面。
通过以上分析,写出程序如下:
void PrintNum(int n)/*该函数能把n按要求输出*/
{ int k;
if(n<10){ printf("%2d",n); return ;} /*如果规模很小,则直接处理后结束程序*/
k=n%10; /*在n中提出个位数字*/
PrintNum(n/10);/*把规模更小的子问题递归调用函数来处理*/
printf("%2d",k);
}
通过以上三个例子,学生对递归函数有了较为清晰的认识,对递归程序的写法有了一定的掌握之后,我们可以总结出一个一般递归程序的结构如下,几乎所有递归程序都可以按照这个结构去分析并写程序。
ReturnType Function(问题描述及规模)/* 在程序内部我们应该认为函数Function已经具备处理这类问题的功能,它可以直接被调用 */
我们根据这个结构,要求学生回过来简单看一下前面的三个例子,多数学生便会对递归有更为深入的认识。之后引入汉诺塔问题,该问题的分析方法类似于例3,并套用这个结构,让学生自己试着写该问题的程序,可以发现有一部分学生能自己写出递归函数来。
3 总结
在C语言中,函数一直是学习的重点和难点,递归又是最难掌握的一类函数,本文从实际教学需要出发,首先分析递归的基本条件,从由易到难的顺序,设计了一些教学实例,重点让学生了解递归函数的写法以及执行情况,最后总结出递归函数的一般程序结构,使学生能正确设计递归程序,在实际教学中取得了良好的效果。
参考文献
[1][美]Robert Sedgewick.C算法(第一卷).人民邮电出版社,2004
【c程序设计作业】推荐阅读:
c语言程序设计作业三06-24
c语言设计程序11-11
《C程序设计》重点总结09-26
C语言图形程序设计报告10-13
c语言程序设计基础题10-28
《C程序设计》课程教学大纲10-19
c语言程序设计复习题10-28
《C语言程序设计》精品试题(附讲解答案)06-10
AVR单片机C语言高级程序设计09-25