标题：plugin
机制
主应用程序提供给插件可以使用的服务，让插件在主应用程序中注册插件本身，以及和插件进行数据交换的协议。插件依赖于主应用程序提供的这些服务，通常不能独立运行。相反地，主应用程序和插件是分离的，这就使得我们可以不改变主应用程序而动态增加或更新插件。
公开的应用程序接口(API）提供一个标准接口，允许第三方编写插件和主应用程序交互。一个稳定的API必须在主应用程序版本升级后第三方插件仍可以运行。插件同时也延长了过时的应用程序的生命。Adobe Photoshop 和 After Effects 提供给插件的API已经成为一种图像处理软件API的标准，被相类的图像处理软件所采纳。其它类似的API包括 Audio Units 和VST。
这种插件的机制很普遍，比如一个网络交换器，它有一个没被占用而且是非标准的端口，用它来接纳不同的任意的物理层连接；再比如计算机硬件制造业的行业标准架构（Industry Standard Architecture）和IBM著名的微通道架构（Micro Channel Architecture），都允许第三方设备。这些都是类似插件的一种机制。
插件和扩展
插件稍不同于扩展（extension），插件通常依赖于主应用程序的接口，有一个它们可以运行的确定的界限。扩展则通常有更少的限制，也可以提供它们自己的接口。相同的是，它们通常都用来减少主应用程序的大小、提供一些可选的功能。
这里不得不提到Mozilla Firefox 和相关软件。它们使用一个叫做Add-on的名词，Add-on又被细分为插件、主题（theme）、搜索引擎（search engine）和扩展。在以后的文章中将会提到Mozilla插件和古老的NPAPI的渊源，以及firefox中插件和扩展的区别。
历史渊源
插件的概念可以回朔到上世纪70年代。那时在Univac 90/60系列主机的Unisys VS/9 操作系统中，运行着一个叫 EDT 的文本编辑器，它提供一种功能可以从编辑器中运行其它应用程序，并允许这些程序访问编辑器的缓冲区，在内存中提供一种编辑会话。这样这些外来的应用程序就可以依靠共享的缓冲区执行文本操作了。这种功能后来被 Waterloo Fortran编译器使用，和EDT编辑的Fortran程序进行交互编译。
在PC机上拥有插件功能的第一个软件可能是在Macintosh上的HyperCard和QuarkXPress，它们在1987年发布。1988年，Silicon Beach软件公司在 Digital Darkroom和SuperPaint软件中也包含了插件功能。而Plug-in 这个名词则是被Ed Bomke提出。
Plugin 架构
以下按编程语言分类C++FxEngine Framework - 一个数据流处理框架 
Qt PlugIns - TrollTech的 Qt 框架的一部分 
Delphi
TMS Plugin Framework 
Java
Java Plug-in Framework (JPF），一种由Eclipse的插件机制而改写的架构 
RCP，由Eclipse发展而来的技术平台，应用程序可以以插件方式编写，应用程序本身也可以拥有插件 
Python
Setuptools 
The Twisted Plugin System 
Sprinkles 
Python plugin system 
.NET
AL Platform 
Mono Addins - .Net和Mono的一个addin框架 
Code Project 基于.NET的插件框架 
Active Visic
Active Visic 
JSP 语法<jsp:plugin>
执行一个applet或Bean，有可能的话还要下载一个Java插件用于执行它. 
JSP 语法 
<jsp:plugin 
type="bean | applet" 
code="classFileName" 
codebase="classFileDirectoryName" 
[ name="instanceName" ] 
[ archive="URIToArchive,..." ] 
[ align="bottom | top | middle | left | right" ] 
[ height="displayPixels" ] 
[ width="displayPixels" ] 
[ hspace="leftRightPixels" ] 
[ vspace="topBottomPixels" ] 
[ jreversion="JREVersionNumber | 1.1" ] 
[ nspluginurl="URLToPlugin" ] 
[ iepluginurl="URLToPlugin" ] > 
[ <jsp:params> 
[ <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> ]+ 
</jsp:params> ] 
[ <jsp:fallback> text message for user </jsp:fallback> ] 
</jsp:plugin> 
例子 
<jsp:plugin type=applet code="Molecule.class" codebase="/html"> 
<jsp:params> 
<jsp:param name="molecule" value="molecules/benzene.mol" /> 
</jsp:params> 
<jsp:fallback> 
<p>Unable to load applet</p> 
</jsp:fallback> 
</jsp:plugin> 
描述
<jsp:plugin>；元素用于在浏览器中播放或显示一个对象（典型的就是applet和Bean），而这种显示需要在浏览器的java插件。
当Jsp文件被编译，送往浏览器时，<jsp:plugin>；元素将会根据浏览器的版本替换成<object>；或者<embed>；元素。注意，<object>；用于HTML 4.0 ，<embed>；用于HTML 3.2. 
一般来说，<jsp:plugin>；元素会指定对象是Applet还是Bean，同样也会指定class的名字，还有位置，另外还会指定将从哪里下载这个Java插件。具体如下： 
属性
type="bean | applet"
.将被执行的插件对象的类型，你必须得指定这个是Bean还是applet，因为这个属性没有缺省值. 
code="classFileName"
将会被Java插件执行的Java Class的名字，必须以.class结尾。这个文件必须存在于codebase属性指定的目录中. 
codebase="classFileDirectoryName"
将会被执行的Java Class文件的目录（或者是路径），如果你没有提供此属性，那么使用<jsp:plugin>；的jsp文件的目录将会被使用. 
name="instanceName"
这个Bean或applet实例的名字，它将会在Jsp其它的地方调用. 
archive="URIToArchive,..."
一些由逗号分开的路径名，这些路径名用于预装一些将要使用的class，这会提高applet的性能. 
align="bottom | top | middle | left | right"
图形，对象，Applet的位置，有以下值： 
bottom 
top 
middle 
left 
right 
height="displayPixels" width="displayPixels"
Applet或Bean将要显示的长宽的值，此值为数字，单位为象素. 
hspace="leftRightPixels" vspace="topBottomPixels"
Applet或Bean显示时在屏幕左右，上下所需留下的空间，单位为象素. 
jreversion="JREVersionNumber | 1.1" 
Applet或Bean运行所需的Java Runtime Environment (JRE) 的版本. 缺省值是 1.1. 
nspluginurl="URLToPlugin" 
Netscape Navigator用户能够使用的JRE的下载地址，此值为一个标准的URL。
iepluginurl="URLToPlugin"
IE用户能够使用的JRE的下载地址，此值为一个标准的URL。
<jsp:params> [ <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> ]+ </jsp:params>
你需要向applet或Bean传送的参数或参数值。
<jsp:fallback> text message for user </jsp:fallback>