此条目页的主題是Microsoft Visual Studio 6.0及更早版本的Basic。与「**Visual Basic**」標題相近或相同的条目页，請見「**Visual Basic .NET**」。

Visual Basic 6 IDE
**Visual Basic**（**VB**）是由微軟公司开发的包含环境的事件驱动编程语言。它源自于 BASIC 编程语言。VB 拥有图形用户界面（GUI）和快速應用程式開發（RAD）系统，可以轻易的使用 DAO、RDO、ADO 连接数据库，或者轻松的创建 ActiveX 控件。程序员可以轻松地使用 VB 提供的组件快速建立一个应用程序。

2020 年 3 月 11 日宣佈微軟不會再開發 VB 或增加功能（Going forward, we do not plan to evolve Visual Basic as a language）。

发展史
---

### .NET Framework 引入之前

#### VB 1

VB1.0的DOS版本
1991 年 4 月，Visual Basic 1.0 for Windows 版本发布。1992 年 9 月，Visual Basic 1.0 for DOS 版本发布。这个连接编程语言和用户界面的进步被称为 Tripod（有些时候叫做 Ruby），最初的设计是由阿兰·库珀（英語：）完成的。这在当时引起了很大的轰动。许多专家把 VB 的出现当做是软件开发史上的一个具有划时代意义的事件。以现在的眼光来看，VB1.0 版的功能其實非常的弱，但它在推出当时可是第一个"可视"的编程软件。这使得程序员欣喜之极，都尝试在 VB 的平台上进行软件创作。

#### VB 2

1992 年 11 月，VB2.0 发布。它对于上一个版本的界面和速度都有所改善。

#### VB 3

1993 年夏天，VB3.0 发布，分为标准版和专业版。其中包含一个数据引擎，可以直接读取 Access 数据库。这使得 VB 的数据库编程能力大大提高。

#### VB 4

1995 年 8 月，VB4.0 发布了 32 位版本和 16 位的版本。其中包含了对类的支持。从 VB4 开始，逐步引入了面向对象的程序设计思想。VB 功能强大，学习简单。而且，VB 还引入了"控件"的概念，使得大量已经编好的 VB 程序可以被我们直接拿来使用。

Visual Basic 1.0~4.0 都必须将源代码编译成 VB 伪代码后解释执行。

#### VB 5

1997年2月，VB5.0 发布。程序员可以用 32 位的版本导入由 4.0 版本创建的 16 位程序，并且能顺利编译。同时还包含了对用户自建控件的支持。自从 Visual Basic 5.0 以后，VB 支持编译成本机代码，但必须在VB 运行库的支持下工作。

#### VB 6

1998年夏天，VB6.0 发布。VB6 是 VB.NET 至今仍無法完全取代的版本。 

### .NET Framework 引入之后

条目：Visual Basic .NET
#### VB.NET （VB7）

2001 年，Visual Basic .NET 和 .NET Framework发布。由于其使用了新的核心和特性，所以很多 VB 的程序员都要改写程序。

2002 年 Visual Basic .NET 2002（v7.0）問世，此后 Visual Basic 包含在 Visual Studio 套装中。

2003 年 Visual Basic .NET 2003（v7.1）推出。

#### VB 8

2004年，微软开放了 Visual Studio .NET 2005 的测试版本（代号Whidbey）。包含了 .NET Framework2.0 的测试版本。2005 年 11 月 7 日 Visual Basic 2005（v8.0）发布，同时为初学者与学生提供 Visual Basic 2005 的免費簡化版本 Express Edition。原定免费使用期限一年，之后微软宣布 Express 版本永久免费。微软在其软件名称中去掉了 .NET 部分。Visual Basic 2005 的"显著"优点是，可以直接编写出 Windows XP 风格的控件；但是其编写的小程序就需要近 10MB 的内存。

#### VB 9

2008 年 2 月 1 日 Visual Basic 2008（v9.0）发布。

通过几年的发展，它已成为一种专业化的开发语言和环境。用户可用 Visual Basic 快速创建 Windows 程序，现在还可以编写企业水平的客户/服务器程序及强大的数据库应用程序。

