新智元报道
编辑:LRS
【新智元导读】每年都有很多新的编程语言来挑战Python在深度学习的地位,但无一例外都失败了。最近图灵奖得主在推特上再度提起4年前就已经停更的Skip语言,并看好它在深度学习领域的发展。图灵奖得主LeCun最近在twitter上分享了一门新的编程语言Skip,并表示它有很多有趣的新特性。
包括安全的并发、具有类型推断的强类型化、简单的语法、面向函数也可以面向对象、默认不可变的变量、可预测的垃圾回收器、支持预计算和缓存、类Lisp:闭包和指令序列等。
LeCun 也指出,虽然Skip语言很有意思,但目前来说把Python作为顶层语言更符合人民的意愿;对于其他下层语言来说,面向数值、支持GPU版本的Skip语言可能会有意义。
实验性语言Skip
Skip 是 Facebook(Meta前身) 于 2015-2018 年开发的一种实验性质的编程语言。
作为一个研究项目,Skip 的主要目标是探索支持准确、高效、基于记忆化(memoization)的缓存和缓存失效的语言和运行时。通过静态类型系统追踪可变性,Skip 做到了前面提到的特性,同时它也支持现代语言特征,例如 trait、泛型与子类型。
Skip 项目于 2018 年结束,Facebook表示不再积极开发 Skip,而是以开源的方式保持语言的稳定性,让编程语言研究社区在语言设计与实现、编译器和库的基础上进行研究和构建。
而编译器和库由该语言的主要设计者 Julien Verlaguet 作为一个副项目进行维护。
后来Julien 围绕Skip语言打造了几个产品,如关系型数据库SQLive。
顾名思义,SQLive受到SQLite的启发,支持一个强大的SQL子集(包括事务)。它的与众不同之处在于,它也是高度并发的。SQLive支持处理来自多个同步reader/writer的复杂查询,而不会让其他数据库用户阻塞住。
用户可以订阅query的变化。通过一种叫做虚拟视图(virtual views)的新结构,数据库可以在任何时候都保持一个特定的视图是最新的,当该视图发生变化时通知用户。
目前SQLive仍处于早期开发阶段,目前已经可以用于免费用于非商用领域。
Skip的开发团队有着多门语言的开发经验,包括ActionScript、C#、Flow、Hack、HHVM、Prettier、React Native和Relay的高级贡献者。
Skip的特性
从名字就可以看出来,Skip的开发就是为了跳过「某些已经计算过的东西」来加快执行速度。
Skip的主要新语言特征是它对副作用(side effect)的精确跟踪,包括值的可变性,以及区分非确定性数据源和那些可以提供反应性无效的数据源(当数据发生变化时告诉Skip)。当Skip的类型系统能够证明在一个给定的函数边界没有副作用时,开发者可以选择安全地记忆该计算,运行时确保当底层数据发生变化时,先前的缓存值会被删除。
Skip还支持两种互补的并发编程,都能避免通常的线程安全问题。首先,Skip支持使用 async/await 语法的 ergonomic 异步计算。由于Skip对副作用的跟踪,异步计算不能引用易变的状态,因此可以安全地并行执行(所以独立的异步继续可以并行地继续)。其次,Skip有用于直接并行计算的API,再次利用其对副作用的跟踪来防止线程安全问题,如对易变状态的共享访问。
Skip使用了一种新颖的内存管理方法,将典型的垃圾收集器与更直接的线性(凹凸)分配方案相结合。由于Skip对副作用的跟踪,垃圾收集器只需要扫描从计算的根部可以到达的内存。在实践中,这意味着开发者可以用可预测的GC开销来编写代码。
Skip的另一大特点是将函数式和面向对象式的观点混合在一起,所有这些都被仔细地整合在一起,形成一种有聚合力的语言。像函数式语言一样,Skip是面向表达式的,并支持抽象数据类型、模式匹配、简单的lambdas、高阶函数,以及(可选择)强制执行纯/反向透明的API边界。像命令式/OO语言一样,Skip支持具有继承性的类、可变的对象、循环和提前返回。Skip还融合了「systems」语言的思想,以支持低开销的抽象,通过值类对对象进行紧凑的内存布局,以及通过静态方法调度确保代码特化(code specialization)的模式。
Skip从一开始就被设计为支持良好的开发者体验,其快速的迭代速度通常与动态语言有关。编译器支持增量类型检查(IDE插件的alpha版本在你输入时提供近乎瞬时的错误),为常见的语法错误提供提示,帮助新手学习语言,识别方法/类名称的小错,甚至识别Skip标准库方法名称的常见替代品,并在Skip中建议正确的名称。Skip还具有一个代码格式调整器,能够帮助确保代码风格的一致性,以及一个用于运行代码模型的工具。
Hello World
根据官方提供的Playground,可以在网页交互页面上轻松实现第一个Skip程序。
可以看到,函数需要类型注释:指定了返回类型(void),名为 main 的特殊函数被调用作为程序的入口点。
Skip 是一种类型化语言。函数参数、返回类型和类别字段等声明都包括类型注释。编译器计算所有表达式的类型,并在遇到预料之外的类型时报错。Skip 包括常见的基元类型:Int、Float、String、Char、Bool、void。
并且函数没有使用关键词 return,因为 Skip 是一种基于表达式的语言,即没有语句的概念。
修改本地变量时需要使用感叹号,等号作为声明局部变量的操作符。
Skip 还包括常见的控制流语句,如 if、for/in、while、do 和 loop。与大部分语言不同,Skip 的控制流语句是表达式,且和其它表达式一样可以生成值。控制流表达式可用于期望使用的任何语境。
稍有不同的是,break, else都有返回值。
和深度学习有关?
LeCun在介绍Skip语言的时候,还提到一个问题:Skip会成为深度学习框架、深度学习语言的一个新品种吗?
并且还附上了一个Skip语言编写的、基于ArrayFire引擎的深度学习原型框架Skai的GitHub仓库。Skai的开发受到著名C++机器学习库FlashLight的启发。
LeCun表示,期待下一个Skip的特性就是支持GPU计算。
Grid.ai的首席 AI Educator、威斯康星大学麦迪逊分校的统计专业副教授Sebastian Raschka表示,由于Skip的开发始终围绕着副作用和缓存的特点,有可能是一种优秀的DL语言。不过与此同时,要换成非Python的东西真的很难。Python有一个强大的社区,这也是新的语言很难从头开始建立的东西。Julia对于ML/DL来说也有很大的意义,但它也没被选中。
也有网友表示Facebook开发的产品通常都是虎头蛇尾,有着很强大的理想主义,但最终无法普及也就无法获得成功,只能变成一个实验项目开放出来给大家玩。
不过这么多年,想挑战Python的语言都没成功,停更近4年的Skip靠着社区能翻盘吗?
参考资料:
https://twitter.com/ylecun/status/1495029342203695104
http://skiplang.com/
https://github.com/pikatchu/skai