官术网_书友最值得收藏!

2.6.1 2D圖形語(yǔ)言支持

Unicon的2D功能是Icon語(yǔ)言?xún)鼋Y(jié)前引入的最后一個(gè)主要功能。該設(shè)計(jì)強(qiáng)調(diào)語(yǔ)言語(yǔ)法的表面變化最小化,因?yàn)榇蟮淖兓遣辉试S的。唯一的表面變化是添加了幾個(gè)表示圖形系統(tǒng)中特殊值的關(guān)鍵字。Unicon中的關(guān)鍵字看起來(lái)像變量名,其前面帶一個(gè)“&”符號(hào)。

添加19個(gè)關(guān)鍵字有助于讓圖形功能看起來(lái)屬于以字符串處理為主的語(yǔ)言。你可能會(huì)驚訝地發(fā)現(xiàn),圖形輸出是其中最簡(jiǎn)單的部分功能,除了1個(gè)關(guān)鍵字外,其他所有關(guān)鍵字都用于簡(jiǎn)化輸入鼠標(biāo)和鍵盤(pán)事件的處理。其中10個(gè)關(guān)鍵字是整數(shù)常量,表示鼠標(biāo)和調(diào)整大小事件,都是為了方便。其他8個(gè)關(guān)鍵字保存有關(guān)上一次接收到的事件的關(guān)鍵信息,這些信息將自動(dòng)更新每個(gè)事件。由于使用了整數(shù)常量,因此不需要頭文件或輸入文件來(lái)處理鼠標(biāo)輸入。最后也是主要添加的關(guān)鍵字是&window,此關(guān)鍵字用于保存默認(rèn)窗口,所有圖形工具功能都使用此窗口,除非有其他窗口值作為可選的第一個(gè)參數(shù)提供。

將Unicon的圖形與底層提供的圖形進(jìn)行比較很有趣,當(dāng)時(shí)底層C API是X Window系統(tǒng)的高級(jí)工具箱(如HP和Athena組件)及其低級(jí)庫(kù)Xlib。由于不可預(yù)測(cè)行為,以及當(dāng)時(shí)缺少可移植性,在原型設(shè)計(jì)階段,高級(jí)工具箱是被拒絕的。Xlib庫(kù)滿足行為和可移植性要求,但它是一個(gè)巨大的API,需要許多新類(lèi)型(例如,在幾十種不同類(lèi)型的事件中,每一種都有一個(gè)單獨(dú)的結(jié)構(gòu)體類(lèi)型),并具有近千種功能。

學(xué)習(xí)Xlib,然后使用Xlib在C語(yǔ)言中編寫(xiě)圖形應(yīng)用程序是一個(gè)非常復(fù)雜的任務(wù),而Unicon的目標(biāo)是提供一個(gè)非常高級(jí)易用的功能。在支持易用性方面,影響最大的是BASIC。在20世紀(jì)70年代使用TRS-80 Extended Color BASIC圖形比任何X Window C API都更容易。對(duì)于非常高級(jí)的語(yǔ)言,如Unicon,其圖形功能應(yīng)與Extended Color BASIC提供的功能一樣簡(jiǎn)單,并且功能更強(qiáng)。保持人們對(duì)Icon的喜愛(ài)的要求延伸到嘗試使圖形功能的設(shè)計(jì)與Icon現(xiàn)有的輸入和輸出特性保持一致。Icon的輸入和輸出特性包括文件類(lèi)型、內(nèi)置函數(shù)和執(zhí)行輸入/輸出的運(yùn)算符。

Unicon引入了一個(gè)新類(lèi)型(“window”)作為Icon的文件數(shù)據(jù)類(lèi)型的子類(lèi)型(和擴(kuò)展)。窗口是對(duì)底層C代碼中十幾個(gè)不同Xlib實(shí)體的抽象。但對(duì)于Unicon程序員來(lái)說(shuō),創(chuàng)建和繪制窗口只是一件單一、簡(jiǎn)單的事情。所有現(xiàn)有的對(duì)文件執(zhí)行(文本)輸入/輸出操作都是在窗口中完成的,然后再添加圖形輸出功能。圖2.2展示了一些底層C庫(kù)實(shí)體,它們都被合并到一個(gè)Unicon窗口中。這個(gè)結(jié)構(gòu)的葉子因平臺(tái)而異,平臺(tái)差異在Unicon層級(jí)已經(jīng)被最小化或消除。

