笔记-编程语言实现模式(Language Implementation Patterns)

news2024/11/20 3:26:24

第1章 语言应用初探 Lanugage Applications Cracked Open

1.1 大局观 The Big Picture

主要思想:文件读取部分对输入内容进行“识别”,并输出数据结构作为中间表示(intermediate representation,IR),供其他部件使用。流水线的末端是生成器,会根据IR及之前所收集到的信息进行计算,并输出最终所需的结果。那么这之间的过程就是进行语义分析。

图形地址:ProcessOn Flowchart

1.2 模式概览 A Tour of the Patterns

  • 解析输入语句:解析输入内容的结构

    • 2、3章文件读取器所涉及的模式

    • 还会对文法进行一些讲解(用形式语言描述的),跟解释器识别语言的原理有关

      • 第一种模式根据文法手工编写解析器:ANTLR(或类似的解析器、生成器 www.antlr.org)可以自动实现这个功能

      • 简单的输入组件,模式二和模式三可以识别输入语句

      • 模式四:增加每次读入字符的个数,解析器的解析能力会得到提高

      • 模式五:更复杂情况,解析器得读入整个语句才能解析

      • 模式六:回溯法,解析能力强大,但运行效率较低

      • 模式七:最强大的解析能力,谓词解析器能根据运行时的信息进行动态调整,切换到正确的解析流上

  • 构建语法树:为避免重新解析输入流,可以生成一些数据结构作为IR

    • 模式八:第一个有关树的模式。解析树中含很多无用信息。如果要编写源代码分析器或者翻译器等应用,通常会采用抽象语法树(abstract syntax tree, AST),主要考虑遍历树的方式(前中后序等等)

    • 模式九:所有节点都用同种类型表示

    • 模式十:多类型节点

    • 模式十一:异型节点

  • 遍历树:树的遍历方法选择

    • 模式十二:把方法内置于每个节点的类中

    • 模式十三:把方法封装在外部访问者里

    • 模式十四、十五:使用工具自动生成访问者,就像自动生成解析器一样

  • 弄清输入的含义:要想生成有用的输出结果,就必须分析输入内容,以获取相关的信息(语义分析),符号表。符号表所采用的的模式取决于语言的语义规则。

    • 模式十六:单一作用域规则

    • 模式十七:嵌套作用域规则

    • 模式十八:C结构体作用域规则

    • 模式十九:类作用域规则

    • 模式二十、二十一:为类C/C++语言打好基础

    • 模式二十二:类C语言非面向对象语言处理

    • 模式二十三:类C++语言面向对象语言处理

  • 解释输入语句:解释器能运行IR中的指令,但一般也要使用符号表之类的数据结构

    • 模式二十四、二十五、二十七、二十八:从作用上来说等价,常见的解释器模式,只是在指令集、运行效率、交互性、易用性及实现的难度上存在差异

  • 翻译语言:任何翻译器的末端都是生成器,能产生结构化的文本或者二进制数据

    • 模式二十九:模型驱动领域方法、模版引擎(逆解析器等,如书中的StringTemplate www.stringtemplate.org)

1.3 深入浅出语言应用 Dissecting a Few Applications

字节码解释器

用软件模拟出硬件处理器,因此也被称作虚拟机。指令集比较底层,但是没有机器代码那么底层。指令集里的指令往往用一个字节(能表示0到255之间不同的整数)就能表示,因此又称为字节码。

包括Java、Lua、Python、Ruby、C#和Smalltalk在内的语言都采用字节码解释器来实现。Lua实现方式采用模式二十八,其他几个用的是模式二十七。在1.9版本以前,Ruby实现方式类似于模式二十五。

Java差错程序1

本例的语义分析中,需要遍历IR两次,第一次记录所有的符号(标识符),第二次找出所有等号两边一样的赋值语句。

