两周自制脚本语言

两周自制脚本语言 pdf epub mobi txt 电子书 下载 2025

[日] 千叶滋 著,陈筱烟 译
图书标签:
  • 脚本语言
  • 自制语言
  • 编程入门
  • 编译器
  • 解释器
  • 代码生成
  • 语言设计
  • DIY
  • 编程实践
  • 两周自制
想要找书就要到 静思书屋
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 人民邮电出版社
ISBN:9787115355645
版次:1
商品编码:11479113
包装:平装
丛书名: 图灵程序设计丛书
开本:16开
出版时间:2014-05-01
页数:285
正文语种:中文

具体描述

编辑推荐

  

只需14天,从零开始设计和实现脚本语言

从解释器到编译器,支持函数、数组、对象等高级功能

东京大学&东京工业大学教授执笔

日本编译器专家中田育男作序推荐

内容简介

  《两周自制脚本语言》是一本优秀的编译原理入门读物。全书穿插了大量轻松风趣的对话,读者可以随书中的人物一起从简单的语言解释器开始,逐步添加新功能,最终完成一个支持函数、数组、对象等高级功能的语言编译器。《两周自制脚本语言》与众不同的实现方式不仅大幅简化了语言处理器的复杂度,还有助于拓展读者的视野。
   《两周自制脚本语言》适合对编译原理及语言处理器设计有兴趣的读者以及正在学习相关课程的大中专院校学生。同时,已经学习过相关知识,有一定经验的开发者,也一定能从本书新颖的实现方式中受益良多。

作者简介

千叶滋

东京工业大学研究生院信息技术理工系研究科教授,兼任东京大学研究生院信息技术理工系研究科教授。著有《面向切面入门——从Java语言?面向对象步入AspectJ语言程序设计》《简明Java程序设计——Great Ideas for Java Programming》《GUI库机制——软件设计案例研习》等。

内页插图

精彩书评

  

这是一本优秀的编译原理入门读物,它尝试以一种现代的方式设计一种现代的语言,即使读者对编译器已有一定程度的了解,也一定能从中学到很多。——日本编译器专家 中田育男

目录

目 录

第1部分 基础篇

第1天 来,我们一起做些什么吧 1
1.1 机器语言与汇编语言 2
1.2 解释器与编译器 3
1.3 开发语言处理器 5
1.4 语言处理器的结构与本书的框架 6

第2天 设计程序设计语言 10
2.1 麻雀虽小、五脏俱全的程序设计语言 11
2.2 句尾的分号 12
2.3 含糊不得的语言 14

第3天 分割单词 17
3.1 Token对象 18
3.2 通过正则表达式定义单词 19
3.3 借助java.util.regex设计词法分析器 22
3.4 词法分析器试运行 27

第4天 用于表示程序的对象 30
4.1 抽象语法树的定义 31
4.2 设计节点类 34
4.3 BNF 38
4.4 语法分析与抽象语法树 42

第5天 设计语法分析器 44
5.1 Stone语言的语法 45
5.2 使用解析器与组合子 46
5.3 由语法分析器生成的抽象语法树 53
5.4 测试语法分析器 59

第6天 通过解释器执行程序 62
6.1 eval方法与环境对象 63
6.2 各种类型的eval方法 65
6.3 关于GluonJ 69
6.4 执行程序 72

第7天 添加函数功能 75
7.1 扩充语法规则 76
7.2 作用域与生存周期 81
7.3 执行函数 83
7.4 计算斐波那契数 89
7.5 为闭包提供支持 90
7.6 实现闭包 92

第8天 关联Java语言 95
8.1 原生函数 96
8.2 编写使用原生函数的程序 98

第9天 设计面向对象语言 101
9.1 设计用于操作类与对象的语法 102
9.2 实现类所需的语法规则 103
9.3 实现eval方法 104
9.4 通过闭包表示对象 110
9.5 运行包含类的程序 114

第10天 无法割舍的数组 115
10.1 扩展语法分析器 116
10.2 仅通过修改器来实现数组 119

第2部分 性能优化篇

第11天 优化变量读写性能 123
11.1 通过简单数组来实现环境 124
11.2 用于记录全局变量的环境 127
11.3 事先确定变量值的存放位置 130
11.4 修正eval方法并最终完成性能优化 134

第12天 优化对象操作性能 137
12.1 减少内存占用 138
12.2 能否通过事先查找变量的保存位置来优化性能 141
12.3 定义lookup方法 144
12.4 整合所有修改并执行 147
12.5 内联缓存 152

