可变目标C编译器:设计与实现

可变目标C编译器:设计与实现 pdf epub mobi txt 电子书 下载 2025

[美] 克里斯多夫W.弗雷泽,[美] 戴维 R.汉森 著,王挺 译
图书标签:
  • 编译器
  • 目标代码生成
  • 优化
  • C语言
  • 程序设计
  • 计算机科学
  • 编译原理
  • 代码生成
  • 可变目标
  • 实现
想要找书就要到 静流书站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 机械工业出版社
ISBN:9787111552581
版次:1
商品编码:12010573
品牌:机工出版
包装:平装
丛书名: 计算机科学丛书
开本:16开
出版时间:2016-11-01
用纸:胶版纸
页数:423

具体描述

内容简介

  本书系统地介绍了可变目标ANSIC编译器lcc的设计方法和实现技术。lcc是一个实用的编译器,能够为不同的目标机器(如MIPSR3000、SPARC、Intel386及其后续产品)生成代码。本书结合lcc的具体实现,详细讲述了存储管理、符号表、词法分析、语法分析、中间代码生成、优化、目标代码产生等编译程序的各个部分。全书共分19章,各章之后均附有练习。本书特色鲜明,实用性强,适合作为高等院校计算机专业的编译原理课程的教材或参考书,对从事编译相关工作的技术人员也有很好的参考价值。

目录

A Retargetable C Compiler: Design and Implementation
出版者的话
译者序
前言
第1章 引论 1
1.1 文本程序 1
1.2 如何使用本书 2
1.3 概述 3
1.4 设计 7
1.5 公共声明 11
1.6 语法规范 13
1.7 错误 14
深入阅读 15
第2章 存储管理 16
2.1 内存管理接口 16
2.2 分配区的表示 17
2.3 空间分配 18
2.4 空间释放 20
2.5 字符串 20
深入阅读 23
练习 23
第3章 符号管理 26
3.1 符号的表示 27
3.2 符号表的表示 29
3.3 作用域的改变 32
3.4 查找和建立标识符 32
3.5 标号 33
3.6 常量 34
3.7 产生的变量 37
深入阅读 38
练习 38
第4章 类型 40
4.1 类型表示 40
4.2 类型管理 42
4.3 类型断言 45
4.4 类型构造器 46
4.5 函数类型 48
4.6 结构和枚举类型 49
4.7 类型检查函数 52
4.8 类型映射 56
深入阅读 56
练习 57
第5章 代码生成接口 59
5.1 类型度量 59
5.2 接口记录 60
5.3 符号 60
5.4 类型 61
5.5 dag操作 61
5.6 接口标志 65
5.7 初始化 67
5.8 定义 67
5.9 常量 69
5.10 函数 70
5.11 接口绑定 72
5.12 上行调用 73
深入阅读 75
练习 75
第6章 词法分析器 77
6.1 输入 77
6.2 单词的识别 81
6.3 关键字的识别 85
6.4 标识符的识别 86
6.5 数字的识别 87
6.6 字符常量和字符串的识别 92
深入阅读 95
练习 95
第7章 语法分析 97
7.1 语言和语法 97
7.2 二义性和分析树 98
7.3 自上而下的语法分析 100
7.4 FIRST和FOLLOW集合 102
7.5 编写分析函数 104
7.6 处理语法错误 106
深入阅读 110
练习 111
第8章 表达式 112
8.1 表达式的表示 112
8.2 表达式分析 115
8.3 C语言表达式的分析 117
8.4 赋值表达式 119
8.5 条件表达式 121
8.6 二元表达式 122
8.7 一元表达式和后缀表达式 124
8.8 基本表达式 127
深入阅读 130
练习 130
第9章 表达式语义 132
9.1 转换 132
9.2 一元操作符和后缀操作符 136
9.3 函数调用 141
9.4 二元操作符 147
9.5 赋值操作 150
9.6 条件操作 154
9.7 常量折叠 156
深入阅读 165
练习 165
第10章 语句 167
10.1 代码的表示 167
10.2 执行点 170
10.3 语句的识别 171
10.4 if语句 173
10.5 标号和goto语句 174
10.6 循环 176
10.7 switch语句 178
10.8 return语句 188
10.9 管理标号和跳转指令 191
深入阅读 194
练习 194
第11章 声明 196
11.1 转换单元 196
11.2 声明 197
11.3 声明符 206
11.4 函数声明符 210
11.5 结构说明符 215
11.6 函数定义 222
11.7 复合语句 229
11.8 结束处理 236
11.9 主程序 238
深入阅读 240
练习 241
第12章 中间代码的生成 243
12.1 消除公共子表达式 244
12.2 构建节点 248
12.3 控制流 250
12.4 赋值语句 256
12.5 函数调用 259
12.6 强制计算顺序 261
12.7 驱动代码生成 263
12.8 删除多次引用的节点 267
深入阅读 272
练习 273
第13章 构造代码生成器 275
13.1 代码生成器的组织 276
13.2 接口扩展 277
13.3 上行调用 279
13.4 节点扩展 280
13.5 符号扩展 282
13.6 帧的布局 284
13.7 生成块复制的代码 287
13.8 初始化 289
深入阅读 290
练习 290
第14章 选择和发送指令 291
14.1 规范 292
14.2 标记树 294
14.3 化简树 295
14.4 代价函数 302
14.5 调试 303
14.6 发送器 304
14.7 寄存器定位 309
14.8 指令选择的协调 313
14.9 共享规则 314
14.10 编写规范 315
深入阅读 316
练习 316
第15章 寄存器分配 318
15.1 组织结构 318
15.2 寄存器状态跟踪 319
15.3 寄存器分配 322
15.4 寄存器溢出 327
深入阅读 334
练习 334
第16章 MIPS R3000代码的生成 335
16.1 寄存器 336
16.2 指令的选取 339
16.3 函数的实现 349
16.4 数据的定义 355
16.5 块的复制 359
深入阅读 360
练习 360
第17章 SPARC代码的生成 362
17.1 寄存器 363
17.2 指令的选取 366
17.3 函数的实现 378
17.4 数据的定义 384
17.5 块的复制 386
深入阅读 387
练习 387
第18章 X86代码的生成 389
18.1 寄存器 390
18.2 指令的选取 394
18.3 函数的实现 407
18.4 数据的定义 409
深入阅读 412
练习 412
第19章 回顾 413
19.1 数据结构 413
19.2 接口 414
19.3 句法和语义分析 415
19.4 代码生成和优化 416
19.5 测试和验证 416
深入阅读 417
参考文献 419

