扩展阅读
TIP
如果你因为网络原因无法稳定访问一些海外网站(如 Github),可以试试同济学术浏览器。
如果你不太适应阅读英语资料,可以使用诸如沉浸式翻译一类的浏览器插件, 配合 DeepSeek API Key 效果更佳。 但我们仍建议你锻炼英语阅读能力。
计算机基础
自学指南
计算机科学自学指南 汇总了全世界优秀的公开课,CS 自学社区 提供了优秀的学习路线图以及大量中文资源。
特别地,对于初学者,我们强烈推荐哈佛大学的 CS50X (编程入门与计算机科学概论) 和加州伯克利大学的 CS61A (深入程序背后的思维方式,建立高阶抽象思维)。
程序设计
现代 C++
受限于课程容量,本课程所涉及到的知识基本限于 C++ 与 C 语言兼容的一个小子集。如果想要对课程未涉及的“现代C++”建立初步的了解,以下资源可能有所帮助:
- cppreference 网络上内容最全、质量最高的 C++ 语法参考,可以解决绝大部分语法上的疑难问题。网站原本有官方中文,但由于网站作者对项目的维护升级暂时关闭,可以使用网络上的中文镜像。
- 斯坦福大学开设的补充性课程 CS106L,在初步掌握面向对象基础知识后即可学习,内容较为浅显,但覆盖了核心概念,也提供了不错的课后练习。
- Awesome Modern C++ 项目列出了大量关于现代 C++ 资源, 包括书籍、社区资源、第三方库、工具等。
- 大型项目的编写与组织离不开对构建系统的理解:
- Makefile 历史悠久,在众多古典 Unix 项目中被广泛使用。虽然不推荐在新项目中使用,但仍然建议掌握。
- CMake 是当前 C++ 社区的事实标准。尽管其语法、设计和文档多有被人诟病之处,但其良好的生态使其在可预料的未来中不会被淘汰。Modern CMake for C++ 这本书系统讲解了使用 CMake 的最佳实践。
- XMake 是社区在新一代构建工具的尝试之一(顺带一提,其主导开发者是国人),简单易用,功能强大,也对 CMake 等构建系统提供了兼容。
Python
作为现代使用最为广泛的编程语言,Python 轻巧、灵活、生态良好,几乎可以在任何领域发挥作用。 无论是人工智能的学习研究,还是编写一个脚本自动化日常杂务,Python 都是极佳的选择。
官方提供的 入门资料合集 与 中文教程 质量都非常不错。 加州伯克利大学面向新生的著名课程 CS61A 同样可以用来学习 Python(尽管其教学内容远不止于语言入门)。
关于编译器、编辑器和IDE的区别
编译器是一个工具,可以理解为“翻译器”,用于将程序员写出的代码转换成CPU能够执行的二进制指令,也就是将代码加工成 exe 程序,编译器可以理解为一种特殊的exe可执行文件。 典型的编译器是gcc和g++,分别用于编译c语言代码和c++语言代码,你可以在dev-cpp安装的文件夹中找到它(如果默认路径安装的话是C:\Program Files (x86)\Dev-Cpp\MinGW64\bin) 编译器能够识别代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的二进制形式,这个过程称为编译(compile)。
编辑器是用于编写代码的文本编辑器,windows自带的记事本软件就是一种编辑器,word也是一种编辑器,常用的编辑器一般会提供自动缩进,语法高亮等功能。 典型的编辑器是Visual Studio Code,在不进行任何配置的情况下,它只能用来写代码,而不能进行诸如编译或调试的操作。
IDE是集成开发环境(integrated development environment)的缩写,将编辑器、编译器、调试器、版本控制系统等工具集于一身,是一系列开发工具的组合套装。 典型的IDE是Visual Studio和Dev-cpp,两者都具备了编辑,编译,调试功能的集成,VS在此基础上还有版本控制,智能提示,代码补全等更多功能。可以大幅提升开发效率。
三者各司其职又相互协作:程序员在编辑器中编写代码,通过编译器转换为可执行文件,而IDE将这一流程无缝集成,提供一站式开发体验,更多内容可参考什么是编译器?什么是集成开发环境?和什么是ide?
字符集与字符编码
计算机中储存的信息都是二进制表示的,这当然也包括它能显示的那些图形字符和没有对应图形的控制字符。了解字符的机内表示能帮助你理解未来可能出现的某些“在意料之外,却又在情理之中”的奇怪输出,在更远的未来它能帮助你解决许多字符编码相关的问题(这是一类历史遗留问题,但我们不得不面对)。
字符集(Charset)
字符集是一个系统支持的所有抽象字符的集合。有了这个集合,我们也就确定了计算机要能够表示哪些字符(即有了一个清晰的设计目标),可以更好地设计实际表示的方式,也就是字符编码。
字符编码(Character Encoding)
字符编码是一套编解码法则,将确定的字符集与另一个信息集合(可以是脉冲信号、存储器中的高低电平、光信号)等,这里我们只关注计算机的机内表示(字符在存储器中的二进制表示)。在给定编码下,码点(字符集里的元素,例如在 ASCII字符集&编码 中,'A'的十进制值为65,十六进制值为0x41,这个值称为码点)与字节序列之间是可逆映射(有可能某些没有编码的值会被显示为?之类的内容,这属于未定义行为,并不意味着?字符对应这个值,较为健壮的系统用这种方式告诉你编码错误或者内容损坏,另一些则可能直接显示乱码)。
在 Unicode字符集(目的是创建一套支持全世界语言、所有领域符号的字符集)出现前,字符集和字符编码并没有被明确区分,大多数字符集和编码都是自己定义字符集并完成编码,那么字符集内也就只有一套编码。我们要讨论字符的机内表示对于同一码点也可能有区别,这就需要用同一字符集下的不同编码举例,所以这里先使用对于课程而言“超纲”的 Unicode字符集 说明:在 Unicode字符集 中,'A' 的码点是U+0041(这是十六进制表示),与 ASCII 保持一致,它用 Unicode字符集/UTF-8编码 表示为01000001(0x41),仅用1字节;用 Unicode字符集/UTF-16 编码 表示为00000000 01000001(这两个字节在计算机中的实际顺序涉及大小端序问题),使用2字节。尽管二者对应同一码点,但对于计算机,他们显然是不同的。关于 Unicode字符集,还涉及很多复杂概念(平面、扩展字符簇、归一化、区域等),有兴趣可以参考:全球语言无障碍:Unicode标注解读与技术演进史、Unicode、UTF-8、UTF-16 终于懂了
接下来介绍一下课程范围内的几种字符集&字符编码:ASCII、GB2312、GBK、GB18030。
- ASCII:美国信息交换标准代码。基于拉丁字母,主要用于显示现代英语。编码为1字节定长编码,1字节表示值的范围是
[0,256)之间的整数,其中[0,127]为 标准ASCII 定义的范围,[128,255]为扩展区域。 - GB2312:中国于1980年发布的汉字编码标准。完全兼容 ASCII。编码是1-2字节的变长编码,英文字符使用1字节,中文字符(以及一些非汉字符)固定2字节,具体规则是:读取1字节,若在范围
[0,127]中,则按1字节的 ASCII 字符解释;若在范围[161,169]U[176,247]中,则再读取1字节(这个字节必须在范围[161,254]中),这两字节组合为一个中文字符;不应在范围[128,160]U[170,175]U[248,255]中,这个范围没有定义。 - GBK:不是国标,而是“国家标准扩展(Guojia Biaozhun Kuozhan)”,是技术规范指导性文件。但它是一个事实标准,使用广泛,是课程主要使用的编码(因为Windows简体中文系统的 CMD 中默认的活动代码页为CP936,即 GBK,你可以使用
chcp命令查看。此外,记事本里显示的 ANSI 根据地区不同,所指的东西也不同,在简体中文系统的默认设置下是指 CP936)。完全兼容 GB2312。编码是1-2字节的变长编码,和 GB2312 一样,英文字符使用1字节,中文字符(以及非汉字符)固定2字节,具体规则开始变得复杂,文字不便描述,详见:彻底搞明白 GB2312、GBK 和 GB18030 - GB18030:中国于2000年发布的标准,在完全兼容GBK的前提下映射Unicode字符。编码为1、2、4字节的变长编码,具体规则见上文链接。
在本课程,你可以使用后三者中任意一个,但强烈建议起码使用 GBK,因为许多人的名字等内容可能涉及 GB2312 未收录的生僻字。如果你使用 GB18030,那么对于 GB18030 支持而 GBK 不支持的部分则无须担心,因为不管你用的是 GB18030 还是 GBK 这些内容都无法在活动代码页为CP936的 CMD 中正常显示,课程也不会涉及这些。
关于更多相关例子和解释,请看链接文章:字符、字符集、字符编码的基础知识科普