本文档是 Windows 控制台和 Windows 终端产品的概要路线图。 它涵盖:
Windows 控制台和 Windows 终端如何适应跨 Windows 和其他作系统的命令行应用程序的生态系统。
作为构建平台的一部分的产品、功能和策略的历史记录和未来路线图,以及为此平台构建。
Microsoft当前控制台/终端时代的重点是将一流的终端体验直接引入 Windows 平台上的开发人员,并逐步淘汰经典 Windows 控制台 API,将其替换为利用伪容器的虚拟终端序列。 Windows 终端 展示了这种过渡到一流的体验,邀请开发人员社区的 开源协作 ,支持各种混合和匹配客户端命令行和终端托管应用程序,并将 Windows 生态系统与所有其他平台统一。
定义
建议先熟悉此空间中使用的常见术语 的定义 ,然后再继续作。 常见术语包括:命令行(或控制台)应用程序、标准句柄(STDIN、、STDOUTSTDERR)TTY 和 PTY 设备、客户端和服务器、控制台子系统、控制台主机、伪控制台主机和终端。
建筑
系统的一般体系结构分为四个部分:客户端、设备、服务器和终端。
客户
客户端是一个命令行应用程序,它使用基于文本的界面使用户能够输入命令(而不是基于鼠标的用户界面),并返回结果的文本表示形式。 在 Windows 上,控制台 API 在客户端和设备之间提供通信层。 (也可以是具有设备控制 API 的标准控制台句柄)。
装置
设备是两个进程(客户端和服务器)之间的中间消息处理通信层。 在 Windows 上,这是控制台驱动程序。 在其他平台上,它是 TTY 或 PTY 设备。 如果整个事务采用纯文本或包含 虚拟终端序列,但不能与 Windows 控制台 API 一起使用,则其他设备(如文件、管道和套接字)可能用作此信道。
服务器
服务器解释来自客户端的请求 API 调用或消息。 在经典作模式下的 Windows 上,服务器还会创建一个用户界面,用于向屏幕显示输出。 服务器还收集输入,以通过驱动程序(如捆绑在同一模块中的终端)向客户端发送回响应消息。 使用 伪控制台 模式,而是将 虚拟终端序列 中的此信息呈现给附加终端的翻译器。
终端
终端是最后一层,向用户提供图形显示和交互服务。 它负责捕获输入并将其编码为虚拟终端序列,最终到达客户端。STDIN 它还将接收和解码虚拟 终端序列 ,该序列从客户端 STDOUT 的屏幕上返回用于演示。
其他连接
作为附录,可将服务多个角色的应用程序链接到其中一个终结点来执行进一步的连接。 例如,SSH 会话有两个角色:它是一个在一台设备上运行的命令行应用程序的 终端 ,但它会将所有收到的信息转发到另一台设备上的 客户端 角色。 这种链接可以在设备和上下文中无限期发生,提供广泛的方案灵活性。
在非 Windows 平台上, 服务器 和 终端 角色是单个单元,因为不需要 API 集和 虚拟终端序列之间的转换兼容性层。
Microsoft产品
所有Microsoft Windows 命令行产品现已在开源存储库 microsoft/终端的 GitHub 上提供。
Windows 控制台主机
这是命令行应用程序的传统 Windows 用户界面。 它处理从任何附加的命令行应用程序调用的所有控制台 API 服务。 Windows 控制台还代表所有这些应用程序处理图形用户界面(GUI)表示形式。 它位于系统目录中,openconsole.exe或conhost.exe以其开放源代码形式找到。 它附带 Windows作系统。 还可以在其他从开源存储库生成的Microsoft产品中找到它,以便实现 伪console 基础结构的更 up-to日期。 根据上述定义,它采用传统的组合服务器和终端角色,或通过首选 伪控制台 基础结构以仅限服务器的角色运行。
Windows 终端
这是命令行应用程序的新 Windows 界面。 Windows 终端是使用 伪规则 分隔 API 服务与基于文本的应用程序交互之间的问题的第一方示例,这与所有非 Windows 平台类似。
Windows 终端是适用于 Windows 的旗舰文本模式用户界面。 它演示了生态系统的功能,并正在推动 Windows 开发与其他平台统一。 Windows 终端也是一个示例,演示如何构建一个可靠且复杂的新式应用程序,该应用程序跨越 Windows API 和框架的历史和范围。 根据上述定义,此产品在终端角色中运行。
重大历史里程碑
控制台子系统的主要历史里程碑在 2014 年之前分为实现,然后进入自 2014 年以来执行的工作概述,当时在 Windows 10 时代形成了对命令行的重新关注。
初始实现
[1989-1990s] 初始控制台主机系统作为 Windows作系统中的 DOS 环境的仿真实现。 其代码与 命令提示符纠缠并协作, cmd.exe这是该 DOS 环境的表示形式。 控制台主机系统代码与命令提示符解释器/shell 共享职责和权限。 它还为其他命令行实用工具提供基本级别的服务,以类似 CMD 的方式执行服务。
适用于 CJK 的 DBCS
[1997-1999] 目前, 引入了 DBCS 支持(“双字节字符集”)来支持中日韩两国市场。 这一努力导致控制台中许多写入和读取方法的划分,以提供“西部”版本来处理单字节字符,以及“东部”版本的替代表示形式,其中需要两个字节来表示大量字符。 此分隔包括控制台环境中单元格的扩展表示形式,可以是 1 或 2 个单元格宽,其中 1 个单元格较窄(比宽高),2 个单元格宽、全角,或者可以刻有典型的中文、日语和韩国象形字的正方形。
安全性/隔离
[2005-2009] 控制台子系统体验在关键系统进程内运行, csrss.exe在各种访问级别将各种客户端应用程序连接到单个超级关键和特权进程时,被注意到特别危险。 在此时代,控制台子系统拆分为客户端、驱动程序和服务器应用程序。 每个应用程序都可以在其自己的上下文中运行,减少每个应用程序的责任和特权。 这种隔离增加了系统的一般稳定性,因为控制台子系统中的任何故障都不再影响其他关键进程功能。
用户体验改进
[2014-2016] 经过组织内各种团队对控制台子系统进行长时间分散的维护,形成了一个新的以开发人员为中心的团队,用于在控制台中拥有和推动改进。 在此期间的改进包括:行选择、平滑窗口大小调整、重排文本、复制和粘贴、高 DPI 支持,以及对 Unicode 的关注,包括“西部”和“东部”存储和流作算法之间的拆分的融合。
虚拟终端客户端
[2015-2017] 随着 适用于 Linux 的 Windows 子系统的到来,Microsoft努力改善 Windows 上的 Docker 体验,并采用 OpenSSH 作为顶级命令行远程执行技术, 将虚拟终端序列 的初始实现引入控制台主机。 这允许现有控制台充当终端,直接附加到各自环境中的这些 Linux 本机应用程序,将图形和文本属性呈现到显示,并在相应的方言中返回用户输入。
虚拟终端服务器
[2018] 在过去 20 年里,为收件箱控制台主机创建了第三方替代项,以提供额外的开发人员工作效率,主要以丰富的自定义和选项卡式界面为中心。 这些应用程序仍然需要运行和隐藏控制台主机窗口。 它们作为辅助“客户端”应用程序附加,以便在运行主命令行客户端应用程序时在轮询循环中刮出缓冲区信息。 他们的目标是成为终端,就像在其他平台上一样,但在 Windows 世界中,终端不可替代。
在此时间段内,引入了 伪控制台 基础结构。 伪控制台允许任何应用程序以非交互模式启动控制台主机,并成为用户的最终终端接口。 这项工作的主要限制是 Windows 在无限期地为所有已发布的 Windows 控制台 API 提供服务方面的持续兼容性承诺,同时提供与所有其他平台上的预期匹配的替换服务器托管接口: 虚拟终端序列。 因此,这一努力执行了客户端阶段的镜像: 伪console 项目将作为委托主机的 虚拟终端序列 在屏幕上显示的内容,并将答复解释为 Windows 格式的输入序列以供客户端应用程序使用。
未来路线图
终端应用程序
[2019-Now] 这是控制台子系统的开源时代,侧重于新的 Windows 终端。 在 2019 年 5 月的 Microsoft 生成会议上宣布,Windows 终端完全位于 Microsoft/终端的 GitHub 上。 在 伪控制台 优化平台之上构建 Windows 终端应用程序将是这个时代的焦点,为 Windows 平台上的开发人员带来一流的终端体验。
Windows 终端 不仅打算展示平台(包括 WinUI 接口技术、 MSIX 打包模型和 C++/WinRT 组件体系结构),而且还要展示平台本身的验证。 Windows 终端正在推动 Windows 组织根据需要打开和改进应用平台,以继续提升开发人员的工作效率。 Windows 终端独特的一组强大用户和开发人员要求驱动现代 Windows 平台要求,以满足这些市场真正需要 Windows 的需求。
在 Windows作系统中,这包括从其默认位置 停用经典控制台主机用户界面 ,以支持 Windows 终端、 ConPTY 和 虚拟终端序列。
最后,这个时代打算提供完全选择默认体验,无论是 Windows 终端产品还是任何替代终端。
客户端支持库
[未来] 借助客户端 上的虚拟终端序列 的支持和文档,我们强烈建议 Windows 命令行实用工具开发人员首先通过经典 Windows API 使用虚拟终端序列,以利用所有平台获得统一生态系统的好处。 但是,一个重要的缺失部分是,其他平台具有广泛的客户端帮助程序库,用于处理输入,如 读线 和图形显示(如 ncurses)。 此特定的未来路线图元素表示探索生态系统提供的内容,以及如何通过经典控制台 API 加速采用 Windows 命令行应用程序中的虚拟终端序列。
序列传递
[未来] 虚拟终端客户端和服务器实现的组合允许完全混合和匹配客户端命令行和终端托管应用程序。 这种组合可以与经典 Windows 控制台 API 或 虚拟终端序列进行通信,但是,将它转换为经典兼容的 Windows 方法,然后重新转换为更通用的虚拟终端方法会产生开销。
市场在 Windows 上足够采用 虚拟终端序列 和 UTF-8 后,可以选择性地禁用主机主机的转换/解释作业。 然后,控制台主机将成为简单的 API 调用服务程序,并通过 伪控制台从设备调用中继到宿主应用程序。 此更改将提高性能,并最大程度地提高客户端应用程序和终端之间可以说出的序列的方言。 通过此更改,将启用其他交互方案 ,并且(最后) 使 Windows 世界与命令行应用程序空间中的所有其他平台系列保持一致。