前言/序言

  前  言  A Retargetable C Compiler: Design and Implementation  编译器是程序员使用的关键工具,程序员每天都在使用编译器,并且非常依赖于其正确性和可靠性。编译器必须接受程序语言的所有标准定义,以便源代码可以实现跨平台的可移植性。编译器必须生成高效的目标代码,但更重要的是,编译器必须生成正确的目标代码,只有可靠的编译器才能生成可靠的应用程序。   编译器本身是一个大而复杂的应用程序,值得我们深入分析研究。本书介绍了ANSI C语言编译器lcc的大部分实现,对编译器的介绍方式与B. W. Kernighan和P. J. Plauger合著的《Software Tools》(Addison-Wesley,1976)一书对文本处理(例如文本编辑和宏处理)的介绍类似。研究实用的工具软件,是学习软件设计和实现技术的最好方法。本书在代码级详细介绍了一个实用的编译器,该编译器的完整源代码可在ftp.cs.princeton.edu(128.112.152.13)服务器的pub/lcc目录下,通过匿名ftp服务得到。   lcc不是一个研究系统,而是一个实用的编译器产品。从1988年开始,lcc就用于编译实际程序,现在每天都有数百名C程序员在使用它。由于本书详细分析了lcc编译器的设计与实现,因此用于介绍相关支撑材料的篇幅较少,仅展示了涉及的理论知识,而更为系统的编译技术的介绍可以参见其他教材。本书有意省略一些涉及琐碎和重复实现的语言特征,而将这部分内容作为练习。   显然,本书将使读者对编译器的构造有更多的了解。然而只有少数程序员需要了解编译器的设计与实现,大多数程序员从事的是应用程序或其他系统程序的开发。但是,基于以下4个原因,大多数C程序员都可以从本书中受益。   第一,一般来说,如果程序员能够理解C编译器的工作原理,通常可以成为较好的程序员,特别是较好的C程序员。编译器设计者必须全面准确地理解C语言的每一个特性,程序员通过学习这些特性的实现,能够更好地掌握语言本身及其在现代计算机上的高效实现。   第二,大多数程序设计教材都是通过一些精简的示例来说明编程技巧的,但大多数程序员都是在从事大型程序的开发,在开发过程中需要不断修改程序,很少有带详细说明的示例可以作为大型程序设计的参考。lcc不是完美的,但是本书详细说明了该程序的优缺点,可以作为大型程序开发的参考。   第三,编译器是计算机科学中理论与实践相结合的最好典范。lcc展示了理论与实践的相互作用及其精美的结果,展示了实践需求牵引理论的发展,这些都可以清楚地从代码中找到。通过一个真实的程序来研究这些相互作用,可以帮助程序员理解何时、何地以及如何运用不同的技术。此外,lcc也阐明了众多的C编程技术。   第四,这本书本身是一个文本程序(literate program),如同D. E. Knuth所著的《TeX: The Program》(Addison-Wesley,1986)一样,本书包括lcc的源代码及说明。为了方便读者理解,本书并未按源程序的顺序对程序代码进行讲解,而是有意进行了调整。   无论是对于在校学生还是专业技术人员,本书都非常适合自学使用。本书为lcc提供了说明完整的源代码,希望进行编译技术实践的人员,以及在需要使用或实现基于语言的工具和技术的应用领域(如用户接口)中工作的专业人员,将会对本书感兴趣。lcc的相关信息可通过以下地址获得:www.cs.princeton.edu/software/lcc。   本书全面而真实地展示了一个大型软件系统,可作为软件工程课程的分析实例。   对于编译课程来说,本书弥补了传统编译教材的不足。本书介绍了C编译器的一种实现方法,而传统教材主要介绍编译过程中遇到的各种问题的解决算法,因此传统教材受篇幅限制只能介绍一些实验性的编译器,代码生成也通常面向较高的级别,以避免与具体的机器相关。   因此,许多教师要求学生完成接近实际的编译器项目,使学生获得实践经验。通常,教师必须从头开始编写编译程序,而学生复制其中的大部分,修改后利用其余的部分。然而,由于编译器只是实验性的,文档往往显得不够充分,这种情形使教学双方都不满意。本书通过对一个实际编译器的大部分程序进行文档说明,并提供源代码,为教师提供了一种新的选择。   本书介绍了完整的代码生成器,代码生成面向MIPS R3000、SPARC和Intel 386及其后续体系结构等不同的平台。本书利用了最新的研究成果,根据目标机器的紧缩规范(compact specification)生成代码生成器。这些方法使得我们能够针对多种机器展示完整的代码生成器,这是其他书籍无法做到的。通过介绍多个代码生成器,既避免了本书依赖于单一的机器,又有助于学生了解如何设计可变目标的软件。   教师布置的作业可以是增加编译器接受的语言特征、优化、改变目标机器等。本书如果与传统教材配合使用,也可以要求学生使用不同的算法代替现有的模块作为实践作业。如果以实现一个实验编译器作为实践作业,则可能在低级基础结构和重复的语言特征上花费大量的时间。采取上述方法,就能够更接近实际的编译器工程实践。本书的许多练习都涉及编译器工程问题。