#### VB 10

Visual Basic 10.0 按计划于2010年3月22日随 Visual Studio 2010 一起正式发布。

新加入的功能：

* 自动实现属性
* 集合初始化
* 不需要在代码断行书写时输入下划线"\_"
* 更好的 lambda 表达式支持
* 更好地与 Python 及 Ruby 等动态语言的互通操作

Visual Basic .NET 2002（7.0）及以后的版本运行在 .NET Framework 环境下。

#### Visual Basic 2012（VB 11.0）

#### Visual Basic 2013（VB 12.0）

#### Visual Basic 2015（VB 14.0）

Visual Basic 2015（VB 14.0）于2015年7月20日发布。

由 VB 派生的語言
----------

微軟開發了一系列有關 VB 的腳本語言：

* Visual Basic for Applications，即 **VBA**，包含在微軟的應用程序中（比如 Microsoft Office，常見的有 Excel），以及類似 WordPerfect Office 這樣第三方的產品里面。VBA這樣嵌入在各種應用程序中看起來有些矛盾，但是它的功能和 VB 一樣強大。

* VBScript 是 ASP 的預設語言，還可以用在 Windows 腳本編寫和網頁編碼(HTML)中。盡管它的語法類似於 VB，但是它卻是一種完全不同的語言。VBS 不使用 VB 執行庫執行，而是由 Windows 脚本宿主(wscript.exe - Microsoft Windows Based Script Host)解釋執行。這两種語言之中的不同點影響 ASP 網站的表現。

當微軟準備開發一種新的編成工具的時候，第一決定就是利用最搶手的VB6來進行修改，或者就是重新組建工程開發新工具。微軟後來開發了 VB 的繼任者 Visual Basic .NET，同時也是 .NET 平台的一部分。VB.NET 編成語言是一種真正的物件導向編成語言（VB4-VB6 祇能稱為基於對象而不是物件導向，最明顯的特徵就是 VB4-VB6 都不支持類的繼承），和傳統 Visual Basic 並不完全兼容。

语言特性
----

VB6的IDE畫面
VB 的中心思想就是要便于程序员使用，无论是新手或者专家。VB 使用了可以简单建立应用程序的 GUI 系统，但是又可以开发相当复杂的程序。VB 的程序是一种基于窗体的可视化组件安排的联合，并且增加代码来指定组建的属性和方法。因为默认的属性和方法已经有一部分定义在了组件内，所以程序员不用写多少代码就可以完成一个简单的程序。过去的版本里面 VB 程序的性能问题一直被放在台面上讨论，但是随着计算机速度的飞速增加，关于性能的争论已经越来越少。

窗体控件的增加和改变可以用拖放技术实现。一个排列满控件的工具箱用来显示可用控件（比如文本框或者按钮）。每个控件都有自己的属性（英语：）和事件。默认的属性值会在控件创建的时候提供，但是程序员也可以进行更改。很多的属性值可以在运行时候随着用户的动作和修改进行改动，这样就形成了一个动态的程序。举个例子来说：窗体的大小改变事件中加入了可以改变控件位置的代码，在运行时候每当用户更改窗口大小，控件也会随之改变位置。在文本框中的文字改变事件中加入相应的代码，程序就能够在文字输入的时候自动翻译或者阻止某些字符的输入。

VB 的程序可以包含一个或多个窗体，或者是一个主窗体和多个子窗体，类似于操作系统的样子。有很少功能的对话框窗口（比如没有最大化和最小化按钮的窗体）可以用来提供弹出功能。

VB 的组件既可以拥有用户界面，也可以没有。这样一来服务器端程序就可以处理增加的模块。

VB 使用引用计数的方法来进行垃圾收集，这个方法中包含有大量的对象，提供基本的面向对象支持。因为越来越多组建的出现，程序员可以选用自己需要的扩展库。和有些语言不一样，VB 对大小写不敏感，但是能自动转换关键词到标准的大小写状态，以及强制使得符号表入口的实体的变量名称遵循书写规则。默认情况下字符串的比较是对大小写敏感的，但是可以关闭这个功能。

