Static Wikipedia February 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Web Analytics
Cookie Policy Terms and Conditions 類型系統 - Wikipedia

類型系統

维基百科,自由的百科全书

電腦科學中,類型系統定義為如何將程式語言中的數值和表達式分類到類型、如何操作那些類型,以及如何互相作用。類型是指一組變數,其具有普遍意義上的相同排序,或具有特定的目的(雖然某些類型,如抽象類型和函式類型,在運作時的程式中,可能不表示為值)。類型系統在各種語言之間有非常大的不同,也許,最主要的差異存在於編譯時期的語法,以及執行時期的運作實踐。

編譯器可能使用值的靜態類型以最佳化所需的儲存區,並選取對值運算時的較佳演算法。例如,在許多C編譯器中,「浮點數」資料類型是以 32 位元表示,與IEEE規格一致的單精度浮點數。因此,在數值運算上,C 應用了浮點數規範(浮點數加法、乘法等等)。

類型的約束程度以及評估方法,影響了語言的類型。更進一步,程式語言可能就類型多態性部分,對每一個類型都對應了一個極度個別的演算法的運算。類型理論研究類型系統,儘管實際的程式語言類型系統,起源於電腦架構的實際問題、編譯器實作,以及語言設計。

目录

[编辑] 基礎

指派資料類型(typing)賦予一組位元某個意義。類型通常和記憶體中的數值或物件(如變數)相聯繫。因為在電腦中,任何數值都是以一組位元簡單組成的,硬體無法區分記憶體位址、指令碼、字元、整數、以及浮點數。類型可以告知程式和程式設計者,應該怎麼對待那些位元。

類型系統提供的主要功能有︰

  • 安全性
使用類型可允許編譯器偵測無意義的,或者是可能無效的代碼。例如,可以識出一個無效的表達式 "Hello, World" + 3,因為不能對(在平常的直覺中)逐字字串加上一個整數。強類型提供更多的安全性,但它並不能保證絕對安全(詳情請見類型安全)。
  • 最佳化
靜態類型檢查可提供有用的資訊給編譯器。例如,如果一個類型指明某個值必須以 4 的倍數對齊,編譯器就有可以使用更有效率的機器指令。
  • 可讀性
