Compartilhar via


Roteiro do console do Windows e do ecossistema do terminal

Este documento é um roteiro de alto nível os produtos Console do Windows e Terminal do Windows. Ele aborda:

  • Como o Console do Windows e o Terminal do Windows se encaixam no ecossistema de aplicativos de linha de comando no Windows e em outros sistemas operacionais.

  • Um histórico e um roteiro futuro dos produtos, dos recursos e das estratégias que fazem parte da criação da plataforma, bem como da criação para essa plataforma.

Na era atual, o foco em termos de console/terminal na Microsoft é proporcionar uma experiência de terminal de primeira classe diretamente aos desenvolvedores na plataforma Windows e eliminar gradativamente as APIs do Console do Windows clássicas, substituindo-as por sequências de terminais virtuais utilizando um pseudoconsole. O Terminal do Windows demonstra essa transição para uma experiência de primeira classe, convidando a colaboração de software livre da comunidade de desenvolvedores, dando suporte a um espectro completo de combinações de aplicativos de linha de comando do cliente e de hospedagem de terminal e unificando o ecossistema do Windows com todas as outras plataformas.

Definições

É recomendável se familiarizar com as definições da terminologia comum usada neste espaço antes de continuar. A terminologia comum inclui: aplicativos de linha de comando (ou console), manipuladores padrão (STDIN, STDOUT, STDERR), dispositivos TTY e PTY, clientes e servidores, subsistema do console, host do console, pseudoconsole e terminal.

Arquitetura

A arquitetura geral do sistema tem quatro partes: cliente, dispositivo, servidor e terminal.

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

Cliente

O cliente é um aplicativo de linha de comando que usa uma interface baseada em texto para permitir que o usuário insira comandos (em vez de uma interface do usuário baseada no mouse), retornando uma representação de texto do resultado. No Windows, a API do Console fornece uma camada de comunicação entre o cliente e o dispositivo. (Também pode ser um identificador de console padrão com APIs de controle de dispositivo).

Dispositivo

O dispositivo é uma camada intermediária de comunicação de manipulação de mensagens que fica entre dois processos, o cliente e o servidor. No Windows, ele é o driver de console. Em outras plataformas, é o dispositivo TTY ou PTY. Outros dispositivos, como arquivos, pipes e soquetes, podem ser usados como esse canal de comunicação quando a transação inteira está em texto sem formatação ou contém sequências de terminais virtuais, mas não com APIs do Console do Windows.

Servidor

O servidor interpreta as mensagens ou as chamadas à API solicitadas do cliente. No Windows, no modo operacional clássico, o servidor também cria uma interface do usuário para apresentar a saída à tela. Além disso, o servidor coleta a entrada para enviar de volta em mensagens de resposta ao cliente, por meio do driver, como um terminal agrupado no mesmo módulo. Usando o modo de pseudoconsole, por sua vez, ele é apenas um tradutor que apresenta essas informações em sequências de terminais virtuais a um terminal anexado.

Terminal

O terminal é a camada final que fornece serviços de interatividade e exibição gráfica ao usuário. Ele é responsável por capturar a entrada e codificá-la como sequências de terminais virtuais, que por fim atingem o STDIN do cliente. Ele também recebe e decodifica as sequências de terminais virtuais que recebe de volta do STDOUT do cliente para apresentação na tela.

Conexões adicionais

Como adendo, outras conexões podem ser realizadas por meio do encadeamento de aplicativos que desempenham várias funções em um dos pontos de extremidade. Por exemplo, uma sessão SSH tem duas funções: atua como um terminal para o aplicativo de linha de comando em execução em um dispositivo, mas encaminha todas as informações recebidas para uma função de cliente em outro dispositivo. Esse encadeamento pode ocorrer indefinidamente entre dispositivos e contextos, oferecendo uma grande flexibilidade de cenários.

Em plataformas não Windows, as funções de servidor e terminal são uma só unidade porque não há necessidade de uma camada de compatibilidade para tradução entre um conjunto de API e sequências de terminais virtuais.

Produtos da Microsoft

Todos os produtos de linha de comando Microsoft Windows estão disponíveis no GitHub em um repositório de software livre, microsoft/terminal.

Host do Console do Windows

Essa é a interface do usuário do Windows tradicional para aplicativos de linha de comando. Ela lida com todos os serviços de API de console chamados de qualquer aplicativo de linha de comando anexado. O Console do Windows também lida com a representação da GUI (interface gráfica do usuário) em nome de todos esses aplicativos. Ele é encontrado no diretório do sistema como conhost.exe ou openconsole.exe em seu formato de software livre. Ele vem com o sistema operacional Windows. Também pode ser encontrado em outros produtos da Microsoft criados com base no repositório de software livre para uma implementação mais atualizada da infraestrutura de pseudoconsole. De acordo com as definições acima, ele opera tradicionalmente em uma função combinada de servidor e terminal ou somente em uma função de servidor por meio da infraestrutura de pseudoconsole preferencial.

