花仲马,五一在加班,我便只得找点事情做。
还记得 Uncode 吗?用于落地我构思的整个云研发体系的 IDE,如果不记得的话,请访问『流程即代码:低代码 & 云研发 IDE —— Uncode』。它来了,现在来了。
Uncode 架构
我,也许擅长 IDE 的插件开发,还有阅读了大量 Intellij IDEA Community 的源码,但也说不上擅长 IDE 的设计 —— 有太多的坑值得去探。特别是在五一之前,我尝试用 Druid 去构建一个编辑器,便发现这并不是容易的事情。所以,我走回了 WebView + Monaco 的路线,然后用 Rust 作为系统的核心:
上图是当前 Uncode 的架构图:
- 基于 Tauri,所以使用的是原生的 WebView 构建。选择 Tauri 的原因是:对 Rust 支持更友好。
- UI。TypeScript + React,选 React 而不是 Angular 的一个原因在于:1. 好久没用 React 了。 2. 外加国内的 Angular 用户变小了。
- App。Tauri 基本上作为是一个 Proxy 在运行 + 系统接口的访问,将核心功能下沉至 uncode。
- Uncode Core。主要工作:1. 提供众多 DSL 的解析和处理。 2. 封装众多工具,以提供分析功能,用于支撑反应反馈。 3. RPC 支持 —— Tauri 太麻烦了。
或许,你还注意到了 Golang。
Uncode 使用 Rust 来实现各类的 DSL 的解析,以及各类的代码生成。但是,Rust 还缺少一个重要的工具,Antlr(至少还不稳定)。依旧是那个老问题,Antlr 官方提供了大量的现有编程语言的语法,这个重要的特性由于支持我们做静态分析。所以,我们将使用 Golang 来暂时实现这样的功能。
Uncode 的第一个小目标
考虑到 Uncode 不是一件容易的事情:
- 设计一系列 DSL 来将设计和流程等代码化
- 设计一个语言(即 Datum,原来的 Charj)来转换不同的语言
- 设计一系列接口来集成其它一系列工具
- ……
所以,Uncode 的第一个目标,相当的简单:可以用 Uncode 来编写 Uncode 的编辑器。
IDE 的复杂性。变身为一个 IDE 是一件非常复杂的事情。在那之前,需要准备好稳定可靠的 UI 接口 + 良好的交互性。当然了,还有对于诸多工具的集成。
Uncode 演示版
所以,在五天里(加上 4.30 号),我开发了演示版本的 Uncode,除了不能写代码,它似乎什么也能做。
需求即代码
需求代码化,即将软件开发需求抽象为特定的领域语言,并使用管理代码一样的方式来管理需求,追踪需求的变化 。同时,为通过新的 API 来对接版本管理系统,以可视化需求,演变为看板代码化。
『需求即代码』作为 Uncode 的第一个部分,在演示版里,我实现得比较简单,读取代码库里的 story,解析其中 cucmber
的语法,然后展示到 Uncode 里。对应的 DSL 也还在早期(因为还得改 Cucumber 对应语法的解析器)。
# status: backlog
Feature: 架构守护 DSL 设计
作为一个架构师,我希望在设计通过类似于 ArchUnit 这样的 DSL 来设定调用规则等。
Scenario: 开发人员违反规则时,无法提交代码
# Enter steps here
由于,使用的 Kanban 库不是很完善,所以并没有创建对应的编辑功能。对应的功能截图如下:
设计即代码
设计即代码就稍微复杂一些,分为这么四部分:
- 架构描述语言。此处是有一个 DSL,只是我还在设计中。
- Modeling。说是建模,但是也说不上,模型的双向绑定。即扫描代码,生成 UML,然后展示;修改 UML 的话,会修改对应的代码。(前半部分支持,后半部分暂不支持)。
- 架构适应度函数。第一个功能是架构守护,即基于 Arch Unit 的 DSL 抽象。其它的暂时懒得写了。
- UI Design。即我在去年设计的:https://github.com/phodal/design ,可以实现简单的 DSL 转换为设计图,以及 DSL 转换为 UI 组件。
UI 依旧很丑。
代码的代码化
我承认,这就是一个带目录功能的编辑器。哦,不,暂时还支持保存文件,但是基本可用。
其它
Todoing。
就这么五天,你还想要什么自行车。
小结
GitHub 下载预览版:https://github.com/inherd/unc...
如果你擅长又或者是对以下的内容感兴趣:
- React
- Monaco Editor
- Rust
- Tauri
- 对 UI 有美感
人生苦短,欢迎加入 Uncode 的开发:https://github.com/inherd/uncode
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。