Unicon中的圖形輸出功能由一組大約40個(gè)內(nèi)置函數(shù)組成,用于繪制不同的圖形圖元。輸出的具體內(nèi)容取決于許多狀態(tài)片段,例如窗口內(nèi)容的內(nèi)存副本,以及字體和填充樣式等抽象資源。對(duì)這些資源并沒(méi)有引入新類(lèi)型,而是生成了一個(gè)API,以使用字符串值對(duì)這些資源進(jìn)行操作。一個(gè)窗口最終定義為兩個(gè)底層實(shí)體的配對(duì),即畫(huà)布和上下文。

控制結(jié)構(gòu)和程序組織是設(shè)計(jì)編程語(yǔ)言特性時(shí)要考慮的主要因素。當(dāng)用C語(yǔ)言編寫(xiě)圖形程序時(shí),程序員立即被告知(迫使)放棄對(duì)庫(kù)控制流,而把他們的程序組織成一組回調(diào)(callback)函數(shù)。這些函數(shù)是在各種事件發(fā)生時(shí)被調(diào)用的函數(shù)。圍繞這種組織方式重寫(xiě)Unicon的字節(jié)碼解釋器是不可能的。字節(jié)碼解釋器需要擁有指令的獲取-解碼-執(zhí)行周期的控制流。一個(gè)多線程的解決方案是可以實(shí)現(xiàn)的,但線程在此時(shí)會(huì)帶來(lái)不可接受的可移植性和性能挑戰(zhàn)。相反,當(dāng)應(yīng)用程序控制流要求時(shí),一個(gè)單線程的、非阻塞的解決方案是通過(guò)讓字節(jié)碼解釋器不時(shí)檢查圖形事件,處理常見(jiàn)的任務(wù)(如從后臺(tái)存儲(chǔ)中重新繪制窗口的內(nèi)容,并將其他內(nèi)容排隊(duì),以便稍后在Unicon語(yǔ)言層面上處理)實(shí)現(xiàn)的。

圖2.2 Unicon窗口的內(nèi)部結(jié)構(gòu)

本來(lái)有可能將二維圖形的C庫(kù)原封不動(dòng)地傳播到Unicon語(yǔ)言中,但這達(dá)不到語(yǔ)言水平和易用性的目標(biāo)。相反,我們引入了一個(gè)高級(jí)數(shù)據(jù)類(lèi)型,由C庫(kù)狀態(tài)的多個(gè)基礎(chǔ)部分組成。支持該高級(jí)數(shù)據(jù)類(lèi)型的維護(hù)和更新操作從語(yǔ)言運(yùn)行時(shí)系統(tǒng)中的多個(gè)地方嵌入,以用嚴(yán)格的庫(kù)方法不可能實(shí)現(xiàn)的方式實(shí)現(xiàn)了一個(gè)易于使用的窗口類(lèi)型。

若干年后,3D圖形硬件支持變得無(wú)處不在,2.6.2節(jié)將介紹在語(yǔ)言中添加3D圖形的設(shè)計(jì)問(wèn)題。

主站蜘蛛池模板: 泾川县| 长葛市| 石门县| 万全县| 镇原县| 上饶县| 斗六市| 忻城县| 云霄县| 沙河市| 湖北省| 永春县| 邢台县| 尼玛县| 大关县| 鹤庆县| 讷河市| 龙江县| 锡林浩特市| 德昌县| 勐海县| 榆中县| 仁化县| 阳高县| 商河县| 廊坊市| 大埔县| 屏东市| 洛宁县| 灵川县| 万源市| 阜新市| 普安县| 麻城市| 临潭县| 都昌县| 北辰区| 桂林市| 民和| 金门县| 九江市|