当我们提交运行一个DATA步程序后,具体发生了什么事情。

SAS程序与其他程序一样,在运行时都要经过两个阶段:编译(Compilation)、执行(Execution)

  • 程序首先经过编译阶段,该阶段主要检查代码语法错误,以及执行一些编译时语句及创建PDV,缓存等相关的环境。如果发现代码存在语法错误,则不进入执行阶段,并且将发现的所有语法错误问题在日志中显示;
  • 如果在编译阶段未发现语法错误,则程序会进入执行阶段,真正运行代码,读取数据,处理数据。

SAS程序中的语句,按照其在编译阶段还是执行阶段生效,可分为三种:

  • 仅在编译阶段有效,例如:length、format、label、retain、keep、drop等语句,一般是有关变量属性的语句;

  • 仅在执行阶段有效,例如:if-else、do while等条件控制及循环语句;

  • 在编译和执行阶段都有效,例如:set、merge等语句,在编译阶段会读取数据的元数据信息,在执行阶段开始读取数据。

其实SAS程序在编译之前还有一个更细节的步骤,称之为“Tokenization”;这个过程类似于文本挖掘当中的分词过程。该过程将整段程序分块,然后逐一读取。完成这项工作的组件称之为“Word Scanner”,该组件将程序拆分成一个个的小块,称之为“Token”。

所以,Token就类似于分词过程中词典中的词,它有以下4种形式:

  • Literal:用引号引起来的字符串

  • Number:包括:纯数字、日期常量、时间常量、十六进制数

  • Name:以字母或者下划线开头的字符串

  • Special:其他的一些符号,例如:* / + - ** ; $ ( ) . & % =

在完成Tokenization的过程时,涉及到一个区域叫“Input Stack”。它就是在内存中的一块区域。用于临时保存提交的代码。所以,更深入一些来看,当你提交SAS程序后有以下4个过程:

  1. 将提交的代码Copy到Input Stack

  2. Word Scanner完成Tokenization的工作,启动编译器,发送Tokens到Compiler;

  3. Compiler接收Word Scanner发送的Tokens。如果所有的Tokens都接收完毕,或者遇到一个DATA Step boundary,开始Compiling;

  4. 程序编译完无错误,开始Executing

Compiler每遇到一个DATA STEP Boundary,就停止接收Tokens。开始编译当前的程序,并且执行;等当前的程序执行完毕后,重新开始接收Tokens,直到遇到下一个DATA Step Boundary,编译执行;依次循环运行。

SAS学习笔记40 SAS程序运行过程的更多相关文章

  1. IOS学习笔记1—Iphone程序运行流程

    Iphone程序运行流程 main.m文件,iOS应用程序的主入口 main函数的两个参数为命令行参数,在ios开发中不会用到这些元素,包括这两个参数是为了与标准ANSI C保持一致 UIApplic ...

  2. SAS学习笔记51 SAS数据集

    结构 SAS数据集是关系型的,包含两个部分:描述部分(变量)和数据部分(观察值) 形式 SAS系统中共有两种类型的数据集: 1.SAS 数据文件(SAS datafiles) 2.SAS 数据视窗(S ...

  3. SAS学习笔记42 宏程序

    Autocall Macro是由SAS提供的一些实现特定功能的Macro Program,可以在代码中直接使用 其中以Q开头的相比正常的多了隐藏特殊字符的功能(称之为Macro Quoting): K ...

  4. SAS学习笔记37 宏程序中parmbuff选项

    该选项用于指定宏可以接受可变参数列表,而且参数值保存在SYSPBUFF宏变量中.parmbuff的参数价值,其实就是每次执行宏程序时,可以指定不同数量的参数值,这些宏参数被保存在&syspbu ...

  5. SAS学习笔记13 SAS数据清洗和加工(续)

    查找缺失值 cha[*]和num[*]是建立数组cha和num,但不指定数组中的元素数 自动变量_character_表示数据集中的所有字符型变量 自动变量_numeric_表示数据集中的所有数值型变 ...

  6. SAS学习笔记38 SAS Comments注释语句

    通常来讲,注释语句有四种: 1.* message; 2.COMMENT message; 3./* message */ 4.%* message; 第一种的主要限制是注释之中不得有“:”符号.通常 ...

  7. 【学习总结】IOS程序运行过程 、UIWindow 、controller 、 UIView 创建过程的总结

    程序启动开始到view显示: 程序启动首先会执行main函数 - > UIApplicationMain函数: 程序启动 (加载框架,info文件,资源等) 执行Main函数 初始化UIAppl ...

  8. SAS学习笔记50 SAS数据集索引

    在没有索引的情况下,SAS是一条接一条的扫描观测:有索引时,直接跳到该索引对应的观测所在位置.总结一句话就是:节省时间,节省内存,提高效率 当然并不是任何情况下使用索引都能提高工作效率,因为建立索引本 ...

  9. SAS学习笔记31 SAS随机分组方法及实现

    随机分组方法包括: 简单随机化(simple randomization) 区组随机化(block randomization) 分层随机化(stratified randomization) 分层区 ...

随机推荐

  1. 火狐调试工具-DevTools

    狐调试工具 - DevTools 咱们做写js 代码的时候,遇到的一个最大的问题就是调试问题,很多开发者在写 js 代码的时候,经常都非常痛苦.但是我们如果掌握好相应的调试工具,那么就可以比较游刃有余 ...

  2. 2018-2019-2 网络对抗技术 20165311 Exp 9 Web安全基础

    2018-2019-2 网络对抗技术 20165311 Exp 9 Web安全基础 基础问题回答 实践过程记录 WebGoat安装 SQL注入攻击 1.命令注入(Command Injection) ...

  3. Linux | Vim使用

    Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主 ...

  4. 中间件 | mq消息队列解说

    消息队列 1.1 什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用.消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系 ...

  5. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

  6. angular组件数据和事件

    <h1>引入图片</h1> <img src="assets/images/02.png" alt="收藏" /> < ...

  7. build

    15:16:53: Running steps for project QQ_Client... 15:16:53: Starting: "/opt/Qt5.12.0/5.12.0/gcc_ ...

  8. VS2015编译gdal库

    gdal下载地址:http://trac.osgeo.org/gdal/wiki/DownloadSource 修改nmake.opt中的一些配置.1. GDAL_HOME = “C:\warmerd ...

  9. Qt编写控件属性设计器7-串口采集

    一.前言 数据源是组态软件的核心灵魂,少了数据源,组态就是个花架子没卵用,一般数据源有三种方式获取,串口.网络.数据库,至于数据规则是什么,这个用户自己指定,本设计器全部采用第一个字节作为数据来演示. ...

  10. HTTP和WSGI协议

    HTTP协议简介 超文本传输协议(HyperText Transfer Protocol)是一种应用层协议.HTTP是万维网的数据通信的基础.设计HTTP最初的目的是为了提供一种发布和接收HTML页面 ...