【开源之夏专访】热爱和努力永远不会被辜负——曹行行

时间:2022-12-21 14:09:03

夏天渐行渐远,秋天匆匆晃过,开源之夏2022在洁白如新的冬天如期收获了350 位同学的结项成果,这些同学也在开源软件社区留下了自己的足迹,感谢各位同学的支持。今年我们依旧按照最佳质量奖、突出贡献奖、最快进步奖、最具潜力奖四个角度评选出了具有代表性的20位优秀学生。

本次采访,我们邀请了最快进步奖获奖者曹行行,分享他的经验。

 

【开源之夏专访】热爱和努力永远不会被辜负——曹行行

姓名:曹行行

性别:男

年龄:21

学校:北京工业大学

兴趣爱好:学习感兴趣的知识并加以实践

 

--自我介绍--

1、首先,请简单地介绍一下自己。

大家好!我叫曹行行,来自北京工业大学新能源科学与工程(可再生能源利用)专业的大四学生,辅修专业计算机科学与技术。我在计算机方向的学习起步较晚,踏入计算机学科也是兴趣使然,但是我相信,永远都不会太晚,重要的是现在就去做。我付出了许多精力和时间去追赶科班生的水平,现在我认为我做到了,未来我也会继续努力下去。

2、我们了解到你的专业是能源动力类新能源方向,计算机类的知识是自学的吗?学习这些知识对本专业的学习有哪些帮助?

计算机类的知识并非完全自学,我在本校学习一个计算机科学与技术辅修专业,这是我在大学第二学年处于兴趣报名的,在辅修课业上我遇到了许多优秀出彩的老师,是他们带领我进入的计算机领域,师恩难忘,在这里我衷心感谢每一位给予我指导的老师!当然,计算机并非纸上谈兵就能精通的科目,在空闲时间,我也会为我的兴趣钻研一番。在学习计算机伊始,我对计算机的认知还停留在最直观的程序语言的层面,看了许多杂七杂八的知识,有些理解不了其原理,但是也出于兴趣记下了;后来随着辅修课程内容的深入,我的课余学习也慢慢加深,往常理解不了的也慢慢明白了。回顾我的大学生活,我对计算机的学习过程没有像传奇故事里一样一蹴而就,我只是一个普通人。千里之行,始于足下,在未来我更要谦虚谨慎,不能好高骛远。

在我所学的课程中,计算机学科与本专业新能源科学与工程(可再生能源利用)的基础知识并没有太多交叉,另外我在大三学年,出于对自己个人情况考虑,已经决定了自己未来的发展重心放在计算机方向上。

如果要说两条帮助的话,首先,计算机学科在软件的使用上给本专业上的学习一些帮助,因为学习计算机学科免不了读很多英文,在使用没汉化的国外软件,如ANSYS时更加顺手一些;其次,对计算机的学习让我拥有更加缜密的思维,提升了我逻辑推理判断的能力,尤其是算法设计上,我明显觉察到对计算机的学习对我有相当大的帮助,例如在风能利用课程中,使用迭代法求轴向诱导因子和轴向诱导因子的算法,只看一眼就觉得相当熟悉。

3、之前有了解过开源吗,有参加过开源相关的活动吗,分享一下你的经历。

开源这个词的概念很早就在我心中产生了,当在高中阶段第一次接触到python时,我了解到它是一门开源的语言,当时给我的第一印象是:开源意味着免费,无需付出代价即可获取;当使用python的pip下载一些软件包时,我又对开源产生了第二印象:开源意味着人人可做修改、做扩展。参与到开源项目之后,我对开源也有了一些更加深刻的认知,项目开源意味着项目在未来可形成一套完善的生态,就像一颗树一样持久生长下去。

由于我起步较晚,这次开源之夏是我第一次正式参与的开源活动。希望自己能在未来更多地参与到开源活动中。

 

--关于开源之夏2022--

4、请简单介绍一下你在开源之夏2022中的项目。

根据IEC61131-3中的规范提取结构化文本语言的语法规范,编写出符合ANTLR4规定规范的语法文件。在此基础上,使用ANTLR4提供的自动生成工具生成词法分析与语法分析程序,以及访问器模板代码。拥有词法分析器与语法分析器后,输入结构化文本源码就能得到抽象语法树,使用ANTLR4提供的AST树的访问工具对树节点进行两次自顶向下的访问。在第一次访问过程中,主要任务是借助符号表与作用域栈的内容对语义进行检查,完善符号表,并在部分关键的树节点上留下信息,供翻译使用。第二次中,对部分重要的树节点进行访问,使用符号表与第一次访问时留在树节点上的信息,将源码翻译为C++代码。翻译出的C++代码使用运行时支持文件提供的类(即被包装的C++基本语法元素)来代替源码中的语法元素,以满足对语法元素的特殊需求。同时,运行时支持文件还需要对运行时的错误进行检查并报告。