Terminal do Windows

Essa é a nova interface do Windows para aplicativos de linha de comando. O Terminal do Windows é um exemplo interno do uso do pseudoconsole para separar as responsabilidades de serviço à API e de interface com aplicativos baseados em texto, muito semelhante a todas as plataformas não Windows.

O Terminal do Windows é a principal interface do usuário de modo de texto para o Windows. Ele demonstra os recursos do ecossistema e está direcionando o desenvolvimento do Windows à unificação com outras plataformas. O Terminal do Windows também é um exemplo de como criar um aplicativo moderno robusto e complexo abrangendo o histórico e a variedade de APIs e estruturas do Windows. De acordo com as definições acima, ele opera em uma função de terminal.

Principais marcos históricos

Os principais marcos históricos do subsistema de console são divididos na implementação anterior a 2014 e em uma visão geral do trabalho realizado desde 2014, quando o novo foco na linha de comando surgiu na era do Windows 10.

Implementação de inicial

[1989 - década de 1990] O sistema host do console inicial foi implementado como uma emulação do ambiente DOS no sistema operacional Windows. Seu código é emaranhado e cooperativo com o Prompt de Comando, cmd.exe, que é uma representação desse ambiente de DOS. O código do sistema host do console compartilha responsabilidades e privilégios com o interpretador/shell do Prompt de Comando. Ele também fornece um nível básico de serviços para outros utilitários de linha de comando para realização de serviços de maneira semelhante ao CMD.

DBCS para CJK

[1997-1999] Por volta desse período, o suporte para DBCS ("Conjunto de caracteres de dois bytes") foi introduzido para dar suporte aos mercados CJK (chinês, japonês e coreano). Esse esforço levou a uma bifurcação de muitos dos métodos de escrita e leitura dentro do console, a fim de fornecer tanto versões "ocidentais" para lidar com caracteres de byte único quanto uma representação alternativa para versões "orientais", em que dois bytes são necessários para representar a vasta gama de caracteres. Essa bifurcação incluiu a expansão da representação de uma célula no ambiente de console para ter uma ou duas células de largura, em que uma célula é estreita (mais alta do que larga) e duas células são largas, de largura inteira ou ainda um quadrado em que os ideogramas comuns do chinês, do japonês e do coreano podem ser inscritos.

Segurança/isolamento

[2005-2009] Com a experiência de subsistema do console em execução no processo crítico do sistema, csrss.exe, a conexão de aplicativos cliente variados, em diferentes níveis de acesso, a um só processo extremamente crítico e privilegiado foi considerada particularmente perigosa. Nessa era, o subsistema do console foi dividido em aplicativos de servidor, driver e cliente. Cada aplicativo podia ser executado em um contexto próprio, reduzindo as responsabilidades e o privilégio em cada um deles. Esse isolamento aumentou a robustez geral do sistema, uma vez que qualquer falha no subsistema do console não afetava mais outras funcionalidades de processo críticas.

Aprimoramentos na experiência do usuário

[2014 – 2016] Após um longo período de manutenção em geral dispersa do subsistema do console por equipes variadas em toda a organização, foi criada uma equipe voltada ao desenvolvedor, para ser responsável pelos aprimoramentos no console e para impulsioná-los. Os aprimoramentos nesse período incluíram: seleção de linha, redimensionamento de janela suave, refluxo de texto, cópia e colagem, suporte para alto DPI e foco no Unicode, incluindo a convergência da divisão entre os algoritmos "ocidental" e "oriental" de manipulação de fluxo e armazenamento.

Cliente do Terminal Virtual

[2015 – 2017] Com a chegada do Subsistema do Windows para Linux, os esforços da Microsoft para aprimorar a experiência do Docker no Windows e a adoção do OpenSSH como tecnologia de execução remota de linha de comando Premier, as implementações iniciais das sequências de terminais virtuais foram introduzidas no host do console. Isso permitiu que o console existente atuasse como terminal, anexado diretamente aos aplicativos nativos do Linux em seus respectivos ambientes, renderizando atributos gráficos e de texto para exibição e retornando a entrada do usuário no dialeto apropriado.

Servidor do Terminal Virtual

