# uCode 和 Blockly、Scratch 之间的关系

uCode 是基于 Scratch 进行二次开发,Blockly 和 Scratch 的关系,要先介绍 Blockly

# Blockly

什么是 Blockly,Blockly 是谷歌推出的一套开源图形化积木块编程的框架,虽然基于 Web 但是它是使用 SVG 进行渲染,和我们平时前端开发的基于 HTML DOM 元素有点不太一样,另外 Blockly 使用的是谷歌的 Closure Library (opens new window) 进行开发的,由于它出现的时间比较早,所以目前都不太兼容 ES6 以及 Webpack 前端常用的工具链以及框架。(目前还是维护,只是多数用于谷歌自身的产品,例如 Gmail,Maps,Google Search)

可以参考该官方最经典的案例:Blockly Code (opens new window)

# Blockly 的特点

  • Blockly 可以把积木块转换成代码,可以说转代码 Code Generator,这是 Blockly 最主要的功能之一
  • Blockly 使用的是 SVG 进行渲染,SVG 比起 DOM 有更高的自由度,可以轻松的实现积木拼接的效果
  • Blockly 并不具备运行状态的管理(虽然有提供一个 JS 执行器,但是它只是一个 Demo),它只负责把积木转换为代码,但并不负责执行,执行是上层使用的人自行处理的
  • 另外由于积木转代码并不是线性一一对应的,所以 Blockly 转代码并不是连续性的(意思就是不是一个 function 对应一个积木,也不是一行代码对应一个积木,就是没有连续性)
  • 由于不是线性对称,因此 Blockly 只有整体运行整个项目,要实现单个积木运行也可以,但实现起来比较复杂,需要管理非常的状态以及对应关系,因此它通常不具备 预览功能
  • 由于以上特性,Blockly 更像一个编辑器 (Editor),而不是 IDE,什么是 IDE,全称是:Integrated development environment ,就是一个集成的开发环境,但显然 Blockly 的开发初衷并不是为了做一个 IDE

# Scratch

什么是 Scratch,Scratch 是 MIT Media Lab 推出的一套图形化积木编程的产品,主要用于儿童的编程学习。 最早的 Scratch 1.x 可以追溯到上个世纪八十年代,后来 Scratch 2 使用了 Flash ActionScript 进行开发,Scratch 3 使用了基于 Blockly 框架进行开发,并且可以兼容 Scratch 2 生成的文件。

Scratch (opens new window)

# Scratch 的特点

  • Scratch 3 最大的变化是新增了一个舞台,这个舞台也是 Scratch 的标志
  • Scratch 3 抛弃了 Blockly 的积木转代码的功能,而是使用了全新一套的运行标准
  • Scratch 3 在 Blockly 基础上增加了一个 VM (Virtual Machine)虚拟机,它改变了整个 Blockly 的积木运行机制,使得 Scratch 3 更像一个 IDE,而不是 Editor
  • 由于 VM 的存在,Scratch 3 可以使得积木和积木的行为做线性对称关系(虽然会有副作用,但 Scratch 3 的设计初衷是线性对称的),因此 Scratch 3 虽然基于的是 Blockly,但是它具备预览功能,

# Blockly 和 Scratch 3 的关系

  1. Blockly 相当于一套图形化积木的开源框架
  2. Scratch 3 是基于 Blockly 的基础上重新开发的版本

可以理解为,Scratch 3 是 Blockly 的超集,同时 Blockly 还有其他基于它衍生的产品,例如:微软的 MakeCode (opens new window) ,还有 MIT 自己的 App Inventor,编程猫的 Kitten (opens new window) ,都是基于 Blockly 开发。