SAS程序編譯執(zhí)行過程

當我們提交運行一個DATA步程序后,具體發(fā)生了什么事情。SAS程序與其他程序一樣,在運行時都要經(jīng)過兩個階段:編譯(Compilation)、執(zhí)行(Execution)。
程序首先經(jīng)過編譯階段,該階段主要檢查代碼語法錯誤,以及執(zhí)行一些編譯時語句及創(chuàng)建PDV,緩存等相關的環(huán)境。如果發(fā)現(xiàn)代碼存在語法錯誤,則不進入執(zhí)行階段,并且將發(fā)現(xiàn)的所有語法錯誤問題在日志中顯示。如果在編譯階段未發(fā)現(xiàn)語法錯誤,則程序會進入執(zhí)行階段,真正運行代碼,讀取數(shù)據(jù),處理數(shù)據(jù)。
SAS程序中的語句,按照其在編譯階段還是執(zhí)行階段生效,可分為三種:
僅在編譯階段有效,例如:length、format、label、retain、keep、drop等語句,一般是有關變量屬性的語句;
僅在執(zhí)行階段有效,例如:if-else、do while等條件控制及循環(huán)語句;
在編譯和執(zhí)行階段都有效,例如:set、merge等語句,在編譯階段會讀取數(shù)據(jù)的元數(shù)據(jù)信息,在執(zhí)行階段開始讀取數(shù)據(jù)。
其實SAS程序在編譯之前還有一個更細節(jié)的步驟,稱之為“Tokenization”;這個過程類似于文本挖掘當中的分詞過程。該過程將整段程序分塊,然后逐一讀取。完成這項工作的組件稱之為“Word Scanner”,該組件將程序拆分成一個個的小塊,稱之為“Token”。
所以,Token就類似于分詞過程中詞典中的詞,它有以下4種形式:
Literal:用引號引起來的字符串
Number:包括:純數(shù)字、日期常量、時間常量、十六進制數(shù)
Name:以字母或者下劃線開頭的字符串
Special:其他的一些符號,例如:* / + - ** ; $ ( ) . & % =
在完成Tokenization的過程時,涉及到一個區(qū)域叫“Input Stack”。它就是在內(nèi)存中的一塊區(qū)域。用于臨時保存提交的代碼。所以,更深入一些來看,當你提交SAS程序后有以下4個過程:
將提交的代碼Copy到Input Stack;
Word Scanner完成Tokenization的工作,啟動編譯器,發(fā)送Tokens到Compiler;
Compiler接收Word Scanner發(fā)送的Tokens。如果所有的Tokens都接收完畢,或者遇到一個DATA Step boundary,開始Compiling;
程序編譯完無錯誤,開始Executing;
Compiler每遇到一個DATA STEP Boundary,就停止接收Tokens。開始編譯當前的程序,并且執(zhí)行;等當前的程序執(zhí)行完畢后,重新開始接收Tokens,直到遇到下一個DATA Step Boundary,編譯執(zhí)行;依次循環(huán)運行。



請前往:http://lygongshang.com/TeacherV2.html?id=166