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

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



請(qǐng)前往:http://lygongshang.com/TeacherV2.html?id=166