在通过各种编辑工具使用各类编程语言进行开发的过程中,我们会被大量噪音分心。

举个例子

我们为了美观性,为了代码格式和对齐,我们会大量的插入/删除Space、Tab和Enter

对于一些同层级的操作,我们可能会手工对齐它。

举一个极端的例子,例如我写的代码就是这样的

这样的

以及这样的

为了使这些代码变得美观,变得整齐工整,无疑是一件很痛苦的事。

同时,语法节点的输入也是个带问题。

对于一颗语法树,我们需要输入它的头部。例如

match

以及我们需要输入它的词法界限来分割它的块部分,例如

with | 和 ->

——而这是完全没有必要的

据直觉性的非客观的不完全统计,在我们写代码的时候30%的部分写的就是这些东西(x

我们完全可以在我们输入语法树的头部时,就让编辑器帮你弄出整个块

我们能输入错误的源代码

这一点我是觉得是最不可思议的。

同志们,已经9102年了,我们用的代码编辑器居然还能让我们输入能让编辑器报错的代码。

Q: 所以,我们需要什么?

A: 所以,我们需要一个高度语言特化的AST编辑器——也就是结构化编辑。它应该最大程度的照顾用户体验——也就是以人为本。

注意:它不是图形化的编辑器,也不是像UE4蓝图那样的东西。

以及,一些有趣的特性

一旦我们用上了AST编辑,那么我们就可以做一些很好玩的东西了

由于编辑器的操作对象是AST,因此我们就能很轻松的指定由编辑器渲染出的代码样式——通过写插件和编辑样式文件的方式。

符号查找和定位是低开销的:对于传统的编程语言而言,符号查找的开销无疑是较高的。首先我们需要从源码中构建出AST,然后我们需要维护一个AST到源码的映射表——在这个过程中,一旦能构建出AST的Token序列被破坏,那么就我们没法从源码中得到任何可用的信息了,我们就只能猜,猜到哪个算哪个。(同时我们能够避免写编辑器的String数据结构(比如坨坨桌子(逃

降低Parser实现难度:对于这一点,大锤予以了反驳,他认为合格的编译器应该独立处理所有的语法问题。我倒是不这么觉得,首先在任何情况下,读纯ast表达式(包括且不限于json、xml)应该是成本最低的方式了。

举个小众的例子:众所周知,某些语言中提供了自定义运算符和控制流的语法。(点名批评Haskell和F#)而为了实现这种功能,我们在实现Parser的时候会用上很复杂的算法和操作。

我认为这是一种很不干净的行为,我们完全可以把这部分功能(甚至一部分宏的作用)交给编辑器前端去做。

最大程度上防止用户写出有问题的代码

这一部分我觉得是结构化编辑最有价值的部分。

举个例子

我们使用Pigeon(目前还不存在的)语言时,我们输入了一个表达式

1 + a

——在正常情况下是这样的

但是,如果我们没有定义a呢?我们没有在任何作用域中定义这个a呢?或者说,这个a的类型和(+)这个函数不匹配呢?

我们的编辑器会对它标记一个红色下划线?不对,此时这个a是写不出来的。我们可以在intellcode的提示中直接进入重构引导。

从这一步我们就可以看出来了。整个的代码编辑过程应该是很流畅的。代码编辑器每时每刻都在和用户强交互。

必要性?

看到这里有人会问啦:那么这些东西和我们现在用的编辑器有什么本质的区别吗?

从使用者的角度来看,两者都能提供同样的功能。但结构化编辑器会带来更整体而非是零碎的体验。

未来的问题

当然,截止目前,结构化编辑器的构思还有很多问题。例如怎么选择和操作ast,例如快捷键该怎么设置,会不会让开发者更快患上腱鞘炎(逃)。诸如此类的问题。

但我们仍然选择相信下一代编辑器,能带来更好的开发体验,能够真正做到以人为本。

c++源码矢量图形编辑器_下一代代码编辑器的设想相关推荐

  1. TinkPHP内核仿每推推51领啦试客源码_PC源码+WAP端+APP原生代码_自带5套精美模板

    TinkPHP内核仿每推推51领啦试客源码_PC源码+WAP端+APP原生代码_自带5套精美模板 源码说明:TinkPHP内核上制作而成,是全国领先的免费试用网站!程序全开源无加密!带有wap手机端, ...

  2. Soul 网关源码阅读(二)代码初步运行

    Soul 源码阅读(二)代码初步运行 简介     基于上篇:Soul 源码阅读(一) 概览,这部分跑一下Soul网关的示例 过程记录     现在我们可以根据地图,稍微探索一下周边,摸一摸      ...

  3. Soul源码分析 ——值得借鉴的代码技巧

    Soul源码分析 -- 可以复用的代码技巧 对bean的操作 设计模式的使用 线程池 线程池线程数 拒绝策略 SPI 加载工厂 java spi应用 自己实现spi Soul-common模块里所有工 ...

  4. 计算机毕业设计-springboot停车场预约管理系统源码-停车位预约系统java代码-车位管理系统

    计算机毕业设计-springboot停车场预约管理系统源码-停车位预约系统java代码-车位管理系统 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 作者:IT跃迁谷 1.开发环境 开发语言: ...

  5. PHP大灌篮投篮游戏源码 微信+手机wap源码 带控制_大灌篮游戏源码

    内含详细安装教程,请严格按照文档来安装,顺序错了也会安装不起来. PHP大灌篮游戏源码,投篮游戏源码,手动提现 后台密码自己替换MD5 [完整源码链接] PHP大灌篮投篮游戏源码微信+手机wap源码带 ...

  6. 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )

    坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript ) HTML5坦克大战网页小游戏,完美还原小霸王学习机效果,以坦克战斗及保卫基地为主题,属于策略型类游戏. ...

  7. 西门子PLC源码图纸S7-224XP-226 ARM芯片代码ST芯片源码

    西门子PLC源码图纸S7-224XP-226 ARM芯片代码ST芯片源码 ID:879638621827400东莞现货

  8. 门禁系统 java源代码_Java经典源码 门禁系统完整代码

    [实例简介] Java经典源码 门禁系统完整代码 门禁系统 另一种写法,代码和前一个系统有区别 [实例截图] [核心代码] ControlSys1 └── ControlSys1 ├── accp.l ...

  9. 直播一对一源码主播美颜SDK代码分享

    这是一篇关于直播一对一源码主播美颜SDK代码分析,仅供码农参考. /** Created by cxf on 2017/9/1. 直播一对一源码主播直播间美颜,滤镜等效果 */ case Beauty ...

最新文章

  1. Android开发环境的搭建
  2. 理解Maven中的SNAPSHOT版本和正式版本
  3. SpringBoot实现注册时头像上传与下载
  4. K8S滚动更新示例演示
  5. 命令行方法查看和设置环境变量
  6. AI运动:阿里体育端智能最佳实践
  7. 自动化集成:Docker容器入门简介
  8. JavaScript执行bat文件清理浏览器缓存
  9. Spring Bean的一生
  10. Java中的引用数据类型-BigDecimal
  11. thinkphp无法加载控制器:Admin
  12. linux上复制文件命令是什么,Linux复制文件用什么命令怎么用
  13. 360 html快捷,360极速浏览器如何设置键盘快捷键?
  14. python模块:Sockets阻塞和非阻塞测试
  15. 计算机网络IP地址分配
  16. 国际学校入学考试MAP语法测试题真题讲解
  17. 这几个视频提取音频的方法很实用,快来学习
  18. 基于神经网络的目标检测论文之目标检测系统:实时路况检测系统的设计与实现
  19. Office WORD WPS如何设置PPT播放全屏
  20. SwiftUI基础——创建并组合视图

热门文章

  1. JS实现Ajax异步刷新
  2. 计算机右键菜单太多,电脑点击右键太多选项怎么办
  3. win2012 ad用户和计算机,Server2012R2搭建AD域服务器并添加登录用户
  4. 云开发的数据库权限机制解读丨云开发101
  5. LVM--逻辑卷管理
  6. matplotlib的颜色和控制条
  7. JAVA四则运算(读写文件)
  8. 排序之选择排序:简单选择+堆排序
  9. IOS开发基础篇 -- 分类、类别
  10. Unity Scene为每一个游戏物体进行扩展编辑