starlark 设计一瞥

英文原文地址:https://blog.bazel.build/2017/03/21/design-of-skylark.html

本文主要介绍 starlark (旧名:skylark)的设计原理,Bazel 用 starlark 语言构建工程。

简史

N年前,Google使用 Makefile 来管理代码。正如坊间传言,Makefile 管理代码太多时,就有点 hold 不住了。救急的解决办法是用 python 脚本来生成 Makefile,编译过程中用到的 python 函数都存储在 BUILD 文件中。但是这样还是太慢,瓶颈在 Make。

Blaze(后来以 Bazel 开源)项目开始于2006年。Blaze 用一个简单的解释器来读取 BUILD 文件(只支持函数调用,列表解析和变量分配)。Blaze 不能直接解析 BUILD 文件,通过 Python 解释器将用户的 BUILD 文件预处理为一个简化的 BUILD 文件,简化后的 BUILD 文件供 Blaze 使用。

这样处理起来简便并且允许开发者创建自己的宏。但是代码维护,性能,安全性又出现了很多问题。因为Blaze 本身不能解析 BUILD 文件,导致编译变得越来越复杂。

Bazel 经过重新设计,剔除了 Python 预处理的步骤。我们保留了 Python 的语法来移植基础代码。效果看上去不错:很多人喜欢我们的 BUILD 文件语法,并对一些构建工具进行了适配,比如 Buck, Pants 和 Please。

设计要求

我们决定将构建过程和扩展功能(宏和规则)分开描述,构建过程的描述放在 BUILD 文件里,然后扩展功能的描述放在 .bzl 文件里,但是他们仍然采用同样的解释器。我们希望代码易读且易于维护,希望成千上万的工程师采用 Bazel,大部分工程师对编译工具内部不熟悉,也不愿意花时间来学习一门新语言。所以 BUILD 文件就需要简明扼要,便于使用。

语言其他要求:

         1. 可以在 JVM 上运行。因为Bazel 是用 Java写的,本语言需要与 Bazel 分享数据结构。

         2. 使用 Python 语法,保留我们的基础代码。

         3. 确保确定性和密封性。我们必须保证代码的执行始终都能产生一致的结果。比如,我们禁止访问 I/O、日期和时间,以便确保字典的迭代。

         4. 确保线程安全。我们需要 BUILD 文件并行执行。执行的代码需要线程安全来保证结果的确定性。

关于性能方面,一个典型的 BUILD 文件很简单,可以很快地被执行。在大部分情况下,直接执行代码比先编译一下再执行要快。

并行性

Starlark 如何处理并行是它的一大特点。在 Bazel 中,一个大的工程需要处理很多的 BUILD 文件,所以我们需要并行加载它们。每个 BUILD 文件可能会用到很多扩展功能,扩展功能又可能会用到很多文件。这就是说我们需要准备好一张依赖性图表。

Bazel 首先会并行分析这张依赖表的各分支。依次加载它们各自依赖的文件,也就是解析各个 BUILD 和 .bzl 文件,不关心 load 语句的顺序。

每个文件几乎同时加载。当文件被解析后,它的定义(全局变量和函数)都被缓存了。其他任意文件都可以通过这个缓存访问其中元素。

由于多个线程可能会同时访问一个变量,所以我们需要严格地保证线程安全。解决方法很简单:当我们缓存了一个文件的定义,会把这些定义先“冷冻”起来,设置成只读,比如,你可以反复使用一个数组,但是不能修改其中的元素。但是你可以对这个数组做备份,然后进行修改。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353