八卦一下Starlark语言

编译移植TensorFlow时用到Bazel这一构建工具,Bazel用Starlark语法来编写WORKSPACE/BUILD文件,它们是类似于Make中的makeifle、CMake中的CMakeLists的存在。

来源:https://blog.bazel.build/2017/03/21/design-of-skylark.html

Starlark语言简史

早些年google用make+makefile构建代码,后来代码多了,发现make不适合(反正我是觉得makefile语法太怪异了,之前看ucore/JOS操作系统内核时候就很慌)。

一个临时办法是手写一个描述文件BUILD,然后用Python生成makefile文件(沿着这种思路,考虑VC/gcc/XCode等多种平台,就是cmake了)。

但是其实Make更大问题是速度太慢,于是google搞了个Blaze,开源版本叫Bazel(比如TensorFlow默认就用Bazel构建)。

Blaze2006年一路过来,也是各种经验啊:用BUILD替代Makefile,用Blaze替代Make,那么似乎应该让Blaze来解析BUILD然后调编译器连接器干活,因为Make就是先听Makefile哔哔然后向gcc和ar发号施令的。

但是既然已经是重新实现一个构建系统了,能不能把描述文件的语法搞的human friendly一点啊?干脆用Python写算了吧!

诶,如果BUILD用纯Python写,那Blaze就不需要解析BUILD了。但是!纯Python写/解析BUILD,太特么自由了,A君写一个宏,B君又写一个宏,实现同样功能。天啊,google那么多项目,这么搞搞死人啊。

好吧,捋一捋:

  • 构建的描述文件,语法得简单,或者说大家基本上熟悉的,门槛低点
  • 构建描述文件中常用的什么目标啊、库啊、路径啊、依赖啊,得有统一的版本
  • 构建速度得快点

其中对于前面两点,干脆搞个阉割版的Python(语言)吧!搞一些限定,但是python的常用基本语法给他留着。

好了,这就是Starlark了。对,它改过名,以前叫Skylark。

Starlark设计需求

Starlark除了是一门Python方言,它更是Blaze(Bazel)的前端。要想Bazel构建速度快,应该避免重复计算,Starlark作为预处理器,这么干的:

  • 搞了一个依赖图(graph of dependencies),这么一来不管你在BUILD.bzl文件中怎么瞎importimport的顺序不会影响构建速度
  • 根据这个图呢,先算“叶子节点”,也就是不依赖任何东西的任务,然后把依赖叶子节点的任务做做掉。好吧,这就是图的搜索算法,主要标记visit flag来避免重复计算。
  • 每个文件只被加载一次:缓存着,避免I/O阻塞计算速度
  • 考虑到多个BUILD文件中可能使用了同一个变量,多线程解析各个BUILD文件时给变量加只读锁

