智能合约语言(eDSL)—— 使用rust实现eDSL的原理

news2025/4/9 0:17:33

        为理解rust变成eDSL的实现原理,我们需要简单了解元编程与宏的概念,元编程被描述成一种计算机程序可以将代码看待成数据的能力,使用元编程技术编写的程序能够像普通程序在运行时更新、替换变量那样操作更新、替换代码。宏在 Rust 语言中是一种功能,能够在编译实际代码之前按照自定义的规则展开原始代码,从而能够达到修改原始代码的目的。从元编程的角度理解,宏就是“生成代码的代码”,因而 Rust 语言中的元编程能力主要来自于宏系统。通过 Rust 语言的宏系统,不仅能够实现 C语言的宏系统所提供的模式替换功能,甚至还能够控制编译器的行为、设计自己的语法从而实现 eDSL,所以我们正是基于 Rust 语言的宏系统实现的 eDSL。

        Rust 源代码文件编译需要经过下列阶段:

  1. 编译器在获得源代码文件后,会先进行词法分析,即把源代码字符序列转换为标记(Token)序列。标记是单独的语法单元,在 Rust 语言中,关键字、标识符都能够构成标记。词法分析还会将标记与标记的关系也记录下来,从而的生成标记树(Token tree),以一条简单的程序语句为例:

    a + b + (c + d[0])  + e
    

    其标记树如下图所示:

    token_tree

    注意

    与C中宏处理(导入 #include 头文件、替换 #define 符号等)是发生在预编译阶段不同,Rust语言并没有预编译阶段,其宏展开是发生在的完成语法分析后。也正是因为如此,Rust宏能够获得更详细、更复杂的编译期信息,从而提供极为强大的元编程能力。

  2. 随即,编译器启动语法分析流程,将词法分析生成的标记树翻译为 AST(Abstract Syntax Tree,抽象语法树)。在计算机科学中,AST 是源代码语法结构的一种抽象表示,能够方便地被编译器处理。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。上述第 1 步中生成的样例标记树会被翻译为如下图所示的 AST:

ast

  1. 然后,编译器开始分析 AST 并执行宏展开过程。此阶段是是最为重要的阶段,因为我们的eDSL 主要工作在这个阶段。以我们xq合约为例,编译器构造出xq合约的 AST 后,当扫描至 AST 中表示#[call(contract = "xq", function = "abc")]语句的语法树节点时,编译器能够知道,此处正在调用属性宏(Rust 中一种特殊的宏),因此会开始寻找call属性宏的定义并尝试进行展开。call属性宏的定义如下:

    #[proc_macro_attribute]
    pub fn call(attr: TokenStream, item: TokenStream) -> TokenStream {
        let attrs = parse_macro_input!(attr as AttributeArgs);
        let contract = get_attribute(attrs.clone(), "contract").unwrap().unwrap();
        let function = get_attribute(attrs.clone(), "function").unwrap().unwrap();
        //let payable = contains_attribute2(attrs.clone(), "payable");
    

    属性宏以函数形式定义,其输入是两个标记序列(TokenStream),其输出也是一个标记序列。事实上,在 Rust 语言中,宏可以理解为将某一个 AST 变换到另外一个 AST 的函数。Rust 编译器并不会向属性宏直接传递 AST,而且会将其调用位置所在的语法树节点转换为标记序列传递给属性宏,由属性宏的编写者自行决定如何处理这段标记序列。无论如何处理,属性宏都需要返回一段标记序列,Rust 编译器接收到这段标记序列后,会将其重新编译为 AST 并插入到宏的调用位置,从而完成代码的编译期修改。具体到 Liquid 的call属性宏,当编译器进行展开时,call属性宏会获取到自身及其后跟随的代码块的标记序列,并将其解析为一棵 AST。

  2. 编译器将经过宏展开之后的 AST 编译为可执行文件:若是需要在本地运行单元测试,则会将 AST 编译为本地操作系统及 CPU 所能识别的可执行文件;若是需要能够在链上部署运行,则会将 AST 编译为 Wasm 格式字节码。至此,合约的基本构建流程结束。

        从上述实现原理中可以看出,我们的eDSL 可以理解为是一种以 Rust 语言目标语言的编程语言。在编译器的广义定义中,编译器是一种能够将以某种编程语言(原始语言)书写的源代码转换成另一种编程语言(目标语言)的计算机程序,因此我们的eDSL在一定程度上扮演了编译器的角色。通过屏蔽区块链的底层实现细节,智能合约的开发过程能够更加便利及自然

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1529798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【QT+QGIS跨平台编译】之八十四:【QGIS_Gui跨平台编译】—【错误处理:未实例化QgsMapLayer - QgsHighlight】

文章目录 一、未实例化QgsMapLayer二、错误处理 一、未实例化QgsMapLayer 报错信息: 二、错误处理 第31行修改为: #include "qgsmaplayer.h"

【Web技术应用基础】HTML(2)——文本练习

题目1&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>HTML链接</title><meta name"description" content"HTML链接知识讲解"><meta name"keywords" content&qu…

(undone) 斯坦福机器学习 讨论课4 (分类器评估指标 TODO:暂时不知道内容是啥)

从标题来看这堂课跟评估指标有关&#xff0c;而且是专门针对分类器的评估指标 如下图&#xff0c;解释了 “为什么 metrics 很重要” 1.训练目标 (成本函数) 仅仅是现实世界目标的一个代理 (proxy) 2.理想的训练目标应该是指标 metric&#xff0c;但这并不总是可能的。metric…

Stability AI 3D:开创3D视觉技术新篇章,提升多视角连贯性与生成质量

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

ASPICE规范之系统追溯矩阵

系统追溯矩阵的需求来自 ISO26262 举例在描述系统追溯矩阵时&#xff1a;客户需求->系统需求&#xff1b;系统需求->客户需求&#xff1b;系统需求->软件需求&#xff1b;系统需求->硬件需求

有实际意义的伦敦金交易策略参考

一谈起有实际意义的伦敦金交易策略参考&#xff0c;很多人以为是讨论的是什么飞天遁地的技术&#xff0c;其实这些都是没有实际意义。对普通投资者来说&#xff0c;什么才是有实际意义的呢&#xff1f;那就是生存。要讨论实际有意义的伦敦金交易策略参考&#xff0c;就是投资者…

【计算机网络_网络层】IP协议

文章目录 1. IP的基本概念1.1 什么是IP协议1.2 为什么要有IP协议 2. IP的协议格式3. 网段划分&#xff08;重要&#xff09;3.1 为什么要进行网段划分3.2 网段划分的规则3.2.1 古老的划分方案3.2.2 现代的划分方案 4. 特殊的IP地址5. 解决IP地址的数量限制问题6. 私有IP和公网I…

【视频异常检测】Real-world Anomaly Detection in Surveillance Videos 论文阅读

Real-world Anomaly Detection in Surveillance Videos 论文阅读 Abstract1. Introduction2. Related Work3. Proposed Anomaly Detection Method3.1. Multiple Instance Learning3.2. Deep MIL Ranking Model 4. Dataset4.1. Previous datasets4.2. Our dataset 5. Experiment…

java8:LinkedList的实现原理

概述 先来看看源码中的这一段注释&#xff0c;我们先尝试从中提取一些信息&#xff1a; Doubly-linked list implementation of the List and Deque interfaces. Implements all optional list operations, and permits all elements (including null).All of the operations …

【Linux(1)】Linux的一些基本指令(补充上一篇)

思维导图 学习内容 通过上面的学习目标&#xff0c;我们可以列出要学习的内容&#xff1a; linux的一些指令&#xff1a;cd mkdir cp touch which rm cat alias 一些基本的概念&#xff1a;指令的概念&#xff0c;用户家目录是什么...... 一、Linux的一些指令 1.1 重新认识…

【SpringSecurity】十三、基于Session实现授权认证

文章目录 1、基于session的认证2、Demosession实现认证session实现授权 1、基于session的认证 流程&#xff1a; 用户认证成功后&#xff0c;服务端生成用户数据保存在session中服务端返回给客户端session id (sid&#xff09;&#xff0c;被客户端存到自己的cookie中客户端下…

信息发布系统

特色功能 画布功能---可任意拖动各控件的播放位置及大小&#xff0c;可任意选择屏幕背景色或添加背景图 同步联屏---毫秒级同步功能 视频切换无黑屏 触摸查询系统 会议预定系统 终端显示-会议综合屏 终端显示-会议预定屏 终端显示-移动端 广告发布系统 硬件产品-智能终端 硬件…

[uni-app] uni.createAnimation动画在APP端无效问题记录

文章目录 uni.createAnimation动画描述动画代码templatejs部分 问题原因改进方案template js部分改动git 改进截图 uni.createAnimation 动画描述 实现一个以左上角为锚点,以Z轴做平面抬起及落下的动画效果 动画代码 template <image v-if"showHot(item.cname)&quo…

查找众数及中位数 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 众数是指一组数据中出现次数量多的那个数&#xff0c;众数可以是多个。 中位数只是指把一组数据从小到大排列&#xff0c;最中间的那个数&#xff0c;如果这组数…

Filter and Listener and AJAX and JSON

一、Filter Filter 表示过滤器&#xff0c;是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。&#xff08;拦截指定资源&#xff09; 正常情况下&#xff0c;浏览器可以访问服务器上的所有的资源&…

【机器学习】无监督学习算法之:高斯混合模型

高斯混合模型 1、引言2、高斯混合模型2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.4.1 概率密度函数2.4.2 EM算法之E步骤2.4.2 EM算法之M步骤 2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;给俺讲一讲什么是高斯啊 小鱼&#xff1a;高斯&#xff1f; 小…

苹果意将Gemini引入iPhone;英伟达发布新AI GPU;Grok正式开源

苹果正在谈判将 Gemini 引入 iPhone Mark Gurman 报道&#xff0c;苹果正在谈判将 Google 的生成式 AI 大模型 Gemini 引入 iPhone。 知情人士透露&#xff0c;两家公司正在积极谈判&#xff0c;让苹果获得 Gemini 授权&#xff0c;为今年 iPhone 软件的一些新功能提供动力。苹…

HCIA——30奈奎斯特定理、香农定理

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

Spring Boot 自动化单元测试类的编写过程

前言 Web环境模拟测试 企业开发不仅要保障业务层与数据层的功能安全有效&#xff0c;也要保障表现层的功能正常。但是我们一般对表现层的测试都是通过postman手工测试的&#xff0c;并没有在打包过程中代码体现表现层功能被测试通过。那么能否在测试用例中对表现层进行功能测…

【NLP笔记】RNN总结

文章目录 经典RNN单向RNN双向RNNDeep RNNRNN特性总结 变体RNNLSTMGRU 参考及转载内容&#xff1a; 循环神经网络&#xff08;RNN&#xff09;深度学习05-RNN循环神经网络完全理解RNN&#xff08;循环神经网络&#xff09; 传统的CNN&#xff08;Covolutional Neural Network&am…