全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
26961 37
2010-05-06
这里是我的一点看法,欢迎拍砖。
经过几个月艰苦的学习,现在也会写一些小程序了。不过,说心里话,写SAS程序,累死我了。
SAS语言的上下文可读性不强。我认为,SAS作为一门编程语言,这是不是很出彩的一块。SAS编程一般分两大部分,一是数据部分,二是程序部分。load数据之后,接着就是proc,如果不是专门写SAS程序的人来看SAS程序,根本看不出到底这两块有什么逻辑关系。至少是从文字上看不出的。这和一般的编程语言,比如C/C++,Java等等比起来,可读性差了很多。
以上仅是我个人的想法,有不对的地方欢迎矫正。
如果你有更好的学习这门编程语言的方法,务必分享一下吖。

这里所说的“联系”是指,数据步与程序步之间的联系,以及这两步内在的联系。这些联系在程序的文字上很难看得出。这里我举个例子:
data li1;
input id $ name $ height weight@@;
cards;
1 tom 187 75
2 cendy 169 57
3 mcdonald 189 85
;
run;
proc means data=li1;
var height weight;
run;
在这里我们考察这段比较典型的SAS程序内在的联系。
先考察数据步:
1.首先是分号的问题,SAS语句,除了数据块之外,其它的地方句子的末尾都要加上分号;,如果有其它语言的编程经验,会存在很多的误解。以为“这件事情到此就结束了”。比如,你看到data li1;,这句后面存在分号,就会认为data li1与后面的句子没有联系了。事实上,一直到run,都是有联系的。这是有其它语言的编程经验所不能理解的。
2.在数据步中 data li1,在这里,一个有编程经验的人很怀疑data 是不是一种数据类型。如果是数据类型,应该是针对一个数据的有机构成单位来说的。如果说这是一个集合类型,但是,无论是拿出一个记录还是记录中数据的个体,这些都是允许重复的,所以,data也不能看作一种集合。由于存在着存取指令等等一些其它的东西,更不能把data看作是一种数据类型,至少不是封装的很好的数据类型。
3.数据步中存在run,程序步中也有run,一个程序体内存在两个run,这让人觉得很奇怪,就像程序运行了两次一样。如果有C/C++编程经验,这很容易看成一个C/C++程序存在着两个要执行的return语句一样。
4.
input id $ name $ height weight@@;
cards;
1 tom 187 75
2 cendy 169 57
3 mcdonald 189 85
;
这一句,中间有一个cards,就是因为这一cards,让人经常觉得input id $ name $ height weight@@;与下面的那些数据没有任何联系。

