认识这个世界
本文旨在对一些概念、一些事实以及这些事实背后的原因作简要介绍。
本文适合纯萌新,内容极其基础,并且带有并不严格的简化,可能会使部分同学感到不适。
朴素的电脑使用者的视角
手机、笔记本电脑、台式机、服务器
相比于一些计导教材上的“大型机”“微型机”等,我粗浅地认为这样的分类可能更贴近人们的生活。
手机的确是一个完整的计算机系统,它有输入输出设备,有用于运算的图灵完备的中央处理器,有各种外设如网络控制器,有操作系统。
笔记本电脑和台式机无需赘述。
服务器也可以认为是“一台电脑”,一般来说,它性能更强亿点,体积更大亿点,系统更稳定亿点。
客户端与服务端
目前大多数上网行为都属于“客户端-服务端模型”。
例如你访问 Bilibili 视频网站,是你的浏览器通过网络跟遥远的 b 站服务器说:我要看视频,给我发个首页过来。于是 b 站服务器把主页、连同十个视频的链接与封面图一起发到了你的电脑上。
你的浏览器收到了这些东西,按照主页的描述信息把那些东西拼成至少视觉上看起来像是正常的网页,然后打在屏幕上。
你用鼠标点击了某个视频,于是浏览器告诉服务器:给我发编号为 #S&@*&*!#QAQ
的视频,然后服务器将视频内容从硬盘中读出来,发到你的电脑上。
浏览器就是“客户端”,浏览器“说的话”称为“请求”,接收请求并且作出对应反应(比如返回给你一个视频)的、b 站服务器那台电脑上运行的那个程序,就是“服务端”。
手机上的过程是类似的。只不过在手机上,APP 完成了与浏览器类似的工作,它负责与你(用户)交互(点击、刷新等操作),然后向服务端发请求。
图形化界面与命令行
图形化界面,包括 Windows 系统的桌面、软件图标,以及鼠标点击这类交互逻辑。
命令行界面,一般是指抖音黑客桌面上的那些全是文字的黑框。
命令行界面下,你有一个”当前目录”,你可以使用 ls 命令(或者 dir)来查看当前目录下有哪些文件,也可以使用 cd 命令(change directory)来移动到其他目录。你当然可以运行应用程序,只需要在应用程序所在的目录下,以其文件名为命令本身即可。
有一个概念叫做“环境变量”,其中有一项为“PATH”。
PATH 由多个路径组成,该项意味着无论你在哪一个目录下,都直接运行可以运行 PATH 包含的目录下的所有应用程序而不必指定目录。
如果希望了解更多,建议合理使用搜索引擎。
程序员的视角
代码
此处以 c 语言为例子,并且内容十分简陋
代码一般指程序员(人类)能够读懂的文本。
编译
显然 可能也不太显然,但是知道就行 这一文本不能直接被电脑执行。但是有一个叫做编译器的软件,人们用它来将这些文本转化为计算机能够读懂的二进制文件。
链接
可能有的工程不止有一个代码文件(假设某个工程有三个 c 源码文件:foo.c,bar.c,xiaosi.c),foo 和 bar 这两个模块有较强独立性,但是都需要用到 xiaosi 模块中的东西,如果将 xiaosi 的内容分别写进另外两个模块,显然代码是十分臃肿的。
那么解决方法是将 xiaosi 编译成库(单独编译成二进制文件),然后其他模块编译后,与 xiaosi 的二进制文件进行”拼接“。也可以不拼接,而是加入少许字段,告诉操作系统”foo 运行时再把 xiaosi 的内容拷贝进来“。
可以简单地认为这就是链接。
环境
作为计算机专业的学生,将经常接触到”配环境“这一事件。
”配环境“指的是配置开发环境。
- 写代码,你需要一个编辑器
- 代码写好了,你需要上文提到的编译器来将其转化成程序
- 你需要链接器进行链接
- 代码要是出错了,你需要调试器来进行调试
除了编辑器以外的这些软件,称之为工具链,有了这些工具才能够完成代码开发的工作。安装和配置这些工具就是所谓”配环境“。
题外话:可能会有同学最开始要使用 VS Code 来搭建 C/C++ 的开发环境,于是在知乎、在 CSDN,或者其他各大网站上搜索,照着教程一步一步进行,但是对其中的一些操作一头雾水,完全不明白为什么要这样去做。
在此浅显地进行一些说明。
VS Code 是一个编辑器,它具有很强的扩展性(意思是能够装插件来增加功能),但是仅仅是一个编辑器。
它是编辑器意味着它不能编译,不能链接,不能调试。
那么装插件了是不是就可以了呢?理论上来说确实是这样,但是插件开发者并不想要这样做。
主流的(你所搜到的大部分教程里的)插件采取以下方式来让程序员在 VSC(VS Code)中能够干上面那些事情:程序员自己安装编译器链接器那堆工具链,然后 VSC 插件负责调用那些工具链。因此插件本身并不具有编译功能,它是一个中间商。
那么程序员需要做的事情有:
首先电脑中得有工具链。这对应于下载安装 MinGW(这里仅考虑 Windows 操作系统的用户,如果你使用 Linux,你应该完全可以不看本文)。
其次,VSC 的那些插件当然能够帮你调用工具链,但是前提是它需要知道你的工具链安装在哪个位置,以及你需要怎样的参数。因此你需要对插件进行配置。
这里的配置,一般需要你写一个 config.json 的文件(或者其他类似的文件),其格式一般来说都有文档进行说明,这一文件作用等同于你熟悉的应用软件的”设置“。那看起来的确反直觉,尤其是在图形化界面的温床下长大的我们。但是习惯了之后可能会觉得那相当自然。在程序员生涯中,未来可能会经常遇到这样的配置文件,所以建议早点习惯。
我非常惭愧地写完这段”题外话“,因为这的确是自然而然的事实,可能无需赘言。但是这一问题的的确确困扰了我几乎整个大一上学期。于是我想,如果有萌新有着跟我类似的困惑,那么这样一段文字可能会帮助到他们。
当然,如果没有人有这个困惑,那就更好了。
平台
操作系统
我们当然听说过,除了 Windows 以外,还有 MacOS 这样一个系统;或许还有人听说过,还有一个叫 Linux 的系统;更有甚者,BSD......
这些都是操作系统。
我们自然而然想到,Windows 上的软件在 MacOS 的系统上没办法直接运行。其原因在于,一方面可执行文件的格式不一样,另一方面系统调用不一样。前者应该好理解。
系统调用
用户软件是不能够使用外设的。外设只能由操作系统来使用。
但是 QQ 它想要在显示器上显示一个窗口怎么办,它想要发出消息通知的声音怎么办?那就得跟操作系统”交流“,告诉操作系统自己要干什么,然后操作系统来代替用户软件做这些事情。
不同的操作系统具有不同的系统调用接口,相当于使用不同的”交流语言“。
指令集架构
除了操作系统的平台差异以外,还具有指令集架构的平台差异。
考虑到该内容与前文联系并不紧密,初学者也不必进一步了解(如果想要了解,可以合理使用搜索引擎
什么?你不知道什么是搜索引擎?完了死锁了),再三考虑,决定删除此段