山楂片的博客

山楂片的博客

山楂片的博客

马上订阅 山楂片的博客 RSS 更新: https://szp15.com/index.xml

编程语言入坑指南

2022年4月29日 01:16

本文先按照理论和应用两方面介绍了编程语言方向的相关概念,而后介绍了清华软院静态分析组研究的内容。最后本文介绍了该方向的科研就业现状,并给学弟学妹们给出一些建议。

作者介绍

我叫孙子平,是:

  • 软院五字班本科毕业生
  • 软院零字班工学硕士在读

主攻静态分析方向。我的微信ID同GitHub ID,欢迎大家通过微信、邮件私戳,相关联系方式见页面下方名信片。这篇文章大多是原创的个人观点,仅供参考,也欢迎来评论区指正。

编程语言方向简介

早在高中时,我就萌发了一个梦想,希望能参与到知名编程语言的设计中。当时,我认为那是编程领域的圣杯,是一个值得毕生奋斗的目标。进入大三后,我依旧怀揣着这个梦想,只是这个梦想具化为了一个领域,编程语言领域。大家通常简称它为PL(Programming Language)。当时,我找到了Paul Zhu学长。他告诉我软院与PL最相关的方向可能是:

  1. 周旻老师的静态分析方向;
  2. 贺飞老师的形式化验证方向。

恰巧当时我很喜欢函数式编程课,讲师理论上是周老师。于是,我联系了周老师,成功入坑静态分析。这门课程后来被取消掉了,也算是很遗憾。

PL主要研究编程语言的设计和实现。它的一方面很理论,包括形式语言与自动机、类型系统;另一方面则偏应用,包括编译器和静态分析。接下来,我讲按这两部分介绍一下PL,希望能够激起有兴趣的人对此的热爱。

PL理论篇

编程语言相关的理论有很多,这里我选取两个较为典型的理论体系:形式语言与自动机,和类型系统。我会更偏重于后者,因为前者是软院已有的课程。

形式语言与自动机

形式语言与自动机是软院大三上的课程。这一系列的理论试图将现实世界中的计算,抽象为一个可以用数学描述的行为,从而进一步描述计算能力和计算复杂度。这些理论发展得非常成熟。到了现代,容易摘得的科研果实基本已被摘取,只剩下一些非常难啃的硬骨头。在这些硬骨头中,最著名的应当是P/NP问题,其难度不言自喻。有趣的是,形式语言与自动机理论也能用于实现编译器的前端。

类型系统

相较而言,类型系统则更能激发我的兴趣。编程语言借助类型检查,可以限制所能进行的操作。根据这种检查发生于编译期还是运行期,类型系统可以分为静态的和动态的。而根据其对隐式类型转换的允许程度,可以将类型系统划分为强类型和弱类型。

类型之间的关系则更为有趣精妙。以下部分大多是个人观点。多态,是指不同类型在同一代码下拥有不同的行为。其目的是提高代码复用能力。面向对象最具吸引力的特性正是多态。相较之下,封装很容易实现,即使实现了也只是“基于对象“,谈不上“面向对象”;而继承的目的则要么是组合(Mixin),要么就是多态。面向对象强调的是动态多态,即在运行时才决定何种行为。类似地,也有静态多态,即在编译期就决定何种行为。例如,二元加法运算符作用于数值类型时表现为加法,作用于字符串类型时表现为拼接,这就是静态多态;函数重载也是静态多态;而类似于C++的模板泛型编程,则是更为强大的静态多态。更多安全的、符合直觉的多态意味着更高效地复用。举个例子,考虑下面的几种操作:

  • 拼接字符串数组
  • 求整数数组的最小值
  • 求二叉搜索树上所有浮点数的积

这些操作都是针对一个可以按某种顺序遍历的容器,将其元素按照某个有单位元且符合结合律的二元操作收集起来。在C语言的时代,人们很难想象这些操作能用统一的代码完成。而借助多态,这种程度的代码复用就成为了现实。例如C++中,你可以用std::accumulate做到上面的所有操作。

方法 容器 元素类型 单位元 二元操作
拼接字符串数组 数组 字符串 空字符串 拼接
求整数数组的最小值 数组 整数 最大的整数 最小
求二叉搜索树上所有浮点数的积 二叉树 浮点数 1.0
#include <...

剩余内容已隐藏

查看完整文章以阅读更多