八卦一下Starlark语言的更多相关文章

  1. Node.js最新技术栈之Promise篇

    前言 大家好,我是桑世龙,github和cnodejs上的i5ting,目前在天津创业,公司目前使用技术主要是nodejs,算所谓的MEAN(mongodb + express + angular + ...

  2. 伏羲八卦、文王六十四卦、老子阴阳太极、西方哲学辩证与"解耦和复用”思想的异曲同工之妙

    伏羲八卦.文王六十四卦.老子阴阳太极.西方哲学辩证与"解耦和复用”思想的异曲同工之妙     问题:任何程序语言在遇到复杂逻辑时,代码维护难度就会加大,如何处理该问题? 答案:重构,模块化. ...

  3. 八卦某 G 的前端开发方式及流程

      他山之石,可以攻玉. 话说本人从毕业到现在一直在某 B 公司工作,前些年折腾过不少开发方式和工具,但总觉得或许有更好的方案,所以很好奇其它公司内部是如何工作的,我曾经浏览过某 Y 公司内部无所不包 ...

  4. 许式伟:我与Go语言的这十年[转]

    2017-12-18 许式伟 Go中国 2007 年 9 月 20 日,关于设计一门全新语言的讨论正式开始,这门全新的语言,就是后来的 Go.时至今日,Go 语言已经发布到 1.9 版本,走过了整整十 ...

  5. 不一样的go语言-gopher

    前言   gopher原意地鼠,在golang 的世界里解释为地道的go程序员.在其他语言的世界里也有PHPer,Pythonic的说法,反而Java是个例外.虽然也有Javaer之类的说法,但似乎并 ...

  6. Prolog学习:用八卦的精神走进Prolog

    最近枕头书是<七周七语言:理解多种编程范型>这本,前面两章分别看了Ruby和IO,都是命令式语言.虽然它们在语法上跟之前接触过的C,C#,Java这些C家族的语言差别很大,但是编程范型却是 ...

  7. day02<Java语言基础+>

    Java语言基础(常量的概述和使用) Java语言基础(进制概述和二,八,十六进制图解) Java语言基础(不同进制数据的表现形式) Java语言基础(任意进制到十进制的转换图解) Java语言基础( ...

  8. 八卦某 G 的前端开发方式及流程--百度FEX前端nwind信息搜集神技能

    他山之石,可以攻玉. 话说本人从毕业到现在一直在某 B 公司工作,前些年折腾过不少开发方式和工具,但总觉得或许有更好的方案,所以很好奇其它公司内部是如何工作的,我曾经浏览过某 Y 公司内部无所不包的 ...

  9. 关于Lisp和函数式编程 & 各种语言对比 & TIOBE

    上一篇文章提到了,今天又读到Lisp的一些内容 <为什么Lisp如此先进>ruanyifeng(Link).关于Lisp的八卦,可以参考我前面两篇文章 http://www.cnblogs ...

随机推荐

  1. 20165231 2017-2018-2《Java程序设计》课程总结

    每周作业链接汇总 预备作业一:我期待的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:linux安装及学习 第一周作业:初识JAVA,注册码云并配置Git 第二周作业:JAVA基本语法,标 ...

  2. 在vue中scss通过scoped属性设置局部变量如何设置框架样式

    应用场景:在使用vue的大型单页应用页面中,我们可以通过使用scoped属性将当前组件的样式设置局部样式 界面被scoped局部化之后,不能覆盖界面里面的子组件样式,因为样式只对当前界面生效.(可以加 ...

  3. js知识巩固

    1.数组操作中使用splice和slice进行删除数组的区别! splice会对原数组进行操作,返回的是被删除元素组成的数组,原数组会被进行改变即变成删除后的数组,用于删除列表中的元素,arr.spl ...

  4. hibernate框架学习之Session管理

    Session对象的生命周期 lHibernate中数据库连接最终包装成Session对象,使用Session对象可以对数据库进行操作. lSession对象获取方式: •加载所有配置信息得到Conf ...

  5. mysql alter add 使用记录

    alter add命令用来增加表的字段. alter add命令格式:alter table 表名 add字段 类型 其他; 例如,在表MyClass中添加了一个字段passtest,类型为int(4 ...

  6. mysql修改字段长度及pymysql.err.DataError: (1406, "Data too long for column 'name' at row 1")错误

    文章链接:修改字段:https://blog.csdn.net/xiejunna/article/details/78580682 错误分析:https://blog.csdn.net/qq_4214 ...

  7. python-函数入门(一)

    1.什么是函数: 可重复使用的,用来实现单一,或相关联功能的代码段. 函数分为内置函数和自定义函数,这里先讲自定义函数 2.如何定义函数: #语法 def 函数名(参数1,参数2,参数3,...): ...

  8. 手机CPU架构体系分类及各大厂商

    手机cpu相关知识,这对于开发Android应用程序适应各个机型有一定的辅助作用 . 手机cpu架构体系分类 指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分,代表架构分别是x86.A ...

  9. python----动态规划

    不能放弃治疗,每天都要进步!! 什么时候使用动态规划呢? 1. 求一个问题的最优解 2. 大问题可以分解为子问题,子问题还有重叠的更小的子问题 3. 整体问题最优解取决于子问题的最优解(状态转移方程) ...

  10. numpy函数:[1]shape用法

    shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度.它的输入参数可以使一个整数表示维度,也可以是一个矩阵.