第13天 设计中间代码解释器 156
13.1 中间代码与机器语言 157
13.2 Stone虚拟机 158
13.3 通过栈实现环境 167
13.4 寄存器的使用 170
13.5 引用变量的值 173
13.6 if语句与while语句 173
13.7 函数的定义与调用 175
13.8 转换为虚拟机器语言 177
13.9 通过虚拟机执行 184

第14天 为Stone语言添加静态类型支持以优化性能 187
14.1 指定变量类型 188
14.2 通过数据类型检查发现错误 193
14.3 运行程序时执行类型检查 204
14.4 对类型省略的变量进行类型推论 208
14.5 Java二进制代码转换 214
14.6 综合所有修改再次运行程序 226

第3部分 解说篇(自习时间)

第15天 手工设计词法分析器 229
15.1 修改自动机 230
15.2 自动机程序 233
15.3 正则表达式的极限 235

第16天 语法分析方式 236
16.1 正则表达式与BNF 237
16.2 语法分析算法 238
16.3 LL语法分析 239
16.4 算符优先分析法与自底向上语法分析 244

第17天 Parser库的内部结构 251
17.1 组合子分析 252
17.2 解析器组合子的内部 252

第18天 GluonJ的使用方法 263
18.1 设定类路径 264
18.2 启动设定 265
18.3 GluonJ语言 267
18.4 功能总结 268

第19天 抽象语法树与设计模式 271
19.1 理想的设计 272
19.2 Interpreter模式 273
19.3 Visitor模式 276
19.4 使用反射 282
19.5 面向切面语言 284

前言/序言

本书是一本编译原理的入门读物。过去,大家普遍认为编译器与解释器之间存在很大的差异,因此会分别编写针对编译器与解释器的图书。不过,最近编译器与解释器之间的界限越来越模糊,我们只要稍微了解一下常见的程序设计语言,就会发现两者已不再是对立的概念。




因此,与其说本书是编译原理的入门书,不如说是语言处理器的入门读物更为恰当。语言处理器是用于执行程序设计语言的软件,它同时包含了编译器与解释器。本书看似用了大量篇幅讲解解释器的原理,其实是在讲解编译器与解释器通用的理论。第1 章将详细介绍各章节的具体内容。




本书采用了Java 语言来实现语言处理器。在设计语言处理器时,C 语言或C++ 语言更为常见,加之本书没有借助yacc 等常用的工具来生成语言处理器,因此读者也许会认为本书的实用性不足。


本书在介绍语言处理器的设计方式时,尽可能采用了较新颖的手段。C 语言或C++ 语言结合yacc 的方式性能较差,且是上世纪80 年代的实现方式。在那之后,程序设计语言飞速发展,已不可同日而语,其运行性能也大幅提升。入门读物也应该与时俱进,讲解与过去不同的设计方式,展现它们的实践价值。




时至今日,软件领域的发展依然日新月异,并逐渐渗透至生活的方方面面,这一势头无疑将持续下去。在此期间,各类技术必将不断发展,为了跟上技术更新的步伐,软件应当以略微领先于时代的设计思路开发。




很久以前,笔者曾使用C++ 语言开发过适用于工作站的语言处理器,当时,时钟频率仅有100 兆赫,内存也不过几百兆字节。那套软件幸运地在各种环境下运行了十年以上。有一天,我收到了一封邮件。我记得好像是一个德国的年轻人,他洋洋洒洒写了很多,批评那套软件的设计有不少问题。还说开发者应当合理使用模板,并灵活运用各种库,要学习使用设计模式,还要用XML 来表示抽象语法树,等等。




他指出我太节省内存,只顾着提升性能,结果程序难以阅读。从当时的主流软硬件标准来看,这些批评确实合情合理,但那套系统毕竟是十年前的产物。在当时软硬件性能孱弱的情况下,如果遵循他的建议,最终完成的语言处理器恐怕会被打上缺乏使用价值的标签(顺便一提,提出批评的那位年轻人虽然说了很多,却没有写一行代码)。




然而,从这件事中我深刻体会到,软件有着惊人的生命力,即使在开发时采用了最佳设计,最终还是会随着时代的进步而被迅速淘汰。因此,前文说软件应当以略微领先于时代的设计思路开发有其合理性。当然,我们也可以不关心他人的批评,尽可能缩短软件的生命周期,并积极抛弃过时的内容。具体采用哪种策略因人而异。


希望读者能够在阅读本书时始终记住这些理念。读过本书之后,如果大家觉得收获良多,我将深感荣幸与喜悦。




2012 年 新春


千叶滋


