Skip to content

在开始之前

什么是SEU-Project R?

SEU-Project R 是由东南大学电子科学与工程学院2023年团委学生会科协成员们发起的、完全开放的知识分享/导学性质的项目。

Project R的名字来源于单词Refactor(重构)—— 通过逐步的引导、有趣的实验、对于底层细节的讲解,重构以往的教学和知识建构体系,重新审视一个优秀的 Engineer/Researcher 应当具备的素养。

从头再来

Visual Studio 的七宗罪

虽然这样说可能有点危言耸听,但是 Visual Studio 是一个巨大的、温柔的陷阱。你可能会想—— 如此复杂和“强大”的软件,怎么就成为陷阱了? 然而Visual Studio 的原罪便来自于它的“强大”。

点击创建项目、一键运行程序……这些你习以为常的操作中,隐藏了太多你本应面对的真相和细节。

如果你真的想搞明白“到底发生了什么”,或是理解代码之下隐藏的细节——就请你先关闭 Visual Studio 吧。 我们并不是说“VS很烂”,而是它现在不适合你。

我们在大一的“C++课程”学会了什么?

回答1:学会了C++。

回答2:学会了类、模板、重载、友元……等下,这些东西是干什么的来着?

回答3:学会了原码,补码,还有……

很遗憾,所谓的C++课程,在某种程度上并不配被叫做“C++/计算机科学基础课”。它更像是一场精心策划的、语言的游戏,一个由符号和语义组成的迷宫。

从C语言到C++的流变其实代表着一种开发思维的转向。前者代表着对计算机系统底层模型的完全可控,在它的基础上,先驱们创造了无数的计算机科学历史上最伟大的作品( e.g. Linux Operating System ) ;而后者则代表着以OOP为核心的、对任务、资源、数据与类型的抽象

令人感叹的是,这两个语言的核心哲学,在一整个学年中几乎从未被我们触及;反而有太多的时间被浪费在了语言游戏、“写出程序的运行结果”的把戏之上(我最痛恨的一集)。

可以这么说:真正意义上的C++是随着2011年发布的 C++11 标准而诞生的。在此之前的C++完全就是不伦不类的 C with Classes。 (都说到这份上了,不妨看一看你手边的C++教材是哪一年的书。

如果你觉得自己大一的C++内容学得很好,或是为刷了个满绩而沾沾自喜的话,请先看看下面几个问题吧:

  1. 写下的.c/cpp文件是怎么变成二进制的可执行代码文件的?
  2. 源代码编译出来的文件里头到底有什么?
  3. 那么多代码文件是怎么最后被构建成一个单个的、可执行的目标的?
    1. 与此相关的:在我引入一个 #include <xxx.h> 或是声明一个 extern 变量或是声明一个不在本文件中被实现的函数原型到最终电脑把它们联系起来,形成一个完整的可执行文件的过程中发生了什么?
  4. 在我使用 printf() 或是 std::cout 的时候,计算机里到底发生了什么?
    1. 我一直觉得这是个很好的问题。你可以从门电路、数字模块、状态机、计算机系统、操作系统、软件编程等等各个角度去思考和回答它。
  5. 我写下的所有的程序,如果说它们都可以被同一个抽象的模型所概括和理解的话,这样的模型是什么?
  6. 现代C++的类型系统是怎样工作的?它和C的类型系统的哲学有哪些不同?
  7. 想一个你觉得有趣的项目, 你会怎么把它用C++写出来?

SEU-Project R 项目框架

项目架构图

为什么要使用C而不是C++?

没别的原因,因为我们是EE专业而非CS。相比起C++高度抽象的特性,C对底层模型的完全可控的能力, 在未来的学习和研究过程中, 更能帮助你快速掌握各种知识和技能。

不过这不代表我们就不需要学C++了。一旦任务开始复杂和抽象起来,C++永远是你的好伙伴。但是相关内容我们不会在此作过多的介绍。

而且我相信,如果你已经能够把C学明白了,再去看Modern C++千奇百怪的特性和语法,或许是个更有趣的过程

我需要具备什么能力才能跟上这个教程?

  • 如何正确提问:

维护者名单

  • 讲义管理与编写: 顾雨杭
  • 仓库与网站维护: 陈昱衡, 顾雨杭
  • 讲义编写: 顾雨杭 邵恺 王皓瑞

友情链接

最后需要说明的是,本项目在很大程度上受到了南京大学计算机系统基础课程实验一生一芯的启发。在此对负责了这些项目的余子濠博士和蒋炎岩老师等致以最崇高的敬意。