Relay IR是一个纯粹的、面向表达式语言。下面的部分描述Relay中不同的表达式并给出他们语义的细节。
为了比较Relay和传统基于图的中间表示,从数据流和控制片段的角度考虑Relay是必要的。Relay编程的每一部分都包含表达式,在编写和表示转换时,只影响数据流的情况可以看作是传统的计算图。
数据流片段涵盖了不涉及控制流的一组Relay表达式。也就是说,仅包含以下构造的程序的任何部分都对应于纯计算图:
-
变量
-
三元组构建和映射
-
操作符调用和抽象语法树构造器
控制流表达式允许图形拓扑根据先前执行的表达式的值进行更改。 Relay中的控制片段包括以下构造:
-
If-Then-Else表达式
-
抽象语法树匹配表达式
-
函数递归调用
从计算图的角度来看,一个函数是一个子图,一个函数调用内联该子图,用其参数替换具有相应名称的子图中的自由变量。 因此,如果函数的主体仅使用数据流构造,则对该函数的调用位于数据流片段中。 相反,如果函数的主体包含控制流,则对该函数的调用不属于数据流片段。