简介:在上一节《安全多方计算(MPC)从入门到精通:简易教程》中,我们已经简单介绍过Frutta语言,Frutta是JUGO为计算逻辑而开发的编程语言,计算逻辑在MPC中是为解决具体业务而编写的算法。它是一门类C高级语言,支持大部分运算符、数据类型,表达方式的实现——300个门电路,仅需一行代码!
1.什么是Frutta
Frutta是矩阵元为安全多方计算的算法电路文件生成而专门定制的编程语言。它是一门类高级语言,也是一门面向过程的编程语言。Frutta支持大部分运算符、数据类型,表达方式灵活实用。目前只有矩阵元提供的在线ide可以进行编译运行。ide可以把Frutta文件编译成可在JUGO平台上执行的电路文件。
2.程序结构
在我们学习Frutta语言的基本构建块之前,让我们先来看看一个最小的Frutta程序结构,在接下来的章节中可以以此作为参考。
Frutta语言主要包括以下部分:
预处理器指令
输入输出定义
函数
变量
语句&表达式
注释
1. #parties 2 /* 两个参与方 */
2.
3. #input 1 int32 /* 参与方1,可以是基础类型,也可以是数组,结构体等复杂类型 */
4. #input 2 int32 /* 参与方2 */
5. #output 1 int32 /* 输出方 */
6.
7. /* 主函数,完成加法操作 */
8. function void main()
9. {
10. output1 = input1 + input2;
11. }
一、基本语法
Frutta程序由各种Token组成,Token可以是关键字、标识符、常量、字符串值,或者是一个符号。
分号
在Frutta程序中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。
注释
注释就像是程序中的帮助文本,它们会被编译器忽略。它们以 /* 开始,以字符 */ 终止。
您不能在注释内嵌套注释,注释也不能出现在字符串或字符值中。
标识符
标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
标识符内不允许出现标点字符,比如 @、$ 和 %。标识符是区分大小写。因此,Manpower 和 manpower 是两个不同的标识符。下面列出几个有效的标识符:
mohd zara abc move_name a_123 myname50 _temp j a23b9 retVal
关键字
下表列出了Frutta中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。对于输入输出,请按照顺序,依次写。输入个数跟参与计算方个数保持一致。比如有3个计算方个数,那么请依次定义input 1 xxx, input 2 xxx, input 3 xxx。输出也同样。
else typedef return for void if struct abs max min
int8 uint8 int16 uint16 int32 uint32 int64 uint64 bool
input1 input2 ... inputN output1 output2 ... outputN
空格
只包含空格的行,被称为空白行,可能带有注释,编译器会完全忽略它。
在Frutta中,空格用于描述空白符、制表符、换行符和注释。空格分隔语句的各个部分,让编译器能识别语句中的某个元素(比如 int)在哪里结束,下一个元素在哪里开始。因此,在下面的语句中:type age;。在这里,type 和 age 之间必须至少有一个空格字符(通常是一个空白符),这样编译器才能够区分它们。另一方面,在下面的语句中:
fruit = apples + oranges;
Copy
fruit 和 =,或者 = 和 apples 之间的空格字符不是必需的,但是为了增强可读性,您可以根据需要适当增加一些空格。
二、预处理器
预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。
所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。
在Frutta中,支持两类预编译器指令:
include
支持包含外部文件,外部文件支持以下几类外部文件: