首页 > 文章中心 > 片段式作文

片段式作文

片段式作文

片段式作文范文第1篇

关键词:初中作文;教学;片段训练;微作文

微作文是一种很好的作文训练形式,对于逐渐提升学生的作文技巧与写作能力都会起到非常好的促进作用。教师在引导学生展开片段训练时要掌握正确的方法与技巧,对于训练主题的选取,引导方式的选择等都要有合理的考虑。这样才能够充分发挥片段训练的积极教学功效,并且能够让学生自身的语言能力与写作技巧得到长足提升。

1、对生活片段的真实记录

片段作文训练可以有很多不同的展开形式,首先,教师可以引导学生对于生活片段进行真实记录,这是片段训练的一个很好的教学切入点。生活中往往是学生获取写作素材的最为直接的渠道,多从生活中积累一些感受与体验,这对于学生自身的写作也会带来很多帮助。因此,教师可以首先引导学生对于生活片段进行真实记录,首先让学生在片段训练中将生活中的一些有意思的细节、场景或者人物写清楚。这不仅是提升学生作文能力的一个很好的训练过程,这也会极大的提升作文教学的综合效率。

有学生在写帮妈妈做家务的片段训练中这样写道:“我双手捞起一条滑溜溜的草鱼,把它放在砧板上,左手按住它的头,右手拿起菜刀,刚想刮去它的鳞片,没想到这条放在砧板上的鱼,不想任人宰割,‘扑腾’一声,从我的手中挣脱开来,溅了我一脸的血水不说,还差点割伤了自己的手。”这无疑是学生对生活的真切体验,这样的记录读来让人感受到浓郁的生活气息。这便是一个很好的习作片段,教师要引导学生对于生活有更为悉心的观察,并且记录下生活中这些难忘的场景与瞬间,这对于学生写作能力的提升会很有帮助。

2、对于细节的清晰刻画

片段训练中加强学生对于细节的刻画能力同样非常重要,这也是一个很重要的作文教学要点。很多学生在自己的习作中都不具备较好的细节描述能力,学生笔下的细节往往缺乏活力,读起来没有感染力。教师在让学生进行片段训练时可以首先引导大家感受一些作家笔下的经典的片段描写,让学生学习这些好的文章中细节的有效表达方式。这不仅会深化学生的写作技巧积累,这也会极大的提升学生自身的写作素养。

很多经典的文章中都有着大量值得学生学习的细节刻画范本,如《散步》中对南方初春田野的细节描写(环境细节),虽着墨不多却透露出春的气息和不可遏制的生机;朱自清的《背影》之所以让人刻骨铭心,是因为其中父亲买橘的背影(外貌细节)被刻画得感人至深;鲁迅笔下的孔乙己到成亨酒店里买酒喝时,“排出九文大钱”,就这么一个动作细节描写就把孔乙己明明穷困潦倒却还要摆阔的迂腐性格展现得淋漓尽致。教师要引导学生对于这些精美的细节加强体验,这对于提升学生的细节刻画能力会起到很好的推动作用。

3、丰富片段训练的教学方式

想要进一步体现微作文教学的功效,教师要有意识的丰富片段训练的教学方式,这在实际教学中也非常重要。教师可以在课堂上确立一些相应的主题,让学生来进行片段训练;也可以让学生进行仿写、续写或者是让学生展开即兴作文。多样化片段训练的教学形式不仅能够丰富作文课堂,这也会从不同的方面展开对于学生写作技巧与写作能力的训练。这样才能够充分体现微作文的积极教学功效。

例如,一次微作文课堂上教师可以如下进行教学导入:阳春三月去踏青是一件赏心悦目的事。同学们徜徉在鸟语春光中,春天万物生机勃发的景象让人真切感受到了美的愉悦。这时候你继续对同学们说:画家可以用手中的画笔描绘出春天的缤纷色彩,摄影师也把春天的美好定格在了自己瞬间的镜头中,而我们手中有一杆笔,能否用笔间流露的语言文字来表现眼前的美景呢?不要他们长篇大论,就写写那一丛烂漫的山花,或是一片嫩绿的草丛,亦或几只上下窜动的小鸟,他们又岂能不灵感如流呢? 这种即兴作文训练不仅迅速激发了学生的写作灵感与表达欲望,这也会让学生感受到写作过程的乐趣,这才是积极的微作文教学方式所在。

4、结语

在初中作文教学中,片段训练是一种很好的作文教学的形式。片段作文训练可以有很多不同的展开形式,首先,教师可以引导学生对于生活片段进行真实记录,这是片段训练的一个很好的教学切入点。片段训练中加强学生对于细节的刻画能力同样非常重要,这也是一个很重要的作文教学要点。想要进一步体现微作文教学的功效,教师要有意识的丰富片段训练的教学方式,这些都会为学生写作能力的提升带来非常有效的促进作用。

参考文献

[1]张方瑞.做好片段作文,提高作文水平[J].四川工程职业技术学院学报,2008年02期.

片段式作文范文第2篇

In point入点和Out point出点概念

在――讲述这些剪辑工具和剪辑方法之前,首先还是让我解释一下In point入点和Out point出点这两个术语。

其实这两个概念很好理解,In point入点就是剪辑对象开始的地方;而Out point出点就是剪辑对象的末尾处。入点和出点可以随意调整。因为通常不是整个素材都在Timeline时间轴序列中使用,我们可以通过设定此素材的入点和出点,摘取我们需要的那一部分。

对In point入点和Out point出点这两个术语概念理解之后,下面笔者将针对上面提到的那些剪辑工具进行详细讲述。

Selction选择工具

使用Selection选择工具不仅可以完成对影片的选择,还可以直接对剪辑片段的入点和出点进行编辑,只要在视频剪辑片段的头部或尾部左右拖拽鼠标就可以了 (图2)。

Rolling使用这个工具编辑可以同时影响两个相邻的编辑片段,它是针对两个编辑片段的交界处的出点和入点一起操作,也就是说通过它将同时编辑前一个编辑片段的出点和后一个编辑片段的入点,也正因为如此,所以整个序列的持续时间不会改变,或者说这两个剪辑片段总的持续时间保持不变(图3)。

Slide滑行式编辑方式将改变当前编辑片段之前上一个编辑片段的出点和当前编辑片段之后下一个编辑片段的入点,而当前编辑片段的入点和出点,以及持续时间都不变化。其实就是使当前编辑片段在Timeline时间轴序列中做滑行式时间位置变动,并且仍保持和前后编辑片段之间的无缝连接(图4)。

Slip滑动式编辑就是同时改变当前编辑片段的入点和出点,但是这个当前编辑片段的持续时间和位置不改变,只是其中的内容前后变动。也就是说,入点多一秒或者几帧,出点就少一秒或者几帧,反之亦然。当然,Slip滑动式编辑丝毫不会影响当前剪辑片段之前和之后的其它剪辑片段(图5)。

如果你对静止的图像进行Slip卷动式编辑是看不到效果的,因为静态的图像其中的内容无论前后如何变动都是一样的,应该使用影片片段来进行Slip卷动式编辑,比较容易看出效果。

此工具是用来调整Timeline时间轴序列中当前编辑片段的入点和出点,调整其持续时间的工具。使用Ripple编辑在调节当前编辑片段的持续时间时,不会影响到其它的各编辑片段的持续时间和片段之间的间隙空白时间,但是它会改变整个序列的持续时间,以及其它编辑片段的时间位置(图6)。

实例操作Selection、Rolling、Slide,Slip和Ripple编辑工具

1首先,打开Premiere Pro 2.0软件,在启动窗口中,点击New Project新项目图标(图7),

打开NewProject新建项目窗口,在Load Preset载入预置标签页的Available Presets可用预置列表中,选择DV--PAL的子选项Standard48kHz,在Location目标存储位置选项,点击Browse按钮,选择一个目标存储路径,最后在Name项目文件名输入框中输入存储名称(图8),

点击OK按钮,创建一个新视频剪辑项目。

2选择File>lmport置入命令,或者按快捷键Ctrl+l打开Import文件置入窗口,置入三个视频文件作为编辑素材(图9)。

3将三个视频素材文件按前后关系――排列在Timeline时间轴窗口的Sequence序列中。在Tools工具面板,选择Selection选择工具,调整这三个视频片断的入点和出点,使每个片段只有中间的部分内容被使用,前部和后部都被暂时裁剪掉,这样才能使剪辑片段留有足够的前后编辑余地,确保我们使用上述提到的各种剪辑工具都起作用(图10)。

4在Tools工具面板,选择Rolling卷动式编辑工具(你也可以方便地通过快捷键N 实现),在第一个剪辑片段的末尾和第二个剪辑片段的开头处,点击并左右拖拽鼠标,同时注意观察Program观测窗口中画面和时间码的变化,体验如何调整前一个编辑片段的出点和后一个编辑片段的入点(图11)。如果想在调整的过程中得到更精确的效果,可以结合键盘的“=”等号键,放大时间轴,进行微调;如果需要还原,请按键盘的减号键。

5在Tools工具面板中选择Slide滑行式编辑工具(你也可以方便地通过快捷键u实现),在第二个剪辑片段的中间部分,按下鼠标并左右拖拽,体验如何在不影响当前选择的剪辑片断的情况下。改变第一个剪辑片段的出点和第三个编辑片段的入点,就好像让当前被选择的剪辑的片段在Timeline时间轴窗口的Sequence序列中进行滑行式时间位置移动,并自动保持前后影片片段的连贯性(图12)。

6在使用Slide滑行式编辑工具时,注意观测Program观测窗口,顶部的两帧画面代表当前选择的剪辑片段的入点帧和出点帧,它们不会被改变;窗口下面两个大一些的帧画面,左边的是前一个剪辑片段的出点帧?面,右边的是后一个剪辑片段的入点帧画面。通过操作时仔细观察这个窗口,相信你能完全理解Slide滑行式编辑就好像是将当前选择的剪辑片段在其前后两个剪辑片段之上进行滑行移动时间位置的操作(图13)。

