Klasszikus konzol API-k és virtuális terminálütemezések

Javasoljuk, hogy cserélje le a klasszikus Windows ConsoleAPI-t virtuális terminálütemezésekre. Ez a cikk ismerteti a kettő közötti különbséget, és ismerteti a javaslatunk okait.

Meghatározások

A klasszikus Windows Console API-felület a C nyelv funkcionális felületeinek kernel32.dll sorozataként van definiálva a "Console" névvel.

A virtuális terminálütemezések a szabványos bemeneti és standard kimeneti streamekbe beágyazott parancsok nyelveként definiálva. A virtuális terminálütemezések nem nyomtatható menekülő karaktereket használnak a normál nyomtatható szöveggel összekapcsolt parancsok jelzéséhez.

Előzmények

A Windows Konzol széles API-felületet biztosít az ügyfél parancssori alkalmazásai számára a kimeneti megjelenítési puffer és a felhasználói bemeneti puffer kezeléséhez. Más nem Windows-platformok azonban soha nem engedhették meg maguknak ezt a specifikus API-alapú megközelítést parancssori környezeteikhez, ehelyett a standard bemeneti és standard kimeneti streamekbe beágyazott virtuális terminálütemezéseket használták. (A Microsoft egy ideig ezt a viselkedést is támogatta a DOS és a Windows korai kiadásaiban egy ANSI.SYS nevű illesztőprogramon keresztül.)

Ezzel szemben a virtuális terminálütemezések (különböző dialektusokban) hajtják végre a parancssori környezet műveleteit az összes többi platformon. Ezek a sorozatok az ECMA Standardban gyökereznek, és számos gyártó bővíti a Digital Equipment Corporation és a Tektronix terminálok felé történő nyomkövetést, a modernebb és gyakori szoftverterminálokig, például az xtermig. Számos bővítmény létezik a virtuális terminálütemezési tartományon belül, és egyes szekvenciák szélesebb körben támogatottak, mint mások, de nyugodtan mondhatjuk, hogy a világ ezen a parancsnyelven szabványosította a parancssori szolgáltatásokat, és egy jól ismert részhalmazt támogat gyakorlatilag minden terminál- és parancssori ügyfélalkalmazás.

Platformfüggetlen támogatás

A virtuális terminálütemezések natív módon támogatottak a platformokon, így a terminálalkalmazások és a parancssori segédprogramok könnyen hordozhatók az operációs rendszerek verziói és változatai között, a Windows kivételével.

Ezzel szemben a Windows Konzol API-k csak Windows rendszeren támogatottak. Átfogó adaptert vagy fordítási kódtárat kell írni a Windows és a virtuális terminál között, vagy fordítva, amikor parancssori segédprogramokat kísérel meg egyik platformról vagy másikról portraportelni.

Távoli elérés

A virtuális terminálütemezések jelentős előnyt jelentenek a távelérés szempontjából. Nem igényelnek további munkát az adatok szállításához vagy a távoli eljáráshívások végrehajtásához, mint amennyi a szabványos távoli parancssori kapcsolat létrehozásához szükséges. Ha egy kimenő és egy bejövő átviteli csatornát (vagy egy kétirányú csatornát) egyszerűen csatlakoztat egy csőhöz, foglalathoz, fájlhoz, soros porthoz vagy bármely más eszközhöz, az elegendő ahhoz, hogy az alkalmazás teljes mértékben áthelyezze a szekvenciákat egy távoli gazdagépre.

Éppen ellenkezőleg, a Windows Console API-k csak a helyi gépen voltak elérhetők, és a távoli távoli eszközökre irányuló minden erőfeszítéshez egy teljes távoli hívási és átviteli felületi réteget kell létrehozni egy egyszerű csatornán túl.

Az aggodalmak elkülönítése

Egyes Windows-konzol API-k alacsony szintű hozzáférést biztosítanak a bemeneti és kimeneti pufferekhez vagy az interaktív parancssorok kényelmi funkcióihoz. Ide tartozhatnak az aliasok és parancselőzmények, melyeket a konzolalrendszer és a gazdagépkörnyezet belsejében programoztak, nem pedig magában a parancssori ügyfélalkalmazásban.

Ezzel szemben más platformok az alkalmazás aktuális állapotának memóriáját és a kényelmi funkciókat a parancssori segédprogram vagy a rendszerhéj feladataként használják.