VB 使得大量的外界控件有了自己的生存空间。大量的第三方控件针对 VB 提供。VB 也提供了建立、使用和重用这些控件的方法，但是由于语言问题，从一个应用程序创建另外一个并不简单。

术语
--

在讨论 Visual Basic（不包含 .NET）时，经常可以听到以下这些术语，因此掌握这些术语的基本理解对初学者十分有帮助。

* **控件**：简单的说，控件就是构成或者说建造 Visual Basic 应用程序的图形化工具，包括窗体、按钮、复选框、列表框、数据控件、表格控件和图片控件等等。
* **事件**：由用户或操作系统引发的动作，例如击键、单击鼠标（Click）、双击鼠标（DblClick）、一段时间的限制，或从端口接收数据。
* **方法**：嵌入在对象定义中的程序代码，它定义对象怎样处理信息并响应某事件。例如，数据库对象有打开纪录集并从一个记录移动到另一个记录的方法程序的基本元素，它含有定义其特征的属性，定义其任务和识别它可以响应的事件的方法。控件和窗体是Visual Basic中所有对象的示例。
* **物件**：一个控件、窗体等都可被看作一个物件。
* **过程**：为完成某些特定的任务而编写的代码段，过程通常用于响应特定的事件，也可以当作应用程序的用户自定义函数来使用。
* **属性**：属性是组成用户界面的各对象的性质的具体描述。例如上述"物件"中所提到的尺寸、位置、颜色、宽度、高度等等都称为控件的属性。属性决定物件的外观，有时也决定物件的行为。物件的属性绝大部分是 VB 中已经事先定义好的，但也有的属性是需要在应用过程中才去定义的。属性即可为物件提供数据，也能从物件取回信息。

VB.NET的变革
---------

### VB（6.0 及以前）不擁有的特性

* 继承：Visual Basic 5 以后，VB虽然提供了简化的类支持，但仍然不能滿足程序員的需求。
* 多线程支持：虽然可以使用 Windows API 完成，不过稳定性与调试都很难保证。
* 異常處理：只支持"`On Error Goto` *line*"語句。
* 對指標的支持非常有限。
* VB 只能支持 8 到 32 位的整數，很多語言都有無限制的支持。
* VB 不允許在任何數組記憶體在不變的變量。
* VB 不支持其它程序语言共享程序代码。

Visual Basic .NET（VB 7.0）以后的版本基本支持了上述特性。

### VB 6 與 VB.NET 比较

VB.NET 的具体变革如下：

* 子程序（函数）的定义与调用。
* 数组的初值设定并且需要注明范围。
* 函数在格式上的改变：`Date` 函数、`Time` 函数、部分数学函数部分不能直接使用，`String` 函数不能使用，`DatePart`、`DateAdd`、`DateDiff` 函数的第一个参数在定义上有所改变。
* `Set` 保留字不再使用。
* `Wend` 保留字以 `End While` 取代。
* 新增运算符：`+=`、`-=`、`/=`、`*=`、`&=`。

### 缺点

这样大的变革一度被认为是微软为了延长 VB 的生命力而做出的，结果把 VB 改得几乎面目全非，成了一个类似于 C# 的新语言。VB6 的程序几乎无法运行在 VB.NET 中，尽管微软针对该问题提供了"升级向导"，也无法执行彻底的转换。这样，程序员不得不付出相当大的精力，手工转换代码。

2005 年，微软宣布将不会再对非 .NET 版本的 VB 进行支持。VB 社群立即作出反应表示关心这个消息，一些老用户还递交了希望能够继续对 VB 进行技术支持的请愿书。微软後續並没有改变他们的决定，最終在 2008 年時微軟對從 1.0 到 6.0 的所有 Visual Basic 開發環境版本結束支持。

关于VB的争议
-------

### 反对者