当你用Slide滑行式编辑工具移动被选择的剪辑片段时,一旦前一个剪辑片段的出点达到了其影片片段本身的末尾,或者是后一个剪辑片段的入点达到了其影片片段本身的最起始 处,被选择的剪辑片段将不能再作滑行式移动。同时,在pogram观测窗口你也可以看到时间编码将不再改变,以证明到达位置移动的极限。

7在Tools工具面板中选择Slip滑动式编辑(你也可以方便地通过快捷键Y实现),在第二个剪辑片段的中间部分,按下鼠标并左右拖拽,体验如何仅改变当前被选择的编辑片段的入点和出点,而不影响其持续时间和位置的操作(图14)。

8注意观察Program观测窗口,窗口顶部的两个画面分别是前一个剪辑片段的出点和后一个剪辑片段的入点,它们并不会被改变;下面较大的两个画面分别是当前被编辑的这个影片片段的入点和出点帧画面,它们会随着你的Slip滑动式编辑而改变。9在Tools工具面板中选择Ripple波浪式编辑工具(你也可以方便地通过快捷键B实现),在第二个剪辑片段的入点处按住左键并左右拖拽鼠标,体验如何调整当前编辑片段的入点和出点操作,并注意观察Timeline时间轴窗口的Sequence序列的整个剪辑项目时间长度变化(图15)。

Ripple波浪式编辑工具和Selection选择工具的图标显示非常相似,不过Ripple波浪式编辑工具图标要大一些(图16),注意区别它们以明确现在是在哪种工具选择状态下。

到这里,我们对Adobe Premiere Pro里的第一类影片剪辑工具(在Timeline时间轴上进行剪辑操作的工具)无论是概念还是实际操作都有了较全面的学习,那么下面让我们来继续学习软件中的第二类影片剪辑工具(在Program观测窗口中进行影片剪辑的工具)。

Extract挤出编辑工具是用来删除在Program窗口中,通过Set In point设置入点工具和Set out point设置出点工具产生的选择范围内的帧,并且向左位移编辑范围后面的各个编辑片断以填补删除帧后所留下的空缺部分,保持整个序列的连贯性和完整性的剪辑工具。

我之所以把这个工具翻译成挤出编辑工具,就是因为你可以理解为,选择范围后面的各个剪辑片段将选择范围内的帧挤出去并删除了这挤出的部分。

Lift提取编辑工具是用来删除在Program窗口中,通过Set in point设置入点工具和Set out point设置出点工具产生的选择范围内的帧,并保留删除后的空缺不变,不被其他剪辑片段替补的剪辑工具,也就是说,在使用此工具后,整个剪辑序列的总时间不会改变。

如果要进行非常精细的修整,特别是两个片段之间的入点和出点精确的位移,使用Trim细节修整窗口就非常适合。Trim修整编辑窗口是一个比较特殊的编辑窗口,它结合了Ripple波浪式编辑和Rolling卷动式编辑两个编辑功能,你可以通过这个窗口精确地修整、编辑影片片段。

实例操作Extract、Lift和Trim编辑工具

1在这里,我们可以继续上面第一类影片剪辑工具的实例操作,或者自己重新建立一个新的Premiere文档,置入多个影片剪辑片段,并将它们按前后关系――排列在Timeline时间轴窗口的Sequence序列中。

2在Timeline时间轴窗口,移动当前时间指针到第二个影片剪辑片段的某一帧处。

3在Program观测窗口中,拖拽当前可视区域条,使当前时间指针大概位于窗口的中心处,这样做可以方便我们后面对入点和出点的调整操作(图17)。

4在program观测窗口中,拖拽当前时间指针到你准备开始裁切掉的片段的开始帧处。

5按下键盘上的快捷键l设置裁剪入点(图18)。

6再在Program观测窗口中,拖拽当前时间指针到你准备开始裁切掉的片段的末尾帧处。

7按下键盘上的快捷键O设置裁剪出点(上一页图19)。

8现在,无论你是在Program观测窗口还是在Timeline时间轴窗口的时间标尺位置。都可以看见一段被括号包住的高亮显示的蓝灰色区域,这个区域就是我们选择的即将要编辑的区域(图20)。

9在Program观测窗口,点击Extract挤出编辑按钮,观察Timeline时间轴窗口,选择范围内的帧都被删除,并且删除部分产生的空白被后面的片段位移补上,保持了整个序列的连贯性和完整性。大家同时发现,其实它和Ripple波浪式编辑工具功能非常相似(图21)。

10按下键盘上的Ctrl+Z键,撤销刚才的Extract挤出编辑操作,下面我们再来尝试一下Lift提取编辑工具,并注意对比其不同之处。

11在Program观测窗口,点击Lift提取编辑按钮,观察Timeline时间轴窗口,选择范围内的帧都被删除,并且删除处留下了一个空白区域,没有自动填补(图22)。

12上面我们还提到了Trim修整编辑窗口可以进行精确编辑的功能,在这里我们就通过实例操作体验一下其精确和方便程度,并对窗口各个功能全面学习。

13将当前时间指针移动到第二个剪辑片段和第三个剪辑片段交界处,在Program观测窗口,点击Trim修整编辑按钮以打开Trim修整编辑窗口。

14Trim们休整编辑窗口中有两个帧画面,左边是第二个剪辑片段的出点帧画面,右边是第三个剪辑片段的入点帧画面。将鼠标移动到帧画面上,发现光标将变成Ripple波浪式编辑工具状态(图23),

按下鼠标左键并左右拖拽鼠标,体验如何编辑第二个剪辑片段的出点和第三个剪辑片段的入点的操作,并仔细观测画面下面的时间码变化,同时注意观察Timeline时间轴窗口的整个Sequence序列时间长度变化和后面的各个剪辑片段的位置移动变化。此操作同等于在Trim修整编辑窗口以下六种编辑方式:

a)在帧画面下方并排排列的五个时间码中的第二个时间码OutgoingOut Point和第四个时间码Incoming In Point上点击鼠标左键并左右拖拽鼠标的编辑操作(图24)。

b)在时间标尺的两个括号处点击鼠标左键并左右拖拽鼠标的编辑操作(图25)。

c)在OutShift和In Shift时间码上点击鼠标左键并左右拖拽鼠标的编辑操作(图26)。

d)在按钮-5、-1、+1、+5上点击鼠标的编辑操作(图27)。

e) 当在左边或者右边帧画面上单击了鼠标后,帧画面下面的蓝色状态条在左边或者右边时,在按钮-1和+1的中间有一个数字输入框,可以输入一定的正负数字,实现对前一个剪辑片段的出点或者后一个剪辑片段的入点进行精确的帧数加减编辑运算(图28)。

f)在窗口最下面的Jog Out Point和Jog In Point滑轮上点击鼠标左键并左右拖拽鼠标的编辑操作(图29)。

15将鼠标移动到Trim修整编辑窗口两个帧画面的中间交界位置,发现光标变成Rolling卷动式编辑工具状态(图30),

按下鼠标左键并左右拖拽鼠标,体验如何用此方式改变第二个剪辑片段的出点和第三个剪辑片段的入点,观察帧画面和时间编码的变化,并结合观察Timeline时间轴窗口中第二个剪辑片段和第三个剪辑片段是如何变化的,同时你还会发现整个序列的持续时间不会改变,或者说这两个剪辑片段总的持续时间保持不变。

此操作同等于在Trim修整编辑窗口以下三种编辑方式:

a)在帧画面下方并排排列的五个时间码中的第三个时间码也就是中间的那个时间码Edit Point Position上点击鼠标左键并左右拖拽鼠标的编辑操作(图31)。

b)当在两个帧画面的中间交界位置上单击了鼠标后,帧画面下面的两个状态条都呈现蓝色状态时,在按钮-1和+1的中间有一个数字输入框,可以输入一定的正负数字,代表Rolling卷动式编辑的具体帧数,可以精确地进行编辑操作。

片段式作文范文第3篇

关键词:

克隆代码;主题建模;软件演化;演化模式;克隆谱系;软件维护

中图分类号: TP311.5; TP18 文献标志码:A

0引言

克隆代码(Code Clone)是指软件系统中一些具有相同或者相似的语法或语义特征的代码片段。克隆代码在软件系统中普遍存在,并且与软件工程领域中的各类研究问题密切相关。软件单一版本中的基础性克隆代码数据已经难以呈现克隆代码在软件演化过程中的变化情况,因此,需要对软件中的克隆代码进行演化跟踪并分析演化情况,从而获得更全面的信息,为软件开发及维护提供更多帮助。

当前的克隆谱系构建方法存在一些不足之处,例如克隆演化模式单一、克隆谱系构建方法复杂、能够分析的克隆类型及编程语言不全面等。本文提出了新的克隆演化模式、克隆演化特征以及克隆谱系的自动化构建方法。以区分视角的方式更加全面地分析了克隆代码的演化模式,利用代码主题信息确立版本间克隆代码映射并最终构建克隆谱系。本文研究结果将为软件开发、软件维护、软件重构及克隆管理等工作提供参考。

1相关工作

1.1克隆代码简介

在软件开发及维护过程中,由于程序员经常使用“拷贝/粘贴/修改”的开发方式、使用相同或相似的应用程序接口(Application Program Interface, API)及算法等因素,导致软件系统中存在大量相同或相似度非常高的代码片段,称为克隆代码。在该研究领域,经过学者们多年研究,已经达成了克隆代码至少应该被检测的基本共识。

克隆代码的研究工作最早可追溯到20世纪90年代,随后,该研究领域受到越来越多国内外相关研究者的高度关注,并在克隆检测、克隆演化、克隆分析以及克隆重构等方面产生了大量研究成果[1]。