在更具表現力的類型系統中,若其可以闡明程式設計者的意圖的話,類型就可以充當為一種文件形式。例如,時間戳記可以是整數的子類型;但如果程式設計者宣告一個函式為返回一個時間戳記,而不只是一個整數,這個函式就能表現出一部分文件的闡釋性。
  • 抽象化(或模組化
類型允許程式設計者對程式以較高層次的方式思考,而不是煩人的低層次實作。例如,程式設計者可以將字串想成一個值,以此取代僅僅是位元組的陣列。或者類型允許程式設計者表達兩個子系統之間的界面。將子系統間互動時的必要定義加以定位,防止子系統間的通訊發生衝突。

程式通常對每一個值關聯一個特定的類型(儘管一個類型可以有一個以上的子類型)。其它的實體,如物件模組、通訊頻道、依賴關係,或者純粹的類型自己,可以和一個類型關聯。例如︰

一個數值的類型
一個物件的類型
  • 種類
一個類型的類型

在每一個程式語言中,都有一個特定的類型系統,保證程式的表現良好,並且排除違規的行為。作用系統對類型系統提供更多細微的控制。

[编辑] 類型檢查

類型檢查所進行的檢驗處理以及實行類型的約束,可發生在編譯時期(靜態檢查)或執行時期(動態檢查)。靜態類型檢查是在編譯器所進行語義分析中進行的。如果一個語言強制實行類型規則(即通常只允許以不遺失資訊為前題的自動類型轉換)就稱此處理為強類型,反之稱為弱類型

[编辑] 靜態和動態檢查

如果一個程式語言的類型檢查,可在不測試執行時期表達式的等價性的情況下進行,該語言即為靜態類型。一個靜態類型的程式語言,是在執行時期和編譯時期之間的處理階段下重視這些區別的。如果程式的獨立模組,可進行各自的類型檢查(獨立編譯),而無須所有會在執行時出現的模組的那些資訊,該語言即具有一個編譯時期階段。如果一個程式語言支援執行時期(動態)調度已標記的資料,該語言即為動態類型。如果一個程式語言破壞了階段的區別,因而類型檢查需要測試執行時期的表達式的等價性,該語言即為依賴類型[1]

在動態類型中,經常在執行時期進行類型標記的檢查,因為變數所約束的值,可經由執行路徑獲得不同的標記。在靜態類型程式語言中,類型標記使用辨識聯合類型表示。

動態類型經常出現於腳本語言和RAD語言中。動態類型在解譯語言中極為普遍,編譯語言則偏好無須執行時期標記的靜態類型。對於類型和隱式類型語言較完整的列表參見類型和隱式類型語言。

術語推斷類型(duck typing)指的是動態類型在語言中的應用方式,它會「推斷」一個數值的類型。

看看類型標記檢查是如何運作的,考慮下列假碼範例︰

var x; // (1)
x := 5; // (2)
x := "hi"; // (3)

在這個範例中,(1) 宣告 x;(2) 將整數值 5 代給 x;(3) 將字串值 "hi" 代給 x。在主要的靜態系統中,這個代碼片斷將會違反規則,因為 (2) 和 (3) 對 x 所約束的類型相矛盾。

相較之下,一個純粹的動態類型系統允許上述程式的執行,因為類型標記附到數值上(不是變數)。在處理錯誤語句或表達式的時候,以動態類型實作的語言會捕捉程式的錯誤,而不是誤用錯誤類型的數值。換句話說,動態類型捕捉在程式執行時的錯誤。

典型的動態類型實作,會以類型標記維持程式所有數值的「標記」,並在運算任何數值之前檢查標記。例如︰

var x := 5; // (1)
var y := "hi"; // (2)
var z := x + y; // (3)

在這個程式片斷中,(1) 將數值 5 約束給 x;(2) 將數值 "hi" 約束給 y;以及 (3) 嚐試將 x 加到 y。在動態類型語言中,約束給 x 的值會是一對 (整數, 5),且約束給 y 的值會是一對 (字串, "hi")。當這個程式嚐試執行第 3 行時,語言對類型標記整數字串進行檢查,如果這兩個類型的 +(加法)運算尚未定義,就會發出一個錯誤。

某些靜態語言有一個「後門」,在這些程式語言中,能夠編寫一些不被靜態類型所檢查的代碼。例如,Java 和 C-風格的語言有「轉型」可用。在靜態類型的程式語言中,不必然意味著缺乏動態類型機制。例如 Java 使用靜態類型,但某些運算需要支援執行時期的類型測試,這就是動態類型的一種形式。更多靜態和動態類型的討論,請參閱程式語言

[编辑] 實踐中的靜態和動態類型檢查

對靜態類型和動態類型兩者之間的權衡也是必要的。

靜態類型在編譯時期時,就能可靠地發現類型錯誤。因此通常能增進最終程式的可靠性。然而,有多少的類型錯誤發生,以及有多少比例的錯誤能被靜態類型所捕捉,目前對此仍有爭論。靜態類型的擁護者認為,當程式通過類型檢查時,它才有更高的可靠性。雖然動態類型的擁護者指出,實際流通的軟體證明,兩者在可靠性上並沒有多大差別。可以認為靜態類型的價值,在於增進類型系統的強化。強類型語言(如 MLHaskell)的擁護者提出,幾乎所有的臭蟲都可以看作是類型錯誤,如果編寫者以足夠恰當的方式,或者由編譯器推斷來宣告一個類型。[2]

靜態類型通常可以編譯出速度較快的代碼。當編譯器清楚知道所要使用的資料類型,就可以產生最佳化過後的機器碼。更進一步,靜態類型語言中的編譯器,可以更輕易地發現較佳捷徑。某些動態語言(如 Common Lisp)允許任意類型的宣告,以便於最佳化。以上理由使靜態類型更為普及。參閱最佳化

相較之下,動態類型允許編譯器和解譯器更快速的運作。因為原始碼在動態類型語言中,變更為減少進行檢查,並減少解析代碼。這也可減少編輯-編譯-測試-除錯的週期。

靜態類型語言缺少類型推斷(如 Java),而需要編寫者宣告所要使用的方法或函式的類型。編譯器將不允許編寫者忽略,這可為程式起附加性說明文件的作用。但靜態類型語言也可以無須類型宣告,所以與其說是靜態類型的代價,倒不如說是類型宣告的報酬。

靜態類型允許建構函式庫,它們的使用者不太可能意外的誤用。這可作為傳達函式庫開發者意圖的額外機制。

動態類型允許建構一些靜態類型系統所做不出來的東西。例如,eval 函式,它使得執行任意資料作為代碼成為可能(不過其代碼的類型仍是靜態的)。此外,動態類型容納過渡代碼和原型設計,如允許使用字串代替資料結構。靜態類型語言最近的增強(如 Haskell 一般化代數資料類型)允許 eval 函式以類型安全的方式撰寫。

動態類型使元程式設計更為強大,且更易於使用。例如 C++ 模板的寫法,比起等價的 RubyPython 寫法要來的麻煩。更高度的執行時期構成物,如元類別(metaclass)和內觀(Introspection),對靜態類型語言而言通常更為困難。

[编辑] 強類型和弱類型

強類型的基本定義即為,禁止錯誤類型的參數繼續運算。C語言的類型轉換即為缺乏強類型的證例;如果編寫者用 C 語言對一個值轉換類型,不僅令編譯器允許這個代碼,而且在執行時期中也同樣允許。這使得 C 代碼可更為緊密和快速,不過也使除錯變的更為困難。

部分學者使用術語記憶體安全語言(或簡稱為安全語言)形容禁止未定義運算發生的語言。例如,某個記憶體安全語言將會檢查陣列邊界。

弱類型意指一個語言可以隱式的轉換類型(或直接轉型)。看看先前的例子︰

var x := 5;
var y := "37";
x + y;

在弱類型語言中編寫上述代碼,並不清楚將會得到哪一種結果。某些語言如 Visual Basic,將會產生可以運作的代碼,它將會給出的結果是 42︰系統將字串 "37" 轉換成數字 37,以符合運算上的直覺;其它的語言,像 JavaScript 將會產生的結果是 "537"︰系統將數字 5 轉換成字串 "5" 並把兩者串接起來。在 Visual Basic 和 JavaScript 中,最終的類型是以那兩個運算元為考量的規則所決定。在部分語言中,如 AppleScript,某個值最終的類型,只以最左邊的運算元的類型所決定。

設計精巧的語言也允許語言顯現出弱類型(籍由類型推斷之類的技術)的特性以方便使用,並且保留了強類型語言所提供的類型檢查和保護。例子包括 VB.NetC# 以及 Java

運算子重載所帶來的簡化,像是不以算術運算中的加法來使用「+」,可以減少一些由動態類型所造成的混亂。部分語言使用「.」或「&」來串連字串,例如。

[编辑] 類型系統的安全性

主条目:類型安全

程式語言的類型系統的第三種分類方法,就是類型運算和轉換的安全性。如果它不允許導致不正確的情況的運算或轉換,電腦科學就認為該語言是「類型安全」的。

再次看看這個假碼例子︰

var x := 5;
var y := "37";
var z := x + y;

在一個如 Visual Basic 的語言中,例子中的變數 z 得到的值為 42。不管編寫者有沒有這個意圖,該語言定義了明確的結果,且程式不會就此崩潰,或將不明定義的值賦給 z。就這方面而言,這樣的語言就是類型安全的。

現在來看 C 的相同例子︰

int x = 5;
char y[] = "37";
char* z = x + y;

在這個例子中,z 將會指向一個超過 y 位址 5 個位元組的記憶體位址,相當於指向 y 字串的指標之後的兩個空字元之處。這個位址的內容尚未定義,且有可能超出記憶體的定址界線,而且就這麼引用參考 z 會引起程式的終止。雖是一個良好類型,但卻不是記憶體安全的程式--如果以對類型安全語言而言不該發生為先決條件的話。

[编辑] 多態性和類型

主条目:多態 (電腦科學)

術語「多態性」指的是︰代碼(尤其是函式和類別)對各種類型的值能夠動作,或是相同資料結構的不同實體能夠控制不同類型的元素。為了提升複用代碼的潛在價值,類型系統逐漸允許多態性︰在具有多態性的語言中,程式設計者只需要實作如列表或詞典的資料結構一次,而不是對使用到它的元素的每一個類型都規劃一次。基於這個原因,電腦學家也稱使用了一定的多態性的方法為泛型程式設計。類型理論的多態性基礎與抽象化模組化和(偶爾)子類型有相當密切的聯繫關係。

[编辑] 推斷類型

主条目:推斷類型

推斷類型(Duck typing)最初是由 Dave Thomas 在 Ruby 社群中提出的,推斷類型用了這個論證法「如果它像什麼,而且其它地方也像什麼,那麼它就是什麼。」

在某些程式設計環境中,兩個物件可以有相同的類型,即使它們沒有什麼交集。一個例子是 C++ 在迭代器和指標之間的雙重性。兩者皆以不甚相同的機制實作並提供一個 * 運算。

這個技術之所以常被稱作「鴨子類型」,是基於這句格言︰「如果它搖搖擺擺的走法很像鴨子,而且它的嘎嘎叫聲也像鴨子,那它就是一隻鴨子!」

"If it waddles like a duck, and quacks like a duck, it's a duck!"

[编辑] 顯示宣告和隱式暗示

許多靜態類型系統,如 C 和 Java,要求要宣告類型︰編寫者必須以指定類型明確地關聯到每一個變數上。其它的,如 Haskell,則進行類型推斷︰編譯器根據編寫者如何運用這些變數,以草擬出關於這個變數的類型的結論。例如,給定一個函式 f(x,y),它將 xy 加起來,編譯器可以推斷出 xy 必須是數字--因為加法僅定義給數字。因此,任何在其它地方以非數值類型(如字串或鏈表)作為參數來呼叫 f 的話,將會發出一個錯誤。

在代碼中數值、字串常數以及表達式,經常可以在詳細的前後文中暗示類型。例如,一個表達式 3.14 可暗示浮點數類型;而 [1, 2, 3] 則可暗示一個整數的鏈表;通常是一個陣列

[编辑] 類型的類型

類型的類型是一種種類。在類型程式設計中有明確的種類,如 Haskell 程式語言類型建構子,在申請比較簡單的類型之後,其返回一個簡單的類型。例如,類型建構子 二選一 有這些種類 * -> * -> ** 代表種類),而且它的申請 二選一 字串 整數 是一個簡單的類型。然而,大多數程式語言的類型,是由編寫者來暗示或寫死,這就並未將種類的概念用作為首選層。

