写点什么

Visual Basic 动态类型简史

  • 2010-01-21
  • 本文字数:1212 字

    阅读完需:约 4 分钟

Visual Basic 一直徘徊在静态类型与动态类型之间。一开始,VB 支持晚绑定(late binding),也就是现在大家所熟知的”鸭子类型(duck typing)“,这意味着 VB 并不要求显式声明变量类型,甚至是局部变量。但如果声明了变量类型,VB 就会采取早绑定(early binding)模式,同时进行运行时类型检查并提供更好的性能。

Visual Basic 4 中引入了 COM,随之而来的是 VB 提供了其他大多数语言都不具备的众多特性。在声明变量类型时,编译器会隐式参照接口而非具体的类。这并非总是那么显而易见,因为每个类都会隐式定义一个同名的接口。实际效果就是在这种模式下,任何类都可以显式实现其他类的接口,但类与类之间是不能直接继承的。虽然 VB 开发者对缺少继承这一特性一直耿耿于怀,但 Google 最近发布的 Go 语言也是如此。

Visual Basic 7(即 VB.NET)舍弃了无限接口风格的多态。这次综合采取了继承与显式定义接口(得益于 Java 的推进)这两种手段。VB 还增加了 Option Strict 指令,这样编译器就会要求显式的类型声明与转换。

就在 VB 向静态类型大踏步前进的同时,这个世界发生了翻天覆地的变化,动态语言开始流行,比如 Python 和 Ruby 等。还需要再来两个 VB 版本以适应这种变化。

VB 9 在动态类型领域提出了几个重要特性。首当其冲就是大获成功的 XML Literal 和 XML Comprehension。其语法首先是为 Haskell 编程语言提出的,后来 C#实现了其原型。VB 是第二种将其应用到产品中的语言。第一种语言是 ECMAScript for XML ,于 2004 年标准化。

顺便提一下,XML Comprehension 并非是 VB 首次为特定类型增加的特殊语法。VB 还有!操作符,在 3.0 到 6.0 中一直用于访问数据库。尽管支持字典风格的查找,但最终还是被历史遗弃了,如下示例:

复制代码
firstName = recordset!FirstName
lastName = recordset!LastName

Visual Basic 9 的一些特性可以让开发者在运行时通过名字来创建对象和访问属性而无需使用反射 API,比如:

复制代码
className = “Customer”
memberName = “FirstName”
x = New (className)
x.(memberName) = “Fred”

从 VB 10 开始,VB 真正成为了动态语言。直到现在,动态特性还仅仅局限在类型的使用上。事实上,直到 VB 增加了对 DLR 的支持后我们才可以创建新的类型或是改变已有的类型。凭借 Visual Basic 10 Beta,开发者可以创建自己的对象模型,包括像 JavaScript 等语言所使用的原型风格的对象。

展望未来,来自微软的 Lucian Wischik 说他们正在扩展 XML Comprehension 语法。目前打算支持 Silverlight XAML 以及 HTML DOM,不仅如此,还能适用于任何 tree 风格的数据结构。

值得注意的是,Visual Basic 的小兄弟 VBScript 也独具特色。与大多数解释性语言类似,VBScript 也可以执行字符串中的代码。这些函数(如 Eval 和 Execute)经常被 VB 6 应用所使用(在需要使用动态功能的时候)。未来,我们希望 IronPython 或是 IronRuby 能担此重任。

查看英文原文: A Short History of Dynamic Typing in Visual Basic

2010-01-21 04:331114
用户头像

发布了 88 篇内容, 共 273.1 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

一篇文章深入理解JDK8 HashMap

itlemon

源码 hashmap 线程安全

Spring Boot 最流行的 16 条实践解读,值得收藏!

Java小咖秀

spring 学习 Spring Boot SpringBoot 2 经验分享

直接赋值,深拷贝和浅拷贝

Leetao

Python Python基础知识

创业使人成长系列 (1)- 从失败中学习

石云升

创业 个人成长 成长

推荐 10个 NB的 IDEA 插件,开发效率至少提升一倍

程序员小富

Java 效率 IDEA

第五周作业

架构师训练营第5周作业

aoeiuvzcs

再谈任务分解

松花皮蛋me

Java 精益开发

可读代码编写炸鸡四(下篇) - 提炼注释的下一步是提炼注释

多选参数

代码质量 代码 代码组织 代码规范

你真的在做持续集成吗?

冯文辉

DevOps 持续集成 CI/CD

架构师训练营第5周总结

aoeiuvzcs

Homework-我的一致性Hash算法

River Tree

Homework

想怎么玩,就怎么玩!搭载桌面级十代酷睿的神舟超级战神真香!

最新动态

小师妹学JVM之:Dirty cards和PLAB

程序那些事

Java JVM 小师妹 性能调优 签约计划第二季

week5 总结

GAC·DU

如何写一份合格的技术简历?

通天哪吒

面试

[架构师训练营] Week02 - 学习总结

谭方敏

一篇文章深入理解JDK7 HashMap

itlemon

hashmap map 源码解析 哈希冲突

小姐姐面试蚂蚁金服被虐经历,哪吒心疼.

通天哪吒

面试

[架构师训练营] Week02 - 作业

谭方敏

架构师训练营总结 -5

River Tree

极客大学架构师训练营 个人总结

Atlassian Team Playbook | OKR 好的不只是逼格

Atlassian

开发

猿灯塔:spring Boot Starter开发及源码刨析(一)

猿灯塔

Java 源码剖析

我终于弄懂了Python的装饰器(一)

BigYoung

Python 装饰器

环信即时通讯云荣获《2020年度云通讯产品创新奖》

DT极客

一致性Hash算法

莫莫大人

极客大学架构师训练营

功利学习法:我为什么要这么功利?

非著名程序员

学习 程序员 程序人生 提升认知

深入理解CAS:以AtomicInteger为例

itlemon

Atomic CAS AtomicInteger 自旋

week5 coding

GAC·DU

第五周学习总结

编程能力 —— TicTacToe(井字棋)

wendraw

Java 大前端 编程能力

Visual Basic动态类型简史_.NET_Jonathan Allen_InfoQ精选文章