目录
背景
以前搞不懂为什么Facebook要用Ocaml实现好多开源库,今天似乎懂了。
最近在做Python的指针分析,初步定的方案两种,第一是用Python实现,自己分析自己;第二是用Haskell实现。第一种方案的有点是可以无缝使用此语言的库,比如Python的AST解析库都是内置的,方便调用;还有就是可以在这个过程中加深对语言的理解。
但是第二种方案有什么优点呢?
优点一 定义数据类型
我的意见是我们可以充分利用其类型系统。什么是类型系统,就是讨论编程语言中计算的类型和在此基础上的操作。每当你遇到类型错误时,这时候就是类型系统在发挥作用。Haskell的类型系统天然很简洁,给个例子:
data Tree a = Leaf | Tree a (Tree a) (Tree a)
以上代码定义了一个二叉树,叶子结点为Leaf.。如果在其他语言类似Python中,我们可能需要定义一个类抽象出二叉树的定义。在程序中,我一直相信简单的才是最好的。正是因为简单,才能更好地维护。
优点二 定义解析
instantiateOne :: (SVar, SVar) -> SType -> SType
instantiateOne _ SBool = SBool
instantiateOne _ SInt = SInt
instantiateOne _ (MyNil beta) = MyNil beta
instantiateOne (old, new) (SVar sVar) =
if sVar == old
then SVar new
else SVar sVar
instantiateOne pair (SFunc type1 type2 beta) =
let
left1 = instantiateOne pair type1
left2 = instantiateOne pair type2
in
SFunc left1 left2 beta
instantiateOne pair (MyPair type1 type2 beta) =
let
left1 = instantiateOne pair type1
left2 = instantiateOne pair type2
in
MyPair left1 left2 beta
instantiateOne pair (MyCons type1 type2 beta) =
let
left1 = instantiateOne pair type1
left2 = instantiateOne pair type2
in
MyCons left1 left2 beta
以上代码是我以前一个编程作业的代码片段,定义了根据SType进行一系列的递归操作。根据我的经验,在Python中实现只会更长。
优点综述
Haskell会强迫你思考你需要的东西,并对其进行简单的表示,最后可以定义基于此表示上的分析。可能实现过程有点难度,但是结束之后,你会发现代码很短很容易维护。函数式语言很适合写项目中的一个组件,类似JSON解析库,Python解析库等等。
缺点
Haskell也有很多缺点,正如其他好多函数式编程语言一样。比如:
- 第三方库好多都是个人业余项目,缺少维护;
- 第三方库好多文档缺失,只能通过查看库的代码来逆推出怎么调用;
- 很抽象的函数式代码非常晦涩,难以阅读;
- 学习成本高,可能你学了但是用不上,这是需要灵感和经验结合的。
总结
编程语言的设计是对思维的抽象,技多不压身。多了解一种思维,一种范式,会对现有项目做更客观的分析。为了找工作,还是先精通类似C++,Java和Python等等常用语言吧。
作业
看一下Python的Haskell解析库: GitHub - bjpop/language-python: A parser for Python 2.x and 3.x written in Haskell