VB 是一种充满了争议的语言：很多程序员对 VB 程序的品质有强烈的反感。很多人认为 VB 不配他们使用，认为它是一种给儿童和菜鸟程序员的语言。它自从设计开始就是一种简单的语言。一些 C++ 和 Java 中的特性在 VB 中并没有出现。在感受开发的方便和快速的同时，一些类似于编译时进行类型和声明检查的功能在默认情况下是关闭的。这样一些程序员一边感叹 VB 的易用性，一边沮丧地看着一些类似于"未定义类型"错误的发生。

一些批评家认为 VB 的简单特性使得其在未来具有伤害性。很多人自学了 VB，但是并没有学到好的编程习惯。当 VB 进入课堂的时候，学生们不会学到很多基础的程序技术和结构，因为很多技术已经包含在那些对用户可见的组件里面了。不用学习标准的编程习惯，因为 VB 具有可视化的特性，所以导致了一些莫名其妙的代码的产生。而且很多错误和警告的检查默认情况下都是关闭的，程序员很难找到隐藏的错误。有经验的程序员在用 VB 编程的时候都会把这些选项打开。

* 并不是非常简便，它开发的程序只能运行在 Microsoft Windows 中。
* VB 不能很好地综合 Windows 的基础 API，很多时候要使用低级运算的"小伎俩"来进行编程。而 C 语言的低级内存运算比 VB 的要简单得多。

### 支持者

但是很多 VB 的支持者解释说 VB 的易用性就是它最大的优势，可以让经验丰富的 VB 程序员或是刚刚懂得皮毛的人都能用自己的方式快速开发程序。而且 VB 的程序可以非常简单的和数据库连接。比如利用控件可以绑定数据库，这样一来用 VB 写出的程序就可以掌握数据库的所有信息而不用写一行代码。

很多语言的特性比如 `GoSub`、`On Error` 和用变量名字的最后一个字符判断宣告类型（比如字符串型 `str$`）都是从BASIC中来的。VB 的语法和绝大部分语言都不同，可能会让新的程序员混淆。比如宣告"`Dim a, b, c As Integer`"宣告了 `c` 为整數變數，但是 `a`,`b` 依然是 `Variant`（.NET中 为 `Object`）类型的。（如果想宣告 3 个 `Integer`，必须写 `Dim a As Integer, b As Integer, c as Integer`；而直接写 `Dim a`，后面不写类型，则自动变成 `Variant` 类型——占用大量资源。這個問題在 VB.NET 以後的版本已经解決，`Dim a, b, c As Integer` 的类型都将为整數）

还有一些特性，比如下划线字符 `_` 支持一行代码分多行写。一些程序员在使用的时候由于不符规范而引起錯誤。

### 总结

VB 会吸引更多的赞誉和批评，也会继续为广大的用户和程序员使用。它比较适合用来开发提供友好界面的程序（比如针对伺服器的数据），但是不适合开发需要进行繁重运算的程序（如联合计算程序）。

对于初學編程者，VB是一個很好的入門軟件，对于一些有編程才能而未发掘的人，由 VB 著手可輕易引發他們的潛能，發揮他們在這方面的才華。

参考文献
----

1. ↑ . CNET.com. 2009-10-19  [2009-12-13] （英语）.

外部連結
----

* （繁體中文）MSDN上的VB6支持 （页面存档备份，存于）
* VB6支持
* VB的教程（页面存档备份，存于）
* VB6中文教程（页面存档备份，存于）
* VBGood（VB愛好者樂園） （页面存档备份，存于）
* play78（VB源代碼）
* Applevb（AppleVB）
* 博客园VB团队
* VB源码分享（VB源码库）
* （繁體中文）Studio Express首頁（下載） （页面存档备份，存于）



|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
程序设计语言 |
| --- |
|  |
| 范型 | 

|  |  |
| --- | --- |
| 过程式 | 
* FORTRAN
* COBOL
* JOVIAL
* ALGOL 60
* JOSS（英语：）
* BASIC
	+ QB64（英语：）
