Windows 主控台和終端生態系統藍圖

本文件是 Windows 主控台和 Windows 終端機產品的整體藍圖。 內容包括:

  • Windows 主控台和 Windows 終端機如何適應 Windows 和其他作業系統上的命令列應用程式生態系統。

  • 產品、功能和策略的歷程記錄和未來藍圖,都是建置平台的一部分,也是專為此平台打造的。

Microsoft 目前的主控台/終端機時代重點是,在 Windows 平台上直接為開發人員帶來一流的終端機體驗,以及淘汰傳統 Windows 主控台 API,並以利用 pseudoconsole虛擬終端機序列進行取代。 Windows 終端機會展示轉換為一流體驗、從開發人員社群邀請開放原始碼共同作業、支援用戶端命令列和終端機主控應用程式的完整混合和比對,以及整合 Windows 生態系統與所有其他平台。

定義

在繼續之前,建議您先熟悉此空間中常用術語的定義。 常見術語包括:命令行(或控制台)應用程式標準句柄(STDINSTDOUTSTDERR、TTY 和 PTY 裝置、用戶端和伺服器控制檯子系統控制台主機虛擬console終端機

架構

系統的一般架構分為四個部分:用戶端、裝置、伺服器和終端機。

Command Line Communication flow chart source to destination running from client to device to server to terminal

用戶端

用戶端是一種使用文字型介面的命令列應用程式,可讓使用者輸入命令 (而不是滑鼠型使用者介面),並傳回結果的文字呈現。 在 Windows 上,主控台 API 會在用戶端與裝置之間提供通訊層。 (這也可以是使用裝置控制 API 的標準主控台控點)。

裝置

裝置是介於兩個程序 (用戶端與伺服器) 之間的中繼訊息處理通訊層。 在 Windows 上,這是主控台驅動程式。 在其他平台上,則是 TTY 或 PTY 裝置。 如果整個交易為純文字或包含虛擬終端機序列,而不是使用 Windows 主控台 API,則檔案、管道和通訊端之類的其他裝置可作為此通訊通道。

伺服器

伺服器會從用戶端解讀要求的 API 呼叫或訊息。 在傳統作業模式的 Windows 上,伺服器也會建立使用者介面,以將輸出呈現至螢幕。 伺服器會另外收集輸入,以透過驅動程式 (例如在相同模組中搭售的終端機) 將回應訊息傳回給用戶端。 使用 pseudoconsole 模式,其只是用來向連結的終端機呈現虛擬終端機序列中此資訊的翻譯工具。

終端機

終端機是為使用者提供圖形化顯示和互動服務的最後一層。 其負責擷取輸入並將其編碼為虛擬終端機序列,這最終會到達用戶端的 STDIN。 此外,也會接收和解碼其從用戶端的 STDOUT 接收回來的虛擬終端機序列,以在螢幕上呈現。

進一步連線

追加功能:將扮演多個角色的應用程式鏈結到其中一個端點,即可執行進一步連線。 例如,SSH 工作階段有兩個角色:這是在某個裝置上執行之命令列應用程式的終端機,但是會將所有收到的資訊轉送給另一個裝置上的用戶端角色。 此鏈結可以會在不同裝置和內容之間無限期地發生,以提供廣泛的案例彈性。

在非 Windows 平台上,伺服器終端機角色都是單一單位,因為 API 集與虛擬終端機序列之間不需要轉譯相容性層。

Microsoft 產品

您現在可以在 GitHub 上的開放原始碼存放庫 (microsoft/terminal) 中找到所有 Microsoft Windows 命令列產品。

Windows 主控台主機

這是命令列應用程式的傳統 Windows 使用者介面。 可處理從任何已連結命令列應用程式呼叫的所有主控台 API 服務。 Windows 主控台也會代表所有應用程式來處理圖形化使用者介面 (GUI) 呈現。 在系統目錄中可找到 conhost.exe,或在其開放原始碼表單中找到的 openconsole.exe。 其隨附於 Windows 作業系統。 在從開放原始碼存放庫建置的其他 Microsoft 產品中也可以找到,以供取得 pseudoconsole 基礎結構的最新實作。 根據上述定義,其會透過慣用的 pseudoconsole 基礎結構,以傳統上兼具伺服器和終端機的角色或僅限伺服器的角色運作。

Windows 終端機

這是命令列應用程式的新 Windows 介面。 Windows 終端機可作為以下情況的第一方範例:使用 pseudoconsole 來區分 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] 隨著 Windows 子系統 Linux 版到來,Microsoft 努力改善 Windows 上的 Docker 體驗,並採用 OpenSSH 作為頂級命令行遠端執行技術,虛擬終端機序列的初始實作已引入控制台主機。 這可讓現有主控台充當終端機,直接連結到其各自環境中的 Linux 原生應用程式,將圖形化和文字屬性轉譯至顯示器,並以適當的方言傳回使用者輸入。