大部分文件的读取都分为两个阶段,首先把输入的字符流分成基本符号,即词法单元,之后用语法解析器检查词法单元的语法。在这个例子里,词法分析器(有些书中也称lexer)会输出如下符号流: ... void setX ( int y ) { ...

语法解析器一边进行语法扫描,一边构建IR。

Java差错程序2

Java编译器输出.class文件,里面是序列化的符号表和AST。使用字节码工程库(byte code engineering library,BCEL)或类似的class文件读取器,就可以直接载入.class文件并分析,而不用自己编写源代码读取器了(实际上,FindBugs就用了这种方式)。图1.5所示的是这种方法的流水线图。(略)

javac也是编译器,其基本原理与传统的C语言编译器的一样。唯一的区别就是C编译器最终会把代码翻译为某个特定平台上的指令。

C编译器

预处理=>加行号的C代码=>编译器处理=>输出汇编代码(机器码的文本助记符)=>汇编器生成最终的二进制机器码

gcc 命令后加上参数-S,就可以把tmp.c编译成汇编代码(tmp.s),而不直接生成机器码。再使用as命令,就可以得到目标文件tmp.o: as -o tmp.o tmp.s(#把tmp.s汇编为tmp.o)

C编译器的流水线:

编译器最复杂的地方是语义分析和优化。

借助C编译器实现C++语言

Bjarne Stroustrup使用了已有的C编译器来完成对C++的编译。

具体来说,他只编写了翻译器(cfront),能把C++翻译成C,而没有编写真正的C++编译器。

由文件读取器、语义解析器和生成器组成。

1.4 为语言应用选择合适的模式 Choosing Patterns and Assembling Applications

程序员常做的两件事:一是实现某个DSL,二是处理或者翻译GPPL(General-Purpose Programming Language,是指类似C、Java等功能较为完备的编程语言)。换言之,程序员可能得实现某种制图语言或者数学语言,但很少需要编写大型程序语言的编译器或解释器。通常所遇到的任务不外乎是编写一些重构、格式调整、度量软件、错误查找、插桩或者翻译语言的工具。

编译器用到的模式,往往也是实现DSL甚至GPPL所需要的关键模式。比如符号表管理模式,几乎所有语言应用都以之为基础。

语言应用中,最基本的架构就是将词法分析模式和语法分析模式组合起来,这是模式二十四和二十九的核心。

另一个基本架构会对输入进行分析并构建AST(通过解析器来构造树),而不会对其进行实时处理。构建好AST之后,就可以对输入的内容进行多次遍历,而不用重复解析,这是比较高效的作法。比如模式二十五的while每次都会重新访问AST节点。

第2章 基本解析模式 Basic Parsing Patterns

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

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

相关文章

制造业为什么要数字化?

制造业数字化,主要包含以下一些因素,有优势也有缺点: 制造业数字化的优势: 提高效率:数字化允许各种制造过程自动化,可以提高效率并降低成本。可以缩短生产时间、减少浪费并提高生产率。 增强质量控制&am…

毛泽东《浪淘沙·北戴河》气势磅礴

毛泽东《浪淘沙北戴河》气势磅礴 https://baijiahao.baidu.com/s?id1662486888860973345&wfrspider&forpc 毛主席因其身份地位以及独特的人生经历,在诗词创作中有他人难以企及的气概。今天我们再在欣赏他的一首《浪淘沙北戴河》,这首词第一句便…

Node.JS环境,Express服务器实现GZIP压缩传输

Node.js是一种基于Chrome V8 JavaScript引擎的开源、跨平台而且异步事件驱动的运行时环境,可以让JavaScript代码在服务器端运行。Express是一个流行的Node.js框架,它提供了简单而强大的工具来创建Web服务器和API。 这篇文章将介绍如何使用Node.js和Expr…

关于说服(一)-反抗机制

首先有一个原则:没有人喜欢被改变 不好的话术反而会引起别人的抵触心理 为避免触发反抗机制,可以稍微改变一下话术:将 “你应该” 改为 “我需要”** 没人喜欢说教者 说教者常用句式 1 你为什么不肯去试一试 ->(隐喻) 你在逼别人复习反…

[CryptoHack] Public-key Cryptography Partial Solutions

文章目录 FactoringMonoprimeManyprimeSalty Factoring So far we’ve been using the product of small primes for the modulus, but small primes aren’t much good for RSA as they can be factorised using modern1 methods2. What is a “small prime”? There was a…

汽车毫米波雷达的规定和标准(四)

01 — 虚警漏警问题 工信部无2021【181】号文件中,是这样定义的“虚警”:虚警是指在规定的条件下,实际目标不存在而雷达探测判为有目标的事件。虚警与虚假信号相关,下图中产生的虚警现象是由于干扰信号的功率超过检测门限导致。…

ResearchRabbit.ai: 学术论文摘要研究工具

【产品介绍】 ResearchRabbit是一个帮助研究人员发现、跟踪和分享学术论文的平台。可以根据你的兴趣和收藏提供个性化的推荐和摘要,并且可以让你可视化论文和作者之间的网络关系。 Researchrabbit.ai是一个基于人工智能的文献搜索和管理工具,它可以帮助你…

Speechify: 在线文本转语音(TTS)网站

【产品介绍】 Speechify是一个基于人工智能技术的在线文本转语音(TTS)网站,可以让用户把任何文本转换成自然流畅的语音,从而提高阅读效率和理解能力。 Speechify有多种平台的应用,包括Chrome扩展、iOS应用、Android应用…

Prompting Learning在CV领域的进展

始于NLP prompt介绍 简单来讲,Prompt就是对原来的输入文本进行一定的处理,使得在不改变预训练模型参数的情况下,相应任务的性能变高。例如,原输入文本为:I received the offer from ETH. ,对于文本分类&a…

Unity3D介绍和VR领域的使用说明

目录 Unity3D介绍 Unity3D 是否能用在VR游戏开发? Unity3D 跟虚幻引擎比,优缺点? Unity3D 可以开发微信游戏小程序吗? Unity3D可以自学吗? Unity3D视频分享图 Unity3D介绍 Unity3D是一种跨平台游戏引擎&#xff…

会声会影2023帧率在哪里设置 会声会影2023怎么改帧率

对于帧率的概念,可能大家会比较陌生。在会声会影编辑视频时,我们一般会选择与素材相同的参数设置。因此,很少会去单独设置视频帧率。本文会给大家介绍一下帧率的概念,以及会声会影帧率在哪里设置,会声会影2023怎么改帧…

数智财资,智慧金融 用友联合工行青海分行举办主题论坛圆满落幕

2023年5月10日,用友网络联合中国工商银行青海省分行于青海西宁举办的“数智财资,智慧金融——工行财资云助力企业构建一流财资体系”主题论坛圆满落幕。金融机构领导,行业财资专家,各企业领导、财务负责人齐聚一堂,分享…

apple pencil一定要买吗?平价好用的电容笔合集

这些年来,iPad已经成为了很多人的首选。而iPad的使用者,更看重的是它的功能,很多人都会选择电容笔搭配来做笔记。实际上,Apple Pencil还有许多其他版本,如果只是为了记笔记,那么你不需要买一支价格不菲的苹…

图片转为base64格式的优缺点分析

1. 优点 (1)网页中使用base64格式的图片时,不用再请求服务器调用图片资源,减少了服务器访问次数。 (2)base64编码的字符串,更适合不同平台、不同语言的传输; (3&#…

【源码解析】SpringBoot接口参数校验原理

使用示例 入门 web接口 RestController public class HelloController {PostMapping("/t1")public void t1(Validated RequestBody Request request) {System.out.println(11);} }实体类 Data public class Request {NotEmpty(message "title不为空")…

Qwik 1.0 发布,全栈式 Web 框架

Qwik 是一个全栈式 Web 框架,Qwik 基于 React、Angular 和 Vue 等其他 Web 框架的概念,但以 JavaScript 流等更新的方法脱颖而出,允许以高性能向用户交付复杂的 Web 应用程序。 随着 Web 应用程序变得越来越大,它们的启动性能会下…

百度文心一言在国产模型中倒数?我看懵了

最近几天,我们公众号的社群在纷纷转发一张名为SuperClue 评测的截图。科大讯飞甚至在官号进行了宣传: 由于讯飞星火大模型刚发布,笔者玩的少,它是不是真的是国产最强这个笔者不敢下结论。 各个大模型的研究测试传送门 阿里通义千问…

揭开Facebook数据抓取的面纱,深入了解其运作机制

在互联网时代,数据是一切的基础。而社交媒体作为数据存储与传输的重要渠道,其数据价值不言而喻。 那么,Facebook数据抓取是如何进行的呢? 1.API接口 首先,我们需要了解一些基本的概念。Facebook的API(Ap…

微服务#2 Feign 和 Gateway

一. Feign Feign远程调用 Feign的使用步骤 引入依赖 <!--feign客户端依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> 添加Ena…

数组和指针

文章目录 指针和数组指针为什么要有指针如何理解编址指针的内存布局指针解引用如何将数值存储到指定的内存地址栈随机化 数组数组的内存布局&a[0] VS &a步长问题 指针和数组无关C为何要这样设计 指针数组和数组指针数组元素个数是否是数组类型的一部分?是地址的强制转…