5、是在哪里了解到开源之夏活动的,参与活动的契机是什么?

我是在老师的牵线搭桥下了解了开源之夏活动,当时我与几位同学已经投入设计这个开源项目相当长的时间,在老师的推荐和鼓励下,我报名参加了这次开源活动。

6、在项目中遇到最印象深刻的问题是什么?如何解决的?有什么收获吗?

AST树访问策略的选择

ANTLR4提供了两种AST树的访问策略:监听器模式和访问器模式。监听器模式是对AST树自动地进行深度优先遍历,通过编写进入AST树节点与离开树节点的方法来实现静态检查与翻译如下图所示。而在访问器模式下,需要手动规定访问树节点的顺序与时机。在确定静态检查与翻译的方式时,遇到了两种方法似乎都可行又都难以实现的问题。最终考虑到ST语言的复杂性,拥有FUNCTION、PROGRAM、CLASS、CONFIG等复杂的语法元素,顺利地解释他们对树节点访问的*度有较高的要求;同时,在访问器模式下可以自定义访问树节点的顺序与时机,虽然较为繁琐,但是更加*,最终在静态检查与翻译使用的工具上选择了访问器模式。访问器模式下,可以自主地选择树的某些子节点进行访问或者略过某些子节点,十分适合对复杂树结构进行分析。下层树节点的访问方法可以通过返回值向上层树节点的访问方法返回数据,这种性质十分适合进行收集一一整合,也就是访问底层树节点时进行数据的收集,访问上层树节点时进行数据的整合。这种自顶向下的访问模式与语法分析中,递归下降分析法十分类似。

两遍访问中的信息传递

在第一遍扫描完成后,符号表中被填满了源码中声明的各种符号,作用域在栈内进进出出,最终变为空栈。在第二遍扫描中,翻译器如果只能通过查询符号表中的信息,那么翻译器会因为缺少必要的信息寸步难行。为此,给出了两种解决方案:一种是在第二遍扫描中,再进行一次作用域的栈出入动作,当前的作用域查询到与之关联的符号,第二种是使用HashMap传递信息,树节点为键,需要传递的信息为值。第一种方案下,某些赋值语句、控制语句等并没有声明符号,翻译器就注意不到这些语句。如果使用此方法,符号表内还需要另外添加一些信息,此方案并不可行。因此采用了第二种方案。在第二种方案下,普通的声明变量的节点可以直接将声明的变量的符号与之组合成键值对添加进哈希表内,由于变量的符号包含了在树节点上搜集的所有信息,因此只需要此符号就能得到一条变量定义语句,并不需要再次访问下面繁杂的子节点去搜集信息;赋值语句树节点与信息特化处理的符号组成键值对,此符号拥有一个名称与赋值的信息,同样不需要访问复杂的Expression子节点进行数据的搜集。享受到便利的同时,也付出了相应得代价,即这个HashMap在静态检查之前被建立,在静态检查中被填充,在翻译时被使用,在程序结束时才被释放,当AST相当大时,需要添加进哈希表内得数据也相当多,会占用较大的内存,在对内存大小有限制时,应该考虑别的方法。

引入作用域的符号与符号表的关系

在大部分高级语言中,如C语言,是允许在作用域内嵌套一个匿名的子作用域的,如在main函数内声明了一个变量myExternalvar和一个没有名称标识的子作用域,在这个子作用域内声明了变量myInnervar。如果main函数引入的作用域与main函数有对应关系,那么对子作用域而言,它没有与他对应的函数(或者说是符号)。但是在IEC61131-3规范中,这种用法是不允许的。IEC61131-3中对变量的声明位置有明确的规定,即必须在作用域的某一位置统一声明,而且必须被VAR和END_VAR这样的变量段标识符包围;同时规定在作用域内不允许声明一个没有符号关联的子作用域;也就是说ST语言中的作用域、作用域对应的符号表和引入作用域的符号是关联在一起的,一一对应,除了全局作用域没有对应的符号外,每一个作用域都是由一个具体的符号声明出来的,明白这一点后,对符号表、作用域、符号的设计产生了莫大的影响。

 

--关于开源和学习--

7、开源对你学习有什么帮助吗,鼓励一下想要参与开源的同学们吧。

