AIX語(yǔ)言環(huán)境和執(zhí)行速度的問(wèn)題
很多人都不明白AIX語(yǔ)言環(huán)境和執(zhí)行速度有什么關(guān)系。今天,我們就來(lái)講解下AIX語(yǔ)言環(huán)境和執(zhí)行速度的問(wèn)題。本地語(yǔ)言支持(NLS)使應(yīng)用不同AIX語(yǔ)言環(huán)境的操作系統(tǒng)變得十分便利。因?yàn)閺V泛應(yīng)用 NLS 對(duì)于從系統(tǒng)獲取***性能變得越來(lái)越重要,因此本附錄包含了一個(gè)對(duì)于 NLS 的簡(jiǎn)短回顧。
NLS 允許操作系統(tǒng)定制為適合個(gè)別用戶語(yǔ)言和文化期望。一個(gè)AIX語(yǔ)言環(huán)境是語(yǔ)言和地理或者文化需求的特定組合,它由一個(gè)復(fù)合名稱來(lái)標(biāo)識(shí),例如 en_US(美國(guó)英語(yǔ))。
對(duì)于每個(gè)受支持的AIX語(yǔ)言環(huán)境,它們有一套消息編目、??敝当砗推渌x該語(yǔ)言環(huán)境的要求的信息。當(dāng)安裝了操作系統(tǒng)以后,系統(tǒng)管理器可選擇應(yīng)安裝哪個(gè)語(yǔ)言環(huán)境。然后,各用戶可以通過(guò)更改 LANG 和 LC_ALL 變量來(lái)控制每個(gè) shell 的語(yǔ)言環(huán)境。
不符合上述結(jié)構(gòu)的一個(gè)AIX語(yǔ)言環(huán)境是 C(或 POSIX)語(yǔ)言環(huán)境。除非用戶明確地選擇另一個(gè)環(huán)境,否則 C 語(yǔ)言環(huán)境是系統(tǒng)缺省語(yǔ)言環(huán)境。每個(gè)新派生的進(jìn)程也是再此語(yǔ)言環(huán)境中開始的。運(yùn)行 C 語(yǔ)言環(huán)境最接近于操作系統(tǒng)在 UNIX 的原始的單語(yǔ)言格式中運(yùn)行。沒(méi)有 C 消息編目。相反,嘗試從編目中獲取消息的程序返回已編譯進(jìn)程序的默認(rèn)消息。一些命令,如 sort 還原至它們?cè)嫉奶囟ㄓ谧址乃惴ā?/p>
NLS 的性能通常分為三個(gè)區(qū)域。C 語(yǔ)言環(huán)境對(duì)于執(zhí)行命令通常是最快的,接下來(lái)是單字節(jié)(拉丁字母)語(yǔ)言環(huán)境,如 en_US,而多字節(jié)語(yǔ)言環(huán)境執(zhí)行命令最慢。
一些簡(jiǎn)單的規(guī)則
如果程序員未注意到多字節(jié)字符集設(shè)計(jì)的一些限制(這些限制允許許多程序在多字節(jié)語(yǔ)言環(huán)境中高效運(yùn)行而幾乎不用國(guó)際化函數(shù))則可能編寫出緩慢、多語(yǔ)言應(yīng)用程序。例如:
· 在 IBM 支持的所有代碼集中,字符代碼 0x00 到 0x3F 是唯一的,并對(duì) ASCII 標(biāo)準(zhǔn)字符進(jìn)行編碼。唯一是指這些位組合不會(huì)作為多字節(jié)字符的字節(jié)之一字節(jié)出現(xiàn)。因?yàn)榭兆址窃摷囊徊糠?,所?strlen()、strcpy() 和 strcat() 函數(shù)用來(lái)處理多字節(jié)以及單字節(jié)字符串。程序員必須牢記 strlen() 返回的值是字符串中的字節(jié)數(shù),而不是字符數(shù)。
· 同樣地,標(biāo)準(zhǔn)字符串函數(shù) strchr(foostr, '/') 在所有AIX語(yǔ)言環(huán)境下都運(yùn)行正常,因?yàn)?/(斜杠)是唯一代碼點(diǎn)范圍的一部分。實(shí)際上,大多數(shù)標(biāo)準(zhǔn)定界符在 0x00 到 0x3F 的范圍內(nèi),所以大部分語(yǔ)法分析不用依賴國(guó)際化函數(shù)或或轉(zhuǎn)化為 wchar_t 格式就能完成。
· 字符串的比較會(huì)出現(xiàn)兩類情況:相等或不等。使用標(biāo)準(zhǔn) strcmp() 函數(shù)來(lái)執(zhí)行比較。當(dāng)你寫入:
if (strcmp(foostr,"a rose") == 0)
您不是在用其它任何名稱查找 "a rose";您僅在查找該位集。如果 foostr 包含 "a rosE" ,則未找到任何匹配的字符。
· 當(dāng)你要嘗試在AIX語(yǔ)言環(huán)境定義的??毙蛄兄信帕凶址畷r(shí),將發(fā)生不等比較。在那種情況下,你應(yīng)使用:
if (strcoll(foostr,barstr) > 0)
并且為獲取每個(gè)字符的??毙畔⒁冻鲂阅艽鷥r(jià)。
· 當(dāng)執(zhí)行程序時(shí),它始終 C 語(yǔ)言環(huán)境中開始。如果它將使用一個(gè)或多個(gè)國(guó)際化函數(shù)(包括訪問(wèn)消息目錄)則它必須執(zhí)行:
setlocale(LC_ALL, "");
以在調(diào)用任何國(guó)際化函數(shù)前切換至其父進(jìn)程的語(yǔ)言環(huán)境。
到這里,我們應(yīng)該懂得AIX語(yǔ)言環(huán)境和執(zhí)行速度的關(guān)系了。
【編輯推薦】