类型系统的四个维度
来源:互联网 发布:nginx 来源ip转发 编辑:程序博客网 时间:2024/05/16 16:03
By pongba
reddit上看到的。
这位老大对类型系统作了相当清晰的阐述;到目前为止是我看到的最清晰的。
其它的要么是盲人摸象(这里,这里,这里),要么是不着四六(这里),要么是云山雾罩(这里)。
Latent typing is any type system where you do not need to explicitly write the types of variables down in source code. Its opposite is manifest typing, where you do need to explicitly write the types down in source code.
Static typing is a type system where individual expressions in the source code must have types, whether written or inferred by the compiler. Dynamic typing is a type system where run-time values have types (or not, as the case may be), yet program expressions can be any type. (Purists often say that dynamic typing isn't a type system at all, since the academic definition of types are a syntactic property of the code, but that's getting overly pedantic IMNSHO.)
The overlap is in type-inferencing systems. Languages like Haskell and Ocaml are statically-but-latently typed, with the compiler figuring out the types of your variables.
In theory, there's also an overlap on the other side, where types are written in the source code but aren't checked until runtime. Python 3000 has proposed a system like this, and Common Lisp and Dylan do something similar.
Bruce Eckel's actually using "latent typing" wrong in this article; he really means "structural subtyping". Basically, structural subtyping means that objects or expressions are tested for type-compatibility based on their structures (the methods/fields/values they support), while "nominal subtyping" means that objects are tested for compatibility based on explicit subtyping declaration by the programmer (think Java interfaces). Haskell, ML, and most dynamically typed languages are structurally-subtyped, while most industrial languages are nominally-subtyped.
There's also strong vs. weak typing, which has to do with whether the runtime automatically coerces values to different types.
So basically, there are 4 dimensions:
- Static (expressions have types) vs. dynamic (values have types)
- Strong (values cannot be coerced to other types without a cast) vs. weak (the runtime performs a variety of coercions for convenience)
- Latent (no type declarations) vs. manifest (type declarations)
- Nominal (subtyping relations are declared explicitly) vs. structural (subtyping relations are inferred from the operations available on types)
And you can place most languages on one of these 4 axes, though several support multiple forms of typing:
- Ocaml: static, strong, latent, structural typing
- Haskell: static, strong, latent, structural typing, with nominal typing available via
newtype
and manifest typing through optional type declarations.- Erlang: dynamic, strong, latent, structural typing
- Scheme: dynamic, strong, latent, structural typing, with nominal typing available in many object systems.
- Common Lisp: dynamic, strong, latent or manifest typing. Same note about structural vs. nominal typing as Scheme, but nominal subtyping is used more often in practice.
- Python & Ruby: dynamic, strong, latent, structural typing. Nominal subtyping is available via
isinstance
or Ruby equivalent, but good practice frowns upon it.- PHP: dynamic, weak, latent, nominal or structural typing. Culture is much friendlier to nominal subtyping than Python or Ruby, but it's not required.
- Java & C++: mostly static, strong, manifest, nominal typing. The casts give you a form of weak-typing when necessary, and C++ templates are structurally typed.
- C: static, generally weak, manifest, nominal typing.
- Assembly: dynamic, weak, latent, structural typing.
programming: Bruce Eckel: 3-31-04 I'm over it (Java)
- 类型系统的四个维度
- 人生意义的四个维度
- 我们能从Linux系统上学到什么?谈谈linux的四个维度
- 随想录(linux的四个维度)
- 随想录(linux的四个维度)
- 随想录(linux的四个维度)
- Presentation 需要注意的四个维度
- 转化率分析的四个维度
- linux四个维度
- 分析系统的性能问题的维度
- 分析系统的性能问题的维度
- C++的四个类型转换
- 类型转换的四个关键字
- 常用的四个博客系统
- 动效设计如何从四个维度吸引你的注意力
- 超级表格从四个维度为您实现精细化的表格数据共享【点击查看】
- 【头条】四个维度,解读VxRail
- JDBC资料库驱动程式的四个类型
- eclipse無法編譯的原因&解決方法
- 在J2ME程序中实现字符串分割
- Web页面的数据导出excel时的格式问题
- Rational Rose、PowerDesign、visio这三个软件的功能与异同
- 一个PING指定IP的控件,包含测试代码
- 类型系统的四个维度
- event objects 小记录
- 硅谷的圈子
- ORACLE数据库备份方法
- Zoundry Blog Writer Test
- 6000级石阶见证绝世爱情[转]
- Oracle数据库备份与恢复之日志备份
- 收藏几个openssl相关的链接
- J2ME程序开发中随机数字处理全攻略