在该研究领域,克隆代码以Type1、Type2、Type3和Type4的方式分类最为流行[2]。Type1指除空白符与注释变化外完全相同的代码段;Type2指除空白符、注释、标识符、类型及常量的替换外句法结构完全相同的代码段;Type3是指除空白符、注释、标识符、类型替换外,句法结构基本相同,但含有少量语句增加、删除或修改的代码段;Type4克隆代码则为功能相似或相同但句法结构不同的代码段。根据克隆代码检测的反馈粒度,相关工作通常以克隆对或克隆群(也称克隆集合、克隆类)为基本单位进行克隆代码的研究。克隆对是指存在克隆关系的一对代码片段。克隆群代表一些克隆代码的集合,同一克隆群内的任意两个代码片段可以构成克隆对,不同克隆群之间的克隆代码通常不具有克隆关系。

图1呈现了来自同一个克隆群的三段克隆代码CF1、CF2和CF3。由克隆代码类型的定义可知,CF1与CF2为Type2克隆关系、CF2与CF3为Type2克隆关系、CF1与CF3也构成了Type2克隆关系。在这三段代码中,只有函数名以及一处标识符不同,所以三者之间均可构成Type2类型克隆对。

1.2克隆演化与克隆谱系

随着软件需求的不断增加,软件需要不断升级,软件中的克隆代码也可能随着软件演化而发生改变。在分析克隆代码为软件带来的影响时,不但要研究软件单一版本中的克隆,还要研究克隆代码以时间为序的演化问题[3-4]。基于此,一些研究者从宏观上分析了克隆代码的数量或密度随着多版本演化的变化情况[5-6],从微观上利用演化模式来研究克隆代码的演化过程也受到研究者的广泛关注[7]。

Kim等[8]在2005年最早提出了克隆谱系的概念,并用克隆谱系抽取工具对克隆代码的演化进行分析[9]。随后,借助于克隆谱系研究克隆代码便在该领域成为了一种基本研究方法。例如,Zibran等[10]借助克隆谱系对软件演化过程中克隆代码的去除活动进行了研究。Saha等针对17款C、C++、Java及C#语言的开源软件进行了关于克隆谱系的实证研究[11],并发现大部分克隆群在演化中要么不发生句法上的不一致改变,要么会发生一致性的改变。虽然克隆谱系已经被广泛用于克隆代码演化研究,然而针对克隆谱系构建方法本身的研究却相对较少。目前构建克隆谱系的方法主要可以分为4种,分别为基于版本控制系统(Control Version System, CVS)或SVN(Subversion)、基于增量克隆检测、基于克隆区域描述符(Clone Region Descriptor, CRD)以及基于相似度距离函数。

基于版本控制系统的方法通常借助SVN或CVS中的修改日志来计算相邻版本间克隆代码的变化情况实现对克隆代码进行演化跟踪,进而按照时序关系合并修改信息,得到克隆谱系。由于该方法以某一选定版本中的克隆代码作为起源并进行跟踪,很难处理软件后续版本中新增的克隆代码。

Gde等[12]使用增量克隆检测技术构建了克隆谱系,然而该方法只适合处理给定版本的软件,当有新的版本加入后,整个方法需要重新执行,时空消耗均非常高,所以该方法难以灵活应对具有新增版本的克隆谱系构建工作。

基于相似度距离函数的方法通常要结合抽象语法树(Abstract Syntax Tree, AST)、Token等代码中间表示形式,该类方法的核心算法时空复杂度相对偏高。Bakota[13]提出了一种的基于相似度距离函数并结合抽象语法树的克隆谱系构建方法,并针对软件的多个版本进行了克隆代码的演化研究。Ying等[14]提出了基于Token与源码相结合的克隆谱系构建方法,但该方法只能在Linux系统下处理C语言的Type1和Type2类型的克隆代码,对其他程序设计语言或其他克隆类型的演化研究存在着很大的局限性。Saha等[15]提出了基于文本并结合代码位置信息的方法构建了克隆谱系。该方法首次对Type3克隆代码进行了克隆谱系的构建研究,然而由于该方法需要处理文件位置变化、方法重命名等问题导致了构建方法较为复杂。

基于CRD的方法在构建克隆谱系时也存在一定的局限性,如果代码某些部分(如循环终止条件、代码的嵌套结构、条件语句的分支谓词等)发生变化,则可能会导致CRD的失效,这将严重影响克隆谱系构建的全面性和准确性。Meng等[16]基于CRD确立了相邻版本间克隆群映射关系,然后基于二元关系合成方法研究了克隆谱系的构建。

1.3克隆演化模式与演化特征

克隆演化模式从微观上体现了克隆代码随着软件不同版本的演化而发生的变化情况。虽然不同研究问题针对克隆演化模式的分类有所不同,但对相同或相似的克隆演化行为的分类大致相同。根据匹配粒度及版本长度,可以将克隆演化模式大体上分为3类。

第1类是克隆群在两个版本间的演化模式。Kim等[8]最早开展了相关研究,将演化模式分为无变化、增加、去除、一致变化、不一致变化和位移6种模式。Ying等[14]以Kim等[8]的演化模式概念集为出发点,识别了除位移模式以外的其他5种模式。

第2类是克隆片段在两个版本间的演化模式。Bakota等[17]介绍了4种不同的克隆片段演化方式,包括消失克隆实例、发生克隆实例、移动克隆实例以及迁移克隆实例。

第3类是研究克隆群在多个版本中的长期演化模式,包括延迟传播(Late Propagation, LP)模式以及独立演化模式等[18-19]。

克隆代码演化特征可以从生命周期以及谱系结构等视角对克隆代码的演化过程进行分析。各类演化模式出现的时间及位置信息可以反映克隆代码的变化方式。克隆代码的演化特征将为克隆演化分析提供最基本的参考信息。长期性的克隆演化模式与演化特征将为软件后期开发及维护活动提供更多具有决策性的意见。

1.4基于主题建模技术研究软件演化

近年来,主题建模技术已不断地应用于软件工程领域。Kuhn等[20]将主题建模技术应用于代码分析,并尝试从中挖掘出代码的功能性主题;Thomas等[21]验证了利用主题建模技术进行软件演化分析是具有可行性的,并利用主题建模技术研究了软件的演化情况[22];Asuncion等[23]将主题建模技术用于软件的可追踪性研究;金靖等[24]运用潜在狄利克雷分配(Latent Dirichlet Allocation, LDA)模型识别代码功能以支持软件开发人员对代码进行良好的理解与复用;张瑞霞等[25]通过LDA主题模型针对软件相邻版本中的克隆群进行了映射研究,但并未构建克隆谱系也未深入分析克隆代码的演化模式和演化特征;Phan等[26]分析比较了LDA、概率隐语义分析(Probability Latent Semantic Analysis,PLSA)、潜在语义分析(Probability Semantic Analysis,LSA)等主题模型,并证明了LDA在挖掘文档潜在语义时比其他模型表现更佳。

1.5小结

通过分析、总结上述相关研究现状可知,现有克隆谱系构建方法主要存在以下不足:

1)依赖代码位置信息且构建流程相对繁琐。

2)无法处理软件在演化过程中新增的克隆代码。

3)代码语句格式对克隆谱系的构建存在影响。

4)不能处理Type3及Type4克隆代码。

5)可移植性较差、编程语言不可扩展。

6)严重依赖特定的克隆代码检测工具。

本文提出了一种基于主题建模技术的克隆谱系构建方法,通过映射克隆代码的主题信息进行克隆谱系的构建。与基于相似度距离函数的方法相比,本文方法不需要代码的中间表示形式(如Token、AST),流程相对简单;与基于增量克隆检测的方法相比,本文针对新增版本的克隆谱系构建而言具有良好的可扩展性。因为本文方法只需根据增版本中克隆代码的主题信息即可扩展原有克隆谱系,而基于增量克隆检测的方法则需要重新执行整个构建过程;与基于CRD的方法相比,本文方法直接利用主题信息构建谱系,避免了由于循环终止及条件语句的变化等情况造成的相邻版本间克隆代码映射失败或错误的问题。此外,由于本文借助于代码的主题信息,所以能支持多种程序设计语言及多种代码粒度的克隆谱系构建研究,而且能够有效处理Type3甚至Type4克隆代码,而不仅局限于Type1和Type2克隆。本文方法不依赖任何特定的克隆代码检测工具,只需运用主题模型从克隆检测结果中抽取主题即可。本文将在原型系统的实现中将克隆代码检测工具视为插件,以支持多种克隆检测工具。

自Kim等[8]提出克隆谱系概念以及克隆演化研究中所使用的6种模式后,该领域研究者大多以其作为基准框架进行克隆代码的演化研究,即便有新的模式提出也只是针对部分或个别演化现象而言,例如LP模式[18-19]。

通过分析现有研究中的克隆演化模式可以发现,前期研究者们不区分视角地分析各种演化模式,例如Kim等[8]提出的6种模式中,无变化、一致变化和不一致变化是针对克隆代码的数量和文本内容而言的,而位移则是针对代码位置的变化而言,增加和去除模式则是针对克隆群内代码片段数量而言的。这些演化模式属于不同的视角,但某些视角中显然缺少一些演化模式来解释不同的演化现象,例如Kim等[8]的模式中虽然包含了克隆群内代码片段数量的增加与去除,但并未包含片段数量不变这一模式,这个模式与其提出的无变化模式是不冲突的,因为一个克隆群内的克隆片段数量不变的情况下,克隆代码的文本内容是完全可以发生改变的。

本文区分视角地重新定义了传统意义上的克隆演化模式,并提出了新的演化模式,将从克隆群生存情况、克隆群内片段数量与克隆代码片段内容这三个视角来分析克隆代码的演化模式,这使得不同演化模式之间的区别更加清晰,模式识别的方法也将会变得简单。