两周自制脚本语言:探索语言的构建奥秘 “两周自制脚本语言”并非一本关于速成秘籍的浅显读物,它是一次深入探索编程语言核心机制的智力冒险。本书致力于拆解那些我们习以为常的脚本语言,例如Python、JavaScript、Ruby等,将它们的复杂性化繁为简,带领读者一步步理解其背后的逻辑、结构与设计哲学。我们不提供现成的“开箱即用”的模板,而是引导你思考“为什么会是这样?”、“如何才能实现?”。 本书的核心理念是“由内而外”的学习。与其死记硬背各种语法规则和API文档,不如从根本上理解语言是如何被创造出来的。我们将从最基础的概念入手,逐步构建起一个简易但功能完备的脚本语言。这个过程本身就是一种极具启发性的学习体验,它能让你对编程语言产生前所未有的深刻认识。 第一部分:奠定基石——抽象与解析 旅程的开端,我们将从“抽象”这个计算机科学中最基础也最核心的概念谈起。我们将探讨如何将现实世界的问题或指令,通过抽象的方式转化为机器能够理解和执行的形式。这不仅仅是关于代码,更是关于思维方式的转变。 词法分析(Lexical Analysis): 这是语言解析的第一步,我们称之为“词法扫描”或“词源分析”。想象一下,你拿到一篇用自然语言写成的文章,首先要做的是将文章拆分成一个个有意义的“词语”或“符号”。在编程语言的世界里,这一步就是将输入的源代码字符串,分解成一系列不可再分的“标记”(tokens)。这些标记代表着语言的基本组成单元,比如关键字(`if`, `while`, `function`)、标识符(变量名、函数名)、字面量(数字、字符串)、运算符(`+`, `-`, ``, `/`)以及标点符号(`;`, `{`, `}`)。我们将详细介绍如何构建一个词法分析器,它能够识别并生成这些标记流。我们会讨论不同的标记类型、正则表达式在词法分析中的作用,以及如何处理空白符和注释。学习这一部分,你将明白代码是如何从一堆字符变成具有结构性的信息的。 语法分析(Syntactic Analysis): 词法分析将源代码转化为标记流,但这些标记本身并没有描述它们之间的关系。语法分析的使命就是检查这些标记是否符合语言的语法规则,并生成一个能够反映代码结构的“抽象语法树”(Abstract Syntax Tree, AST)。AST就像代码的骨架,它以树状结构组织了代码的逻辑关系,例如函数调用、条件判断、循环语句等。我们将深入讲解上下文无关文法(Context-Free Grammar, CFG)的概念,以及如何使用它来定义一门语言的语法。然后,我们将介绍几种常见的语法分析技术,如递归下降解析(Recursive Descent Parsing)和LL(k)解析。你将学会如何手动构建一个递归下降解析器,它能够识别代码的结构,判断代码是否“正确”,并将代码转化为AST。理解AST的生成过程,是理解代码执行逻辑的关键一步。 第二部分:语言的核心——解释与执行 在成功解析源代码并生成AST之后,我们便进入了语言的核心地带——如何让这棵树“活”起来。这一部分将聚焦于解释器(Interpreter)的设计与实现,这是构建脚本语言最直接、最直观的方式。 环境(Environment)与作用域(Scope): 在程序执行过程中,变量的值和它们所处的“可见范围”至关重要。我们将深入探讨“环境”的概念,它是一个存储变量及其对应值的映射表。同时,我们将解析“作用域”的工作原理,包括全局作用域、函数作用域以及块级作用域等。理解作用域机制,是避免变量冲突、保证程序逻辑正确性的基石。我们将学习如何设计一个能够管理多个嵌套环境的系统,以便正确处理变量的查找和赋值。 求值表达式(Evaluating Expressions): 表达式是构成程序的基本单元,它们计算出值。我们将讲解如何设计一个求值器,它能够遍历AST,并根据运算符的优先级和结合性,递归地计算出表达式的值。这包括算术表达式、逻辑表达式、比较表达式以及函数调用表达式等。你将学习到如何实现短路求值(Short-circuit evaluation)等优化策略,以及如何处理错误情况。 执行语句(Executing Statements): 语句是构成程序的控制流。我们将重点介绍如何设计一个语句执行器,它能够处理各种类型的语句,如赋值语句、条件语句(`if-else`)、循环语句(`while`, `for`)、函数定义与调用语句。我们将深入剖析控制流的转移机制,例如如何实现跳转、退出循环以及函数返回。 构建一个简单的解释器: 在掌握了上述概念之后,我们将动手实践,使用一种已有的编程语言(例如Python或JavaScript)来构建一个功能性的脚本语言解释器。我们将从一个极其简陋的、只能执行简单算术运算的解释器开始,逐步添加变量、表达式、语句、函数等功能。这个过程将是理论结合实践的绝佳范例,你会亲眼看到你所设计的语言如何一步步变得强大。 第三部分:语言的扩展——对象、内存与模块 一个完整的脚本语言往往需要更丰富的功能来支持复杂的应用程序开发。这一部分将探讨一些更高级的概念,它们能够让你的语言更具表现力和实用性。 对象与数据结构(Objects and Data Structures): 现代脚本语言大多支持面向对象的编程范式,或者至少是原型继承。我们将探讨如何设计一个灵活的对象系统,包括属性的访问、方法的调用以及对象的创建。我们将介绍如何实现基本的数据结构,如列表(List)、字典(Dictionary)或哈希表(Hash Table),以及如何在解释器中集成它们。 垃圾回收(Garbage Collection)与内存管理: 随着程序运行,内存的分配与释放是一个至关重要的问题。对于脚本语言而言,自动内存管理(即垃圾回收)是提升开发效率的关键。我们将介绍不同的垃圾回收算法,如引用计数(Reference Counting)和标记-清除(Mark-and-Sweep)算法,并讨论它们各自的优缺点。虽然我们可能不会在本书中实现一个完整的垃圾回收器,但理解其工作原理,对于设计健壮的语言至关重要。 模块与库(Modules and Libraries): 任何强大的语言都离不开模块化和代码重用。我们将探讨如何设计一种机制,允许开发者将代码组织成独立的模块,并在需要时导入和使用。这将涉及模块的查找路径、导入和导出机制,以及如何管理依赖关系。 错误处理与调试(Error Handling and Debugging): 在软件开发过程中,错误是不可避免的。我们将讨论如何在语言设计中考虑错误处理机制,例如异常(Exceptions)的处理。同时,我们将探讨如何为你的语言提供基本的调试支持,例如设置断点、查看变量值等。 谁适合阅读这本书? 对编程语言底层原理感到好奇的开发者: 如果你经常使用脚本语言,但对其工作方式感到困惑,这本书将为你揭开神秘的面纱。 渴望更深入理解编程的爱好者: 通过亲手构建一门语言,你将获得对编程的全新视角和更深刻的理解。 希望设计和实现自己语言的未来开发者: 本书将为你提供坚实的基础和实践经验,助你迈出创造自己语言的第一步。 计算机科学专业的学生: 本书的内容与编译原理、程序语言设计等课程高度相关,是学习这些课程的绝佳补充。 “两周自制脚本语言”并非一本让你在两周内就写出媲美Python的脚本语言的“魔法书”。相反,它是一份邀请,邀请你踏上一段充满挑战但也极具回报的智力探索之旅。在这段旅程中,你将不仅仅学习到如何构建一门语言,更重要的是,你将学会如何思考,如何设计,如何将复杂的概念分解并实现。最终,你将对编程语言这个工具,对计算本身,拥有一个前所未有的透彻理解。这本书将赋能你,让你不再仅仅是语言的使用者,更能成为语言的创造者。