再考察程序步:
proc means data=li1;
var height weight;
run;
1.首先是声明变量的问题。一般的编程语言,都是“先声明,后使用”,在这里,var height weight;竟然存在于最后,给人一种不伦不类的感觉,并且,如果没有写SAS程序的经验,你也不会知道height weight与数据之间有什么关系,特别是你写的数据步很长,后面接了很多的语句才写下数据步的run,更是让你丈二的和尚摸不着头脑了。
2.proc means data=li1,这一句话,在数据步中,存在着 data li1,这里又写上 data=li1,不是很了解的人就会问,这到底算是声明还是赋值?同一种语言中,如果存在关键词为data,并且data li1与data=li1都成立,这是编程语言设计的大忌。因为这会产生语义混乱。
一些题外话:
SAS的程序编辑窗口比较弱智。当然,存在的关键词也就是那些统计模块外加一些不痛不痒的data proc之类的关键词,但是编辑窗口可否再智能一些?不要只是在我写下关键词之后才要么变成粗体,要么变成红色,这一变化的存在确实必要,但是当我写对关键词之后再给我变成粗体,总有一种“事后的诸葛亮”的感觉。能否存在关键词补全的这样一种功能?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-5-6 20:27:16
如果不是专门写SAS程序的人来看SAS程序,根本看不出到底这两块有什么逻辑关系。
--------------------------------------
我读着怎么那么别扭呢,要说,不是专门写c++的人也肯定不知道c++怎么编译的吧?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-5-6 20:45:00
1# yukiooy
两种不同语言之间是不存在可读性的比较,所谓的可读性是对同一语言不同的编写风格从理解,耦合度来评价的性质,其也并不是必须追求,有时候过于精巧、效率很高的算法反而很难读懂,所以不论可读性,如果对所用的语言不熟悉,不能很好理解器其内部机理,无论对待SAS还是C或者JAVA,那必然是很难去理解的。
其次说SAS,SAS用来做开发的主要还是base和macro,proc不用说更多的是应用。当然有些proc靠开发会多一点,比如sql。
开发理念更多是“自顶向下”的opp方向,而不是oop,当然AF另当别论。正是由于是opp,因此SAS代码的扩展性有所缺陷,对已有的程式进行修改,往往会大费周章,这不比cpp或java,后两者因有类的概念,再加上封装和多态与重用,可以开发扩展性很好的代码。
其差异本身也是由于SAS并不以development为重,也不以此为核心竞争力的缘由。
学一门开发语言,个人认为,理解主要的框架,并需要深刻知道其内部编译和运行上机理,则能从开发上慢慢起步了。但SAS更多的还是应用,是一种工具,说到底也是由底层语言开发而成,应用层采用code方式使其更具备灵活性,非开发的应用能力好坏则并不体现在coding上了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-5-6 21:46:39
1 SAS不是一个开发工具,和C#或是java没有可比性。它只是一个应用软件而已。
2 SAS的核心技术是proc步,是它的模块们。而绝非它招牌的data步、畸形的proc sql、神来之笔或是无奈之举的MACRO、已经日暮西山的AF和SCL。data步和proc sql只是起到对数据的管理(这个也逐渐被数据库工具蚕食,数据库+SAS的架构现在貌似很主流)、加工(同前,数据库也能搞定。效率,可移植性都不可同日而语),现在看起来,这些更像是SAS对其他输入数据的一个过渡,一个妥协。
3 另一方面,由于各个领域都有大牛、巨牛的存在,SAS的code几十年来被折腾出了无数超级牛B、很牛B或是一般牛B的玩法(蛮多是SAS自己的技术人员为了卖产品灵光乍现或是含辛茹苦出来的,毕竟客户花了大价钱买SAS,希望SAS多干点事情)。“原来SAS还可以这么做!!”不断被提起,重复,再提起,再重复。这样或多或少会提高“不明真相”的用户对SAS的期望,SAS被神化,真的很多原来做开发杀进来搞SAS的“开发”,除了对统计知识的“头大异常”,就是抱怨SAS code的种种弱智,前者好歹可以理解成一个黑箱,一个函数,一个封装了的算法,而后者则只能舍近求远,入乡随俗了。
4 SAS的BASE模块就是苦力的干活,是SAS的鸡肋。STAT以及等等模块才是SAS的精髓。
最后是一个不是很恰当的比喻,WOW也有自己的“开发语言”(能这样称呼吗?反正可以写来定制界面,数据搜集、开发些小玩意,做插件之类的等等),对于物品和技能的使用也有类似于MACRO的概念(当年的自然迅捷+大加血 ^_^)。但是这些都无法掩盖WOW本身的光辉,我想SAS就是如此......
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-5-6 22:40:13
4# soporaeternus
SAS的核心其实就是STAT,他最初是靠这个起家,也是最核心的模块,不然也不会被FDA认定为唯一的临床新药统计分析结果
至于说SAS编程语言,很难理解,和常规的编程语言差别有点大,可读性不强,刚才楼上两位说的很清楚,当你熟悉之后就知道其实可读性是相对的
在这边其实我们都存在一个误区
是不是SAS编程会了,就什么问题都可以解决了?
我觉得soporaeternus说的很对,SAS其实包括数据处理模块,数据管理,数据分析,数据展现等几大类,一般编程厉害其实就是数据处理很不错,能够根据需要处理原始数据集,几千万条,甚至几十亿条数据,大家想一想,为什么要处理原始数据集,就是给数据洗澡,目的就是为了后续的统计分析服务的,让数据集的形式更好的进行统计分析。
数据处理现在很多软件都可以做,做的很好,但是不是每个软件的统计分析统计算法做的最好,他们在统计方法的研究上估计无法和SAS抗衡。另外SAS编程其实不难学,只要你肯学,想学,你学6个月我想你绝对学得会,因为语法很简单,在所有编程语言我估计SAS语言算是简单的了,所以我个人觉得要是想在SAS编程上有一个飞跃,建议学好STAT。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-5-6 22:42:51
soporaeternus 发表于 2010-5-6 21:46
...真的很多原来做开发杀进来搞SAS的“开发”,除了对统计知识的“头大异常”,就是抱怨SAS code的种种弱智,前者好歹可以理解成一个黑箱,一个函数,一个封装了的算法,而后者则只能舍近求远,入乡随俗了......
好像在说我哈。小量数据做清洗,转换,data step还是挺顺手的,毕竟原本就是面对样本的处理,也不用考虑效率什么。一个好的工具就该用在刀刃上,扬长避短么。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群