通过分析1.4节的相关研究可知,基于主题建模技术的软件演化分析已经取得了很大的成功,并且这些研究问题充分证明了主题建模技术是可以用于软件工程领域中的众多问题,包括软件的理解与演化分析等。LDA已经被广泛并成熟地运用在人工智能及自然语言处理等领域,而且文献[20-26]可以充分说明利用LDA进行软件演化分析是可行的。本文将使用LDA对克隆代码进行主题建模分析,从而根据克隆代码的主题信息进行克隆群映射、演化模式识别及克隆谱系构建等工作。

2演化模式识别及克隆谱系构建方法

本文的克隆谱系构建方法主要分为5个核心步骤:

第1步针对软件多版本分别进行克隆代码检测并获取克隆检测结果;

第2步以克隆群为基本单位进行克隆代码的主题信息抽取;

第3步进行克隆群以及克隆片段的映射;

第4步识别各类克隆演化模式、分析克隆演化特征;

第5步合并映射结果与克隆演化模式,完成克隆谱系的构建工作。

主要流程如图2所示。

2.1克隆检测及代码主题抽取

克隆检测是克隆代码研究领域中的基础性、必要性工作,克隆检测的反馈结果能为克隆代码分布分析、演化分析、重构分析等研究提供最基本的数据支持。本文借助现有克隆代码检测工具对软件的多个版本进行克隆代码检测。选取了CloneDetective[27]以及本文的前期研究开发的克隆代码检测工具FClones[28]作为本文实验时所使用的克隆代码检测工具。CloneDetective能有效检测Java语言的Type1、Type2和Type3克隆代码,FClones能有效检测C语言的Type1、Type2和Type3克隆代码。这两款工具的克隆代码检测结果将为本文的克隆谱系构建研究提供基础性数据。

当软件多个版本的克隆检测完成后,每个版本中都会含有一定数量的克隆群,而相邻版本间的克隆群映射是构建整个克隆谱系工作中不可缺少的部分。在软件的每个版本中,由于同一克隆群内的克隆代码有较高的语法及语义的相似性,而不同克隆群之间克隆代码的相似程度却较低。所以,相邻版本中对应的克隆群之间的主题信息具有较高的相似性,而非对应的克隆群之间的主题信息差异较大。基于此,本文以克隆群为基本单位进行克隆代码的主题信息抽取,并基于主题的相似性进行版本之间的克隆群映射。

本文将使用LDA主题模型对克隆代码进行主题信息抽取。抽取主题之前需对代码进行预处理,方法参考了文献[24]中使用的静态分析以及切词方法。经过切词后还需针对部分单词进行过滤处理,因为初步切词的结果中会包含大量的编程语言关键字、Java开发工具包(Java Developers Kit, JDK)中的类名和接口名及英文中常见的停用词。过滤之后的结果作为主题模型的输入数据,然后利用LDA对克隆群抽取主题。抽取结果中包含了不同克隆群主题对应的主题词,本文以克隆群主题词集合的相似性作为克隆群映射的基本依据。

2.2克隆群映射

针对版本间克隆群主题词集合的相似性计算问题,本文使用Jaccard相似度计算模型,之所以采用此计算模型是考虑了每个克隆群的主题词集可视为一个集合,因此可以利用该模型计算两个克隆群主题词集之间的相似程度。Jaccard相似度模型计算两个集合A与B的相似度如式(1)所示:

JaccardSim(A,B)=A∩B/A∪B(1)

针对多版本克隆群映射问题,本文设计了映射算法,如算法1所示。算法思想为:按照版本时序关系,每个克隆群在后一版本中先寻找一个最相似的克隆群作为后继进行映射,此为第一轮映射。之后,对于任意一个没有前驱的克隆群,在其前一版本中寻找前驱,如果找到满足条件的克隆群则进行映射;对于任意一个没有后继的克隆群,在其后一版本中再次寻找后继,如果找到满足条件的克隆群则进行映射,此为第二轮映射。第二轮映射完成后,对于任意一个无后继的克隆群,从其下下版本开始,找一个与其最相似的而且无前驱的克隆群,如果找到满足条件的克隆群则进行映射并结束寻找,此为第三轮映射。至此所有克隆群映射工作完成。

算法1Clone Group Mapping。

有序号的程序――――――――――Shift+Alt+Y

程序前

1)

for each version∈versions do

2)

for each cg∈version do

3)

cg.pre=[],cg.next=[]

4)

end for

5)

end for

6)

for each version∈versions do

7)

for each cg∈version do

8)

cg.next.append(cg.findNext(version.next))

9)

end for

10)

end for

11)

for each version∈versions do

12)

for each cg∈version do

13)

if cg.pre==[] then

14)

cg.pre.append(cg.findPre(version.pre))

15)

end if

16)

end for

17)

end for

18)

for each version∈versions do

19)

for each cg∈version do

20)

if cg.next==[] then

21)

cg.next.append(cg.findNext(version.next))

22)

end if

23)

end for

24)

end for

25)

for each version∈versions do

26)

for each cg∈version do

27)

nextVersion=(version.next).next

28)

while cg.next==[] and nextVersion do

29)

if cg.findNext(nextVersion) then

30)

break

31)

nextVersion=nextVersion.next

32)

end if

33)

end while

34)

end for

35)

end for

程序后

在算法1中,Vi和Vi+1分别代表软件中的两个相邻版本,CGi, j代表版本Vi中编号为j的克隆群,CGi, j.pre记录CGi, j映射到了前一版本(或更前版本)中对应的克隆群编号信息。CGi, j.next记CGi, j映射到了后一版本(或更后版本)中对应的克隆群编号信息。在映射算法中,首先将当前版本Vi中的所有克隆群CGi, j的后继初始化为空,将后一版本Vi+1中所有克隆群的前驱初始化为空,然后再进行三轮映射。findNext和findPre函数分别代表在某一版本中为当前克隆群寻找后继克隆群、前驱克隆群并返回相应的克隆群的编号信息。version.pre和version.next分别代表当前版本的前一版本及后一版本。

在算法1中,相邻版本间克隆群映射的条件相对严格,对于当前版本Vi中的任一克隆群CGi, j而言,在后一版本Vi+1中映射到的克隆群CGi+1,k是所有Vi+1的克隆群中与CGi, j的主题相似度最高的,而不是仅仅在满足相似度阈值的情况下即可进行映射。这样的映射规则保证了每一对映射包含的两个克隆群都有非常高的主题相似度。克隆群映射过程中,主题相似度阈值直接影响映射结果,参照了前期研究[25]中采用的克隆群映射相似度阈值,本文将主题相似度阈值暂设为0.8,但该值并非固定,本文将在原型工具的实现以及后续研究中对该阈值的设定问题进行更详细的研究。

克隆群映射完成后,除起始本中的克隆群没有前驱、最终版本中的克隆群没有后继以外,如果某一克隆群未能找到其前驱,则说明该克隆群是新增克隆群,如果某一克隆群未能找到其后继,则说明该克隆群在软件演化的过程中可能被移除。克隆群的前驱与后继信息将有助于判断克隆代码的演化模式类型。

图3呈现了某款软件多版本中的部分克隆群映射效果。图中每一竖排圆点代表一个版本中的不同克隆群,每条线段代表映射关系,不同灰度和大小的圆形及线段代表了不同的映射关系与演化模式。

2.3克隆片段映射

由于单纯的克隆群映射还不能够呈现更多的克隆代码演化信息,例如不一致变化等。所以,在相邻版本间的克隆群映射完成后,还需要针对两个对应克隆群内的克隆代码片段进行映射,以便识别出更多的克隆代码演化模式与演化特征。由于存在映射关系的两个克隆群内的克隆代码片段之间的相似程度相对较高,导致代码主题信息区分度不大,所以片段映射时不能再次利用代码的主题信息进行匹配。

在Ying等[14]及Saha等[15]的克隆谱系构建研究中,克隆片段的映射主要参考了位置信息,例如Saha等[15]在映射克隆代码片段时,如果其所在的文件名、函数名及起止行号不变,在不匹配克隆代码内容的情况下就直接进行映射。该类方法虽然能够较快地进行片段映射,但针对函数重命名以及代码位置变化时,容易造成映射错误。如果文件名、函数名等属性不一致时,则还需要根据代码文本内容或中间形式进行克隆片段的映射。如果不考虑文件的位置属性而仅仅通过代码相似性来映射克隆片段,则可能由于克隆代码的位置改变而造成映射的偏差,所以为了综合考虑克隆代码片段的位置信息以及克隆代码本身的相似性,本文针对克隆代码片段映射任务定义了4种距离。

1)目录距离。两段克隆代码所在目录的相似程度。本文考虑了软件演化过程中某些路径名可能出现较小的修改,例如将某一目录名“temp”改为“tmp”等,所以计算目录相似度时不宜采用严格的字符串匹配。本文采用编辑距离来衡量两个目录的距离,这样避免了由于个别目录名修改而造成映射错位等问题。与Ying等[14]的克隆片段映射方法相比,本文考虑了目录名可能修改的情况,所以对位置属性的处理更为合理。

2)文件名距离。与目录距离的定义类似,文件名距离是指文件名之间的编辑距离。之所以将目录距离与文件名距离分开考虑是因为很大一部分克隆代码会来自于同一源代码文件,所以利用文件名距离辅助判断克隆代码片段映射关系可以大大减少其他距离的计算量。

3)签名距离。在本文中,签名是指能够代表一段代码的一个字符串,例如函数的签名可以为函数名和参数列表。签名距离为两个代码段对应的签名之间的编辑距离,签名距离可以在路径距离及文件名距离都相同时进一步来判断克隆代码之间的相似度,因此可以用于克隆片段映射。