用户评价

评分

初识《两周自制脚本语言》,脑海中浮现的,并非枯燥的代码行,而是那种亲手搭建起一座功能性建筑的成就感。一直以来,我对于“编程”这个词,总带着些许敬畏,觉得那是少数天才的游戏。但这本书的名字,如同一个温暖的邀请,告诉我,原来构建一个属于自己的“小工具”,一个能够替我处理琐碎事务的“脚本”,并非遥不可及。我期待的是,它能像一个循序渐进的向导,带领我一步步揭开脚本语言的面纱,从最基础的概念讲起,比如变量是如何存储信息的,函数是如何封装操作的,再到如何让这些元素相互协作,形成一个完整的逻辑。我希望这本书能提供足够多的实际案例,让我能够一边阅读,一边动手实践,感受代码在指尖跳跃,转化为具体功能的喜悦。哪怕只是一个简单的文件批量重命名工具,或者一个自动整理下载文件夹的脚本,那份“我做到了”的满足感,我想是无与伦比的。我相信,这本书不会仅仅教授我一门语言的语法,更重要的是,它将传递给我一种解决问题的思维方式,一种将复杂任务分解,然后用代码去自动化的能力。这种能力,在如今这个信息爆炸的时代,无疑是一项宝贵的财富。

评分

《两周自制脚本语言》这本书,给我最大的感受就是“赋能”。它让我意识到,原来我也可以成为那个“创造者”,而不是仅仅“使用者”。我不再被动地接受现有的工具,而是拥有了改造和创造工具的能力。在阅读的过程中,我惊叹于作者将那些复杂的编程原理,用如此简练且富有诗意的方式表达出来。例如,对于递归函数的讲解,作者用了一个非常生动的比喻,让我瞬间就理解了它的精妙之处。而对于异步编程的探讨,也让我对程序的运行方式有了更深的认识,不再局限于线性的思维模式。这本书的魅力在于,它不仅仅教授技术,更传递了一种“掌握技术,掌控生活”的理念。它鼓励我去探索,去尝试,去打破界限。我迫不及待地想要将书中学到的知识,应用到我正在进行的一些个人项目中,看看能否让它们变得更智能,更高效。这本书,无疑是我通往更广阔数字世界的一块敲门砖,让我看到了无限的可能性。