A Windows Console úgy kezeli ezt a felelősséget a konzol gazdagépében és az API-ban, hogy gyorsabbá és egyszerűbbé teszi a parancssori alkalmazás írását ezekkel a funkciókkal, mivel eltávolítja a rajzállapotok megjegyzésének és a szerkesztési kényelmi funkciók kezelésének felelősségét. Ez azonban szinte lehetetlenné teszi, hogy ezeket a tevékenységeket távolról összekapcsolja a platformok, verziók vagy forgatókönyvek között a megvalósítások és a rendelkezésre állás változásai miatt. A felelősségkezelés ezen módja a Windows parancssori alkalmazások végső interaktív élményét is teljesen függővé teszi a konzolgazda implementációjától, prioritásaitól és kiadási ciklusától.

A speciális vonalszerkesztési funkciók, például a szintaxis kiemelése és az összetett kijelölés például csak akkor lehetséges, ha egy parancssori alkalmazás kezeli a szerkesztési problémákat. A konzolnak soha nem volt elég környezete ahhoz, hogy teljes mértékben megértse ezeket a forgatókönyveket az ügyfélalkalmazáshoz hasonlóan.

Ezzel szemben más platformok virtuális terminálütemezésekkel kezelik ezeket a tevékenységeket, és maguk a virtuális terminálok közötti kommunikációt újrafelhasználható ügyféloldali kódtárakon keresztül, például olvasási vonallal és ncurses-ekkel kezelik. A végső terminál csak az információk megjelenítéséért és a kétirányú kommunikációs csatornán keresztüli bemenetek fogadásáért felelős.

Wrong-Way igék

A Windows Console használatával bizonyos műveletek a bemeneti és kimeneti adatfolyamok ellentétes irányában hajthatóak végre. Így a Windows parancssori alkalmazásai elkerülhetik a saját puffereik kezelésével kapcsolatos aggodalmakat. Lehetővé teszi továbbá, hogy a Windows parancssori alkalmazásai speciális műveleteket hajtsanak végre, például szimulálják/injektálják a bemenetet egy felhasználó nevében, vagy olvassák vissza az írási előzmények egy részét.

Bár ez további teljesítményt nyújt az egy adott felhasználói környezetben, egyetlen gépen futó Windows-alkalmazások számára, egy vektort is biztosít a biztonsági és jogosultsági szintek vagy tartományok közötti kereszthasználathoz, ha bizonyos helyzetekben használják. Ilyen forgatókönyvek például az ugyanazon a gépen lévő környezetek, illetve egy másik gép vagy környezet környezetei közötti üzemeltetés.

Más platformok, amelyek virtuális terminálütemezéseket használnak, nem engedélyezik ezt a tevékenységet. A klasszikus Windows-konzolról a virtuális terminálütemezésekre való áttérésre vonatkozó javaslatunk célja, hogy együttműködési és biztonsági okokból is konvergáljunk ezzel a stratégiával.

Közvetlen ablakelérés

A Windows Console API felülete pontosan megadja az üzemeltetési ablak fogópontját. Ez lehetővé teszi, hogy a parancssori segédprogram speciális ablakműveleteket hajtson végre az ablakfogóponton engedélyezett Win32 API-k széles skálájához érve. Ezek a Win32 API-k módosíthatják az ablak állapotát, keretét, ikonját vagy egyéb tulajdonságait az ablakról.

Ezzel szemben más virtuális terminálütemezésekkel rendelkező platformokon az ablakban végrehajtható parancsok szűk halmaza érhető el. Ezek a parancsok többek között módosíthatják az ablak méretét vagy a megjelenített címet, de a parancsokat ugyanabban a sávban és a stream többi részével megegyező vezérlővel kell végrehajtani.

A Windows fejlődése során az ablakfogópontok biztonsági vezérlői és korlátozásai növekedtek. Emellett az alkalmazáscímezhető ablakkezelők jellege és létezése bármely adott felhasználói felületi elemen megváltozott, különösen az eszközforma-tényezők és -platformok fokozott támogatásával. Így a parancssori alkalmazások közvetlen ablakhoz való hozzáférése a platform és a szolgáltatások fejlődésével törékenysé válik.

Unicode

