术语概要

  本文档概述及约定 YSLib 基本的概念含义,主要用于开发

项目管理

依赖(dependency) 管理

  项目管理的客体被分解为特定关联的依赖项。任意两个依赖项之间存在反对称传递二元关系称为依赖关系严格依赖关系是反自反的依赖关系。

  依赖项和依赖项之间的严格依赖关系统称为依赖

依赖引用

  因为依赖关系的传递性,多个依赖关系可能存在无法满足严格依赖关系的情形,即循环依赖。这导致以确定的顺序解析依赖不可行,增加维护成本。

  为了避免一定层次上的循环依赖,以该层次内组件为顶点的依赖关系的关系图应明确组织为有向无环图。 在最简单情况下依赖关系可退化为线性顺序依赖。

内部依赖和外部依赖

  项目中的组成部分之间的依赖称为内部依赖,其它依赖为外部依赖

源代码(source code)

  源代码用于生成指定目标代码(target code) 。

  通常源代码以文件形式保存,即源代码文件(source code file) ,简称源文件(source file) 。

版本库(repository)

  本项目使用的版本控制(version controll) 的存储实体。

  当前使用的主要版本控制系统为 Mercurial 。因为是分布式版本控制,也用于直接分发源代码。

  每个文件系统上存储的版本库实例中, .hg 目录存储版本库元数据。

设计和模型

环境(environment)

  程序中的某一部分的外界称为环境。根据限定程序的范围,可以有更确切的定义,如实现环境(对一类语言实现而言)、运行时环境(对共享实现环境的一类程序而言)。

  一般地,实现环境可以分为独立环境(freestanding environment)宿主环境(hosted environment) ,区分依据为是否依赖宿主(对部署在单一计算机上的实现,一般指操作系统)的支持。因此,环境有时指操作系统及其提供的外部服务的集合。

  一些语言,如 ISO C 和 ISO C++ ,可以同时支持宿主环境和独立环境的实现,对应独立实现(freestanding impementation)宿主实现(hosted impementation)

平台(platform) 环境

  环境中决定程序适用环境的被依赖的特定资源集合称为平台环境,简称平台。平台的典型例子有:

  平台的内涵是资源的集合,其构成并非任意。构成平台的特定准则应使之保持相对的稳定和可预期,即可配置;即平台是名义的(nominal) 可配置的资源集合。

  若平台包含的资源是已知的,则不需要平台的观念,分析其资源子集(即便不构成平台)即可解决几乎平台抽象涉及的所有技术问题(同时这也是定义一个具体平台的基础)。但在简化资源集合的全局性质分析(如比较资源配置方案)和名义抽象以隐藏实现(如为开发者提供预设环境集合)的应用角度上,平台仍有被单独讨论的意义。

兼容性(compatibility) 和可移植性(portability)

  若一个依赖项对应的平台可以替换,则此依赖项和此平台兼容(compatible) 。兼容性不是一种等价关系,因为不保证传递。

  替换平台的过程称为移植(porting) 。移植的可行性称为可移植性

  兼容任意平台的依赖项被称为是平台中立(platform-neutral) 的。

  当平台中立的依赖项的依赖能被自动满足而不需要考虑时,是平台无关(platform-independent) 的。平台中立实质蕴含平台无关。

依赖和外延

  若平台之间不出现平台的实现(如开发语言的实现)和环境自身的相互依赖,则这些平台相互独立。总是保持相互独立的一组平台称为独立平台(independent platforms) 。每一组独立平台保证可以相对于其它独立平台分离开发和测试。

  注意以上术语和 ISO C 和 ISO C++ 定义的宿主实现(hosted implementation)独立实现(freestanding implementation) 的关联和区别。

  典型的应用场景约定以下类型的平台:

  • 构建平台(build platform) 运行开发环境的平台。
  • 宿主平台(host platform) 运行构建平台输出代码的平台。
  • 目标平台(target platform) 运行最终目标代码的平台。

  若宿主平台和构建平台一致,称为本机构建(native build);否则,称为交叉构建(corss build)

  通常构建工具在本机构建时提供对构建平台的检查以确定自身是否能够运行;交叉构建环境需要显式指定。

  目标平台通常和宿主平台一致。指定目标平台的理由是,存在最终不一定在宿主平台上运行的程序,其运行的环境可能需要宿主平台不保证支持的特性,这典型地包括:

  • 构建的程序自身是生成其它程序的程序,如编译器和链接器。这些程序生成的平台是目标平台,不需要和它们的宿主平台相同。
  • 构建的程序可以在宿主平台上运行,但在其它平台上具有更完全的特性集。后者被作为目标平台。