類型可分為幾個大類︰

這是最簡單的類型種類,例如︰整數浮點數
全部是數字的類型,例如︰整數和自然數
以浮點數表示數字的類型
由基本類型組合成的類型,例如︰陣列記錄單元抽象資料類型具有複合類型和界面兩種屬性,這取決於你提及哪一個。
  • 子類型
  • 衍生類型
  • 物件類型
例如︰變數類型
例如︰二進制函式
如參數類型
模組
  • 精煉類型
識別其它類型的子集的類型
  • 依賴類型
取決於執行時期的數值的類型
  • 所有權類型
描述或約束物件導向系統結構的類型

[编辑] 相容性︰等價性和子類型

對於靜態類型語言的類型檢查器,必須檢驗所有表達式的類型,是否與前後文所期望的類型一致。例如賦值語句 x := e,推斷表達式 e 的類型,必定與宣告或推斷的變數類型 x 一致。這個一致性的概念,就稱為相容性,是每一個程式語言所特有的。

很明顯,如果 ex 的類型相同,就允許賦值,然後這是一個有效的表達式。因此在最簡單的類型系統中,問題從兩個類型是否相容,簡化為兩個類型是否相等(或等價)。然而不同的語言對於兩個類型表達式是否理解為表示了相同類型,有著不同的標準。類型的相等理論的差異相當巨大,兩個極端的例子是結構類型系統(Structural type system),任兩個以相同結構所描述的值的類型都是等價的,且在標明類型系統(Nominative type system)上,沒有兩個獨特的語法構成的類型表達式表示同一類型,(類型若要相等,就必須具有相同的「名字」)。

