決策表預處理器

決策表預處理器

計算機科學中, 預處理是是程式原始碼被翻譯為目標代碼的過程,例如在對程式進行編譯之前,一般都會對原始碼進行預處理及最佳化。決策表預處理器就是程式中利用決策表這一方法來處理和簡化輸入數據,產生能用來輸入到其他程式的數據的程式。

基本介紹

  • 中文名:決策表預處理器
  • 外文名:decision table preprocessor
  • 學科:計算機科學
  • 領域:程式設計語言、編譯原理
  • 作用:簡化、最佳化
  • 階段:程式編譯之前
  • 問題:兼容性
簡介,決策表,

簡介

在計算機科學中, 預處理是是程式原始碼被翻譯為目標代碼的過程,例如在對程式進行編譯之前,一般都會對原始碼進行預處理及最佳化。決策表預處理器是程式中利用決策表這一方法來處理和簡化輸入數據,產生能用來輸入到其他程式的數據的程式。

決策表

決策表是一種精確而緊湊的方法,用於對複雜規則集及其相應的動作進行建模。
決策表,如流程圖,if-then-else和switch-case語句,將條件與要執行的操作相關聯,但在許多情況下以更優雅的方式執行此操作。
在20世紀60年代和70年代,一系列基於“決策表”的語言,如Filetab,受到業務編程的歡迎。
每個決策對應於一個變數,關係或謂詞,其可能的值在條件替代中列出。每個動作是執行的過程或操作,並且條目指定對於條目對應的條件替換集合(或以什麼順序)執行動作。許多決策表包括在他們的條件替代品不關心符號,連字元。使用不關心可以簡化決策表,特別是當給定條件對要執行的操作影響不大時。在某些情況下,當沒有任何條件影響執行哪些動作時,最初發現的整個條件被認為是無關緊要的。
除了基本的四象限結構之外,決策表在條件替代和行動條目的表示方式上有很大差異。一些決策表使用簡單的真/假值來表示條件的替代(類似於if-then-else),其他表可能使用編號的替代(類似於switch-case),甚至有些表甚至使用模糊邏輯或機率表示來進行條件替代。以類似的方式,動作條目可以簡單地表示要執行的動作(檢查要執行的動作),還是在更高級的決策表中表示要執行的動作的排序(對要執行的操作進行編號)。
軟體工程的好處
決策表,特別是與使用域特定語言相結合時,允許開發人員和策略專家從相同的信息,決策表本身工作。
將傳統程式語言的語句嵌套到決策表中的嵌套工具也可以用作調試工具。
決策表已被證明比代碼更容易理解和審查,並且已被廣泛和成功地用於生成複雜系統的規範。
潛在的困難
以Cobol為例
根據10年Cobol決策表處理器的經驗,我遇到了一些問題:
決策表可能與源程式的其餘部分具有不同的格式,使得難以將程式準備為單個文本。
程式設計師可能必須記住與Cobol不兼容的關於句子的最大長度,延續線等的特殊規則。
在調試期間,程式設計師必須參考Cobol程式列表,他的輸入數據和他的測試結果。他還可能需要額外的預處理器輸入和輸出列表,以便Cobol程式中的錯誤可以追溯到錯誤的表。這太多了,不能放在桌子上當預處理器檢測到錯誤時,編譯步驟經常被跳過。所以Cobol語法檢查必須等待所有的表錯誤被修復,需要額外的轉機。
Cobol用戶對機器獨立感興趣,但是他的預處理器可能僅適用於一台特定的機器。
它可能與其他預處理器(例如DBMS)或使用程式庫不兼容,或支持非標準Cobol功能
問題解決方案可能會分散,因為它們只能被表示為由GO TO所連結的一系列表。
程式設計師可能會看到處理器產生的代碼比手寫的代碼要差一些可能更嚴重的一個難點。他可能沒有辦法改善它。他因此對自己的工作不滿意。手工翻譯決策表是一小步,最終完全放棄決策。
代碼實現例子
以下示例來自ccide程式本身:
這是原來的if-then-else代碼(你能找到邏輯錯誤嗎?)
extern int donotgenerate, notimestamp, uselocaltime,noinline,yydebug;
char *xstring;
int main(int argc, char **argv)
{
int narg = 1;
while (argc > narg) {
if(strcmp("-b", argv[narg]) == 0) {
notimestamp = 1;
}else {
if (strcmp("-l", argv[narg]) ==0) {
uselocaltime= 1;
} else {
if(strcmp("-e", argv[narg]) == 0) {
strcat(xstring, "- ");
}else {
if (strcmp("-n", argv[narg]) ==0) {
noinline= 1;
} else {
if(strcmp("-s", argv[narg]) == 0) {
GenSkeleton();
exit(0);
}else {
if (strcmp("-t", argv[narg]) ==0) {
yydebug= 1;
} else {
if(strcmp("-u", argv[narg]) == 0) {
noinline = 1;
donotgenerate = 1;
}else {
if (strcmp("-V", argv[narg]) = 0){
ShowCopyright();
exit(0);
} else {
if(strcmp("-x", argv[narg]) == 0) {
strcat(xstring, "- ");
}else {
Usage();
exit(0);
}
}
}
}
}
}
}
}
}
narg++;
}
}
使用決策表的代碼
extern int donotgenerate, notimestamp,uselocaltime, noinline, yydebug;
char *xstring;
//CCIDE_INLINE_CODE:
int main(int argc, char **argv)
{
#define Argis(P) strcmp( #P, argv[narg]) ==0
while( argc>narg ) {
//DECISION_TABLE:
// Y- - - - - - - - - | Argis(-b)
// -Y - - - - - - - - | Argis(-l)
// -- - - - - - - Y - | Argis(-e)
// -- Y - - - - - - - | Argis(-n)
// -- - Y - - - - - - | Argis(-s)
// -- - - Y - - - - - | Argis(-t)
// -- - - - Y - - - - | Argis(-u)
// -- - - - - Y - - - | Argis(-V)
// -- - - - - - - - Y | Argis(-x)
// _________________________________
// X- - - - - - - - - | notimestamp=1;
// -X - - - - - - - - | uselocaltime=1;
// -- X - - X - - - - | noinline=1;
// -- - X - - - - - - | GenSkeleton();
// -- - - X - - - - - | yydebug=1;
// -- - - - X - - - - | donotgenerate=1;
// -- - - - - X - - - | ShowCopyright();
// -- - - - - - X - - | Usage();
// -- - - - - - - X - | checkequal=0;
// -- - - - - - - - X | strcat(xstring,
// -- - X - - X X - - | exit(0);
//END_TABLE:
narg++;
}

相關詞條

熱門詞條

聯絡我們