Team Work
每个团队3人,需要从下面的选题中选择一个题目开展调研、分析、评测工作,按要求提交阶段报告和相关代码、开展组间交流和互问等。
- 专题A:
- 虚继承
- Mixin
- Traits
- 原型继承
- 专题B:
- STL
- Concepts
- 专题C:
- 智能指针与内存管理
- Java Garbage Collection
- 专题D:
- 宏
- Macrofication
- 专题E:
- Halide
- Darkroom
- Loopy
- 计算图的表示与变换
- 其他自选:需事先征得主讲老师的同意
注: 各团队在后期需要组织团队间的交流,互相提问题并进一步调研解答(注意记录到各团队的报告中)。例如,选择 A.2 Mixin 和 A.3 Traits 的团队需要结合自己的理解来讨论、分析和总结 Mixin 与 Traits 的区别。每个团队需要和至少2个团队进行交流和相互问答。
时间表
- 10.12 在 Google Doc 文档:Compiler H 2017 Fall Teamwork Subjects 上报团队的选题和队长身份
- 12.13 建立好你的仓库,并使用 GitHub 的 Pull Request功能将团队的项目说明上传至 Teamwork 仓库中。具体要求见下节。
提交方式
每组需要建立至少一个与项目相关的 GitHub 仓库,并将自己的工作上传。你可以将仓库建在某一成员名下,也可以建立一个 organization 并将队伍成员全部加入其中。
如工作只包含文档,则可参考 GitBook 来组织仓库,使用 Markdown 编写文档(你也可以使用 GitBook 来 host 你的文档页面);如工作包含代码和文档,你可以选择使用单一仓库维护你的代码,并在 /docs
页面中包含你的文档,也可以选择使用分离的仓库。
在建立好你的仓库后,你需要使用 GitHub 的 Pull Request(简称 PR)功能将团队的项目说明上传至 Teamwork 仓库中。具体方式如下:
- 由某一成员在 Teamwork 页面的右上角,点击
Fork
按钮将这一公共仓库 fork 至成员账户下;fork 功能的说明见 Fork A Repo - GitHub Help。如果你建立了队伍的 organization,你也可以将仓库fork至这一组织下。 - 在被 fork 的仓库中,通过 git 加入你的团队的项目说明。项目说明的命名见 Teamwork README.md。项目说明应包含你的项目链接、成员姓名和 GitHub 账户的对应、项目简介。具体步骤如下:
- 在你被 fork 的仓库页面上,点击
Clone or download
绿色按钮,根据你的喜好选择 HTTPS 或 SSH 链接,将提供的链接复制; - 在你的终端当中,通过
git clone
拉取仓库内容; - 在本地添加
<your-team-no.>-<your-proj-name>.md
文件,在其中编写你的项目说明,提交并上传(commit
&push
);
- 在你被 fork 的仓库页面上,点击
- 参考 Creating a pull request from a fork - GitHub Help,向 Teamwork 仓库提交 PR。 助教会在你的 PR 提交后进行 Review,通过后即会被 merge 进源仓库中。请及时查看你的 PR,助教会在 Comment Review 中说明你的问题,只有修正好后才能 Approve;在你自己仓库中的更新会自动反映到 PR 当中,不需要重新提交 PR。
- 在你的 PR 被 merge 后,如果还希望更新说明,请更新你的仓库并重新开 PR。
- 如果你最终确认项目说明不需要再更改、已经定稿,可以删除你 fork 的仓库。
在你们的组队项目中,你们也应尽量习惯 GitHub 式的协作;对于每个队员的工作量,我们会依据每个人的 commit 的贡献量来分析(并非简单地按照行数,而是综合地考量工作量和难度;所以请不要随意地使用外来代码刷行数)。
如果对这些协作功能有任何疑问,欢迎随时联系助教提问,也可以向同学寻求帮助。
选题
A. 继承与软件复用
本专题重点关注现有编程语言中的继承机制。编程语言中引入继承的主要目的是为了抽象和复用代码。
选择本专题的各团队均需要了解基本的单一类继承;而对于多重继承,需要了解 Java 中支持的规格继承(protocol inheritence,允许一个类继承多个接口类)。本专题的各个选题主要围绕编程语言对多重继承的支持方式而展开,感兴趣的团队可以从中选择其一,不同的团队需要选择不同的题目。
-
- 是 C++ 为解决多重继承的 Diamond 继承问题而提出的一种解决方案。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类 A中的变量和函数。可以阅读 Bjarne Stroustrup 的Multiple Inheritance for C++。
-
- 是指一个类,其中的方法可以被其他类使用而不必是其他类的父类。早期关于基于Mixin的继承论文参见 Gilad Bracha 等的论文 Mixin-based Inheritance [OOPSLA1990]。
- 在D、Dart、JavaScript、Perl、Python、Racket、Ruby、Scala、Swift、SystemVerilog 等语言中均提供这种语言特征。
Traits )
- 表示一组方法可以用于扩展一个类的功能。最初起源于 Xerox 公司的 Self 语言(Traits: An approach to multiple-inheritance subclassing [SIGOA 1982]),影响力比较大的文章是Oscar Nierstrasz 教授领导的研究组的 Traits: Composable Units of Behaviour[ECOOP 2003]。
- 在C++、D、Java、JavaScript、Kotlin、Perl、Python、Racket、Ruby、Rust、Scala、Self、Swift 等语言中均提供这种语言特征。
-
- 是指通过原型来对现有的对象进行复用,即一个对象可以基于另一个对象来创建,复用另一个对象的实现。最初起源于 Xerox 公司的 Self 语言。可以阅读 Classifying Prototype-based Programming Languages 和 Prototypal Inheritance in JavaScript 来了解原型继承。
- 在Common Lisp、ECMAScript的系列语言(如ActionScript、JavaScript、JScript)、Lua、Perl、Python、R、Self 等语言中均提供这种语言特征。
B. 泛型编程
本专题重点关注现有编程语言中的泛型编程(Generic Programming)机制。
STL(Standard Template Library)
- 重点了解函数模板、类模板、C++14 提供的变量模板 等
- Alexander Stepanov 是 C++ STL的主要设计和实现者。C++ STL于1994年向 ANSI/ISO C++ 标准委员会建议,后经少量修改和扩展于1997年成为官方的 C++ 标准的一部分。
Concepts )
- 是对一个类型中所支持的操作的描述,包括语法和语义。最早于1998年在 STL 中使用 Concepts: The Future of Generic Programming,该术语出自 Alexander Stepanov。
- 可以阅读 a bit of background for concepts and C++17—Bjarne Stroustrup 及其中列的文献了解 Concepts。
C. 指针与自动的内存管理
本专题重点关注编程语言中的指针与动态内存管理方法,以及它们引起的内存安全问题。不论你选择本专题的哪个选题,你都需要先总结 C 语言中指针及其内存安全问题(如 dangling pointers、null-dereference、use-after-free 等)。指针与动态内存管理是分割不开的,如果你选择下列选题之一开展调研,那么你不仅要研究指针的使用语法和语义,还需要了解相关的实现以及动态内存管理。
- Smart pointers 与内存管理
- 了解智能指针在 C++ 不同标准以及Rust中的定义与实现,相关的内存管理
- 【ICSE2016 论文介绍】使用 Rust 语言开发 Servo 浏览器引擎
- Java Garbage collection与各种 GC 算法
D. 宏与Macrofication
- Macro )
- 词法级别的宏:如C语言
- 语法级别的宏:如用在 类Lisp的语言、Rust、Scala 等
- 普通宏和Hygienic Macro的区别:若宏调用处有个名字name1,同时宏内部也有一个name1,hygienic宏在展开时会把自己内部的name1改名成name2,普通宏则不改名。
- Macrofication:介绍了在JavaScript上的Macrofication,它识别代码中与宏定义的模式相匹配的代码片断,将其替换为宏。
- 调研类似的工作以及实现技术
E. 领域专用语言与面向异构计算架构的编译
本专题主要调研在深度学习、图像处理等系统或应用领域,为有效利用CPU 与加速器异构计算资源、提高软件开发生产力而提出的一些领域专用语言与相关的编译和优化技术。
目前的一些深度学习系统,如 MXNet、谷歌的 TensorFlow [OSDI 2016]等,已经能够识别异构资源同时为编程框架屏蔽异构资源的差异,方便其利用异构资源的特性。TVM 是MXNet 研究人员提出的面向深度学习的统一中间表示和虚拟机,旨在让上层深度学习框架相对容易地利用底层各种异构硬件的特性。
TVM对CPU、GPU和其他专用硬件进行统一表示,而且能自动地对计算图变换,以便最小化内存使用、优化数据布局和融合计算模式。目前 TVM 包含对 x86、ARM、OpenCL、CUDA和JavaScript 的优化原语。TVM软件栈提供一组可复用的工具链,可以把来自深度学习框架前端的高级神经网络描述编译成多种硬件后端的低级机器代码。现有深度学习框架所使用的高级图表示包括 MXNet 的 NNVM(TVM支持的高级计算图表示)、谷歌TensorFlow 的 XLA (github) 和 Intel 的 Ngraph(github) 等。虽然对计算图可以实施各种优化来改进图,但是针对一些单个图算子,如卷积或矩阵相乘,不同的硬件可以有不同的优化实现。这些硬件相关的优化在内存布局、并行化线程模式、cache访问模式和硬件原语选择上有很大区别。TVM期望提供低级的统一中间表示以便显式地表达这些优化。
TVM的低级中间表示采用现有图像处理语言(如 Halide 或 Darkroom)中的原则,来构思表达深度学习的领域专用语言(DSL);它利用像 loopy 和基于多面体(polyhedra)的分析等循环变换工具来构建低层的优化。
- Halide: a language for image processing and computational photography, [PLDI 2013] Helium: Lifting stencil code from stripped x86 binaries to Halide DSL code, [PLDI 2015]
- Darkroom: a language for describing image processing pipelines embedded in Terra. [SIGGRAPH 2014]
- Loopy: Loopy: Programmable and Formally Verified Loop Transformations, [SAS 2016]
- 计算图的表示与变换,如NNVM