可变目标 C 编译器:设计与实现 简介 本书深入剖析了现代编译器设计中的核心挑战之一——可变目标(Retargetable)编译器的构建。在软件开发日新月异的今天,代码需要在各种异构硬件平台、操作系统环境以及指令集架构上高效运行,这使得传统的、针对单一固定目标的编译器显得力不从心。可变目标编译器应运而生,它通过将前端(前端负责词法分析、语法分析、语义分析等,生成中间表示)与后端(后端负责将中间表示转化为特定目标的机器码)解耦,极大地提升了编译器的灵活性和可移植性。 本书并非详述某一款具体的 C 编译器(例如 GCC 或 Clang)的内部实现细节,而是聚焦于构建可变目标 C 编译器所必需的设计思想、核心算法和关键技术。我们将从编译器理论的基础出发,逐步构建一个能够支持多后端输出的 C 编译框架。本书的叙述将严谨且系统,旨在为读者提供一个坚实的理论基础和实践指导,使他们能够理解并亲手设计和实现自己的可变目标 C 编译器。 核心内容概述 本书的内容组织围绕着“可变目标”这一核心概念展开,详细阐述了如何将编译过程分解为独立的、可替换的组件。 第一部分:编译基础与中间表示 编译器架构概览: 我们将首先介绍编译器的通用架构,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段。在此基础上,重点讲解如何通过引入中间表示(Intermediate Representation, IR)来实现编译器的可变目标特性。IR 的选择和设计对于编译器后端的设计至关重要,我们将探讨不同类型的 IR(如三地址码、静态单赋值形式 SSA、抽象语法树 AST 等)的优缺点,以及如何设计一种灵活且易于优化的 IR。 词法分析与语法分析: 虽然这些是编译器构建的通用步骤,但我们将着重讨论如何设计这些组件,使其能够与后端无关。例如,如何定义一套通用的标记(tokens)和语法规则,以便后续的语义分析和中间代码生成。 语义分析: 这一阶段负责理解程序的含义,进行类型检查、作用域解析、变量声明检查等。我们将重点关注如何将与目标平台相关的语义信息(例如,类型在不同平台上的大小和对齐要求)抽象出来,以便在后端处理。 中间表示(IR)的设计与实现: 这是本书的核心之一。我们将深入探讨几种典型的 IR,包括但不限于: 基于抽象语法树(AST)的 IR: 易于理解和生成,但对于全局优化和代码生成可能不够高效。 三地址码(Three-Address Code, TAC): 结构清晰,便于进行数据流分析和过程间分析。 静态单赋值(Static Single Assignment, SSA)形式: 极大地简化了许多优化算法,是现代编译器优化的基石。我们将详细介绍如何将代码转换为 SSA 形式,以及 SSA 形式带来的优势。 指令集无关的 IR: 强调 IR 的抽象性,使其能够独立于任何特定的指令集架构。我们将讨论如何设计一种能够表示高级语言结构,同时又能高效转换为各种低级机器指令的 IR。 第二部分:可变目标设计与后端架构 解耦前端与后端: 本部分将深入阐述如何通过 IR 实现前端与后端的彻底解耦。前端负责生成 IR,而后端则负责将 IR 翻译成特定目标平台的机器码。这种解耦使得我们可以为同一个前端编写多个不同的后端,从而轻松支持新的硬件平台。 后端的设计原则: 我们将讨论设计一个可变目标后端所需要考虑的关键原则,包括: 指令选择(Instruction Selection): 如何将 IR 中的操作映射到目标平台的机器指令。我们将探讨基于模式匹配(Pattern Matching)的方法,以及如何处理复杂的指令组合。 寄存器分配(Register Allocation): 如何有效地利用目标平台的寄存器资源,以减少访存次数,提高程序执行效率。本书将介绍经典的图着色算法,以及线性扫描等更现代的寄存器分配技术,并讨论它们在可变目标环境下的适应性。 指令调度(Instruction Scheduling): 如何重新排列指令的顺序,以充分利用处理器流水线,隐藏延迟,提高性能。我们将讨论静态调度技术,以及如何考虑目标平台的具体微架构特性。 代码生成(Code Generation): 将经过优化的 IR 最终转化为目标平台的汇编代码或机器码。 目标平台抽象层: 为了支持不同的目标平台,我们需要一个清晰的抽象层来描述目标平台的特性。我们将讨论如何定义这样一个抽象层,包括: 指令集描述: 如何表示目标平台的指令集,包括指令格式、操作数、寻址模式等。 寄存器模型: 如何描述目标平台的寄存器集合,包括通用寄存器、特殊用途寄存器、寄存器大小和类型等。 内存模型: 如何描述目标平台的内存访问特性,包括地址空间、对齐要求、缓存模型等。 调用约定(Calling Conventions): 如何处理函数调用、参数传递、返回值以及栈帧的布局。 后端的实现技术: 我们将详细介绍实现可变目标后端的各种技术和算法。例如,如何为不同的指令集架构构建指令选择器,如何为不同处理器模型实现高效的寄存器分配器,以及如何进行针对特定微架构的指令调度。 第三部分:代码优化与高级主题 与目标平台无关的优化: 我们将介绍那些可以在 IR 级别进行的、不依赖于具体目标平台的优化技术,例如: 常量折叠(Constant Folding)与传播(Propagation): 预先计算常量表达式的值。 代数简化(Algebraic Simplification): 利用代数定律简化表达式。 死代码消除(Dead Code Elimination): 移除永远不会被执行的代码。 公共子表达式消除(Common Subexpression Elimination): 避免重复计算相同的表达式。 与目标平台相关的优化: 本部分将重点关注那些需要考虑目标平台特性的优化技术,例如: 循环优化(Loop Optimizations): 包括循环展开(Loop Unrolling)、循环外提(Loop-Invariant Code Motion)等,旨在提高循环的执行效率。 内联(Inlining): 将函数调用替换为函数体,以减少函数调用的开销。 延迟槽填充(Delay Slot Filling): 对于某些具有延迟槽的处理器(如 MIPS),如何利用延迟槽来隐藏指令延迟。 SIMD 优化: 如何利用单指令多数据(SIMD)指令集来加速向量化计算。 高级主题与未来方向: 即时编译(Just-In-Time Compilation, JIT): 探讨如何将可变目标编译器的思想应用于 JIT 编译,以在运行时动态生成优化代码。 领域特定语言(DSL)编译器: 讨论如何利用可变目标编译器的框架来构建针对特定领域的编译器。 编译器性能调优: 分享提升编译器整体性能和生成代码质量的实践经验。 现代编译器工具链集成: 简要介绍如何将自行设计的编译器集成到现有的开发工具链中。 本书特色 理论与实践并重: 本书不仅提供深入的理论讲解,还通过详细的算法描述和伪代码示例,帮助读者理解具体实现。 系统性强: 内容组织严谨,从基础概念到高级主题,层层递进,构建完整的知识体系。 高度抽象: 避免陷入特定工具的细节,专注于可变目标编译器的通用设计思想和核心技术。 启发性: 鼓励读者思考和探索,为构建自己的编译器提供坚实的基础。 读者对象 本书适合以下读者: 对编译器设计原理感兴趣的计算机科学专业学生。 希望深入理解编译器内部工作机制的软件工程师。 需要开发或修改编译器,尤其是在异构计算环境中工作的开发者。 对编程语言实现、系统软件或嵌入式系统开发有深入追求的研究人员。 通过本书的学习,读者将能够掌握构建和理解可变目标 C 编译器的关键技术,为应对日益复杂的软件开发环境打下坚实的基础。本书将带领您穿越编译器的核心,探索如何让代码在不同世界自由穿梭。

用户评价

评分

我最近淘到一本名为《可变目标C编译器:设计与实现》的书,它的厚重感和标题所蕴含的技术深度,瞬间就勾起了我探索的欲望。作为一个对计算机科学底层原理有着强烈好奇心的读者,我一直对编译器这个复杂而精密的系统着迷。过去接触过的编译原理资料,虽然有启发,但总感觉缺少一个能够系统性地、深入地讲解“如何构建”一个编译器的实践性读物。而“可变目标”这个词,则让我联想到它能够生成适用于不同硬件架构的代码,这是一种多么强大的能力!我非常期待书中能够详细解析编译器设计的各个阶段,从词法分析、语法分析到语义分析,再到中间代码生成和优化,最后是目标代码生成。特别是针对“可变目标”的设计,我希望能够深入了解它背后的架构思想,是如何通过一种灵活的中间表示来适配各种不同的CPU指令集和特性。这本书,我期待它能成为我理解软件生命周期中,从源代码到可执行程序的转换过程的百科全书。

评分

《可变目标C编译器:设计与实现》这本书,从书名本身就透露出一股强大的技术气息,仿佛预示着一场深入的探索之旅。我一直对编译器的工作原理非常感兴趣,但很多时候,市面上的一些书籍要么过于理论化,要么过于局限于特定平台。这本书的“可变目标”这几个字,恰恰戳中了我的痛点。我非常想知道,如何才能设计一个如此灵活的编译器,能够将同一份C代码,编译成适配于不同CPU架构、不同操作系统环境的机器码。这其中一定涉及到了非常精妙的设计思想和工程实践。我希望这本书能够详细讲解编译器前端(如词法分析、语法分析、语义分析)是如何工作的,以及如何将这些信息转化为一种通用的中间表示。更重要的是,我期待书中能够深入剖析后端(代码生成、优化)是如何实现对不同“目标”的适配,是否会涉及一些现代编译器的设计模式,例如基于LLVM的架构。这本书,对我来说,不仅仅是学习知识,更是一种对底层软件工程的致敬。

评分

这本《可变目标C编译器:设计与实现》的封面设计就充满了学术和技术的严谨感,一种沉甸甸的分量扑面而来。我拿到这本书的时候,就被它厚实的纸张和精炼的排版所吸引。我并非C语言的深度开发者,更多的是出于对编译原理的好奇,以及对“可变目标”这个概念的浓厚兴趣。在我看来,编译器的设计往往是软件工程中最具挑战性的部分之一,它像是一座精密的机器,将人类可读的代码转化为机器能懂的语言。而“可变目标”这个词,则让我联想到在不同的硬件架构、操作系统甚至运行环境中,同一份C代码能够“变形”以适应,这其中的复杂度和智慧该是如何令人神往。我期待这本书能像一位经验丰富的老师,循序渐进地揭示编译器的内部运作机制,特别是如何处理那些针对不同“目标”的适配与转换。我希望它能用清晰的逻辑和翔实的案例,带领我穿越抽象的编译流程,领略前端解析、中间表示生成、后端代码优化的每一个环节。尤其是对于“可变目标”这一核心概念,我希望书中能深入剖析其背后的设计哲学和实现策略,是否涉及到某种通用的中间表示,以及如何高效地生成针对特定目标的机器码。这本书的价值,在我看来,将不仅仅在于技术上的学习,更在于理解软件如何在底层进行生命力的传递。