[2018] Nos últimos vinte anos, alternativas de terceiros para o host do console da caixa de entrada foram criadas a fim de proporcionar mais produtividade ao desenvolvedor, bastante centradas em personalizações avançadas e em interfaces com guias. Esses aplicativos ainda precisavam executar e ocultar a janela do host do console. Eles eram anexados como um aplicativo "cliente" secundário para extrair informações do buffer em loops de sondagem conforme o aplicativo cliente de linha de comando primário operava. Sua meta era ser um terminal, assim como em outras plataformas, mas no mundo do Windows em que os terminais não eram substituíveis.

Nesse período, foi introduzida a infraestrutura de pseudoconsole. O pseudoconsole permite que qualquer aplicativo inicie o host do console em um modo não interativo e se torne a interface de terminal final para o usuário. A principal limitação desse esforço era a promessa de compatibilidade contínua do Windows para atender a todas as APIs de Console do Windows publicadas pelo futuro indefinido, ao mesmo tempo que fornecia uma interface de hospedagem de servidor substituta correspondente ao que é esperado em todas as outras plataformas: sequências de terminais virtuais. Dessa forma, esse esforço realizou a imagem espelho da fase do cliente: o pseudoconsole projeta o que seria exibido na tela como sequências de terminais virtuais para um host delegado e interpreta as respostas em sequências de entradas no formato do Windows para o consumo de aplicativos cliente.

Roteiro para o futuro

Aplicativos de terminal

[2019 – agora] Esta é a era de software livre do subsistema do console, concentrando-se no novo Terminal do Windows. Anunciado durante a conferência Microsoft Build em maio de 2019, o Terminal do Windows está totalmente disponível no GitHub em microsoft/terminal. Criar o aplicativo de Terminal do Windows com base na plataforma refinada do pseudoconsole será o foco dessa era, trazendo uma experiência de terminal de primeira classe diretamente aos desenvolvedores na plataforma Windows.

O Terminal do Windows pretende não só demonstrar a plataforma – incluindo a tecnologia de interface WinUI, o modelo de empacotamento MSIX e a arquitetura de componentes C++/WinRT –, mas também ser uma validação da própria plataforma. O Terminal do Windows está levando a organização do Windows a abrir e desenvolver a plataforma de aplicativo conforme necessário para continuar aumentando a produtividade dos desenvolvedores. O conjunto exclusivo de requisitos de usuários avançados e de desenvolvedores do Terminal do Windows direciona os requisitos da plataforma Windows moderna para o que esses mercados realmente precisam do Windows.

No sistema operacional Windows, isso inclui a desativação da interface do usuário do host do console clássica de sua posição padrão em favor do Terminal do Windows, do ConPTY e das sequências de terminais virtuais.

Por fim, essa era pretende oferecer capacidade total de escolha com relação à experiência padrão, seja ela o produto de Terminal do Windows ou qualquer terminal alternativo.

Biblioteca de suporte ao cliente

[Futuro] Com o suporte e a documentação das sequências de terminais virtuais no lado do cliente, incentivamos enfaticamente os desenvolvedores de utilitários de linha de comando do Windows a usar primeiro as sequências de terminais virtuais em vez das APIs clássicas do Windows para ter o benefício de um ecossistema unificado com todas as plataformas. No entanto, uma parte importante que está faltando é que outras plataformas têm uma ampla gama de bibliotecas auxiliares do lado do cliente para manipular entradas como readline e exibições gráficas como ncurses. Esse elemento em particular do roteiro para o futuro representa a exploração do que o ecossistema oferece e como podemos acelerar a adoção de sequências de terminais virtuais em aplicativos de linha de comando do Windows em vez da API do Console clássica.

Passagem de sequência

[Futuro] A combinação de implementações de cliente e servidor de terminal virtual permite a combinação completa de aplicativos de linha de comando do cliente e de hospedagem do terminal. Essa combinação pode trabalhar com as APIs do Console do Windows clássicas ou com as sequências de terminais virtuais, no entanto, há um custo de sobrecarga para converter isso no método clássico compatível do Windows e, depois, de volta no método de terminal virtual mais universal.

Após o mercado adotar de maneira suficiente as sequências de terminais virtuais e o UTF-8 no Windows, o trabalho de conversão/interpretação do host do console poderá ser desabilitado. O host do console se tornaria, então, um simples serviço de chamada à API e retransmitiria chamadas de dispositivo para o aplicativo de hospedagem por meio do pseudoconsole. Essa alteração aumentará o desempenho e maximizará o dialeto de sequências que podem ser faladas entre o aplicativo cliente e o terminal. Por meio dessa alteração, cenários adicionais de interatividade seriam habilitados e (finalmente) alinhariam o mundo do Windows com a família de todas as outras plataformas no espaço de aplicativo de linha de comando.