编辑器¶
基本概念¶
编辑器(本文所指都是文本编辑器),顾名思义,就是可以编辑文本文件的工具。写代码离不开编辑器
语言服务¶
大多数编辑器都会提供 语言服务 以提高开发效率,比如 语法高亮、代码补全、类型提示、引用跳转 等
LSP
LSP,即 语言服务器协议 的出现是为了把语言服务从编辑器中分离出来,从而实现解耦。
语言服务器作为服务端,编辑器作为客户端,两者通过 LSP 进行通信。如此编辑器开发者可以简单地使用所有已实现的语言服务,语言开发者也可以快速地支持所有已实现 LSP 的编辑器。这大大便利了新编辑器和新语言的开发。
图形界面¶
大多数编辑器为了易用都有 图形界面,并且可能包含一些按钮或类似的图形元素,通过点击就可以执行各种操作,比如 生成可执行文件、运行测试 等
集成开发环境¶
只有知道如何在没有 集成开发环境(IDE)的情况下进行开发,才能真正理解 IDE 到底是什么。下图以 C/C++ 为例展示了最简单的开发流程
flowchart LR
A[源代码] --编译--> B[可执行文件] --运行/调试--> C[结果] 我们首先在编辑器里写代码,然后在终端里用编译器编译出可执行文件,最后(还是在终端里)直接运行可执行文件或用调试器进行调试。
很多人喜欢 IDE,因为它让开发变得更方便。IDE 把一切都整合到了一起,捆绑了编辑器、编译器、调试器、终端以及各种配件。这对初学者很友好,因为用户不需要知道那一堆工具应该怎么安装和使用,只需在 IDE 提供的图形界面上 点点点 就行。使用者甚至可以连编程语言的基本常识都不知道 我猜测那些只会用 IDE 的人中有很多连自己写的代码是怎么运行起来的都不知道,在他们看来这是一个 IDE 的魔法。
但我不建议任何希望提升自己水平的、有一定经验的开发者使用 IDE。IDE 有很多缺点
IDE 的定义争议
关于什么才算 IDE,一直以来都存在争论。那种把编辑器、编译器/解释器、调试器等各种工具深度捆绑在一起的肯定算 IDE;但还有一些编辑器,能够通过安装拓展并花时间配置,来达到类似前者的效果。因此也有人把后者称为 轻量级 IDE,而前者则是 重量级 IDE。如果你认同轻量级 IDE 的说法,那么我并不反对它,我只反对重量级 IDE。
- 捆绑了很多东西,不够轻量,不够灵活,很难定制
- 通常 IDE 都是针对某个特定编程语言设计的,不能够很好地支持多语言项目,每换个语言写项目就要换个 IDE,重新学习各种操作、适应新的界面。使用 IDE 的本意是节约学习成本和减轻记忆负担,这下反而得不偿失了
- IDE 在图形界面的背后隐藏了很多细节,对于依赖 IDE 的人而言这通常就是魔法。一旦遇到 IDE 无法解决的问题或 IDE 本身出现问题时,不知道 IDE 实际在做什么的话根本就无从下手。
- 好用的 IDE 大多都要付费
好用的标准比较主观,但很多 IDE 都要付费是真的
而相比之下,使用编辑器有很多好处,并且这个好处会随着时间的推移而越来越多。
- 你在编写代码的过程中不断地对编辑器进行配置(比如通过拓展实现了丰富的语言服务和 GUI 操作支持,比如定制了自己喜欢的主题、快捷键、代码片段等),你的开发效率会越来越高,一切都越来越符合你的喜好
- 你逐渐学会各种工具的使用方式,你对开发有了更加深刻的、属于自己的理解
- 你亲手挑选了每个拓展,组合起每个工具。你对这一切了如指掌,即使出现问题也可以轻松定位到具体的拓展/工具,甚至还可以自己修复
- 你不用担心自己会为了使用别的语言而不得不更换编辑器,因为你已经能够轻松地配置出自己满意的开发环境
不夸张地说,一款好的编辑器可以陪你整个开发生涯,是个比被窝更让人感到亲切的东西。
不过我并不想全盘否定 IDE,它的存在肯定是有价值的
- 对于初学者而言,IDE 是个非常好的起点。它让初学者可以只专注于编写代码,而忽略其它所有繁琐的事情
- 对于企业而言,统一使用相同的 IDE 可以减少沟通、合作的成本,也更方便培训新人
分类¶
我将编辑器按照使用的 UI 进行分类
GUI学习成本低,但比较重,启动慢、占用高,并且可能出现图形渲染错误TUI学习成本高,但非常轻量,启动快、占用低,且通常更稳定
选择什么编辑器主要看个人喜好。我更习惯用 GUI,偶尔也会用 TUI。
GUI¶
- VSCode 免费开源,轻量灵活,支持非常高程度的自定义,可以通过拓展达到类似 IDE 的效果,且对远程开发、AI 编程、冷门语言等支持度很高。我现在所有的项目都使用 VSCode 编写代码,包括 C/C++、Python、Web、Julia、Go、Rust、Markdown、Tex、Verilog、Godot 等各种类型。
- Zed 类似 VSCode,不过使用 Rust 实现,因此速度更快,但也导致无法重用 VSCode 的拓展生态。Zed 自己的拓展生态正在迅速发展中。
- Jupyter 某种程度上也算编辑器,但功能远远超过了一般的编辑器,对它的最好定义也许是 交互式编程笔记本。Jupyter 更适合学习、探索,不太适合大型工程项目。Jupyter 基于 Web 技术,许多编辑器都可以借助拓展实现对 Jupyter 的支持。
TUI¶
- Neovim Vim 的现代版本,更易用且可拓展性更强。Neovim 的拓展使用 VimScript/Lua 编写,复用了 Vim 生态的同时还有属于自己的生态。