八卦一下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文件中怎么瞎import,import的顺序不会影响构建速度
  • 根据这个图呢,先算“叶子节点”,也就是不依赖任何东西的任务,然后把依赖叶子节点的任务做做掉。好吧,这就是图的搜索算法,主要标记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. CF1098B/CF1099E Nice table

    题目地址:CF1098B/CF1099E Nice table 显然,a nice table需要满足如下条件: 要么,每行都由两个字符交替组成,相邻两行的字符均不相同 要么,每列都由两个字符交替组成 ...

  2. SpringSecurity权限表达式

    * 当我们想要使用多个权限表达式的时候,是不能直接级联调用的,也就是说,我们只能手写了. @Override protected void configure(HttpSecurity http) t ...

  3. office 产品密钥

    刚买的小新,配置下office,作为技术人员,喜欢Share以下 office 产品密钥,任你选一组 一.序列号激活法(密钥激活法)这种是最为安全而且最为正规的方法,通过取得合法的序列号(密钥)进行激 ...

  4. Open-Drain与Push-Pull【转】

    转自:https://www.cnblogs.com/zhangpengshou/p/3643546.html GPIO的功能,简单说就是可以根据自己的需要去配置为输入或输出.(General Pur ...

  5. pandas爬虫

    import pandas as pd import re pat=re.compile("shenfenzheng = (.*?);") ###果树财富 class RongSh ...

  6. smarty半小时快速上手教程

    一:smarty的程序设计部分: 在smarty的模板设计部分我简单的把smarty在模板中的一些常用设置做了简单的介绍,这一节主要来介绍一下如何在smarty中开始我们程序设计.下载Smarty文件 ...

  7. windows网络相关的命令

    一.netstat命令 显示协议统计信息和当前 TCP/IP 网络连接. NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-x] ...

  8. 题解-APIO2010 特别行动队

    题目 洛谷 & bzoj 简要题意:给定一个长为\(n\)的序列\(\{s_i\}\)与常数\(a,b,c\),序列的一个连续子段\(s_i\)到\(s_j\)的贡献为\(at^2+bt+c\ ...

  9. ASP.NET MVC5入门3之登录验证

    参考: HTML页面模版: http://www.ui.cn/detail/70262.html(第38个) MVC后台代码参考: http://www.oschina.net/p/nfine 开发环 ...

  10. 大数据mapreduce俩表join之python实现

    二次排序 在Hadoop中,默认情况下是按照key进行排序,如果要按照value进行排序怎么办?即:对于同一个key,reduce函数接收到的value list是按照value排序的.这种应用需求在 ...