在子類型的語言中,相容關係更加複雜。特別是如果 AB 的子類型,那麼類型 A 的值可用於類型 B 也屬意料之中,但反過來就不是這樣。如同等價性,對每一個程式語言而言,子類型的關係的定義是不同的,可能存在各種變化。在語言中出現的參數或者特定的多態性,也可能意味著具有對類型的相容性。

[编辑] 爭議

在強類型、靜態類型語言的支持者,和動態類型、自由形式的支持者之間,經常發生爭執。前者主張,在編譯的時候就可以較早發現錯誤,而且還可增進執行時期的效能。後者主張,使用更加動態的類型系統,分析程式碼更為簡單,減少出錯機會,才能更加輕鬆快速的編寫程式。[3]與此相關的是,考慮到在類型推斷的程式語言中,通常不需要手動宣告類型,這部分的額外開銷也就自動降低了。

[编辑] 參考資料

  1. Harper, Robert & Benjamin C. Pierce (2005), "Design Considerations for ML-Style Module Systems", in Pierce, Benjamin C., Advanced Topics in Types and Programming Languages, Cambridge, MA: MIT Press, ISBN 0262162288
  2. http://citeseer.ist.psu.edu/xi98dependent.html
  3. Meijer, Erik and Peter Drayton - Static Typing Where Possible, Dynamic Typing When Needed: The End of the Cold War Between Programming Languages Microsoft Corporation

[编辑] 參閱

您可以在維基教科書中查找此百科条目的相關電子教程:
您可以在維基教科書中查找此百科条目的相關電子教程:
Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu