[dynamic FL]part 6:comparison between Dynamic and Static
2017-05-25 14:45
501 查看
各种语言的比较:
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
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
相关文章推荐
- The difference between static_cast and dynamic_cast
- part 8: comparison between OOL and FL
- The difference between static_cast and dynamic_cast
- A Comparison between Focus-Group and In-Depth Interview
- Difference Between == and === : A Simple Comparison
- Comparison Between NetCDF and HDF5
- Build Static and Dynamic Libary in Linux
- linux static and dynamic library
- Strongly/Weekly typed, Explicitly/Implicitly typed and Dynamic/Static type
- MinGW Static and Dynamic Libraries
- A warning - comparison between signed and unsigned integer expressions [-Wsign-compare]的解决方法
- C warning“comparison between pointer and integer [enabled by default]”
- Comparison between the simplex algorithm and interior point method
- comparison between distinct pointer types 'QPushButton*' and 'QAbstractButton*' lacks a cast
- Cross Compile zlib as static and dynamic library
- 文献笔记:《Fitting a 3D Morphable Model to Edges: A Comparison Between Hard and Soft Correspondences》读后感~
- Comparison between overloading operators in member function and in friend function
- [Error] ISO C++ forbids comparison between pointer and integer [-fpermiss
- CSharp - Comparison between IComparer and IComparable
- What is the difference between const and static readonly?(const 和 static readonly 的区别?)