* PL/I
* MUMPS（英语：）
* ALGOL 68
* Forth
* Pascal
	+ Turbo Pascal
* C
* Modula-2
* Ada 83
* occam
* Oberon
* Go
* Zig

 |
|  |
| 面向对象 | 
* Simula 67
* Smalltalk
* Objective-C
* Eiffel
* Object Pascal
	+ Delphi
* Self
* Visual Basic
	+ Gambas
* Ada 95
* Java
* C#
	+ Vala
* Fantom（英语：）
* Crystal（英语：）

 |
|  |
| 多范型 | 
* C++
* Modula-3
* Dylan
* Python
* Lua
* JavaScript
* Ruby
* D
* Factor
* Scala
* F#
	+ F\*
* Haxe
* Dafny（英语：）
* Nim
* Rust
* Dart
* Julia
* Swift
* Bosque（英语：）

 |
|  |
| 函数式 | 

|  |
| --- |
| 
* LISP
	+ Scheme
	+ Common Lisp
	+ Clojure
* Logo
* APL/J
* ML
	+ Standard ML
	+ OCaml
* Erlang
	+ Elixir
* Haskell
	+ Curry
* SAC
* Agda
* Idris
* Pure（英语：）
* jq（英语：）
* Cuneiform

 |

 |
|  |
| 逻辑式 | 
* Prolog
* Datalog
* Mercury
* AnsProlog

 |

 |
|  |
| 脚本语言 | 

|  |  |
| --- | --- |
| 动态语言 | 
* SNOBOL
* Icon
* REXX
* Perl
	+ Raku
* Tcl/Tk
* CLOS
* newLISP
* Python
* Lua
* Ruby
* PHP
	+ Hack
* CFML（英语：）
* REBOL
	+ Red（英语：）
* Julia

 |
|  |
| Shell语言 | 
* Unix shell
	+ sh/ash
	+ csh/tcsh
	+ ksh
	+ bash
	+ zsh
	+ rc（英语：）
	+ fish
* sed
* AWK
* PowerShell

 |
|  |
| ECMA-262 | 
* ECMAScript
	+ JavaScript
* TypeScript
* CoffeeScript/LiveScript（英语：）
* Elm
* PureScript
* Reason

 |

 |
|  |
| 特定平台 | 

|  |  |
| --- | --- |
| .NET | 
* C#
* C++/CLI
* F#
* PowerShell
* VB.NET
* Small Basic

 |
|  |
| JVM | 
* Java
	+ AspectJ（英语：）
* Scala
* Clojure
* Groovy
* Kotlin

 |

 |
|  |
| 特定领域 | 

|  |  |
| --- | --- |
| 科学计算 | 
* Speakeasy（英语：）
* IDL
	+ GDL
* Maxima
* Maple
* MATLAB
	+ Octave
	+ Scilab
* Wolfram
* R
* Yorick（英语：）
* SageMath
* Julia

 |
|  |
| GPU计算 | 
* Cg/HLSL
* GLSL
* Brook（英语：）
* OpenCL
	+ SYCL
* CUDA/PTX（英语：）
* Futhark
* SPIR-V（英语：）

 |
|  |
| 数据查询 | 
* SQL
	+ PL/SQL
	+ T-SQL
	+ SQL/PSM（英语：）
* xBase（英语：）
* XPath
* XQuery（英语：）
* GraphQL

 |
|  |
| 可视化 | 
* Simulink
* LabVIEW
* Orange（英语：）
* KNIME（英语：）
* Scratch
	+ Snap!
* Power Fx

 |
|  |
| 传媒设计 | 
* SuperCollider
* Pure Data
* Processing
* ChucK

 |

 |
|  |
|   | 

|  |  |
| --- | --- |
| 其它 | 
* 汇编语言
* APT（英语：）
* GPSS（英语：）
* dc
* make
* PostScript
* XSLT
* LLVM IR
* WebAssembly

 |

 |
|  |
| 
* 分类 目录
* 列表级条目 列表
* 历史
* 比较（英语：）
* 时间线（英语：）

 |

 |