[dynamic FL]part 6:comparison between Dynamic and Static

各种语言的比较
Dynamic type language VS Static type language:
     Dynamic看待Static: ML好像只是Racket的子集。ML会拒绝更多程序, 可能有bug的也可能是没有bug的。
     Static看待Dynamic: Racket好像只是ML的子集,所有的表达式都属于某一个大的数据类型,并且有很多子类型,这些类型有类似tag的东西,以便在运行时进行检查。如果检查不通过就会抛出异常。

Static Checking: 在parse后run之前reject程序。parse的时候的错误:syntax error;static checking的错误:type error。不需要任何输入,编译期的检查----无论检查完成后是用编译器还是解释器执行程序。最普遍的static checking是通过type system实现的(如何实现)。(目的)都是一致的:防止误用或者无用的程序执行
Dynamic Checking: 给值加上tag
两者的区别是在compile-time还是在run-time防止程序做坏事。实际上,检查错误可以有以下的时间:
     1.输入时:editor发现的
     2.compile time
     3.link time: 当发现main函数调用了某个不合法的函数
     4.run time
     5.later:当发现执行错误的时候,不抛出异常,而是返回一个错误值,或者直到错误值被使用的时候再抛出异常
还有需要注意的是,不检查某种错误X和Dynamic/static checking 无关。
比较:
     1.方便性:dynamic:可以混合多种类型的数据;static:能尽早发现错误
     2.速度:static: 更快,在ML中只有在用户添加datatype constructor的地方才会存在run-time tag
     3. 检查bug: static: 更早;dynamic: 依赖testing
     4.其他:如拒绝更多程序、能复用、利于代码进化(写代码更快)。。。

Sound and Complete
     假设X代表某种错误的情况
     sound:不会接受X的程序(prevent false negative)
     complete:不会拒绝没有X的程序(prevent false positive)
     type system通常是sound但是不是complete的。因为一个static checker不能够同时:sound, complete, always terminate。因此抛弃complete

假设type system对某种错误情况X unsound——即可能发生错误X。最好的解决方法是dynamic check X,并且抛出异常。
Weak Typed: 不对X进行类型检查,Bug可能导致任意结果。(C, C++)
Strong Typed: 有Bug的程序会受限。

interpolation/quasi-quoting in scripting language
     eval: 在运行时求值。并不依赖是compiler-based language还是interpreter-base language。只需要在运行时有一个compiler或者interpreter就可以了。有趣的是,Racket的输入是一个列表
     
     (f #t) =>打印了hi并且返回6
     quote: 将它后边的东西都看作是符号,数字…,不会求值
     
     eval和quote是相反的。(eval (quote e)) == e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值