4)文本距离。文本距离的计算首先将源代码视为字符串,进而通过计算字符串的编辑距离得出克隆代码的文本距离。当待映射的克隆片段之间具有相同的目录距离、文件名距离、签名距离时,利用文本距离可以最终判断克隆片段的映射关系。本文不仅仅使用文本距离进行作为克隆片段的映射依据是考虑了片段映射的效率问题,前3种距离的计算量相对较少,可以大大节省克隆片段映射的时间。

为了综合利用上述4种距离属性进行映射,制订了以下具有优先级的映射规则进行克隆代码片段映射,假设相邻版本中已经映射的两个克隆群分别为CG与CG′。它们所包含的克隆片段的映射步骤为:

步骤1对于克隆群CG中的任一克隆片段CF与CG′中的所有克隆片段计算目录距离,CF选择与其目录距离最小的克隆片段进行映射,已经映射的克隆片段不能再次参与映射。

步骤2如果目录距离相等,CF选择与其文件名距离最小的克隆片段映射,已经映射的克隆片段不能再次参与映射。

步骤3如果文件名距离相等,CF选择与其签名距离最小的克隆片段映射,已经映射的克隆片段不能再次参与映射。

步骤4如果签名距离相等时,CF选择与任意一个文本距离最小的克隆片段映射,已经映射的克隆片段不能再次参与映射。

克隆片段的映射方法之所以不再使用类似克隆群的映射方法是考虑了克隆片段可能存在新增、去除等情况,所以可能存在克隆片段映射不完全的情况,即部分克隆片段未能与相邻版本间的其他克隆片段建立映射关系,但这类信息将有助于克隆群容量演化模式及克隆代码片段内容层面演化模式的分析。

2.4克隆演化模式及其识别

当相邻版本间克隆群映射完成后,即可识别克隆群层面的演化模式。针对克隆群层面演化模式主要涉及到克隆群本身的生存情况以及群内包含克隆代码片段的数量的变化情况。

与其他研究方法相比,本文将克隆群与克隆片段的演化模式分开研究使得各种模式具有更加清晰的视角。Kim等[8]将演化模式分成6种,与本文所用模式不同的是,Kim等[8]的方法考虑了位移模式,即克隆代码的位置发生了改变。本文方法更关注克隆群及克隆代码内容上的改变,所以不考虑位移模式,取而代之,本文将简单模式、复活模式与合并模式引入到演化模式概念集中。复活模式的产生意味着克隆代码存在延迟传播现象的可能。延迟传播是指一些克隆代码在演化过程中出现过内容的不一致改变而分离,而在后续版本中又重新变为克隆关系。克隆代码的延迟传播研究将有助于分析克隆代码与Bugs的关系[18-19],所以复活模式值得深入研究。

本文针对克隆群演化而言主要研究两种视角下的九种演化模式,分别为克隆群生存视角下的6种模式包括:新生模式、消失模式、分支模式、合并模式、复活模式、简单模式;以及克隆群内片段数量视角下的3种模式,包括:增加模式、去除模式和保持模式。每种模式的基本定义如下:

新生模式当前版本中的某一克隆群与前续版本中的任何克隆群未能建立映射关系,即该克隆群无前驱。

消失模式当前版本中的某一克隆群与后续版本中的任何克隆群未能建立映射关系,即该克隆群无后继。

分支模式当前版本中的某一克隆群在后一版本中与多个克隆群具有映射关系,即该克隆群具有多个后继。

合并模式当前版本中的某一克隆群在前一版本中与多个克隆群具有映射关系,即该克隆群具有多个前驱。

复活模式某一克隆群在演化过程中先经历消失模式,而后又经历新生模式,即该克隆群“死而复活”,为复活模式。

增加模式当前版本中的某一克隆群与前一版本中对应克隆群相比,包含克隆代码片段的数量有所增加。

去除模式当前版本中的某一克隆群与前一版本中对应的克隆群相比,包含克隆代码片段的数量有所减少。

保持模式当前版本中的某一克隆群与前一版本中对应的克隆群相比,包含克隆片段的数量保持不变。

简单模式当前版本中某一克隆群有唯一的前驱克隆群和唯一的后继克隆群,而且前驱和后继克隆群都存在于相邻版本中,演化过程相对简单,没有发生过新生、消失、合并、分支以及复活演化模式。

克隆群映射完成后,克隆群层面的演化模式识别即可进行。由各类模式的定义可知,如果克隆群无前驱则发生了新生模式;如果克隆群无后继则发生了消失模式;如果克隆群有多个前驱则发生了合并模式;如果克隆群有多个后继则发生了分支模式;如果克隆群先发生了消失模式而后又出现新生模式则产生了复活模式;其余模式均为简单模式。

图4呈现了某软件系统6个连续版本中的部分克隆群的演化情况。其中:矩形代表软件系统的版本,圆形代表克隆群,箭头代表映射关系。由映射信息可知,B1和C3克隆群均发生了分支模式(例如B1分化为C1和C2),B2克隆群发生了消失模式,C4克隆群发生了复活模式,E1克隆群发生了合并模式,其余均为简单模式。

图5呈现了某克隆群CG在4个版本中的演化过程;同时呈现了克隆群内克隆片段数量的变化情况,其中圆形代表克隆群CG,正方形代表克隆代码片段。显然,CG在V1到V2的演化过程中增加了克隆片段,即发生了增加模式;在V2到V3的演化过程中去除了克隆片段,即发生了去除模式;在V3到V4的演化过程中,群内片段数量保持不变,即属于保持模式。

此外,本文还研究了3种克隆代码片段内容层面的演化模式,包括:无变化模式、一致变化模式和不一致变化模式。每种模式的基本定义如下:

无变化模式在相邻版本间对应的克隆群内,所有参与了片段映射的克隆代码片段的内容都未发生改变。

一致变化模式在相邻版本间对应的克隆群内,所有参与了片段映射的克隆片段的内容作了一致改变。

不一致变化模式在相邻版本间对应的克隆群内,所有参与了片段映射的部分或全部的克隆代码片段内容做了不一致改变。

克隆片段演化模式与克隆群演化模式不同,克隆片段模式仅仅针对克隆片段内容层面在相邻版本间的演化而言。本文将克隆片段演化模式分为3种,但这3种模式与Kim等[8]提出的相关演化模式存在差异。在本文中,这3种模并不涉及克隆群层面的演化,而在Kim等[8]的研究中,这3种模式既涉及到克隆群层面的演化同时又涉及到克隆代码内容层面的演化,视角混淆。本文将这3种模式重新定义,视角明确,有较好的层次感,更加清晰,易于理解。

图6呈现了某克隆群CG内的克隆代码片段在4个相邻版本间的演化过程,其中圆形代表克隆群,正方形代表克隆代码片段,不同填充颜色及边框代表克隆代码片段内容发生了不同的改变。在V1到V2的演化过程中,群内所有克隆代码片段发生了内容上的一致变化;在V2到V3的演化过程中,克隆代码片段发生了内容上的不一致变化;在V3到V4的演化过程中,也发生了内容上不一致变化,而且还增加了克隆代码片段。由此可见,不同视角的克隆演化模式可能会同时发生,所以区分视角的克隆演化模式分析是十分必要的,这将为克隆演化的后期研究提供更加清晰和明确的思路。

针对上述3种克隆片段演化模式,本文先识别无变化模式,即对应克隆群内的所有参与映射的克隆代码片段内容不变。这种模式识别较为简单,可以将代码元素的变化情况作为参考,求出对应克隆片段源代码的差异,从而确定是否改变。如果在对应克隆群内所有参与映射的克隆代码内容不变,则为无变化模式。识别无变化模式完成后,可识别一致变化和不一致变化模式。如果参与映射的部分或全部克隆代码内容发生了改变,先求出所有对应克隆代码片段的差异,然后计算这些差异的相似情况。如果所有差异相同,则为一致变化模式,否则为不一致变化模式。本文将借助Diff工具对克隆代码片段内容层面的演化情况进行分析,从而给出克隆代码片段的演化模式。

2.5克隆演化特征

克隆代码映射关系中包含了大量的克隆代码演化信息。基于已构建的克隆代码映射关系,本文从克隆演化模式、克隆生命周期以及克隆代码数量增长率等方面选取克隆演化特征进行分析。克隆演化模式提供了丰富的演化信息,便于研究和理解克隆演化现象。克隆生命周期能够反映克隆群在演化过程中所经历的版本数量。此外,克隆演化特征还可用于克隆代码相关问题的预测研究,例如可用代码的有害性及稳定性预测等问题。

2.5.1演化模式的数量特征

通过对各类克隆演化模式进行统计,可以发现克隆群在软件的演化过程中主要进行了哪种改变方式。统计某一克隆群经历各种演化模式的数量可以宏观地了解克隆群的演化情况。演化模式的数量特征可以从侧面反映一款软件中大部分克隆代码是否稳定,如果简单模式与无变化模式数量较多,则说明大部分克隆代码的演化相对稳定。而其他模式的数量较多,则可以反映某些克隆群在演化过程中比较多变,稳定性较差。在研究克隆代码的稳定性或有害性时,克隆代码所经历的某些演化模式可能作为判断其性质的决定性因素。例如,如果某个克隆群在演化过程中频繁发生一致或者不一致变化模式,则该克隆群必然占据了过多的维护成本,可以认为其有害性较强,建议优先去除或者重构,因此,克隆演化模式的数量特征可以为克隆代码的其他相关研究工作提供良好的数据支持。

2.5.2克隆代码的生命周期

对于一个克隆群而言,其所经历的版本数量就是其生命周期。克隆群的生命周期可以明确反映克隆群在演化过程中存在时间的长短。对于生命周期较长而且演化相对稳定的克隆群,可以建议开发或维护人员进行简单的跟踪。对于生命周期比较短暂的克隆,通过分析其引入因素及去除因素,可以总结一些有意义的开发及维护策略作为经验,从而为后期的开发及维护提供参考,避免再次引入该类克隆代码,从而降低开发及维护的成本。

