摘要:系列文章导读:Vim Language (VimL) 是编辑器之神Vim的“灵魂”,它极致高效、简洁,但也始终被“脚本语言”的枷锁所束缚,难以用于构建超大型的软件工程。ObjectSense文档则展示了一条不同的进化路径:如果VimL从一开始就拥抱现代工程思想
系列文章导读: Vim Language (VimL) 是编辑器之神Vim的“灵魂”,它极致高效、简洁,但也始终被“脚本语言”的枷锁所束缚,难以用于构建超大型的软件工程。ObjectSense文档则展示了一条不同的进化路径:如果VimL从一开始就拥抱现代工程思想,它会是什么样子?
本系列将分两篇,从VimL的进化角度,客观解读ObjectSense如何试图将其“内核”带入一个全新的工程领域。
(上篇)从脚本到现代OOP(下篇)从语言到跨平台生态一、VimL的“天花板”
任何一个深度Vim用户,都对VimL怀有复杂的情感。
它的“神性”: 极致的性能、与编辑器无缝融合、仅用几行代码就能实现复杂的文本操作。它的“局限”: 当你想写的不是一个“插件”,而是一个“大型应用”时,VimL的局限性就暴露无遗:“伪”面向对象: VimL 8 引入了 dict 函数,可以通过 self 关键字模拟OOP,但这本质上是“字典驱动”,而非真正的类(Class-based)结构。工程化缺失: 它没有原生的 Package(包)或 Import(导入)机制,导致大型项目依赖混乱,命名空间极易污染。语言“孤岛”: 它几乎完全被困在Vim编辑器内部,无法作为一门独立的语言去构建其他类型的应用(如服务、GUI等)。VimL是一个顶级的“脚本小子”,却不是一个合格的“系统架构师”。
二、ObjectSense的第一步:保留内核,重构“骨架”
面对VimL的局限,ObjectSense的进化选择不是推倒重来,而是“基因重组”。
根据其文档,它首先保留了VimL的“优良基因”:“基于Vim language进行面向对象的封装,该语言核心代码仅在千行之内,高度精炼,简洁。”
这意味着它继承了VimL轻量、高效的运行时特性。但紧接着,它进行了第一次、也是最关键的一次“进化”——注入了完整的现代OOP骨架。
三、从“字典戏法”到“真正的类”
VimL的dict函数是一种“模拟”,而ObjectSense则提供了“原生”的工程化能力。这是从“脚本”迈向“工程语言”的第一步。
1. 引入 Class 与 Inherits(继承)
VimL需要你手动管理字典和函数引用来实现“对象”。 ObjectSense则提供了清晰的Class关键字,以及Inherits来实现多重继承。
function! s:Person.getName dict
return self.name
endfunction
let g:Person = { 'name': 'VimL', 'getName': function('s:Person.getName') }
ObjectSense (原生)Package oop
Class Human
" @accessible
function! s:Work
return "Go to work"
endfun
End
Class Index Inherits Human, Car
" ...
End
2. 引入 Package 与 Import(包管理)
VimL的“工程化之痛”在于缺乏命名空间。所有插件的函数理论上都在一个“大通铺”里,只能靠命名规范(如unite#...)来避免冲突。
ObjectSense则引入了现代语言标配的 Package 和 Import 机制。
Package example
Import example.Door
Class Index
function! s:Main
" 创建对象实例
let door = CreateInstance("Door", #{})
echo door.color
endfun
End
这彻底解决了VimL在大型项目中最大的痛点——命名空间污染和依赖管理。
通过Class, Inherits, Package和Import这几项关键进化,ObjectSense在保留VimL简洁内核的同时,完成了从“编辑器配置脚本”到“现代面向对象语言”的第一次飞跃。
但这仅仅是语言层面的进化。一门语言要“活下去”,还需要摆脱对单一宿主(Vim编辑器)的依赖,并建立自己的“生态工具链”。
(未完待续)
在(下篇)中,我们将探讨ObjectSense如何通过“编译框架”和“微语言”实现第二次飞跃——从一门“语言”进化为一个“跨平台生态”。
来源:Codigger