这是一篇面向有编程需求的电脑入门攻略会涉及到很多略微复杂、偏底层的概念需要读者认真理解——但是等你理解完了这些内容一定会让你对手上的电脑、开发环境的理解有显著的提升文章会从操作系统与命令行入手依次讲到文件格式、可执行文件、IDE 的运行原理再到软件的安装与卸载——前面的每一节都在为后面的内容做铺垫建议按顺序阅读。如果你是第一次接触这些概念不必试图一次记住所有细节遇到暂时没读懂的地方可以跳过去继续读后面的例子往往会把前面的坑重新填上。关于操作系统操作系统Operating System, OS是控制电脑硬件进行正确的资源调度、任务控制的软件——你的 CPU、内存、硬盘、显卡、网卡、USB 等等硬件就是依靠操作系统进行协同工作的。不得不介绍的 Linux在成为开发者之前作为广大用户的一员WindowsAndroidmacOSiOS 等常见的 OS 大家肯定是耳熟能详——而 Linux 是电子信息类学生常见的另一种系统其重要的特点包括轻量化、可裁剪、权限层次清晰、网络管理方便、运行稳定、命令化/脚本化深入、开源社区完善、硬件交互简洁。因此有海量的交叉编译工具链建立于 Linux 环境有许多自动化脚本工作于 Linux 命令行中还有数不胜数的嵌入式系统基于 Linux 开发。Android 的底层就是 Linux 内核。智能车大赛的若干赛道就是使用基于 Linux 的板卡开发的。近年来兴起的大量 AI 开发工具在 Linux 环境下的自动化支持也更完善进一步巩固了 Linux 在开发领域的地位。什么是命令行命令行是一个非常容易被初学者忽略但是又十分重要的交互方式在我们探索电子信息世界的过程中如影随形。从何谈起呢我们举个例子如果你想要在桌面创建一个文件夹然后新建一个文件写入一串数字你可以右键新建文件夹创建文本文档用记事本打开编辑当然你也可以这么做下面的举例有很多不一定需要掌握的代码以及没那么快解释清楚的概念感受即可在 Windows 系统下打开 PowerShell 终端输入命令cd$HOME\Desktopmkdir demo cd demo123456 number.txt或者启动 cmd输入命令cd/d%USERPROFILE%\Desktopmkdirdemocddemoecho123456number.txt当然如果你在 Linux 系统下这些命令就更加广为人知cd~/Desktopmkdirdemocddemoecho123456number.txt感受到了吗下面给几个重要的概念命令行交互CLI, Command-Line Interface是通过输入文本命令来操作系统、执行任务的人机交互方式命令行解释程序用于将用户输入的命令转化为系统的操作包括 Windows 的 PowerShell、cmd 以及 Linux 的 shell其语法和功能各有差异终端Terminal是执行 CLI 的窗口。cmd 弹出的黑框IDE 中的集成式命令行面板都是终端。shell 是一类程序的总称bash/zsh 都是具体 shell。与命令行交互相对的概念就是图形界面交互GUI, Graphical User Interface它容易上手但是难以批量操作无法实现复杂的设置——作为开发者明确地知晓 CLI 的存在能够对很多东西有更加深入的理解。在电脑上跑 Linux 环境的几种方案这里仅做简单介绍Linux 环境在有需求的时候配置即可想要进一步了解的自己去查资料。双系统在电脑上同时安装 Windows 和 Linux 操作系统开机选择进入。性能最好但切换要重启且数据互通较为麻烦。虚拟机Virtual Machine用 VMware 等软件在 Windows 里“装一台 Linux 电脑”。可以随时开关、随手重装容错率高但是性能受限。WSL2Windows Subsystem for LinuxWindows 官方提供的 Linux 运行环境轻量、启动快、和 VS Code 等工具配合极好。适合日常学习命令行和程序开发但硬件访问能力相对较弱。MSYS2一套 Linux 风格的工具集跑在 Windows 上能够在 Windows 上提供 Linux Shell 的命令行解释程序并且快速管理某些复杂的依赖。不同于以上三者他不是真正的 Linux 系统只是在 Windows 上提供了一个 Linux 风格的开发环境。Git Bash 是在 MSYS2 上再次裁剪而来的。远程登录当然你也可以选择不在自己电脑上装 Linux而是直接用 SSH 连接开发板或服务器上的 Linux 系统。笔者曾经在 Android Pad 上用 Termux 搭建过 Linux 桌面工作环境有兴趣瞎搞的同学可以看看我当时写的攻略。文件与文件系统一块硬盘如何进行快速的索引本质上你可以靠地址来寻找任意一个区域的数据但是这显然很麻烦于是文件系统就诞生了。文件、路径文件夹与压缩包要认识文件系统先从两个基本的元素——文件与路径讲起。文件文件就是一段有名字、有组织的数据。你写好的实验报告、录下的语音、下载的安装包在计算机底层都是一串串字节。这些字节可能散落在硬盘的各个角落但文件系统把它们组织成一个整体并给你提供一个按名字访问的入口在有需要时负责找到数据、读出内容或写入新内容。文件最重要的属性就是文件名比如“新建文本文件.txt”。其他的属性元数据还有占用的空间、权限、类型、修改时间等等。文件的类型也是个重点后面再说这里希望读者能够明确文件作为一个“实体”的基本概念。文件夹与路径硬盘里存着成千上万个文件怎么管答案是分门别类把用途相关的文件放进同一个文件夹文件夹里再建子文件夹层层嵌套最终形成一棵目录树。文件夹也叫目录directory是目录树上的节点路径是用来描述“从根或当前位置走到某个目录/文件”的一串字符。如果你有留意前面的 CLI 代码就会发现三种解释器的“新建文件夹”指令都是mkdir即 make directory——目录树里的“目录”对应我们更容易理解的“文件夹”。路径分为绝对路径和相对路径两种绝对路径是从根目录开始进行索引比如 Windows 的根目录从C盘、D盘根目录开始一步步索引比如C:\Users\felix\DesktopLinux 从根目录开始就是/home/felix/Desktop。相对路径则是以当前的工作目录为起点进行索引比如上文的桌面如果当前工作目录是C:\Users\felix那么.\Desktop就是相对路径如果要从当前目录跳到上一级再进入别处就得用..\lihua这种写法。在 Windows 下路径用\分割在 Linux 下路径用/分割。一般来说所有的进程都有一个自己的“工作区”即工作目录。在写代码或敲命令时可以用相对路径直接访问工作目录下的文件不用每次都输入长长的绝对路径。这里强烈推荐两个 Windows 软件一个是 Everything能够光速检索全盘文件另一个是 SpaceSniffer能够直观地展示各个路径的大小分布便于管理。压缩包Windows 11 的文件管理器内置了简单的压缩包预览、访问、解压导致大家并没有对压缩包引起必要的重视——压缩包是一种极其特殊的文件值得拿出来单独讲解。压缩包能够以单个文件的形式打包保存若干文件与相对路径并且通常会对内部数据进行无损压缩消除冗余信息从而减小体积。如果一个文件的信息熵较低说明里面有许多可预测的重复模式就可以用更短的编码表示同样的信息从而实现体积减小。在后续的《数字图像处理》课程中会涉及到相关的知识点。Win11 的文件管理器对压缩的功能支持极其有限跨平台、多种类的压缩文件解析以及压缩选项支持都不如专业的压缩文件管理器因此装机必要的一步就是安装专业的压缩文件管理器。界面最干净、功能也十分齐全还支持 CLI 的传世经典就是 7-Zip现在还有个基于 7-Zip 为 Win11 适配开发的 NanaZip界面与交互会更流畅一些。关于压缩包有两点“常识”需要在应用的过程中注意在压缩文件中“打开”一个文件本质上是把这个文件解压到系统的暂存目录然后再打开。因此实际上你只能对这个压缩包中的文件进行“读”操作无法进行“写”操作需要将这个文件提取到自己所需的路径下才能进行编辑、保存。上文提到压缩包能够保存相对路径很多可执行文件也需要依赖工作目录之下的其他文件才能正常工作。结合上一点可知在未解压完整压缩包的状态下打开一个可执行文件只会把这个可执行文件本体提取出来缺少了工作目录下的其他文件无法正常运行是大概率的事情因此要执行压缩包中的可执行文件时应该先把整个压缩包解压出来。比如你直接在压缩包里双击打开一个 Word 文档编辑后想保存系统会提示你“另存为”——因为这个 Word 文档其实只是临时解压出来的影子副本你无法把它写回压缩包内部。日常工作中我们的工程有目录结构文件可能需要一次传输很多个有些数据需要归档还有些文件本身的编码优化不足这时候就是压缩包派上用场的时候选定一个文件夹或者多个文件文件夹右键添加到压缩文件就可以创建你的压缩包了。还有很多有意思的玩法比如分卷压缩加密压缩都可以等待大家来探索文件的类型文件扩展名在看这一部分之前请大家打开你的文件管理器勾选上查看-显示-文件扩展名。然后我们来观察一下一个文件名称的组成新建文本文档.txt 新建 Microsoft Word 文档.docx 新建压缩文件夹.zip HelloWorld.cpp Photo.jpg如果你重命名一个文件你会发现.xxx的部分并不会自动选中而且你要是修改了这部分文件名还会被系统弹窗警告——这就是一个文件的扩展名。然后再试试看把一个文件的扩展名从.docx的改成.jpg然后双击打开你会发现图片查看器无法正确打开这个文件但是如果你把这个文件右键强制用 Word 打开你会发现文件又被正确解码打开了。这是一个很简单的对比实验但是已经能让我们对文件扩展名有最直观的认识了——一个文件的扩展名会让电脑决定应该默认用什么软件打开、解码。相对地修改扩展名并不会改变文件内部的数据。文本文件接下来我们继续观察。找到几个扩展名为.py.c.h.html.md的文件用记事本打开你会发现记事本可以完整地展示出这个文件里面的所有文本。这就是文本文件文件始终只按顺序保存其中的每个字符。事实上几乎所有编程语言的源代码都是文本文件。你编写的.py、.c、.cpp、.html本质上和“新建文本文档.txt”没有任何区别里面存的就是一串字符。当然文本文件之间亦有差异最常见的是换行符和编码。Windows 的换行符是\r\n而 Linux 和现代 macOS 都用\n。如果你看到文本文件里中文字符变成了乱码那就是编码不匹配的问题。常见编码有 GBK/GB2312中国国标和 UTF-8国际通用写代码建议统一使用 UTF-8想深入了解的自己去查资料。如果你用 VSCodeNotepadVim 这类通用的代码编辑器任意打开一个源代码文件就会发现这些代码编辑器能够根据文件扩展名加载对应的语法高亮规则用颜色把代码结构直观地呈现出来。你可以试一试把一个.c文件复制一份改成.txt后缀再用 VSCode 打开这时候就不会有语法高亮了因为编辑器已经不认识它“本来”是什么语言。这又一次说明扩展名只是一个外部标签重要的是大家约定好怎么解释它。二进制文件如果想要继续用记事本打开.docx.pptx.jpg.exe.zip.mp3你会发现记事本显示的是一堆乱码——因为这些文件的内容不是按照文本编码规则组织的而是按照各自的文件格式进行二进制编码必须由对应的程序来解析。文本文件里的字符最终也是以二进制字节存储的。但这些字节必须符合文本编码规则如 ASCII、UTF-8、GBK。所有可能的字节组合远不止文本编码这一小部分遇到不符合文本编码规则的字节序列记事本就只能显示乱码。如果你用压缩文件管理器打开二进制文件比如.exe、.docx会发现它们可以被解析出内部结构。这并不是巧合——不少二进制文件格式内部是有结构的。例如.docx本身就是个 ZIP 容器打开后能看到 XML、图片等资源.exe也有自己严格的组织规范如 PE 格式由多个节区组成。怎么启动一个可执行文件什么是可执行文件首先明确可执行文件executable的定义。顾名思义可执行文件能够直接被操作系统加载并运行而不需要再借助其他的软件进行解析。可执行文件中直接包含 CPU 指令。启动时操作系统负责为它分配内存空间、加载依赖的动态库然后把 CPU 的控制权交到它的入口点此时这个程序就从静态的文件变成了运行中的进程。在 Windows 下可执行文件的扩展名是.exe在 Linux 下可执行文件不强制依赖扩展名只要文件格式符合要求且有执行权限就能直接被执行。可执行文件无处不在我们使用的浏览器、Office、电脑游戏自己编译的 Hello World以及写出 Hello World 的开发环境本质上都是可执行文件。可以说每一个正在运行的进程都来源于某个可执行文件。到了这里我们可以再看一看“编译”到底是什么意思——编译就是把源代码转化成可执行文件也可以理解为把人看得懂的东西转化成 CPU 能看懂的指令。可执行文件的启动要素好了现在你已经知道了可执行文件是什么了现在你手上有一个.exe文件让这个可执行文件跑起来有三个关键的要素动态链接库动态链接库是可执行文件外部的“现成的指令”程序在运行时才将其加载进来使用如果缺少了依赖的动态链接库程序就无法启动。程序运行时系统会去可执行文件所在目录和系统目录中寻找它们。Windows 的动态链接库是.dll文件Linux 的动态链接库是.so文件启动参数可执行文件在启动的时候还可以传入一些参数以决定程序如何运行。传入参数的方式下文会介绍工作目录工作目录是进程解析相对路径时的基准目录。它并不一定等于可执行文件所在的路径。从不同目录启动同一个程序程序读写相对路径文件时的参照点就不同。你可能对启动参数、工作目录没什么直观的感受——没关系这些都是铺垫接下来我们将把这些东西全部串起来。可执行文件的启动方法先从简单的讲起。打个比方如果你想卸载 QQ右键桌面快捷方式打开文件所在位置找到Uninstall.exe双击启动卸载成功——这就是最基本的可执行文件启动方法在文件管理器中直接双击即可——在文件管理器中双击启动可执行文件启动参数为空工作目录为文件所在目录。Windows 的可执行文件快捷方式可以手动设置工作目录。接下来是最最最重要的也可以说就是为了讲这个东西而写的这篇文章前面铺垫了这么多的常识和概念也是为了把这个东西讲清楚命令行启动可执行文件。我们给一个最常见的情景。现在假设你已经配置好了你的 C 语言编译器gcc.exe然后在一个.c源文件所在文件夹下打开了终端——首先终端的光标前面应该已经展现出了一串路径D:\demo我们输入编译指令D:\demogcc hello.c-ohello.exe然后不出意外你的源文件就被编译成了可执行文件。发现了吗这就是一个三要素齐全的可执行文件启动过程。如果你观察过gcc.exe所在的目录就会看到很多.dll文件这是动态链接库命令行光标前面的路径就是我们启动的可执行文件的工作目录gcc 后面的hello.c-ohello.exe这三个都是编译器的启动参数。这就是命令行启动的过程。还是有点懵我们再讲一点细节可执行文件的索引规则在工作目录下直接用相对路径索引或者就直接用绝对路径索引。注意.exe文件的后缀在命令行中可以省略。比如你刚才编译了hello.exe就可以接着命令行启动D:\demo.\hello D:\demoD:\demo\hello.exe你一定会发现刚才的 gcc 既不在我们的工作目录下也没有用绝对路径来索引为什么能被命令行索引到这是因为有一个系统变量叫做PATH在命令行启动可执行文件的时候命令行解释器会去PATH变量记录的路径下依次检索文件。因此当你的gcc.exe所在的目录被记录在了PATH变量中你就可以在任意的工作目录下直接启动gcc.exe。拓展一下脚本文件也就是保存着 shell 指令的文件比如 Windows 下的.bat.ps1.cmd文件Linux 下的.sh文件也是可以忽略后缀直接被检索执行的。可执行文件的启动参数我们来假设一个场景我实现了一个my_cat.exe程序把所有接收到的启动参数全部拼起来并且输出。那么这个命令行的运行结果会是什么样的呢.\my_cat a bc d e fgh答案是.\my_catabc d e fgh命令行参数会直接被可执行文件读取并且按照一定的规则进行解析参与可执行文件运行的过程。依旧有几个常见的场景和细节需要讲解理论上调用可执行文件本身的字符串也算是启动参数比如上例中的.\my_cat算是第一个启动参数在 C 语言中这个参数保存在argv[0]一般来说有 CLI 功能的软件都会给出使用说明很多情况下使用单个--help参数就可以查看使用方法与帮助比如gcc--help参数是按照用空格来间隔的如果你的参数带有空格需要在这个参数外面加上双引号上例已经展示过了约定俗成很多软件的命令行会用-x表示某些带有参数的选项比如-o hello.exe表示输出文件为hello.exe--x表示某些不需要额外参数的选项比如--help。你的IDE是怎么跑起来的介绍完上面的内容我们就可以进一步理解你手上的 IDE集成开发环境Integrated Development Environment是怎么运行起来的了。举个例子。假设你有一个 C 语言源文件然后你希望你的编辑器能够一键启动编译编译完成后启动编译出来的可执行文件你要怎么做首先你需要确定编译器gcc.exe的路径你可以把编译器的路径放进PATH然后直接gcc也可以手动指定编译器的绝对路径其次你要指定编译器的编译选项比如加上-g表示保留调试接口-O1进行一级编译优化等等。如果你用的是交叉编译器还会有更多有必要的编译选项然后你要指定编译的输入和输出比如你需要输入编译器目前打开着的源文件输出的可执行文件直接把源文件的后缀改成.exe然后输出到.\output文件夹下最终你要启动你的可执行文件还可以考虑给你写好的程序传入启动参数——恭喜你你已经理解了 VSCode 怎么配置了。来看看 VSCode 的配置文件是怎么写的{tasks:[{type:cppbuild,label:C/C: g.exe 生成活动文件,command:D:\\Users\\For_VSCode\\MinGW\\bin\\g.exe,args:[-fdiagnostics-coloralways,-g,${file},-o,${fileDirname}\\output\\${fileBasenameNoExtension}.exe],options:{cwd:${fileDirname}},problemMatcher:[$gcc],group:{kind:build,isDefault:true},detail:调试器生成的任务。}],version:2.0.0}这个tasks.json写的是编译指令command标注了编译器路径args写了编译参数cwd是 Current Working Directory 即为工作路径problemMatcher是读取gcc报错信息的方式${fileDirname}指的是文件路径${fileBasenameNoExtension}指的是不包含扩展名的文件名部分……当然编译的指令远没有这么简单编译过程也不仅仅依赖于编译器。C/CQt 等工程可以用 MakefileCMake 这类工具简化配置Python 可以用 Anaconda 等方式配置虚拟环境等等。对于一种 IDE开发环境的轻量化、开放化也意味着你需要进行更多的配置比如 VSCode你要自己安装 MinGWCMakePythonTexLive 等基础的工具链然后再安装插件进行配置而开发环境的集成化比如 Visual StudioMATLAB会减少配置的过程但是开放性、灵活性也受限。由于编译的过程复杂而灵活因此编译器的命令行启动是必然的结果而 IDE 的重要功能就包括了语法高亮、自动补全、报错展示、快速启动编译、可视化调试其中快速启动编译、报错展示、可视化调试就与命令行交互息息相关。了解命令行交互的基本逻辑有助于理解 IDE 的运行原理从而更好地理解配置的过程。你真的懂“软件”吗便携版与安装版软件在上面海量的基础概念灌输后这些衍生的概念就很容易理解了。一般来说我们使用的软件都是用可执行文件启动的。在常见的软件获取渠道下我们会接触到两种软件的部署形式——便携版与安装版便携版软件的可执行文件以及它运行所需的一切动态链接库、数据文件等都放在同一个目录下不向系统其他路径写入任何东西。有的便携版甚至真的只有单个可执行文件。它开箱即用但更新时通常需要整体替换文件。常见的便携版以小体量工具居多比如 vofa Everything胜在便于拷贝携带。相对地安装版软件由特定安装包进行部署。他们会把程序本体放到指定路径把公共组件放进系统库目录同时改写系统信息——比如创建桌面/开始菜单快捷方式、修改注册表、把可执行文件目录写入 PATH、登记卸载入口等等。安装版软件与系统深度配合能够进行增量升级因此需要与系统持续深度绑定的软件多采用安装版部署。安装软件的一些体会来点经验——下载软件的时候尽量从官网下载。在第三方渠道下载的时候一定要小心类似于“安全下载”之类的选项也要小心下载页里那些高亮的假下载按钮很可能会有捆绑如果你的电脑分出了多个分卷C盘D盘等尽量把软件本体安装在容量大的非系统盘上打开安装包的时候就要认真找一找安装路径的选项安装包还有很多陷阱类似于开机自启动、捆绑安装、右键菜单一定要看清楚窗口里面的每个选项尽量将软件安装在固定的文件夹下方便管理。另外安装路径绝对不能出现中文也最好不要出现空格开发工具安装时注意有没有Add To PATH之类的选项——如果有一般建议勾选上如果安装包没有提供这个选项而你又希望能在命令行里直接启动它就需要自己去系统环境变量设置里手动把它的所在目录加进PATH很多软件会偷偷在系统盘C盘占很多空间你需要在各个软件的设置中找到类似于缓存、暂存、数据存储、下载路径之类的选项把这些路径都改到其他盘下卸载的时候不要直接删掉本体文件夹老老实实从系统卸载入口或者打开 Uninstall 文件卸载——安装版软件大多会修改系统环境所以卸载也别当普通文件夹处理。总结所有的知识学习都以概念为最基础的支柱而对于电脑大量的实践则是将概念融会贯通的必经之路。希望大家能尽快上手编程早日“人机合一”将自己无限的想象力与创造力投入到软件与硬件的创造之中