2.5.3克隆代码数量结构特征

在软件的演化过程中,克隆代码片段可能被增加或去除,因此,克隆群以及克隆代码片段数量的增长比可以直接反映克隆代码整体数量结构的变化情况。克隆群与克隆代码片段的数量比则可以直接反映克隆代码在演化过程中整体的繁殖量。克隆代码的数量结构特征可以在宏观上反映软件系统中克隆代码所占比重的变化情况。在实际的软件开发或维护环境中,如果发现克隆代码的整体繁殖能力越来越强,则可以考虑重构或去除某些克隆代码,从而为后续的开发及维护工作减轻压力。

2.6克隆谱系构建

克隆谱系是指克隆代码在软件多个版本演化过程中变化情况的记录信息。将克隆谱系作为克隆代码分析的基本数据,可以进行更多克隆代码相关问题的研究。当相邻版本间的克隆群映射、对应克隆群之间的克隆代码片段映射、克隆演化模式识别及克隆演化特征分析完成后,按照版本的时序,将所有演化信息合并得到克隆谱系。从宏观结构层面来看,克隆谱系主要是根据克隆群映射关系连接而成的拓扑结构。克隆谱系反映了克隆代码在软件的演化过程中是如何产生、繁殖和去除的。克隆谱系中的每个克隆群都记录了对应的演化模式信息,其内部包含的克隆代码片段也各自记录了微观层面的片段映射关系以及片段演化模式。

本文克隆谱系结构与前期相关研究中的克隆谱系结构明显不同。在前期相关研究中,其克隆谱系结构主要为克隆群粒度层面的树形结构,而本文构建的克隆谱系不再为树形结构,而是拓扑结构。在前期相关研究中,克隆演化模式的概念几乎全部来自于Kim等的研究[8],仅限于大约6种模式,而且各个模式之间不分视角,结构不清晰。此外,前期相关工作也并为分开视角地考虑到克隆群的合并模式与复活模式,所以其克隆谱系的构建工作中还关注了克隆直系与克隆家系的概念。克隆直系描述了某一克隆群的单支演化过程,克隆家系描述了起源于同一个克隆群的所有克隆直系的演化过程。虽然本文研究方法拓展了传统意义上的克隆谱系结构,但是克隆直系与克隆家系的子结构仍然可以在本文方法构建的克隆谱系中找到,因为并非所有克隆群都经历合并或者复活模式。除了克隆直系与克隆家系以外,本文将引入克隆族系的概念,克隆族系描述了起源于或合并于不同克隆群的所有直系克隆及家系克隆。由于合并及复活演化模式的存在,某一些克隆群的起源并非前续版本中的单一克隆群,而可能是经由多个克隆群合并之后演化而来,克隆族系将更加有助于分析克隆群的合并或重构问题。

图7展示了克隆谱系的基本结构,其中圆形代表克隆群,正方形代表克隆代码片段,箭头代表映射关系,不同的灰度及字母分别代表了克隆代码的模式及编号。

3实验与分析

3.1数据来源

本文分别针对4款开源软件的多个版本进行了克隆谱系的构建研究。使用了CloneDetective[27]和FClones[28]克隆代码检测工具以函数粒度进行克隆检测。4款开源软件的基本信息如表1所示。本文所选取的开源软件常被软件工程领域研究者作为基础的实验数据使用,具有一定代表性。例如Lin等[29]在研究克隆代码模式时使用了jedit以及jhotdraw等开源软件作为研究对象。针对这些开源软件的实验数据能为本文的后续对比研究作一定的铺垫。选取这些开源软件还考虑了不同程序设计语言及不同功能的软件,而且这些开源软件一直被良好地开发与维护,拥有较多的版本,含有丰富的克隆代码。能为克隆演化研究提供基础性数据。

3.2实验结果及分析

实验中,在相邻版本间克隆群映射时,主题相似度阈值设定参照了前期相关研究[25],将阈值暂设为0.8,但是该阈值并非固定不变,本文将在后续研究中对此值的选取问题进行更为细致深入的研究。通过对4款软件系统构建克隆谱系,得出了每款软件中的克隆群在演化过程中表现在生存层面的演化模式数量,各类演化模式数量统计如表2所示。

由表2可知,本文新提出的克隆演化模式在克隆代码演化过程中确实存在,而且占有一定数量。例如,在jhotdraw的16个版本的演化过程中,出现了3次合并模式;在ffmpeg的29个版本中,出现了8次合并模式以及20次复活模式。复活模式将为克隆代码与Bugs的研究提供更多参考信息,因此本文所提出的新的演化模式具有更深层次的研究意义。

此外,实验还统计了克隆群在容量层面的演化模式,包括克隆群内片段数量的增加、去除以及保持3种模式,如表3所示。由表3可知,克隆群在容量层面发生克隆代码片段增加及去除模式也出现了多次,这说明了克隆代码在演化过程中是非常可能再次被复制重用或删除。在jhotdraw及ffmpeg中,克隆群容量发生多次增加及去除模式,而在jedit及bluefish中该类演化模式数量则相对较少。由此可知,各类演化模式在不同功能、不同程序设计语言、不同开发团队、不同规模的软件系统中均有可能发生。

除了分析粗粒度的克隆演化模式以外,本文还针对细粒度的克隆代码演化情况进行了分析。从克隆代码片段的内容层面,分析了同一克隆群内的克隆代码片段在版本之间的变化情况。包括无变化模式、一致变化模式和不一致变化模式。此层面的各类演化模式数量如表4所示。由表4可知,绝大多数(平均约90%)克隆克隆代码在演化过程中基本不变;平均约10%的克隆代码发生了改变,而发生一致改变的克隆代码较多,平均约为6.5%,发生不一致改变的克隆群最少,平均约为4.4%。这也说明了绝大多数克隆代码在演化过程中不会被修改,而被修改的克隆代码超过一半被一致性地修改了,仅有一少部分被不一致地修改。本文将在后续研究中继续关注引起克隆代码不一致性修改的原因及其为软件开发及软件维护带来的利弊。

本文除了关注克隆代码演化模式之外,还统计了克隆群的生命周期,如表5所示。由表5可知,大部分克隆代码在软件演化过程中并未生存较长时间,而仅有一小部分克隆代码在演化过程中一直稳定地生存下来。生存时间不超过软件整体生命周期40%的克隆群数大约为总数的67%。生存时间超过软件整体生命周期80%的克隆群数大约为总数的6%。剩余部分克隆群的生命周期约占软件整体生命周期的27%。

克隆代码在演化过程中会伴随着克隆群的消失与新生模式,但克隆群及克隆代码片段的数量会随着软件演化的推进而增多,表6给出了克隆群数量及克隆代码数量在软件版本演化过程中的数量增长比率。

由表6可知,这4款开源软件中的克隆代码几乎全部以增加克隆代码数量的方式演化。克隆群数量平均增长率约为24.1%,克隆代码片段数的平均增长率约为17.4%。也有个别相邻版本间存在着克隆群及克隆片段减少的情况,但这种情况比较少见。出现克隆代码数目减少的原因可能包括克隆检测工具阈值的固定性、克隆代码修改量较大、克隆代码被重构等。

克隆代码的数量结构说明克隆代码在软件开发、维护、升级及重构等活动中都扮演着不可或缺的角色,占据了软件整体代码的一定比例。克隆代码的跟踪、维护及管理将对软件开发活动和软件质量产生积极性的影响。

4结语

本文基于软件多版本演化,根据克隆代码主题信息构建版本间克隆代码的映射关系,为演化过程中的克隆代码添加演化模式,分析演化特征并构建克隆谱系。

本文传承了利用克隆代码主题信息进行克隆群映射的工作,并继续开展了克隆演化模式识别、演化特征分析以及克隆谱系构建的工作。发现了大部分克隆代码(约90%)在演化过程中表现得相对稳定,但仍然有部分克隆代码在演化过程中比较多变,稳定性较差。另外,本文还通过实验验证了新提出的克隆演化模式在克隆代码演化过程中确有发生。还发现了大部分克隆代码的生命周期并未超过软件演化整体周期的50%。本文研究结论将为克隆代码演化分析、克隆代码的维护管理及重构任务提供更多参考信息。

本文的研究内容与实验依然存在一些不足之处,包括:Type3克隆代码内容层面的演化模式还需要进一步深入研究;一致变化模式及不一致变化模式的判断需要更加详细合理的标准;克隆群映射准确性与全面性的评价需要研究;克隆谱系结果未进行良好的可视化等。

本文将在后续研究中陆续改进、完善不足之处,包括:选取更加适合分析克隆代码的主题模型;为克隆群和克隆代码片段映射工作构建测试集和自动化的评价框架;将克隆谱系的结果进行良好的可视化;研究各种演化模式与Bugs的关系;为克隆代码构建本体模型以及检索系统;为克隆代码的维护与管理提供更多帮助。此外,将在下一步研究工作中,进一步考虑将所提方法与已有的一些经典的研究工作进行深入的对比分析;同时,分析不同方法中某些阶段不同算法的选择或不同参数的取值对最终结果的影响。

参考文献:

[1]

ROY C K, ZIBRAN M F, KOSCHKE R. The vision of software clone management: past, present, and future (Keynote paper) [C]// Proceedings of the 2014 IEEE Conference on Software Maintenance, Reengineering and Reverse Engineering. Piscataway, NJ: IEEE, 2014: 18-33.

[2]

BELLON S, KOSCHKE R, ANTONIOL G, et al. Comparison and evaluation of clone detection tools [J]. IEEE Transactions on Software Engineering, 2007, 33(9): 577-591.

[3]

PATE J R, TAIRAS R, KRAFT N A. Clone evolution: a systematic review [J]. Journal of Software: Evolution and Process, 2013, 25(3): 261-283.

