Aracılığıyla paylaş


Klasik Konsol API'leri ile Sanal Terminal Dizileri karşılaştırması

Önerimiz, klasik Windows Konsol API'sinisanal terminal dizileriyle değiştirmektir. Bu makalede ikisi arasındaki fark özetlenecek ve önerimizin nedenleri tartışılacaktır.

Tanımlar

Klasik Windows Konsol API'si yüzeyi, üzerinde kernel32.dll adında "Konsol" bulunan C dili işlevsel arabirim serisi olarak tanımlanır.

Sanal terminal dizileri , standart giriş ve standart çıkış akışlarına eklenmiş komutların dili olarak tanımlanır. Sanal terminal dizileri, normal yazdırılabilir metinle araya girilen sinyal komutları için yazdırılamayan kaçış karakterleri kullanır.

Tarih

Windows Konsolu, istemci komut satırı uygulamaları için hem çıkış görüntü arabelleği hem de kullanıcı giriş arabelleği işlemek için geniş bir API yüzeyi sağlar. Ancak, Windows dışındaki diğer platformlar, komut satırı ortamlarına yönelik bu API temelli yaklaşımı hiçbir zaman sunmadılar, bunun yerine standart giriş ve standart çıkış akışlarına katıştırılmış sanal terminal dizilerini kullanmayı tercih ettiler. (Microsoft, bir süre için dos ve Windows'un erken sürümlerinde de ANSI.SYS adlı bir sürücü aracılığıyla bu davranışı desteklemektedir.)

Buna karşılık , sanal terminal dizileri (çeşitli diyalektlerde) diğer tüm platformlar için komut satırı ortam işlemlerini yönlendirir. Bu diziler, Digital Equipment Corporation ve Tektronix terminallerine kadar uzanan, birçok satıcının geliştirdiği bir dizi uzantı ve bir ECMA Standardı üzerine temellenir ve daha modern ve yaygın olan yazılım terminalleri, örneğin xterm, ile ilişkili hale gelmiştir. Sanal terminal dizisi alanında birçok uzantı vardır ve bazı diziler diğerlerinden daha yaygın olarak desteklenir, ancak bu konuda dünyanın neredeyse her terminal ve komut satırı istemci uygulaması tarafından desteklenen iyi bilinen bir alt kümenin desteklenmesiyle komut satırı deneyimleri için komut dili olarak standartlaştığını söylemek mümkündür.

Platformlar Arası Destek

Sanal terminal dizileri platformlar arasında yerel olarak desteklenir ve Windows hariç, terminal uygulamalarının ve komut satırı yardımcı programlarının işletim sistemlerinin sürümleri ve varyasyonları arasında kolayca taşınabilir hale getirilmesini sağlar.

Buna karşılık, Windows Konsol API'leri yalnızca Windows'ta desteklenir. Bir platformdan veya başka bir platformdan komut satırı yardımcı programlarını taşımaya çalışırken Windows ile sanal terminal arasında (veya tam tersi) kapsamlı bir bağdaştırıcı veya çeviri kitaplığı yazılmalıdır.

Uzaktan Erişim

Sanal terminal dizileri , uzaktan erişim için önemli bir avantaja sahip olur. Standart bir uzak komut satırı bağlantısı kurmak için gerekli olanlardan fazlasını gerektirmeden, hem taşımayı hem de uzaktan yordam çağrılarını gerçekleştirmeyi sağlar. Bir giden ve gelen aktarım kanalını (veya tek bir çift yönlü kanalı) bir boru, yuva, dosya, seri bağlantı noktası veya başka bir cihaz üzerinden bağlamak, bu dizileri konuşan bir uygulama için gereken tüm bilgileri uzak bir ana bilgisayara tamamen taşımak için yeterlidir.

Tam tersine , Windows Konsolu API'lerine yalnızca yerel makinede erişilebilirdi ve bunları uzaktan kumanda etmek için tüm çabalar basit bir kanalın ötesinde bir uzaktan arama ve aktarım arabirimi katmanı oluşturmayı gerektirir.

Endişelerin Ayrılması

Bazı Windows Konsolu API'leri , etkileşimli komut satırları için giriş ve çıkış arabelleklerine veya kolaylık işlevlerine düşük düzeyde erişim sağlar. Bu, komut satırı istemci uygulamasının kendisi yerine konsol alt sistemi ve ana bilgisayar ortamında programlanmış takma adları ve komut geçmişini içerebilir.

Buna karşılık, diğer platformlarda uygulamanın geçerli durumunun ve kolaylık işlevselliğinin belleğe alınması komut satırı yardımcı programının veya kabuğun kendisinin sorumluluğundadır.

Windows Konsolu'nun bu sorumluluğu konsol konağı ve API'sinde işleme yöntemi, bu özelliklerle bir komut satırı uygulaması yazmayı daha hızlı ve kolay hale getirerek, çizim durumunu anımsama veya düzenleme kolaylığı özelliklerini işleme sorumluluğunu ortadan kaldırır. Ancak bu, uygulama ve kullanılabilirlik değişimleri nedeniyle bu etkinlikleri platformlar, sürümler veya senaryolar arasında uzaktan bağlamayı neredeyse imkansız hale getirir. Bu sorumluluk işleme yöntemi, bu Windows komut satırı uygulamalarının son etkileşimli deneyimini de konsol konağı uygulamasına, önceliklerine ve yayın döngüsüne tamamen bağımlı hale getirir.

Gelişmiş satır düzenleme özellikleri, örneğin söz dizimi vurgulama ve karmaşık seçim, yalnızca bir komut satırı uygulaması düzenleme sorumluluklarını üstlendiğinde mümkündür. Konsolun hiçbir zaman bu senaryoları istemci uygulamasının anlayabileceği gibi geniş kapsamlı bir şekilde tam olarak anlamak için yeterli bağlamı olamaz.

Buna karşılık, diğer platformlar bu etkinlikleri ve sanal terminal iletişimini readline ve ncurses gibi yeniden kullanılabilir istemci tarafı kitaplıkları aracılığıyla işlemek için sanal terminal dizilerini kullanır. Son terminal yalnızca bilgileri görüntülemekten ve bu çift yönlü iletişim kanalı üzerinden giriş almaktan sorumludur.

Wrong-Way Fiil

Windows Konsolu ile bazı eylemler giriş ve çıkış akışlarında karşıt doğal yönde gerçekleştirilebilir. Bu, Windows komut satırı uygulamalarının kendi arabelleklerini yönetme endişesi taşımalarını önler. Ayrıca, Windows komut satırı uygulamalarının kullanıcı adına giriş simülasyonu yapma/ekleme veya yazılanların geçmişinin bir bölümünü geri okuma gibi gelişmiş işlemler gerçekleştirmesine olanak tanır.

Bu, tek bir makinede belirli bir kullanıcı bağlamında çalışan Windows uygulamalarına ek güç sağlasa da, belirli senaryolarda kullanıldığında güvenlik ve ayrıcalık düzeylerini veya etki alanlarını geçmeye yönelik bir vektör de sağlar. Bu tür senaryolar, aynı makinedeki bağlamlar arasında veya başka bir makine veya ortamdaki bağlamlar arasında çalışma içerir.

Sanal terminal dizileri kullanan diğer platformlar bu etkinliğe izin vermez. Klasik Windows Konsolu'ndan sanal terminal dizilerine geçiş önerimizin amacı, hem birlikte çalışabilirlik hem de güvenlik nedenleriyle bu stratejiyle yakınsama yapmaktır.

Doğrudan Pencere Erişimi

Windows Konsol API yüzeyi barındırma penceresine tam pencere tutamacını sağlar. Bu, bir komut satırı yardımcı programının bir pencere tutamacına karşı izin verilen win32 API'lerinin geniş gamına ulaşarak gelişmiş pencere işlemleri gerçekleştirmesine olanak tanır. Bu Win32 API'leri pencere durumunu, çerçeveyi, simgeyi veya pencereyle ilgili diğer özellikleri değiştirebilir.

Buna karşılık, sanal terminal dizileri olan diğer platformlarda, pencerede gerçekleştirilebilecek dar bir komut kümesi vardır. Bu komutlar pencere boyutunu veya görüntülenen başlığı değiştirme gibi işlemler yapabilir, ancak bunların akışın geri kalanıyla aynı bantta ve aynı denetim altında yapılması gerekir.

Windows geliştikçe, pencere tanıtıcılarındaki güvenlik denetimleri ve kısıtlamaları artmıştır. Özellikle cihaz form faktörleri ve platformlarının artan desteği ile, belirli bir kullanıcı arabirimi öğesinde uygulama tarafından adreslenebilir bir pencere tutamacının doğası ve varlığı gelişti. Bu, platform ve deneyimler geliştikçe komut satırı uygulamalarına doğrudan pencere erişimini kırılgan hale getirir.

Unicode

UTF-8, taşınabilirlik, depolama boyutu ve işlem süresi arasında doğru dengeyi sağlandığından, neredeyse tüm modern platformlarda Unicode verileri için kabul edilen kodlamadır. Ancak, Windows geçmişte Unicode verileri için birincil kodlama olarak UTF-16'yı seçti. Windows'da UTF-8 desteği artıyor ve bu Unicode biçimlerinin kullanılması diğer kodlamaların kullanımını engellemiyor.

Windows Konsolu platformu desteklemiştir ve mevcut tüm kod sayfalarını ve kodlamaları desteklemeye devam edecektir. Windows sürümleri arasında maksimum uyumluluk için UTF-16 kullanın ve gerekirse UTF-8 ile algoritma çevirisi yapın. Konsol sistemi için utf-8 desteği artırıldı.

Konsoldaki UTF-16 desteği, tüm konsol API'lerinin W varyantı aracılığıyla ek yapılandırma olmadan kullanılabilir ve diğer Microsoft ve Windows platformu işlevleri ve ürünlerinin wchar_t varyantı ile iletişim kuran uygulamalar için daha muhtemel bir seçimdir.

Konsoldaki UTF-8 desteği, kod sayfasını uygun şekilde veya 65001 olarak ayarladıktan sonra CP_UTF8 ve SetConsoleCP yöntemleriyle konsol tanıtıcıları için Konsol API'lerinin A varyantı aracılığıyla kullanılabilir. Kod sayfalarını önceden ayarlamak, yalnızca Denetim Masası'nın Bölge bölümünde yer alan Unicode olmayan uygulamalar ayarlarında "Dünya çapında dil desteği için Unicode UTF-8 kullan" seçeneği seçilmediyse gereklidir.

Uyarı

Şu andan itibaren UTF-8, WriteConsole ve WriteFile yöntemleriyle standart çıkış akışında tam olarak desteklenmektedir. Giriş akışındaki destek, giriş moduna bağlı olarak değişir ve zaman içinde gelişmeye devam eder. Özellikle girişte varsayılan "pişmiş" modlar henüz UTF-8'i tam olarak desteklemez. Bu çalışmanın geçerli durumu GitHub'daki microsoft/terminal#7777 adresinde bulunabilir. Geçici çözüm, bekleyen sorunlar çözülene kadar ReadConsoleW veya ReadConsoleInputW aracılığıyla girişi okumak için algoritmaya çevrilebilir UTF-16'yı kullanmaktır.

Öneriler

Windows'ta tüm yeni ve devam eden geliştirmeler için, terminalle etkileşim kurmanın yolu olarak sanal terminal dizileri önerilir . Bu, Windows komut satırı istemci uygulamalarını diğer tüm platformlarda uygulama programlama stiliyle birleştirilir.

Windows Konsol API'lerini kullanmaya yönelik özel durumlar

İlk ortamı oluşturmak için Windows Konsolu API'lerinin sınırlı bir alt kümesi hala gereklidir . Windows platformu hala işlem, sinyal, cihaz ve kodlama işleme konusunda diğerlerinden farklıdır:

  • Bir işlemin standart tanıtıcıları GetStdHandle ve SetStdHandle ile kontrol edilmeye devam edecektir.

  • Sanal Terminal Dizisi desteğini kabul etmek için bir tanıtıcıdaki konsol modlarının yapılandırması GetConsoleMode ve SetConsoleMode ile işlenir.

  • Kod sayfası veya UTF-8 desteğinin bildirimi , SetConsoleOutputCP ve SetConsoleCP yöntemleriyle kullanılmaktadır.

  • Bir konsol cihazı oturumuna katılmak veya oturumu bırakmak için AllocConsole, AttachConsole ve FreeConsole ile genel işlem yönetiminin bir düzeyi gerekebilir.

  • Sinyaller ve sinyal işleme SetConsoleCtrlHandler, HandlerRoutine ve GenerateConsoleCtrlEvent ile yürütülmeye devam edecektir.

  • Konsol cihazı tanıtıcılarıyla iletişim WriteConsole ve ReadConsole ile gerçekleştirilebilir. Bunlar şu biçimlerde programlama dili çalışma zamanları aracılığıyla da kullanılabilir: - C Çalışma Zamanı (CRT): akış G/Ç gibi printf, scanf, putc, getc, veya diğer G/Ç işlev seviyeleri. - C++ Standart Kitaplığı (STL): cout ve cin gibi iostream. - .NET Runtime: System.Console gibi Console.WriteLine.

  • Pencere boyutu değişikliklerinin farkında olması gereken uygulamaların, tek başına ReadConsole onları atacağından, bu değişiklikleri tuş olaylarıyla birlikte almak için ReadConsoleInput kullanması gerekir.

  • Sütun, kılavuz çizmeye veya ekranı doldurmaya çalışan uygulamalar için pencere boyutunu bulma işleminin GetConsoleScreenBufferInfo ile gerçekleştirilmesi gerekir. Pencere ve arabellek boyutu bir pseudokonsol oturumunda eşleşecek.

Gelecekteki planlama ve psödokonsol

Windows konsol API'lerini platformdan kaldırma planı yoktur.

Tam tersine, Windows Konsolu ana makinesi mevcut Windows komut satırı uygulama çağrılarını sanal terminal sıralarına çevirmek ve bunları uzaktan veya platformlar arasında başka bir barındırma ortamına iletmek için pseudoconsole teknolojisini sunmuştur.

Bu çeviri mükemmel değil. Windows'un kullanıcıya görüntüleyeceğini simüle eden bir ortamı sürdürmek için konsol penceresine ihtiyaç duyar. Ardından bu sanal ortamın bir çoğaltmasını pseudokonsol ana bilgisayarına projeler. Tüm Windows Konsol API'si çağrıları, eski komut satırı istemci uygulamasının gereksinimlerini karşılamak için sanal ortamda çalıştırılır. Yalnızca efektler son konağa yayılır.

Bu nedenle, platformlar arasında tam uyumluluğu ve hem Windows'ta hem de başka bir yerdeki tüm yeni özellikleri ve senaryoları tam olarak destekleyen bir komut satırı uygulamasının sanal terminal sıralarına geçmesi ve komut satırı uygulamalarının mimarisini tüm platformlarla uyumlu olacak şekilde ayarlaması önerilir.

Komut satırı uygulamaları için bu Windows geçişi hakkında daha fazla bilgi ekosistem yol haritamızda bulunabilir.