乐于分享
好东西不私藏

文本编辑器的核心难点是什么?

文本编辑器的核心难点是什么?

电脑办公时,经常要对一个文本格式的文件进行编辑,那就离开不文本编辑器。或许有人会对文本编辑器的内部构造和原理感兴趣,作为一名长期开发文本编辑器的老师傅,笔者简单介绍下文本编辑器做的事情,和它背后的核心难点。

简单来说,其实文本文件分两种,一种是纯文本,另外一种是带格式的文本。前者以各种txt 文件和编程代码文件居多,内部存放的是纯粹的文字,而不包括渲染该文字时的格式说明。后者以html/markdown/pdf 等常见格式居多,内部存放不仅包含文字本身,还包括显示该文字时的格式,比如字体大小,颜色,段距等。这种带格式的文本,还有一个专业的名称——富文本,顾名思义,不仅包含文本,还富含对文本的格式属性描述。

拿笔者开发的Ndd 编辑器而言,它是一款纯粹的纯文本编辑器,只提供对纯文本文件的编辑,而无法提供对富文本的编辑或渲染。实际上,富文本有许多不同的常见格式,包括公开格式或私有格式。常见的富文本格式有html、markdown、docx、pdf等,比较冷门的有tex 格式。如果要对富文本进行显示,一般而言,需要使用支持对应格式的对应软件。

有了这些前提知识后,可以简单回答文本编辑器在做什么——本质就是提供对文档格式的解析、数字存储,格式渲染显示。每种文本编辑器,无论是纯文本的,还是富文本的,它都需要对文档进行显示。差异点在于,对于富文本的渲染,其需要遵循富文本格式的定义,要能在格式规定的前提下显示出文本。

知道文本编辑器所做工作,介绍其核心技术难点——高效美观渲染显示具体来说核心难点有如下2点。

1 高效的文本定位+实际内容修改管理

试想一下看到一篇文章鼠标只要动一下就要鼠标所在屏幕逻辑位置换算当前文字的排版显示位置同时后台要计算实际存储内存硬盘字节位置,三个位置三位一体不能一个字符偏差而且快速

文本存储格式至关重要。试想如果一段文字插入一个文字那么直观来说插入这个鼠标位置立刻腾出一个空位文字塞进去然后本来这个位置后面所有内容都立刻往后移动一个位置如何选择一种高效数据结构是否快速做完该流程至关重要

常见文本组织管理数据结构列表分块gappiecetable树形节点没有一种放之四海而皆准数据结构取决具体编辑器需要实现功能需求复杂度

2 高效美观的渲染

直白说即良好排版富文本的格式琳琅满目,细节锱铢必较,是文本渲染一大挑战。从文字渲染的角度而言,浏览器从本质而言也算高级的文本编辑器,无非是html/css等富文本渲染全球做好目前也就2到3家,其中谷歌以遥遥领先的趋势排第一。

每时每刻,编辑器需要后台计算每一段文字显示宽度高度字体大小颜色、段字距离等排版细节然后快速呈现用户面前这里面每一个细节一个独立开发者喝一壶。武断地说99%的普通开发者无论技术难度还是工作量评估二个维度而言不足以独立开发一款文本编辑器

ndd 是一款简单文本编辑器,麻雀虽小五脏俱全需要面对几个难点

第一个巨长文本渲染性能如果文字很长,有几万个汉字,在显示时候,屏幕宽度无法显示这么长的一行。要想看到长行的所有文字,需要自动换行效果。即一个很长句子掰断屏幕宽度多个小段从而达到一个能够多个“视图行”同时呈现用户方式这里难点在于后台实时动态计算每个视图宽度,单个视图行的宽度和屏幕可视宽度一样宽。这虽然是个粗活,因为工作量巨大,要做到实时计算很难。

简单举例来说要把一根竹竿放进麻袋需要竹竿砍成多个小段每个小段要能整整齐齐正好麻袋宽度一致否则就会装不下或者浪费麻袋空间这里最大麻烦在于性能做这件事本身不难,最难的是能否快速去做。只要一秒用户都会抱怨难用35用户用脚投票然后垃圾

具体来说长可能很长,几万个文字每个文字可能是中英字符、标点字符、阿拉伯字符,其字符宽度各不相同视图要和屏幕一样,单行包含字符个数都可能不一样。这个动态计算过程相对耗时就会导致卡顿

第二个是排版美观问题。就算解决渲染问题需要考虑美观问题比如有时候英文最好不能把一个单词中间切开显示避免一个单词切断出现上一行行尾下一行行首情况类似特殊情况需要考虑渲染方案之中

种种这些难点性能要求加起来直接劝退大量尝试自己01编辑器开发者不精确考证,开源gun项目的祖师爷理查德·斯托曼写出了世界上第一个gcc编译器写出了第一个调试器gdb后续linux系统编译调试打下了基础但是很少有人知道哥们第一个gcc编译器时候同时做了一个文本编辑器就是大名鼎鼎emacs可以武断文本编辑器编译器一样基础核心工具之一虽然他们难度工程一些区别但是重要性却是不相上下

IT界中有个搞笑的故事,tex的发明者高德纳,就是写《计算机程序设计的艺术》的大牛,本来准备7本同类系列书籍。结果写到2本的时候,因为没有一个文字排版工具不得不中断10年,先去写了一个文字排版系统tex。由此可见,一种高效美观的排版显示系统,对高德纳这种级别的大牛也是一个颇为棘手的问题,以至于十年磨一剑方才打磨tex

AI 对程序员的冲击

最后我想讨论下AI对程序员行业的冲击。对初学者建议如果真正厉害程序员真的建议自己写一写文本编辑器,编译器,数据库项目入手不一定做出真正流行可用编辑器编译器发明自己语言但是这些难度事情。在这些事情尝试解决那些牛人遇到同样问题这样才能成为牛人比肩

当然是01那种不是开源基础继续扩展,如果不是从0开始写,而是拿开源组件直接改,这样你就逃避了那些真正难搞,却让人成长部分

一个程序员,如果尝试自己开发文本编辑器,开发自己编程语言,开发自己的操作系统,那么才可能成长真正牛人这部分无论如何不需要担心AI取代程序员”这类话题。

纯粹技术角度而言AI没有太多担忧,唯一担忧是大量初级的程序员被淘汰,我的活反而更重了。因为知道无论技术难度还是工程复杂度而言我所面临的一系列问题远远不是目前AI所能掌控那种给一个提示AI就能给你推翻重来糊弄面对文本编辑器语言编译器这些需要精确控制场景无论如何无法令人接受

不过目前AI如果未来十年AI还能继续保持进化那就不好了。今天AI远不足以替换牛人只会造成初级程序员断层淘汰