[4]

BARBOUR L, KHOMH F, ZOU Y. An empirical study of faults in late propagation clone genealogies [J]. Journal of Software: Evolution and Process, 2013, 25(11): 1139-1165.

[5]

LAGUE B, PROULX D, MAYRAND J, et al. Assessing the benefits of incorporating function clone detection in a development process [C]// Proceedings of the 1997 IEEE International Conference on Software Maintenance. Piscataway, NJ: IEEE, 1997: 314-321.

[6]

ANTONIOL G, VILLANO U, MERLO E, et al. Analyzing cloning evolution in the Linux kernel [J]. Information and Software Technology, 2002, 44(13): 755-765.

[7]

GDE N. Clone Evolution [M]. Berlin: Springer, 2011: 3-4.

[8]

KIM M, SAZAWAL V, NOTKIN D, et al. An empirical study of code clone genealogies [J]. ACM SIGSOFT Software Engineering Notes, 2005, 30(5): 187-196.

[9]

KIM M, NOTKIN D. Using a clone genealogy extractor for understanding and supporting evolution of code clones [J]. ACM SIGSOFT Software Engineering Notes, 2005, 30(4): 1-5.

[10]

ZIBRAN M F, SAHA R K, ROY C K, et al. Evaluating the conventional wisdom in clone removal: a genealogybased empirical study [C]// Proceedings of the 28th Annual ACM Symposium on Applied Computing. New York: ACM, 2013: 1123-1130.

[11]

SAHA R K, ASADUZZAMAN M, ZIBRAN M F, et al. Evaluating code clone genealogies at release level: an empirical study [C]// Proceedings of the 10th IEEE Working Conference on Source Code Analysis and Manipulation. Piscataway, NJ: IEEE, 2010: 87-96.

[12]

GDE N, KOSCHKE R. Studying clone evolution using incremental clone detection [J]. Journal of Software: Evolution and Process, 2013, 25(2): 165-192.

[13]

BAKOTA T. Tracking the Evolution of Code Clones [M]. Berlin: Springer, 2011: 86-98.

[14]

YING T, LI P Z, CHUN H W, et al. Extract function clone genealogies across multiple versions [J]. International Journal of Security and Its Applications, 2015, 9(6): 167-182.

[15]

SAHA R K, ROY C K, SCHNEIDER K. gCad: a nearmiss clone genealogy extractor to support clone evolution analysis [C]// Proceedings of the 2013 IEEE International Conference on Software Maintenance. Piscataway, NJ: IEEE, 2013: 488-491.

[16]

MENG C, XIAO H, TIAN T, et al. A new clone group mapping algorithm for extracting clone genealogy on multiversion software [C]// Proceedings of the 2013 Third International Conference on Instrumentation, Measurement, Computer, Communication and Control. Piscataway, NJ: IEEE, 2013: 848-853.

[17]

BAKOTA T, FERENC R, GYIMOTHY T. Clone smells in software evolution [C]// Proceedings of the 23rd International Conference on Software Maintenance. Piscataway, NJ: IEEE, 2007: 24-33.

[18]

AVERSANO L, CERULO L, PENTA M D. How clones are maintained: an empirical study [C]// Proceedings of the 11st European Conference on Software Maintenance and Reengineering. Piscataway, NJ: IEEE, 2007: 81-90.

[19]

THUMMALAPENTA S, CERULO L, AVERSANO L, et al. An empirical study on the maintenance of source code clones [J]. Empirical Software Engineering, 2009, 15(1): 1-34.

[20]

KUHN A, DUCASSE S, GíRBA T. Semantic clustering: identifying topics in source code [J]. Information and Software Technology, 2007, 49(3): 230-243.

[21]

THOMAS S W, ADAMS B, HASSAN A E, et al. Validating the use of topic models for software evolution [C]// Proceedings of the 2010 IEEE Conference on Source Code Analysis and Manipulation. Piscataway, NJ: IEEE, 2010: 55-64.

[22]

THOMAS S W, ADAMS B, HASSAN A E, et al. Studying software evolution using topic models [J]. Science of Computer Programming, 2014, 80: 457-479.(无期)

[23]

ASUNCION H U, ASUNCION A U, TAYLOR R N. Software traceability with topic modeling [C]// Proceedings of the 32nd ACM/IEEE International Conference on Software Engineering. New York: ACM, 2010: 95-104.

[24]

金靖,李萌,华哲邦,等.一种基于LDA和静态分析的代码功能识别方法[J].计算机工程与应用,2013,49(15):27-31.(JIN J, LI M, HUA Z B, et al. Code function recognition approach based on LDA and static analysis [J]. Computer Engineering and Applications, 2013, 49(15): 27-31.)

[25]

张瑞霞,张丽萍,王春晖,等.基于主题建模技术的克隆群映射方法[J].计算机工程与设计,2015,36(6):1524-1529.(ZHANG R X, ZHANG L P, WANG C H, et al. Clone group mapping method based on topic modeling [J]. Computer Engineering and Design, 2015, 36(6): 1524-1529.)

[26]

PHAN X H, NGUYEN L M, HORIGUCHI S. Learning to classify short and sparse text & Web with hidden topics from largescale data collections [C]// Proceedings of the 17th International Conference on World Wide Web. New York: ACM, 2008: 91-100.

[27]

JUERGENS E, DEISSENBOECK F, HUMMEL B. Clonedetectivea workbench for clone detection research [C]// Proceedings of the 31st International Conference on Software Engineering. Piscataway, NJ: IEEE, 2009: 603-606.

[28]

张久杰,王春辉,张丽萍,等.基于Token编辑距离检测克隆代码[J].计算机应用,2015,35(12):3536-3543.(ZHANG J J, WANG C H, ZHANG L P, et al. Clone code detection based on Levenshtein distance of token [J]. Journal of Computer Applications, 2015, 35(12): 3536-3543.)

片段式作文范文第4篇

每个电视频道播出的广告节目一般来说都具有以下几个特点。(1)每条电视广告一般都具有重复性,这种重复性有两种情况:一种情况是一条广告一天内会重复播放几次;另一种情况是一条广告每天只播一次,但在一定周期天数内还是会再次播放;(2)每个电视频道每天具有相对固定的广告时段,在广告时段内将连续播放一条以上的广告节目;(3)考虑到商业利益和广告宣传的因素,电视台制作的广告节目只播一次不会再次重复播放的情况很少。

2技术思路

本文研究的智能化广告监管系统,主要基于视频识别比对技术来实现,因此,首先需要对系统采集到的所有视频进行视频特征提取处理。根据上述电视广告播放具有重复性和相对固定播出时段的特点,本文提出以下主要技术思路:首先,在系统的建立初期,先由人工创建初始化的视频广告样本库,通过采用基于色彩特征和纹理特征的视频比对检索技术,将电视频道全天视频源节目的视频特征与广告样本视频特征进行比对,比对后全天视频源将被自动划分出已知广告时段视频片段和疑似广告时段视频片段,识别出的已知广告会进行自动定位并拆条编目形成广告节目串播单;接着,针对疑似广告时段视频片段,采用基于递归比对算法的视频广告识别发现技术,将重复出现次数达到预设阀值的视频片段定义为疑似新广告;然后,通过基于特征索引的切割技术自动生成疑似广告片段样本视频文件,提供给工作人员审核。最后,监管人员通过系统生成的疑似广告片段的视频摘要关键帧图和GIF动态图,即可快速判断确认目标广告。确认后的广告视频片段将自动被拆分并形成编目,完善之前生成的广告节目串播单,同时该视频片段也自动变成新的广告样本添加进广告样本库。每个电视频道的广告样本除一开始建立初始样本库时需要人工制作一遍外,往后均由系统自动发现和制作生成。这样一来,整个电视广告节目的比对、识别、发现、拆分等过程基本都是由系统自动完成,监管人员只需进行少量的确认和审核工作即可完成广告监管的日常工作,大大降低了人工参与的工作量,由此大幅提升工作效率,并提高了广告监管系统的智能化水平。系统总体技术思路框图如图1所示。

3主要关键技术