虛擬終端機伺服器

[2018] 在過去 20 年中,已建立收件匣控制台主機的第三方替代方案,以提供額外的開發人員生產力,以豐富的自定義和索引卷標式介面為中心。 這些應用程式仍然需要執行和隱藏主控台主機視窗。 其會連結為次要的「用戶端」應用程式,以在主要命令列用戶端應用程式運作時,消除輪詢迴圈中的緩衝區資訊。 其目標是要成為終端機,如同在其他平台上,但是在 Windows 世界中,終端機不是可更換的。

在這段時間內,引進了 pseudoconsole 基礎結構。 Pseudoconsole 允許任何應用程式以非互動式模式啟動主控台主機,並成為使用者的最終終端機介面。 此種作法的主要限制是 Windows 未來為所有已發佈的 Windows 主控台 API 提供無限期服務的持續相容性承諾,同時提供符合所有其他平台上期望的替代伺服器主控介面:虛擬終端機序列。 因此,此種作法執行了用戶端階段的鏡映影像:pseudoconsole 會將畫面上會顯示的內容投射為委派主機的「虛擬終端機序列」,並將回覆轉譯為用戶端應用程式使用量的 Windows 格式輸入序列。

未來的藍圖

終端機應用程式

[2019-Now]這是控制檯子系統的 開放原始碼 時代,著重於新的 Windows 終端機。 2019 年 5 月的 Microsoft Build 會議期間宣佈,Windows 終端機完全放在 GitHub 的 Microsoft/Terminal 上。 在 pseudoconsole 的精簡平台上建置 Windows 終端機應用程式,將成為這個時代的焦點,並在 Windows 平台上直接為開發人員帶來一流的終端機體驗。

Windows 終端機不僅要展示平台 (包括 WinUI 介面技術、MSIX 封裝模型,以及 C++/WinRT 元件架構),還要成為平台本身的驗證。 Windows 終端機會促使 Windows 組織開啟應用程式平台並視需要改進,以繼續提升開發人員的生產力。 Windows 終端機獨特的進階使用者和開發人員需求推動了現代化 Windows 平台需求,以滿足這些市場對於 Windows 的真正需求。

在 Windows 作業系統中,這包括從預設位置中淘汰傳統主控台主機使用者介面,改為支持 Windows 終端機ConPTY虛擬終端機序列

最後,不管是 Windows 終端機產品還是任何替代終端機,這個時代都想要提供完全自選的預設體驗。

用戶端支援程式庫

[未來]透過用戶端上的虛擬終端機序列支援和文件,我們強烈建議 Windows 命令行公用程式開發人員先透過傳統 Windows API 使用虛擬終端機序列,以取得與所有平臺整合生態系統的優點。 不過,遺漏了一個重要的部分,那就是其他平台都有一系列廣泛的用戶端協助程式程式庫,可供處理 readline 之類的輸入和 ncurses 之類的圖形化顯示。 這個特定的未來藍圖元素代表探索生態系統所提供的內容,以及如何透過傳統主控台 API,加速在 Windows 命令列應用程式中採用虛擬終端機序列。

序列傳遞

[未來] 虛擬終端機客戶端和伺服器實作的組合可讓您完整混合和比對用戶端命令行和終端機裝載應用程式。 此種組合對傳統 Windows 主控台 API虛擬終端機序列都有吸引力,不過,將此轉譯成傳統相容的 Windows 方法,然後再回到更通用的虛擬終端機方法,會產生額外負荷成本。

一旦市場充分採用 Windows 上的虛擬終端機序列和 UTF-8,就可以選擇性地停用主控台主機的轉換/轉譯作業。 主控台主機接著會變成簡單的 API 呼叫服務工具,並透過 pseudoconsole 從裝置呼叫轉送至主控應用程式。 這項變更將會提升效能,並充分發揮可在用戶端應用程式與終端機之間傳達的序列方言。 透過這項變更會達成其他互動性案例,而 (最終) 讓 Windows 世界與命令列應用程式空間中的所有其他平台系列保持一致。