您的位置:首页 > 编程语言

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

2017-05-25 14:45 387 查看
各种语言的比较:
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数式编程