<< 返回全文目录
更新:欢迎关注 0xFFFF 的语雀 Wiki:《CS 专业课内外学习》。
计算机入门 - Step 2 环境篇
环境搭建一直是老生常谈的话题。各类教程五花八门,大多只是停留在“能用”的程度,知其然不知所以然。结果要么是停留在上古时期,要么重度依赖于某些集成环境所构筑的复杂体系,懵懵懂懂之下,不少刚入坑的新朋友在这其中也迷失了道路。即使是大三大四的同学,连命令行都还不了解的都大有人在。
计算机世界就像一座大山,每个人都不可能一下子穷尽它的所有。若对它没有一点印象,可能一直都只会在山脚下的细枝末节中徘徊。你不是第一个来到这个山头的人,前人已挖好许多好走的山路,通过它你可以快速了解一下这座山的大体构造。熟悉以后,再更深入地去探险也成为可能,乃至于打造一条属于你自己的不寻常的山路。
几年的编程学习之中,我深深地体会到:计算机入门的障碍,在于缺少一个统一、稳定、靠谱的编程学习环境。一个好的环境,不仅仅是一个顺手的编程工具,更是你在计算机大山中披荆斩棘的大刀的存在。
下面也让我与你一道,打造一把小巧但却能在计算机大山中开路的瑞士军刀,为未来的你能动手打造只属于你的全新大刀做一些铺垫。
核心目标以及权衡
在行动之前,先在思想方面有所准备。环境的打造,关键是明确一个核心的目标和预期,然后根据实际情况去接近。
一个稳定、靠谱的编程学习环境,具体展开来看,大致需要满足这三点:
- 友好的命令行界面
- 好用的文本编辑器
- 适合学习的 Linux
接下来我也说说这三点的重要性。
命令行界面
这块对于大多数人来说想必会比较陌生,所以在这里也花两页 A4 纸的篇幅介绍一下,目前我们接触的计算机都是冯·诺依曼体系结构,始终离不开如图的五大部分。其中,输入输出设备是机器与外界的交互渠道。
图源:冯·诺依曼体系结构 - 百度百科
计算机发展至今,输入、输出设备越来越复杂多样,例如键盘、触控板、屏幕、打印机、音频输入输出、网络等等等等。计算机实现用户想做的事,内部需要通过一些特定的程序,去处理用户通过输入设备传入的操作,通过输出设备给用户反馈结果。负责这些交互的部分又称作界面(Interface,也叫“接口”)。
最为常见的界面,便是以显示器为主的输出设备、以鼠标和触屏为主的输入设备相对应的图形用户界面(Graphical User Interface,简称GUI)。GUI 具有贴合直觉的优势,但因为考虑的输入输出设备等因素十分众多,实现也很复杂,很多东西都难以通用起来。
在各种错综复杂的输入输出设备的背景之下,有一组输入输出贯穿了整个冯诺依曼结构计算机世界的始终,那就是 — 标准输入输出(Standard Input/Output),与此对应的输入输出设备,叫做终端。关于终端,这里不详细展开介绍了,推荐阅读 这篇文,作一个详细的了解。
基于标准输入输出实现的操作界面,也叫做命令行界面(Command-Line Interface,简称 CLI)。它的优点是简洁且富有表达力,不足的是,使用 CLI 的初期需要一些学习成本和记忆的负担。
GUI贴近直觉的特性,尤其适合简单直观一次性的初级任务。当任务变得庞大、固定和重复之后,GUI 表达力的局限性就体现出来。CLI 的简洁与表达力带来的好处早已盖过了它本身的学习成本,但一般人们习惯 GUI 之后,很难体会到这一点。
许多关键的工具如编译器、调试器等都是基于 CLI 下运作的,这是程序员无法避免的一部分。
可惜的是,我们日常使用的系统基本上过分强调 GUI 的存在,并没有对 CLI 投以足够的重视,目前用得最广泛的 Windows 系统下的 CLI 体验也异常糟糕,以至于造成了命令行“高端到难以接近”的错觉。这方面是需要我们主动去补齐的。
文本编辑器
讲到文本编辑器,首先我们得明确文件系统 (File System)和文件(File)的概念。
数据在计算机这个载体中,是以二进制位(bit)的状态表示。一般以字节(byte)为单位去组织存取的过程(1 byte = 8 bits)。一段数据通常由若干个 byte 的二进制位组成。
底层的存储器一般按照包含固定数量的 byte 的逻辑块(Logical Block)组织数据,为了抹平底层的差异,在操作系统之上,就有了文件系统的概念。文件系统为用户提供了文件和目录的抽象概念。用户在使用时无需关心底层如何实现,只需要知道目录和文件名,就能访问到对应的文件。
现在我们知道了,计算机文件系统提供了文件的概念满足我们保存一段数据这样的需求。我们要关心的就只有,这些数据保存在了某个文件中。
下面我们把目光放到数据本身,为了保存特定的数据,前人设计了一些对应的编码规则,不同的编码规则对应着不同类型的数据,保存到文件后也对应着不同的文件类型。当我们按照文本的编码规则(如ascii,utf-8 等)将文本数据编码成对应的二进制状态、把这些二进制状态固定到某个文件,这个文件便可以称为文本文件。文本编辑器,便是专门处理文本类型数据(也可以说是操作文本文件)的工具。
代码的本质,都是文本,不同语言的代码文件的差别,只是文件命名后缀的差异罢了 (.c
, .cpp
, .py
, .java
, .js
...)。写代码的本质,就是编辑文本的过程。
理论上来说,任意一个文本编辑器都可以编写代码,差别在于体验与效率上。而人的力量是有限的,但因为不同的语言规则不同,提升阅读和编写体验便成了一个关键的因素。为了减轻大脑的负担,减少出错的概率,就产生了类似不同元素对应的代码着色,行号等等的辅助功能,如图:
除了行号与高亮这些基本要求外,一个好用的编辑器可能还有关键字提示、自动补全、语法检查等等功能,具体需要你慢慢探索和体会。
Linux
关于 Linux 的重要性,此前@Bintou 老师开的帖子 学习Linux为什么重要 已有详细讨论。
目前来说,Linux 的重要性可总结为以下几点:
- Linux 系统本身作为开源程序,是一个可以避免纸上谈兵,直接深入研究操作系统原理的系统;
- Linux 由程序员为程序员打造,在 CLI 方面的体验是其它系统难以匹敌的;
- 通过 Linux 可以接触到许多优秀的开源软件,感受黑客文化与 Unix 文化的熏陶,以及开源社区的开发模式,即使未来投身于其它领域的开发,其中也会带来不少积极的影响;
- Linux 基本主导了服务器于云计算的市场,开源模式正逐渐主导整个软件业,以 Windows 为代表的软件领域的商业也在拥抱 Linux 为代表的开源社区体系,即使仅面向未来的就业,Linux 也是无法拒绝的。
具体方案
具体的实现上,对于刚入门的新手来说,一开始最重要的是快速对这个体系有一个大致印象。大致来说可以分两步,首先通过一个预先配置好的套装迅速地折腾起来,然后在落脚以后,再考虑折腾和研究更合适自己的方案。拿开头的比喻来说,就是:先走计算机大山中挖好的比较好走的山路,对这座山有了大致的了解之后,再去挑战那些不那么容易的路线。
综合以上考虑,我推荐以下方案:
- 环境:VirtualBox 虚拟机
- 操作系统:Ubuntu 18.04 LTS
- 文本编辑器:gedit + Visual Studio Code
VirtualBox 虚拟机可避免过早地掉进驱动折腾的坑,快速进入状态;Ubuntu 18.04 LTS 作为一个强调易用性,面向桌面应用的发行版,在预置的工具等各方面都有比较好的支持;gedit 是一个小巧好用的文本编辑器,Visual Studio Code 是一个功能丰富,扩展性极强的编辑器,在各个领域的开发都能有统一的开发体验,且上手门槛不高,与 gedit 配合之下基本上可以满足入门时大多数的文本编辑需求。
下面是这个方案的具体步骤,基于 Windows 10 环境进行,macOS 与此也大同小异,此处也不再赘述。
详细步骤
虚拟机与系统安装
下载安装 VirtualBox,到 VirtualBox 的官网下载页,下载与宿主机(host)对应的安装包,这里选择 Windows hosts,下载安装包后,打开,一路“下一步”直到安装完毕。
其中需要确认一点,为了避免性能打折扣,你需要在 BIOS 中打开硬件虚拟化的选项,Intel 的 VT-X 或 AMD 的 AMD-V。参考这篇教程。
下载 Ubuntu 18.04 安装光盘镜像,我们可从官网下载,但考虑到下载速度这里我们用中科大LUG的镜像站点。
创建虚拟机,选择Ubuntu,至少给 2GB 内存。
创建一个新的虚拟硬盘,容量可给 20GB(未来不够再扩容)。
将 Ubuntu 的安装光盘镜像“插入”虚拟机,在 设置 -> 存储 选项中操作。
启动这台虚拟机,稍等片刻可以看到 Ubuntu 的安装界面,选择中文(简体)
一路下一步
此处不用担心,虚拟机中一切操作都是在虚拟出来的电脑,磁盘也是虚拟的。
命名环节需要注意,用户名和计算机名不宜过长,密码也简短一些,因为这些在未来输入都会比较频繁。
然后安装开始,Ubuntu 的安装程序会把一切的东西安排好。
重启虚拟机之后就可以进入装好的 Ubuntu。为了用好它,这时候这时候需要一些针对的配置。
为了软件安装的速度,把软件源换成中科大的,参考科大的教程切换。
切换软件源之后,打开终端,运行以下命令安装编译程序所需要的组件,这在后面会用到。
sudo apt install build-essential
虚拟机与宿主机的互通
刚装好的虚拟机的功能是局限的,比如说,屏幕分辨率是固定的,这直接影响了接下来的进一步的使用。所以现在我们需要安装 VirtualBox 的增强功能,让虚拟机与宿主机实现互通和融合。
需要互通的部分主要是让适应 Windows 窗口的显示驱动、还有剪切板、文件夹共享等。增强功能装好以后,可以避免许多虚拟机带来的非必要的坑。下面介绍具体的操作步骤。
安装增强功能,点击 设备 -> 安装增强功能 ,此时会自动挂载。
输入密码启动,让它自带的安装脚本完成剩下的事情。
直到出现 Press Return to close this window,回车关闭窗口。
此时虚拟机增强组件已经完成,在菜单栏启用共享剪贴板,跨系统的复制粘贴就不会是一件困难的事情了。
设置文件夹的共享
我们在虚拟机编辑的文件,经常有要拷贝出来的需求,最方便的方式还是利用 VirtualBox 提供的共享文件夹功能,所以这里也说一下这里的配置。
首先得明确一点,使用电脑的时候,文件的安排是有一些规律的。你需要摆脱 Windows 的 C D E 盘概念的习惯,一般来说你的日常文件都会放在你的主目录(/home/用户名
,又叫家目录)中,与 Windows 下的 C:\Users\用户名
同理。主目录的路径在命令行中以 ~ 代表。(现在不熟悉的话也没关系,未来回顾过来就知道了)
接下来的文件操作都在主目录进行,不影响其它地方。
(1) 在主目录新建一个文件夹,用来和宿主机绑定,这里取名为 host
(2) 共享文件夹设置,设置一个你想在虚拟机的 Ubuntu 访问的文件夹(这里我指的是整个D盘),然后挂载点指向刚刚创建的文件夹的路径(这里是 /home/john/host
,实际需要把 john 换成你的用户名)
(3) 重启虚拟机,此时你会发现可以在 Ubuntu 看到这个名为 host 的共享目录,但因为权限的问题而无法打开,这是图形界面暂时无法解决的。
(4) 排查权限问题,在终端打开主目录,用 ls -l
命令列出主目录的文件,根据 ls 命令输出的规则,这个 host 目录的所有者的 root,组是 vboxsf,只有所有者和同组的用户才可以访问。
所以这里的解决方案是,把 john 用户加入 vboxsf 组中,命令:
sudo usermod -aG vboxsf john
然后重启虚拟机,我们就能通过 host 目录实现文件共享了~
开始你的 Hello World !
刚刚我们通过安装 build-essential 一股脑把 GCC 编译器等需要的东西都准备好了,配合前两步的环境优化,实际上是已经可以开始写代码了。
在开始写代码之前,最好先用目录来组织一下你当前的工作涉及到的文件,避免混乱。比如说,学习 C 语言,可以建一个目录 learn,然后建一个名为 c 的目录,用来放你学 C 语言的代码。
打开文本编辑器,新建一个文件,这里我们可以保存为 hello.c
,放在刚刚创建的 ~/learn/c
目录下。
然后在终端下调用 gcc 编译这个文件:cd 命令将工作目录切换到 ~/learn/c
,gcc hello.c
编译,生成一个 a.out
的可执行文件。
然后在终端通过 ./a.out
执行这个程序,程序往终端输出 "Hello World!",是的,第一个C语言程序就这么跑起来了。
同理,写其它的程序也是一样的方法编译和执行。
就这么简单几步,你就完成了文本编辑到编译再到运行的过程,这里用到文本编辑器其实就是 gedit,一般的文本编辑都可以用它搞定。
到这里,一个满足核心目标的基础的编程环境已经完成了,你现在可以基于 gedit 完成绝大部分的编程工作。但,怎么能满足于此呢?
用更高级的编辑器提高效率
上面写代码和调试代码我们需要用到文本编辑器、终端模拟器和文件管理器,显得有些麻烦。能不能把这几步都集成在一起呢?VSCode 便是这样的一个工具,它集合了文本编辑、文件管理、终端于一身的同时,也集合了诸如调试、版本控制等等更多与写代码息息相关的功能。这里也简单地展示一下 VSCode 的一些基本的配置和体验:
官网下载 deb 格式安装包:https://code.visualstudio.com/ (安装包链接)
把刚刚为 C 的文件夹拖进去,可以看到它把工作目录都组织在了左边栏,右边栏则是编辑器,在 Terminal 菜单点击 New Terminal,还可以看到一个终端,这不就是刚刚三个工具的组合吗!
当然,这里你可能会发现,无论是编辑器还是终端的字体都没有刚刚那么好看,这是没有匹配等宽字体的缘故,下一步我们需要改回来。
字体设置:
菜单栏打开 File -> Preferences -> Settings,打开设置,找到 Font Family,在前方加上一组'Ubuntu mono'。
这时恢复了正常的字体。
至此,可以满足基本的编程需求的开发环境(瑞士军刀)便准备好了,这里仅仅只是达到“能用”的程度(与那把只属于你的大刀还有着很大的距离)。至于刚刚提到的诸如利用 VSCode 的 Tasks 和 Debug 功能对接 gdb 调试器、Git 版本控制、更多提升编程幸福感的插件等等功能,需要你自己进一步发掘。网上已有许多相关的笔记和教程。
整个过程下来你可能会发现,实际的操作中涉及到这个体系的知识网络中千丝万缕的联系,很多细节很难在一篇线性的文章表达出来,最后还是离不开你的亲自动手滴!只有自己折腾起来,才能补齐很多缺位之处。
说的再多,不如多写两行代码,便是如此。但又不能什么都不说,不然的话怎么有人一起入坑交流呢?(说来惭愧,不写写就不知道,自己还有那么多不懂的)
进阶
上述的一切,都还只是开始,进一步的知识了解,关于折腾与命令行的入门,推荐阅读:
还有@wzpan 师兄14年时留下的讲稿,关于 Linux 从入门到再入门的递归学习姿势:
关于黑客文化与 Unix 文化:
进一步的折腾方向
在文章的结尾,列出一些进一步的折腾方向供你参考:
生活所迫的选择:
- WSL + VSCode
- Visual Studio
- Clion
- Code::Blocks
- Dev-cpp