3.1基于色彩和纹理特征相融合的视频片断比对检索技术。要对监管的视频源进行视频特征提取,系统需要设计一个视频检索子模块对图像数据进行特征提取和索引,提取的特征包括视觉色彩和纹理,提取后进行相应索引。色彩特征和纹理特征是反映一副图像基本信息的典型特征。但是单一的色彩特征或纹理特征只能反映某一方面的信息。如果只用色彩特征做为区别两幅图像的依据则会因为不同场景具有相同的色彩分布而出现大量的错误匹配结果;同样单一的纹理特征匹配也会出现大量的错误匹配结果;如果将这两种特征通过加权的方式同时作为图像判断依据则会大大减少错误匹配概率。因此,通过这两种特征融合的方式和合理利用视频片段的时间比较,本文提出一种有效的视频片断比对检索方法,利用视频比对的方式对视频片段进行比对识别,视频主要利用视频帧的方式进行匹配,该方法原理的具体步骤如下。(1)对视频进行抽去色彩特征和纹理特征并且划分镜头的预处理,把每一帧的特征、时间和镜头编号写入特征文件;(2)输入视频片断寻找其对应的特征文件,并且读入媒体库的特征数据;(3)在媒体库中查找与视频片段开始帧匹配的帧;(4)如果某一帧和输入视频片段的开始帧匹配,则让媒体库的下一个镜头开始帧和输入视频片段的下个镜头的开始帧进行匹配,依次逐镜头进行匹配直到出现不匹配的镜头;(5)判断匹配上的视频片段和媒体库中的视频片段的时间长度差,如果时间差在合理范围内则判断两个视频片段为匹配视频片段。基于色彩和纹理特征相融合的视频片段比对检测技术是广告监管系统实现基于视频比对识别的关键,该技术的识别效率和准确率直接影响着系统的性能指标,通过实验和实际应用证明,该技术已具有较高的查全率和查准率,并且具有较高的效率。3.2基于递归比对算法的视频广告识别发现技术。本文根据电视广告播放具有重复性和广告时段相对固定的特点,采用递归比对算法,识别出疑似新广告片段,通过人工核定,即可方便快速地识别定位。此技术首先通过基于色彩特征和纹理特征的视频比对技术进行广告视频时段划分,再利用递归比对算法进行新广告发现,主要分为四部分:第一部分为广告样本匹配,第二部分为划分疑似广告时段,第三部分为递归比对,第四部分为新广告发现,具体步骤如下。(1)广告样本匹配:利用初始建立的视频广告样本库中的各广告视频样本识别出已知广告节目片段及已知广告时段。(2)划分疑似广告时段:根据广告样本库匹配上的广告按时间顺序排列,在已匹配上的广告视频片段或连续广告时段的前后各设定一个可预设时间,把这两个前后视频片段作为疑似新广告时段划分出来,再对所述疑似广告时段进行定长切割为各视频片段,并对其进行特征提取,这些视频片段通过每天的积累将形成一个广告时段特征库用来进行递归比对。(3)递归比对:将广告时段特征库中各视频片段按时间顺序排序,从第一个视频片段开始比对,将第一个视频比对上,则用第一个视频片段和第三个视频片段进行匹配,直至最后一个片段;再利用第二个视频片段和第三个视频片段进行匹配,如果比对上记录下匹配上的时间位置信息,如果没有比对上,则用第二个视频片段和第四个视频片段进行匹配,直至到最后一个片段;以此类推;最后将所有相似片段进行记录并对近邻片段按匹配时间进行重组切割,得到固定阀值下的重复相似片段;(4)发现新广告:由于递归比对得到的大量重复的视频片段中,可能含有一些同样会重复播放的节目片头片尾等非广告片段,因此再利用预先建立的一个非广告样本库将非广告片段进行匹配过滤,最后通过人工审核结果,确定新广告视频。基于递归比对算法的视频广告识别流程图具体流程如图2所示。这里需要指出的是由于广告时段特征库每天都在不断的积累,所以基本上保证了在特征库中进行重复性比对时,那些在一天内或一定天数内重复播放的广告都可以被发现识别出来,而只播放一次再无重播的广告由于不是特别多,再加上在系统建立时还要考虑设计生成频道视频摘要关键帧和全天视频片段GIF动态图作为人工审核辅助手段,监管人员在每天审核完系统自动生成的疑似广告片段后,再通过关键帧和动态图快速浏览,也可发现和补充系统未自动发现和生成的新广告节目,因此,整个系统还是能够保持较高的新广告发现能力。3.3基于特征索引的视频片段切割技术。由于采集的每个视频文件,都对应含有一个索引文件,文件格式主要为二进制形式,包含的信息主要是视频播放的时间信息,文件大小等,系统根据此索引文件可以便捷地对视频文件进行IO流的切割、合并等操作。利用此特征索引文件可以通过对基于递归比对算法得到的目标广告样本进行快速切割,并自动归类,分级存储在系统中。具体流程如下:(1)系统根据视频片段特征自动识别出样本片段,并提取样本片段的开始和结束时间;(2)系统根据非广告样本片段自动过滤已识别出的样本片段;(3)系统根据视频索引文件利用IO流自动将已过滤的样本片段进行切割合并,并自动分类,并将关键信息入库。基于特征索引的视频片段切割流程图如图3所示。

4系统技术特点

采用上述基于视频特征的关键技术构建的电视广告监管系统,与其他广告监管系统相比,应具备以下创新的技术特点。(1)通过基于色彩和纹理特征融合的算法,提取视频片断的特征,进行有效的广告视频片段比对检索。(2)自动划分广告时段与疑似广告时段视频片段,对已识别出的广告能自动编目,生成广告节目串播单。(3)通过递归比对算法对相邻视频片段进行重组切割,得到预定阀值下的匹配时长相似片段,从中发现新广告节目。(4)采用视频特征索引切割技术,系统自动切割广告样本片段,智能化创建样本库,取代传统依靠人工制作广告模板的工作方式。(5)广告样本比对性能不受样本库大小的制约,且进行样本比对后能从视频源中自动拆分出广告节目。

5结语

广告监管系统中使用到的广告识别一般都基于广告样本片段进行,因此,对广告样本库的维护要求很高,且实时性也较强。本文提出基于视频特征进行广告检索识别,且只需要进行最初的广告样本初始后采用基于递归比对算法的视频广告识别技术即可自动发现新广告,再根据视频特征索引对广告样本进行自动切割,这些过程全部先由系统自行完成,几乎无人工参与,从而形成了广告自动发现识别、广告片段自动切割的技术方法,有助于推动广告监管技术进一步向自动化、智能化方向的发展。经过研究开发和对实际应用表明,利用这些技术方法构建的广告监管系统具有较高的性能:通过应用系统同时对40套电视频道节目进行监管处理,系统对广告节目的识别查全率和比对识别正确率以及广告样本匹配准确率都能达到90%以上;系统对单个电视频道全天24小时视频片段的检索速度在6分钟以内;每个监管人员通过系统巡检审核一个电视频道所有广告节目的处理时间约为0.5小时/天。系统的高效智能化大幅降低了监管人员的工作强度和难度,在提高监管工作效率的同时进一步扩大了监管范围,有效实现了广告监管工作的智能化水平。

参考文献:

[1]耿国华,王克刚,李康.基于色彩纹理特征的图像分类及应用[J].西北大学学报•自然科学版,2010(1):53-56.

[2]余时强,张铮,张为华.近似重复视频检索方法研究[J].电子技术应用,2016(5):24-26+35.

[3]陈康睿.视频分割算法研究[D].大连:大连理工大学,2015.

片段式作文范文第5篇

一、留心观察,抓住事物特点

观察,是学生通过视觉直接观看事物,并获得知识、加深理解的主要途径。在写作教学中,培养学生的观察能力是推动学生获得写作素材的重要手段。鲁迅曾说过:“如要创作,第一须观察。”只有留心观察,才能抓住事物特点,如此,写作时才会构思灵敏,得心应手。因此,在小学片段作文写作训练中,教师要指导学生留心观察事物,抓住事物的细节特点,然后整合多种叙述方式,运用语言片段呈现出来。

以描述性片段作文写作训练为例,具体指导如下:首先,教师要引导学生选取一个具体的描述对象,认真观察,获得直观的感性表象。其次,抓住事物的主要特点,细致观察,并运用相关的修饰语强化表象,使事物特点更加鲜明、生动、具体。如人物描写,要留心观察所选人物,抓住人物的不同特点,如形态、容貌、神情、风度、服饰等,然后用具体而生动的语言加以描绘,再现人物的言谈举止、音容笑貌,刻画人物的鲜明个性,揭示人物的思想品质。以下是某位学生的人物外貌描写片段作文:我的妈妈是一位三十多岁的中年妇女,尽管脸上已出现几条浅浅的皱纹,但她仍然很漂亮。中等的个子,一头乌黑的长发常常披散在肩头,大大的眼睛很有几分神采。妈妈特爱笑,一笑起来就露出一口洁白可爱的牙齿,显得特别精神。通过这样的作文片段写作训练,不仅可以培养学生的观察能力,还能够增强学生的作文意识,提高学生的语言表达能力。

二、想象联想,丰富形象意象

想象,是学生思维创造的火花,写作离不开想象联想,学生富有想象力,敢于想象联想,才能打破思维常规,创造出构思精巧、形象生动、内容丰富的作文。反之,则作文形式千人一面,内容苍白无力、空洞乏味。因此,在小学作文教学中,教师可以借助片段作文写作训练,引导学生大胆想象,合理联想,创造出丰富的形象意象,提高学生的写作水平。

(1)给出词语或句子,引导学生想象联想,修饰完善或组合情节,进行片段描写。如笔者给出“琴声吸引了许多路人驻足倾听”这样一个句子,要求学生根据所提供的句子,展开联想或想象,使之形成一个完整片段。经过思考、想象,于是形成这样一个片段:优美的《梁山伯与祝英台》小提琴协奏曲,轻轻地飘出演播大厅的窗户,穿过蒙蒙细雨,洒落在林间的小路上。许多行人情不自禁地停下了脚步,听得如痴如醉。这样,通过想象联想,既充实了表达内容,丰富了形象意象,又活跃了学生的思维,增强了学生的写作兴趣。

(2)结合课文空白,引导学生想象联想,拓展省略情节,或续写故事结局。教材中有许多课文留有空白,这些空白意犹未尽、余味无穷,给学生极大的拓展想象空间。因此,在小学片段作文写作训练中,教师可以借助这些空白处,巧妙地指导学生推测、构思,放飞想象,大胆联想,对省略的情节进行拓展,或对作品的结局进行续写,以发展学生的创新思维,提高学生写作能力。教师可以引导学生展开想象的翅膀,续写故事的结局,弥补这一空白。这样,既对作品进行了再创造,有助于进一步提高学生的写作水平,又激发了学生的写作欲望,加深了学生对课文内容的理解和把握。

三、注重仿写,做到学以致用

仿写是写作训练不可或缺的过程,是提升学生语言表达能力的重要途径。在小学片段作文写作训练中,教师可以从课文、所见到的美文中精选仿写范文,引导学生从修辞、句式、主题等方面思考,进行多样化的片段仿写训练,帮助学生掌握写作方法和技巧,提高学生的鉴赏力以及语言运用能力。

相关期刊更多

短篇小说

省级期刊 审核时间1个月内

吉林市委宣传部

新语文学习

省级期刊 审核时间1个月内

凤凰出版传媒集团

译苑新谭

省级期刊 审核时间1个月内

四川省翻译协会