查看“︁控制表”︁的源代码
←
控制表
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{NoteTA |G1= IT }} [[File:Control table.png|thumb|220px|一個簡單的控制表,依單一輸入變數決定程式流程,每個表格項目包括一個可能的輸入數值,及對應動作的副程式,若程式語言不支援指向副程式或函式的指標,也可以用副程式的編號代替]] '''控制表'''是一個決定[[控制流程]]或是主要影響控制流程的[[数组|表]]。關於控制表的結構或內容沒有硬性的規定,其特點是其可以影響[[控制流程]]的能力。這類表格的設計有時稱為「表格驅動設計」<ref>''Programs from decision tables'', Humby, E., 2007,Macdonald, 1973 ... Biggerstaff, Ted J. Englewood Cliffs, NJ : Prentice-Hall ISBN 0-444-19569-6</ref><ref>{{Cite web |url=http://www.dkl.com/html/CMFiles/53table_driven_design.pdf |title=存档副本 |access-date=2012-09-17 |archive-url=https://web.archive.org/web/20120808114334/http://www.dkl.com/html/CMFiles/53table_driven_design.pdf |archive-date=2012-08-08 |dead-url=yes }}</ref>(不過後者多半是指由外部的表格自動生成程式碼,而不是在程式中的表格)。以[[有限狀態機]]為基礎的[[自动机编程]]有時會用控制表為其實現方式。若控制表有幾個不同的層次,其行為就類似{{link-en|UML狀態機|UML state machine}}。 控制表有時會以{{link-en|關聯表|association list}}的方式表示,其中會有對應的[[條件表示式]]及[[子程序]]。控制表可以簡化一些類似的程式敘述,而且若是二維的控制表,在閱讀及更新上都比一維特性的程式碼要容易維護,有時控制表甚至可以讓非程式設計師來維護。電腦科學家[[高德納]]在1974年提出的論文《Structured Programming with go to Statements》中就提到「多路分支是一種重要的程式設計技術,但常常被一些數量不足的if指令取代」<ref> {{cite journal en |author = Donald Knuth |title = Structured Programming with go to Statements |journal = Computing Surveys |volume = 6 |issue = 4 |date = Nov 1974 |pages = pp 261-301 |url = http://sbel.wisc.edu/Courses/ME964/Literature/knuthProgramming1974.pdf |language = en |format = PDF |accessdate = 11 Oct 2012 |archive-url = https://web.archive.org/web/20120523061003/http://sbel.wisc.edu/Courses/ME964/Literature/knuthProgramming1974.pdf |archive-date = 2012-05-23 |dead-url = yes }} </ref>。 ==一般使用方式== *將輸入變數轉換為: **一個和和後續分支跳躍或[[指標_(電腦科學)|指標]][[查找表|查找]]有關的編號。 **一個程式模組名稱、其編號、[[標記_(程式語言)|標記]]或是程式指標的[[偏移量]],以調整後面的控制流程。 *[[状态转移表]]中的[[控制變數]],在[[事件驅動程式設計]]中來控制[[事件迴圈]]。 * 在[[線上交易處理]]中控制程式周期。 ==進階使用方式== * 可以作為由[[直譯器]]運作的[[虛擬機器]]中的虛擬指令 :類似[[字节码]],但常會配合控制表的結構中隱含的動作而運作。 ==表格結構== 控制表可以是多維的,可以是固定長度或是[[可變長度編碼|可變長度]],而且具有可在不同[[系统平台]]之間使用的[[軟體可攜性|可攜性]],系统平台變動時只針對[[直譯器]]修改軟體,不會變動隱含在控制表的結構及其內容中的演算法。控制表的結構可能類似一個[[multimap]]的關聯表,會將資料值(或資料值的結合)映射到一個或多個要進行的函式。 ===一維表格=== 控制表可以是一維表格的形式,這可能也是最簡單的控制表。一維表格的控制表將原始数据轉換為副程式的偏移值、編號或是指標,轉換方式可能是直接以{{link-en|原始数据|raw data}}為索引進行查表,或是將原始数据進行簡單的數學處理後再作為表格的索引。查表的過程不會用到[[線性搜尋]]或是[[二分搜尋]],可以在[[常數時間]]內完成。對於大部份的[[電腦架構]]而言,上述處理可以利用二或三個[[機器語言]]的指令來達成,不需進行比較或是迴圈處理。此技術一般稱為「Trivial hash function」,若特別用在分支表中,則稱為{{link-en|雙重分派|double dispatch}}。若要使用一維表格的控制表,數據的可能範圍需要很小,像[[ASCII]]或[[EBCDIC]]字元都只有255個可能資料,符合此條件,若數據是用ASCII字元表示,且可以確認其中有些數據不可能出現,其對應的控制表會更小。 以下是將ASCII的資料(A,D,M,S)轉換為副程式編號(1,2,3,4)的控制表,此控制表為一維陣列,可以在[[常數時間]]內完成轉換。 (下表只列出有使用的部份,中間副程式編號為0的部份省略,下表中的前二欄只作說明用,只有第三欄才是控制表) {| class="wikitable" style="text-align:center; " |- style="vertical-align:bottom;" ! [[:ASCII]]!! [[十六進位]] !! Array |- | [[空字元]] || 00 ||style="background:lightblue;"| 00 |- | .. || .. ||style="background:lightblue;"| 00 |- | [[@]] || 40 ||style="background:lightblue;"| 00 |- |A || 41 ||style="background:lightblue;"| '''01''' |- | .. || .. ||style="background:lightblue;"| 00 |- |D || 44 ||style="background:lightblue;"| '''04''' |- | .. || .. ||style="background:lightblue;"| 00 |- |M || 4D ||style="background:lightblue;"| '''03''' |- | .. || .. ||style="background:lightblue;"| 00 |- |S || 53 ||style="background:lightblue;"| '''02''' |} 在[[自動機編程]]及{{link-en|伪会话交易|pseudoconversational transaction}}程序中,若相異程式狀態的個數不多,可以有效的用控制變數來建立整個程式控制流程的模型。 上述一維的控制表可以視為將原始資料直接翻譯為對應副程式的數值,在原始資料的種類不多,或者有夠快的記憶體時,此作法可以快速的進行[[資料驗證]]及對應副程式數值的轉換。 ===分支表=== [[分支表]]是由連續的[[機械碼]][[分支_(計算機科學)|branch或jump]]指令組成的一維陣列,其目的是可以進行{{link-en|多路分支|multiway branch}},依編號執行對應的指令。有時[[編譯器]]最佳化處理{{link-en|switch指令|switch statement}}時,若輸入值的範圍不大,也可能會用分支表來實現<code>switch</code>指令。 分支表比一連串的<code>If</code>指令要短,但分支指令碼仍然會重複出現,而上述的控制表只包括副程式編號,執行上所需時間會比分支表短。 ===多維陣列=== 控制表常常也可以視為是[[真值表]]或是{{link-en|決策表|decision table}}的可執行版本。控制表中常包括了命題及一到多個的對應行動。行動一般會是通用的副程式或是客戶建立的副程式,程式扮演類似「[[直譯器]]」的作用,依命題是否符合執行對應的行動,程式類似一個[[虛擬機器]],執行控制表的內容,其[[抽象化 (計算機科學)|抽象化]]的程度較高。 多維陣列的控制表也可以用程式語言中的switch指令來代替,而其條件可以利用邏輯運算的[[邏輯與|AND]]和[[邏輯或|OR]]指令組合出複雜的條件,條件成立時也可以執行不止一個的[[副程式]]。不過各[[高级语言]]中的switch指令在語法上可禸能仍然有些差異,而且可能有些語言的switch指令不允許複雜的條件。相較於switch指令,控制表沒有程式語言的相依性,在處理上會比較單。 ===控制表的內容=== 控制表保留了傳統程式的本質,去除了程式語言的語法及和平台有關的成份(例如IF/THEN DO.., FOR.., DO WHILE.., SWITCH, GOTO, CALL),將程式濃縮為變數(例如input1)、數值(例如'A','S','M'及'D')及副程式的識別符號(例如'Add','subtract,..'或#1, #2,..)。控制表的結構本身隱含了有關的程序,包括比較是否相等、執行副程式等。 多維的控制表至少會包括一組數值和動作,可能還會有額外的運算子或其他資訊,例如輸入或輸出資料的位置、長度及格式,供控制表相關程式進行資料轉換。控制表可能會包括[[数组|索引]]或指向要執行副程式的[[指標_(電腦科學)|指標]]或相對位置。 以下舉例用的控制表只接受一個輸入。 '''控制表結構中隱含的條件及動作''' ::{| class="wikitable" | '''(隱含)IF ='''|| '''(隱含)處理''' |- | 資料|| 動作 |- | 資料|| 動作 |} (這種資料及動作對應的情形類似[[事件驅動程式設計]],但後者的事件本身會有[[非同步系統|非同步]]的特性) 控制表可以包含的資料種類和使用的[[程式語言]]有關,[[組合語言]]沒有資料型態的限制,允許的資料最多,其至在動作部份可以包括對應的程式碼位址。一般控制表會包括各個可能的數值及對應副程式的指標。若有些語言沒有指標的概念,則其動作部份可以用一個程式碼的編號表示,再用switch指令執行對應的副程式。 控制表中可以加入註解或其他文字說明,可以使控制表除了包括其程式邏輯以外,也會提昇其可讀性。若是在程式開發前就已製作手寫的決策表,列舉不同的情形及其動作時,控制表可以用來比對是否符合原始程式規格。控制表中也可以包括一些計數器,提供不同情形的統計資訊,可以在程式執行中自動進行最佳化,或是之後由人工修改程式,進行最佳化。 控制表可以當成程式的[[静态变量]],利用文字檔儲存,放在[[資料庫]]中,也可以在程式[[啟動程式|啟動]]時依參數動態建立。 ==性能考量== 乍看之下,使用控制表會增加{{link-en|運算負擔|Computational overhead}},因為需要一個程序來查表及執行對應的副程式。不過將執行的程式及用表格表示的邏輯分開,可以更清楚的讓每個程式執行各自的機能。就像是[[電子試算表|試算表]]的應用程式一様,為了顯示其結果,試算表軟體將複雜的公式變成可以有效用表格顯示的方式。 ==控制表的例子== 以下的範例是以四則運算為例,為簡單起見只接受一個輸入,範例的目的只是展示如何用控制表來取代一般程式的指令來調整控制流程。控制表也可以接受多個輸入,若利用有層次的連結式控制表,也可以達到[[結構化程式設計]]的目的(可能可以使用縮排來突顯控制表中的副程式)。 CT1的控制表是一個簡單的[[查找表]],第一欄是要測試的資料,若資料等於第一欄的數值,會執行第二欄指定的副程式。實務上這就是一個[[多路分支]]的形式來進行,也是一種{{link-en|動態分配|dynamic dispatch}}的形式,最後一列是對應資料不符合任一數值時的處理。 '''CT1''' :{| class="wikitable" ! 輸入1!! [[指標_(電腦科學)|指標]] |- | '''A''' || -->Add |- | '''S''' || -->Subtract |- | '''M''' || -->Multiply |- | '''D''' || -->Divide |- | '''?''' || -->Default |} <syntaxhighlight lang="c"> static const char CT1[] = { "A", "S", "M", "D" }; /* permitted input values */ static const void *CT1p[] = { &&Add, &&Subtract, &&Multiply, &&Divide, &&Default}; /* labels to goto & default*/ for (int i = 0; i < sizeof(CT1); i++) /* loop thru ASCII values */ {if (x == CT1[i]) goto *CT1p[i]; } /* found --> appropriate label */ goto *CT1p[i+1]; /* not found --> default label */ </syntaxhighlight> 若控制表改為一個有256個元素的一維陣列,直接將數值轉換為對應副程式的編號,即利用元素大小為位元組的陣列進行{{link-en|索引映射|index mapping}},可以在[[常數時間]] <math>O(1)\,</math>內找到對應的副程式,CT1p陣列也可以用指向副程式的指標代替[[標記 (程式語言)|標記]],就不需用到goto指令,但因為呼叫副程式需要的{{link-en|系統服務|Housekeeping (computing)}}較多,會對程式性能略為影響。 <syntaxhighlight lang="c"> static const void *CT1p[] = {&&Default, &&Add, &&Subtract, &&Multiply, &&Divide}; /* the 256 byte table, below, holds values (1,2,3,4), in corresponding ASCII positions (A,S,M,D), all others set to 0x00 */ static const char CT1x[]={ '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x01','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00', '\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00'}; /* the following code will execute in constant time, irrespective of the value of the input character (x) */ i = CT1x(x); /* extract the correct subroutine index from table CT1x using its ASCII value as an index initially */ goto *CT1p[i]; /* goto (Switch to) the label corresponding to the index (0=default,1= Add,2= Subtract,.) - see CT1p */ </syntaxhighlight> 以下的例子說明只要程式語言支援依編號分支到各副程式的語法(副程式放在一個啟始編號為0的陣列中),就可以達到類似上述程式的二維控制表的效果。下例中用陣列CT2來決定指標陣列CT2P的編號,若程式語言不支援指標陣列,也可以用類似SWITCH指令的方式處理,SWITCH指令中可以直接處理輸入,或是跳到對應的副程式再處理輸入。 '''CT2''' :{| class="wikitable" ! 輸入 1!! '''副程式編號''' |- | '''A''' || '''1''' |- | '''S''' || '''2''' |- | '''M''' || '''3''' |- | '''D''' || '''4''' |- | '''?''' || '''0''' |} ::'''CT2P''' 指標陣列 ::{| class="wikitable" ! [[指標_(電腦科學)|指標]][[陣列]]!! |- | '''-->default''' |- | '''-->Add''' |- | '''-->Subtract''' |- | '''-->Multiply''' |- | '''-->Divide''' |- | '''-->?other''' |} 以下的例子不使用實際的程式碼,只用二個陣列來表示,只要是支援依編號分支到陣列中(陣列是從0開始編號)特定副程式的程式語言皆可適用。可利用陣列CT2將輸入的資料轉換為副程式陣列(CP2)的編號,若此程式語言不支援指標,也可以用類似SWITCH指令的作法取代CP2陣列的查表,依序將輸入值和每一個可能的資料比對,若資料符合,跳到對應的副程式中。 '''CT2''' :{| class="wikitable" ! 輸入1 !! '''副程式編號''' |- | '''A''' || '''1''' |- | '''S''' || '''2''' |- | '''M''' || '''3''' |- | '''D''' || '''4''' |- | '''?''' || '''0''' |} 此例可以在不使用查表法的情形下,很有效率的將[[ASCII]]輸入資料(A、S、M、D或其他)轉換為指標陣列的編號,不過為了和上例一致,仍使用陣列表示。 ::'''CT2P''' 指標陣列 ::{| class="wikitable" ! 指標陣列!! |- | '''-->default''' |- | '''-->Add''' |- | '''-->Subtract''' |- | '''-->Multiply''' |- | '''-->Divide''' |- | '''-->?other''' |} 也可以配合實際的應用,創造有更多欄位的控制表,控制表會比上例複雜,但可以在更多測試輸入時有更多測試條件的組合,而不是只比對單一測試條件。以下的控制表有增加一個輸入資料(小寫的a、s、m、d),若輸入滿足其中一個資料,該測試條件就成立,也就會進行對應的動作,另外也增加一欄來計算實際執行時各個條件成立過幾次。 '''CT3''' :{| class="wikitable" ! 輸入1 !!替代輸入!! '''副程式編號'''!! '''計數''' |- | '''A''' ||'''a'''|| '''1'''|| '''0''' |- | '''S''' ||'''s'''|| '''2'''|| '''0''' |- | '''M''' ||'''m'''|| '''3'''|| '''0''' |- | '''D''' ||'''d'''|| '''4'''|| '''0''' |- | '''?''' ||'''?'''|| '''0'''|| '''0''' |} 上述的控制表更接近[[過程化編程]]中用到的條件指令,不過實際語言中用到的一些指令已轉換為處理控制表的「直譯器」程式,控制表只看到各個輸入及其對應的副程式編號。 <!--英文 Control table 的 CT4 及前面的 「In tables such as these」 先不翻譯--> [[結構化程式設計]]或是「無Goto代碼」也可以配合經過適當設計及縮排的控制表結構使用。 ===表格驅動評級=== 在電信領域中決定一通電話特定費率的「電信評級」應用中,「表格驅動評級」(table-driven rating)技術描述將控制表應用在規則可能常常會因為市場外力而進行調整的情形,在許多情形下,決定計費的表格會由非程式設計者花一點時間進行修改及維護,更改需要的時間很短。<ref>Carl Wright, Service Level Corpo. (2002) ''[http://www.servicelevel.net/rating_matters/newsletters/issue12.htm Program Code Based vs. Table-driven vs. Rule-Based Rating] {{Wayback|url=http://www.servicelevel.net/rating_matters/newsletters/issue12.htm |date=20071031075615 }}'', Rating Matters issue n. 12, 13 November 2002 ISSN: 1532-1886</ref><ref>Brian E. Clauser, Melissa J. Margolis, Stephen G. Clyman, Linette P. Ross (1997) ''[http://links.jstor.org/sici?sici=0022-0655%28199722%2934%3A2%3C141%3ADOASAF%3E2.0.CO%3B2-%23 Development of Automated Scoring Algorithms for Complex Performance Assessments: A Comparison of Two Approaches]'' Journal of Educational Measurement, Vol. 34, No. 2 (Summer, 1997), pp. 141-161</ref> 若其演算法不是事先建在直譯器中,而是由程式決定此演算法,此技術稱為「以規則為基礎的評價」(Rule-based Rating),但和表格驅動評級比較,前者的{{link-en|運算負擔|Computational overhead}}更高。 ===試算表=== [[電子試算表|試算表]]可以看成是一種二維的控制表,其非空白的儲存格中有資料,而試算表的程式即為直譯器。有公式的格子一般前面會前置一個等號,表示這是特殊形態的輸入,在處理中可能還會用到其他儲存格的資料。試算表和上述的「以規則為基礎的評價」有很相近的地方,就是控制表的外化,即使是非程式設計者也能進行維護。 ==編程範型== 和控制表最接近的[[編程範型]]是[[自動機編程]]或是[[反射式编程|反射]]的[[元編程]]。不過控制表的直譯器及各副程式可以用任何一種或多種編程範型來開發。表格本身可以只是[[原始資料]]的集合,不需要編譯,在使用時再從外部設備中讀取即可,不過表格放在記憶體中的效率會比較高。 ==和位元碼/虛擬機器指令集的對照== 多維的控制表在概念上類似在[[虛擬機器]]上運作的[[字节码]],虛擬機器是[[跨平台]]的「[[直譯器]]」軟體,要執行對應的程式,而要執行的內容是依表格內容所決定。控制表的概念也有些類似[[通用中间语言]],其目的都在創建共用跨平台的「指令集」。 ==監控控制表的執行情形== 直譯器也可以儲存各階段的[[程式計數器]]內容或是其他資料,來記錄部份或完整程式的流桯,記錄的目的可以為了[[偵錯]]的需要、{{link-en|熱點 (電腦科學)|Hot spot (computer science)|熱點}}偵測、[[代碼覆蓋]]的分析及[[性能分析]],像上述CT3的例子就可以計數各個動作執行過的次數。 ==優點== * 清楚:以二維表格表示的控制表可以清楚的表示資料及其對應的動作,容易被一般社會大眾了解,像一般產品說明書中的故障處理也是以類似控制表的方式表示。 * 可攜性:可以設計成和程式語言及平台無關的形式。 * 彈性:可以配合問題所需,某些條件下執行程式指令,某些條件下執行[[副程式]]。 * 精簡:二維表格表示的控制表直接將條件和動作的組合列出,不需利用程式語言的其他語法,因此 ** 其[[二进制文件]]的長度變小。 ** 其[[源代碼]]的大小也變小,因為少了許多重複的判斷指令。 ** 提昇程式下載的速度。 * 維護性:控制表減少了需維護及比對的程式碼。 * [[访问局部性]]:精簡的控制表結構可以使整個表格留在快取記憶體中。 * 代碼復用:「編譯器」可以復用,而且新的計劃可以應用相同的技術,逐漸可以建立由已測試過的函式組成的[[標準庫]],再由表格的定義及內容決定要執行哪些程式。 * [[演算法效率]]:可以進行系統面的最佳化,任何對於「編譯器」的最佳化都會帶來所有使用「編譯器」應用程式的效率提昇。 * 可擴展性:只要增加控制表的內容即可增加新的指令。 ==缺點== * 需要訓練:程式設計一般不熟悉利用控制表的方式處理程式。 * {{link-en|運算負擔|Computational overhead}}會提高,原因是因為讀取控制表時會根據相當資料去找對應的動作。 * 複雜的[[運算式]]不一定可以放在控制表中直接比較,但有時可以事先計算運算式的值放在一變數中,在控制表中直接比較變數即可。 * 控制表只有資料及其對應的動作,若沒有註解說明時,不易看出資料及其動作的因果關係。 ==相關條目== *[[自动机编程]] *[[有限状态机]] *[[指针 (信息学)]] *[[資料驅動測試]] ==參考資料== {{reflist}} == 外部連結 == * [http://www.microsoft.com/technet/scriptcenter/resources/pstips/jan08/pstip0111.mspx Switch statement in Windows PowerShell] {{Wayback|url=http://www.microsoft.com/technet/scriptcenter/resources/pstips/jan08/pstip0111.mspx |date=20100307003802 }} describes extensions to standard switch statement (providing some similar features to control tables) * [http://www.cs.auckland.ac.nz/~j-hamer/07.211/C/C-Lesson/C-LESSON.4 Control Table example in "C" language using pointers] {{Wayback|url=http://www.cs.auckland.ac.nz/~j-hamer/07.211/C/C-Lesson/C-LESSON.4 |date=20160310200818 }}, by Christopher Sawtell c1993, Department of Computer Science, University of Auckland * [https://web.archive.org/web/20120808114334/http://www.dkl.com/html/CMFiles/53table_driven_design.pdf Table driven design ] by Wayne Cunneyworth of Data Kinetics * [http://commons.oreilly.com/wiki/index.php/From_Requirements_to_Tables_to_Code_and_Tests From Requirements to Tables to Code and Tests] {{Wayback|url=http://commons.oreilly.com/wiki/index.php/From_Requirements_to_Tables_to_Code_and_Tests |date=20091218094858 }} By George Brooke * [http://portal.acm.org/citation.cfm?id=362041.362195&coll=GUIDE&dl=GUIDE&CFID=60499203&CFTOKEN=67618699 Some comments on the use of ambiguous decision tables and their conversion to computer programs] {{Wayback|url=http://portal.acm.org/citation.cfm?id=362041.362195&coll=GUIDE&dl=GUIDE&CFID=60499203&CFTOKEN=67618699 |date=20200728083200 }} by P. J. H. King and R. G. Johnson, Univ. of London, London, UK * [http://portal.acm.org/citation.cfm?id=364113&dl=GUIDE&coll=GUIDE&CFID=60499203&CFTOKEN=67618699 Ambiguity in limited entry decision tables] {{Wayback|url=http://portal.acm.org/citation.cfm?id=364113&dl=GUIDE&coll=GUIDE&CFID=60499203&CFTOKEN=67618699 |date=20200728083231 }} by P. J. H. King * [http://portal.acm.org/citation.cfm?id=365896&dl=GUIDE&coll=GUIDE&CFID=60499203&CFTOKEN=67618699 Conversion of decision tables to computer programs by rule mask techniques] {{Wayback|url=http://portal.acm.org/citation.cfm?id=365896&dl=GUIDE&coll=GUIDE&CFID=60499203&CFTOKEN=67618699 |date=20200728083201 }} by P. J. H. King *[https://web.archive.org/web/20120227064827/http://ols.fedoraproject.org/GCC/Reprints-2008/sayle-reprint.pdf A Superoptimizer Analysis of Multiway Branch Code Generation] section 3.9, page 16 index mapping * [https://web.archive.org/web/20120212110151/http://www.netrino.com/node/137 Jump Tables via Function Pointer Arrays in C/C++] Jones, Nigel. "Arrays of Pointers to Functions [http://www.rmbconsulting.us/Publications/PointerToFunction.pdf] {{Wayback|url=http://www.rmbconsulting.us/Publications/PointerToFunction.pdf |date=20210128150400 }}" Embedded Systems Programming, May 1999. * [http://stats.grok.se/en/200912/control_table Page view statistics for this article for December 2009] {{Wayback|url=http://stats.grok.se/en/200912/control_table |date=20121106140140 }} * [http://is.ifmo.ru/download/modelingsoftwarewithfinitestatemachinesapracticalapproach.pdf Modelling software with finite state machines - a practical approach] {{Wayback|url=http://is.ifmo.ru/download/modelingsoftwarewithfinitestatemachinesapracticalapproach.pdf |date=20201001042349 }} * [http://docs.google.com/viewer?a=v&q=cache:dytF6h4pD-4J:lss.fnal.gov/archive/tm/TM-1508.pdf+%22finite+state+table%22&hl=en&gl=uk&pid=bl&srcid=ADGEESgaFAmVjB_QzcxIn2MmK7N6QeffWYyHfUGTZG7zfB0DKoTaJUc2m_uncWXIteXNu_oCi570cGtCCjJeHYFUURZNoGdZMgn62OgTldHus4dTTN6BNt_vSce0jBoayojMcIGOfhcj&sig=AHIEtbQ_1D3cO9a-FChv2QDKZqlzZ4oT4Q Finite State Tables for General Computer Programming Applications January 1988] {{Wayback|url=http://docs.google.com/viewer?a=v&q=cache%3AdytF6h4pD-4J%3Alss.fnal.gov%2Farchive%2Ftm%2FTM-1508.pdf+%22finite+state+table%22&hl=en&gl=uk&pid=bl&srcid=ADGEESgaFAmVjB_QzcxIn2MmK7N6QeffWYyHfUGTZG7zfB0DKoTaJUc2m_uncWXIteXNu_oCi570cGtCCjJeHYFUURZNoGdZMgn62OgTldHus4dTTN6BNt_vSce0jBoayojMcIGOfhcj&sig=AHIEtbQ_1D3cO9a-FChv2QDKZqlzZ4oT4Q |date=20200203044208 }} by Mark Leininger * [http://msdn.microsoft.com/en-us/library/aa561913%28v=bts.20%29.aspx MSDN:Trigger-Based Event Processing] {{Wayback|url=http://msdn.microsoft.com/en-us/library/aa561913%28v=bts.20%29.aspx |date=20200728083209 }} [[Category:控制流程]] [[Category:数据结构]] [[Category:编译原理]]
该页面使用的模板:
Template:Cite journal en
(
查看源代码
)
Template:Cite web
(
查看源代码
)
Template:Link-en
(
查看源代码
)
Template:NoteTA
(
查看源代码
)
Template:Reflist
(
查看源代码
)
Template:Wayback
(
查看源代码
)
返回
控制表
。
导航菜单
个人工具
登录
命名空间
页面
讨论
不转换
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息