评分

当我在书店看到《可变目标C编译器:设计与实现》时,内心涌起的是一种久违的求知欲。我是一名有着多年编程经验的开发者,虽然日常工作中主要使用高级语言,但对于编译过程的原理一直有着浓厚的兴趣,总觉得少了对这部分知识的深入理解,就好像隔着一层纱看世界。特别是“可变目标”这个概念,让我觉得这本书可能不仅仅是讲述一个静态的编译流程,而是探讨如何构建一个能够适应不同环境的动态生成器。我猜测书中会对诸如LLVM这样的现代编译器架构有所涉及,它如何通过多层级的中间表示来实现对不同目标平台的灵活性支持。这本书的“设计与实现”这几个字,预示着它会深入到编译器内部的架构设计,以及具体的代码生成策略。我期待它能详细讲解如何解析C语言的语法,如何进行语义分析,以及最重要的,如何将这些抽象的概念转化为各种CPU架构能够理解的机器指令。这本书,我希望能成为我理解软件底层运作机制的一把钥匙,让我能够更自信、更深入地去探究那些隐藏在代码之下的奥秘。

评分

我最近入手了《可变目标C编译器:设计与实现》,说实话,这本书的标题就已经牢牢抓住了我的眼球。我一直对底层的计算机科学知识充满热情,而编译器无疑是连接高级语言和硬件的桥梁。过去,我接触过一些编译原理的课程,但总感觉碎片化,缺乏一个系统性的、能够深入钻研的读物。《可变目标C编译器:设计与实现》这个名字,恰恰点出了我一直想要探索的深度——如何设计一个能够适配多种“目标”平台的C编译器。这不像是一些通用的编译器书籍,更多的是针对某种特定架构进行讲解,这本书的“可变性”暗示着一种更具普遍性和灵活性的设计思路。我设想着,书中应该会详细阐述如何将C语言的抽象语法树有效地转化为多种目标架构的汇编代码,这其中涉及到多少精巧的设计和权衡?会不会有关于如何处理不同指令集、寄存器分配、以及针对特定优化技术的讨论?我非常好奇书中对于“实现”部分的着墨,是会给出具体的算法伪代码,还是会引导读者去理解设计背后的思想,从而能够举一反三,触类旁通。我相信,通过阅读这本书,我能够更深刻地理解C语言的本质,以及编译器技术在现代软件开发中所扮演的关键角色。

评分

了解一下编译器的实践

评分

相信京东品质,物流速度快,质量有保证。

评分

物美价廉,体验还不错的

评分

正版图书,印刷质量特别好

评分

书不错,刚收到,备用,正版速度快

评分

东西好,质量不错,很好用

评分

纸质太薄了,从前面能看到后面!

评分

书不错,买来作为技术储备,以后有时间了慢慢看。。。。。。。。。。。。。。

评分

不错哦!加油!

相关图书

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

© 2025 book.coffeedeals.club All Rights Reserved. 静流书站 版权所有