参加开源之夏活动是一次十分宝贵的经历,我从中学到了许多。以前我从没接触过开源项目的开发,对git工具等等都不太熟悉,参加这次活动我切身体验了一次多人协作开发。这次项目也让我学习到不少现代编译器使用的方法,十分地长见识,也让我意识到自己做的完全不够,未来还需要在我参与的这个开源项目上做更多工作。目前我正在与几位同样保研的同学对原来的项目进行重构,并将目标语言转换为llvm IR。

我应该算是参加开源项目的同学里,情况相对差的一类了。刚看到项目题目,大脑就一片空白,本能地想退缩,战战兢兢,如履薄冰。但是世上无难事,只怕有心人,保持谦逊的态度,拿出奋进的势头,如果不会就去学,如果看不懂就去学更加基础的知识,没有人是一步登天的。如果同学们有和我一样的体验,又想拥有这样一次宝贵的开源经历的话,那就鼓起勇气来参加吧!

8、在之后的学习中,重心会向哪个技术领域倾斜,选择它的原因是什么?

未来我会在编译器以及操作系统这些系统软件上继续研究学习,为此我也需要了解当今体系结构领域的发展,在目前新兴的RISC-V领域,我也会有所学习。同时,我之后的学习还会涉及一些人工智能技术,去研究一些用于机器学习领域的智能编译器,如TVM就是一个非常好的项目,Halide也提供了非常重要的思想,未来希望能够深入研究一下。

选择这个领域的原因之一是,它相对于其他领域更合我的胃口。经过长期的接触、了解,我应当算是入门了,我明白了这个领域是什么模样,也能接受它,我能保证未来能在这个领域上保持相当的热情。其次,如今中国在基础软件方面相对欠缺,出于一种家国情怀,我也应当选择这个方向。最后,我在开源之夏的导师以及未来研究生院的导师的研究方向也是与此相关,我也是在他们的带动下才确定了重心。

9、有想要深入了解的开源软件吗,简单介绍一下吧。

目前我正在做一项目标语言是LLVM IR的项目,设计思路是沿用我所负责的开源之夏项目的,并做了适当的修改。在这过程中,我了解到了大名鼎鼎的LLVM,其子项目CLANG以及用于机器学习的MLIR,其中我对LLVM十分感兴趣,目前正在研究中。

"计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决",我认为LLVM很好地践行了这句计算机领域的至理名言。如果将LLVM简单地描述成三段式,前端是使用不同的编译工具对代码文件做词法、语法分析以形成抽象语法树AST,然后将分析好的代码转换成LLVM IR;中间部分对LLVM IR进行操作,通过一系列的pass做优化;后端负责将优化好的IR解释成对应平台的机器码。LLVM的优点在于,在高级语言代码和机器码之间加了一层统一的中间表示LLVM IR,如果需要支持一种新的编程语言,那么只需要新增一个前端,如果需要支持一种新的设备,那么只需要新增一个后端。LLVM已经存在了十多年,但经久不衰,未来希望能够深入了解一下这一款开源软件。

【开源之夏专访】热爱和努力永远不会被辜负——曹行行

10、你觉得编程的魅力有哪些?

在我看来,编程是一种手段,不同的程序设计语言就像筷子、叉子、勺子一样,学会一门语言就像只是会用了这个工具,而要能优雅从容地吃下饭,还需要学习各种各样的姿势、礼仪,也就是设计模式、算法和规范等等。学习一门语言、了解一种算法,在某天突然发现能应用它,在这个时候的带给我的满足感大概就是编程的魅力就在。

11、恭喜你这次被评选为最快进步奖,这是对你的学习能力的肯定,可以分享对你帮助较大的学习方法吗?

十分荣幸能被评选为这一奖项,感谢各位评审老师的对我的赏识!对我帮助比较大的学习方法,我总结了以下几点:第一,俗话说兴趣是最好的老师,又说干一行爱一行,要学习某一领域时要提起兴趣,至少不能打心底讨厌他,否则就提不起劲来,看什么都味同嚼蜡,上学如上班一样。第二,要找到适合自己的学习方法,提高学习的效率,让自己充实起来。有些人适合去啃书,有些人适合去看视频教程,有些人适合从别人嘴里问出知识,或者有人三者兼有,找到自己的一套学习模式,会对自己的学习生涯有莫大影响。最后一点,千万不能灰心丧气。有些知识不能理解可能是因为花费的时间不够或者前置知识学得不够,一定要对自己的能力有信心,一定不能说出“我太笨,永远都学不会!”这种话来。