注意 此处的宿主平台具有相对意义,不一定脱离被运行的目标平台。一个宿主平台通常自身是宿主实现平台,但这点不被保证。

模拟(emulation) 和仿真(simulation)

  模拟指适配和运行为不同平台设计的程序,广义上包括以下两类:

  • 环境模拟(environment emulation) :使用模拟器(emulator) 或虚拟机(virtual machine) 等作为宿主平台的程序,模拟运行环境的通用解决方案;
  • 程序模拟(program emulation) :直接以运行时环境适配层嵌入宿主平台运行时,在具体程序中提供类似被模拟的目标平台的具体特性和接口。

  运行模拟程序的环境和被模拟环境分别是宿主平台和目标平台。

  注意虚拟机在这个意义下是广义的模拟器,但一般仍然分别对待。

  环境模拟和程序模拟的主要差异为是否独立的、专用的宿主平台程序作为中介以维护目标平台和宿主平台的隔离。

  在一般意义上,仿真指对需要分析的问题建立的模型(model) 的过程、方法和机制,在软件工程以外也被称为模拟,如计算机模拟(computer simulation) 。对于以计算机系统为目标的仿真,建立的模型可以是具体的实物(包括硬件和软件),称为仿真器(simulator) 。以软件接口为主要操作方式实现的仿真器同时实现了环境模拟,但侧重不同:精确重现需要分析行为,而非实用的功能等价性和体系中的可替换性。

平台配置

  实际的平台实现可能复用部分实现,配置之间可存在某种构成依赖关系的偏序关系(如继承关系)。这些在项目中所有被配置的平台称为公共平台(common platform) ,其中能对应生成输出的称为具体平台(concrete platform) ,否则为抽象平台(abstract platform)

标识

  不同平台可以标识符加以区分。由于平台受到不同环境因素决定的正交性,通常此类标识符可以分解为表示这些正交环境的标识符的元组形式,用 - 等字符分隔。

  一种常用的方式是 GNU 构建系统的系统类型(en-US),经典表示方式为三元组(triplet) ,或其省略形式:

  • 一般包括体系结构、系统厂商和系统软件环境
  • 第一项不可省略,之后的项可省略
  • 体系结构一般指定 CPU 要求的最小指令集架构
  • 系统厂商指集成平台的环境厂商
  • 系统软件环境保证满足 ABI 要求,可以包含操作系统及本机语言运行时实现的名称

  确定为宿主环境时,系统软件同时指定操作系统和运行时环境而拆分为两项,三元组扩充为四元组,如 Gentoo 使用的 CHOST (en-US)

  在不够充分体现平台的必要差异(尤其是体系结构相关的配置)时也可通过自行定义标识符并指定与三元组的对应关系,如 Debian multiarch (en-US)

  除非必要时另行指定, YSLib 使用三元组作为指定平台标识的基本形式。

多平台构建

  构建系统中可能涉及多个平台。

  运行构建系统的环境和被构建的程序的环境不需要相同,对应的平台分别称为宿主平台(host platform) 和目标平台(target platform) 。宿主平台和目标平台相同时称为本机(native) 构建;不同时称为交叉(build) 构建。

  多个构建过程可能串联组成更大的构建过程。不同构建过程存在输出和输入之间的依赖。此时,前一过程输出的目标平台需要兼容于后一过程作为输入的宿主平台,否则无法直接运行。典型情况下这些平台是相同的,但也可以存在平台之间自身保证二进制互操作兼容性(如支持 x86_64 的体系结构上混用 i686 和 x86_64 )的情况。

  一些构建系统如 GNU 工具链(en-US) 使用更复杂的术语,单独引入构建(build) 平台。为确保一般性并简化模型, YSLib 不使用这个概念,而把构建平台作为第一级构建过程(即 GNU autoconf 的“配置”)的宿主平台。