Az UTF-8 a Unicode-adatok elfogadott kódolása szinte minden modern platformon, mivel megfelelő egyensúlyt teremt a hordozhatóság, a tárterület mérete és a feldolgozási idő között. A Windows azonban korábban az UTF-16-ot választotta elsődleges kódolásként Unicode-adatokhoz. Az UTF-8 támogatása egyre nő a Windowsban, és ezeknek a Unicode-formátumoknak a használata nem zárja ki más kódolások használatát.

A Windows Console platform támogatott, és továbbra is támogatja az összes meglévő kódlapot és kódolást. Használja az UTF-16-ot a Windows-verziók maximális kompatibilitásához, és szükség esetén algoritmikus fordítást végezzen az UTF-8 használatával. Az UTF-8 fokozott támogatása folyamatban van a konzolrendszer számára.

A konzol UTF-16-támogatása további konfiguráció nélkül használható az összes konzol API W-változatán keresztül, és valószínűbb választás az UTF-16-ban már jól jártos alkalmazásokhoz más Microsoft- és Windows-platformfüggvények és -termékek wchar_t való kommunikáció révén.

A konzol UTF-8-támogatása a Konzol API-k A változatával használható a konzolfogantyúkon, miután a kódlapot a 65001 vagy a CP_UTF8 metódusokkal vagy értékre állította, szükség szerint. A kódlapok előzetes beállítása csak akkor szükséges, ha a gép nem a Vezérlőpult Régió szakaszában a Nem Unicode-alkalmazások beállításai között a "Unicode UTF-8 használata a világnyelv támogatásához" lehetőséget választotta.

Megjegyzés:

Az UTF-8 jelenleg teljes mértékben támogatott a standard kimeneti adatfolyamon a WriteConsole és a WriteFile metódusokkal. A bemeneti adatfolyam támogatása a bemeneti módtól függően változik, és idővel tovább fog javulni. Nevezetesen az alapértelmezett "főtt" mód a bemeneten még nem támogatja teljes mértékben az UTF-8-at. A munka aktuális állapota a GitHubon a Microsoft/Terminal#7777 címen található. A megkerülő megoldás az, hogy a fennálló problémák megoldásáig olvassuk a bemenetet a ReadConsoleW vagy a ReadConsoleInputW segítségével az algoritmikusan lefordítható UTF-16 használatával.

Ajánlások

A Windows összes új és folyamatban lévő fejlesztése esetén a terminállal való interakcióhoz a virtuális terminálütemezések ajánlottak . Ez a windowsos parancssori ügyfélalkalmazásokat az összes többi platform alkalmazásprogramozási stílusával fogja össze.

Kivételek a Windows Console API-k használatához

A Kezdeti környezet létrehozásához továbbra is szükség van a Windows Console API-k korlátozott részhalmazára . A Windows platform továbbra is különbözik a többitől a folyamat, a jel, az eszköz és a kódolás kezelése terén:

Jövőbeli tervezés és pszeudokonzol

A Windows konzol API-jait nem tervezi eltávolítani a platformról.

Éppen ellenkezőleg, a Windows Konzol gazdagépe biztosította a pszeudokonzol technológiát a meglévő Windows parancssori alkalmazáshívások virtuális terminálszekvenciákra való lefordításához, és irányítja őket egy másik üzemeltetési környezetbe távolról vagy különböző platformokon.

Ez a fordítás nem tökéletes. Ahhoz, hogy a konzol gazdagépablaka olyan szimulált környezetet tartson fenn, amelyet a Windows megjelenítene a felhasználó számára. Ezután a szimulált környezet replikáját a pszeudokonzol gazdagéphez vetíti. Az összes Windows Console API-hívás a szimulált környezetben működik az örökölt parancssori ügyfélalkalmazás igényeinek megfelelően. A hatások csak a végső gazdagépre terjednek tovább.

Ezért javasoljuk, hogy a parancssori alkalmazások teljes kompatibilitást követeljenek meg a platformok között, és teljes mértékben támogassák az összes új funkciót és forgatókönyvet Mind a Windowson, mind máshol, ezért ajánlott a virtuális terminálütemezésekre váltani, és a parancssori alkalmazások architektúráját úgy módosítani, hogy az megfeleljen az összes platformnak.

A parancssori alkalmazások windowsos áttűnéséről az ökoszisztéma ütemtervében talál további információt.