评分

阅读《两周自制脚本语言》的过程中,我仿佛置身于一个充满惊喜的实验室。作者巧妙地将那些看似晦涩的编程概念,用一种极为直观且易于理解的方式呈现出来。例如,关于数据结构的讲解,不再是冰冷的图示,而是被比喻成各种日常物品的收纳方式,让我瞬间就能领会其精髓。而控制流的部分,更是如同一个精明的管家,根据不同的指令,做出恰当的决策,让整个脚本的运行流程变得井井有条。我尤其欣赏作者在书中对“调试”这一环节的重视。过去,我总是在代码出错时感到沮丧,无从下手。但这本书教会我,调试并非惩罚,而是探索和理解代码运行机制的绝佳机会,它指导我如何像侦探一样,一步步追踪问题的根源,最终找到解决方案。这种寓教于乐的学习方式,让我在不知不觉中,攻克了一个个技术难关。更重要的是,它培养了我独立思考和解决问题的能力。当遇到新的需求时,我不再盲目地寻求他人的帮助,而是能够主动思考,尝试用脚本语言来解决,这种自信心的提升,是金钱无法衡量的。

评分

《两周自制脚本语言》这本书,对我而言,更像是一把开启创意之门的钥匙。在翻阅的过程中,我脑海中不断闪现出各种可以被自动化的场景:繁琐的数据录入、重复性的报告生成、甚至是日常生活中那些令人厌烦的“小麻烦”。我开始想象,如果我能够掌握脚本语言,就可以将这些耗时耗力的任务,轻松地委托给我的“数字助手”。书中对于不同应用场景的讲解,极大地激发了我的创造力。它不仅仅是教我如何写代码,更是引导我思考“可以用代码做什么”。从自动化办公到简单的网页抓取,再到个人项目管理,每一个章节都像是一扇新的窗户,让我看到更广阔的世界。我期待着能够利用书中学到的知识,为我的工作和生活带来真正的改变。也许是开发一个能够自动监控网站更新的工具,也许是编写一个能够管理我庞大数码照片库的脚本,这些想法,在读完这本书后,似乎都变得触手可及。这种将想象转化为现实的能力,让我对未来充满了期待。

评分

这本书,与其说是一本技术手册,不如说是一位经验丰富的导师,耐心地引导着我从零开始,构建自己的技术体系。《两周自制脚本语言》的结构设计非常合理,每一个知识点都层层递进,确保初学者不会感到 overwhelmed。我喜欢它循序渐进的讲解方式,从最基本的“Hello, World!”开始,逐步深入到更复杂的概念,比如错误处理和模块化编程。作者并没有回避编程过程中可能遇到的坑,而是坦诚地分享了自己曾经的经验和教训,让我能够少走弯路。更让我感动的是,书中提供的那些精心设计的练习题,它们紧密结合了理论知识,让我能够及时巩固所学,并将抽象的概念转化为具体的实践。每一次成功地完成一个练习,都能给我带来巨大的成就感,也让我更加坚定了继续学习下去的信心。这本书不仅仅教会了我如何编写脚本,更重要的是,它让我明白了学习编程并非一蹴而就,而是一个需要耐心、毅力和不断实践的过程。

评分

书的质量很好,印刷精美,京东送货很快。

评分

图书是正版,到货快,我一直相信京东自营的商品,

评分

不错的编译原理入门书,上来就开始写代码,比较适合喜欢实战的人。

评分

书的内容不错,讲的有点浅。

评分

真版,很好,加油。。。

评分

刚highhighhighhighhighhi

评分

非常好的一本书,对于变成不懂编程的人,这不能算是一本启蒙书,但是却是一本入门级别的书。

评分

书是好书,适合新人

评分

刚highhighhighhighhighhi

相关图书

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.idnshop.cc All Rights Reserved. 静思书屋 版权所有