Plasma refers to two things: the Plasma library and the Plasma workspace. The workspace is the default desktop shell for KDE4, and the library is what drives it.
The Plasma library is generally the more interesting meaning of the word, as it provides a scene/view (much like model/view) approach to presenting a user interface. Widgets sit on the Corona canvas, grouped into Containments. Data is obtained via DataEngines and Runners. The entire scene is designed to be viewed in a flexible manner, including zooming and resolution independence.
Plasma also provides many standardized services such as artwork, presentation and script management, and creating add-ons for a Plasma application quite easy.
The goal of Plasma is to provide a flexible, re-targetable, scriptable and highly portable, and componentized interface to the user.
A widget is a single component on the canvas. Other common names that are analogous are "applet" or "gadget". Superkaramba Themes, Apple's Dashboard, Google Gadgets, Yahoo Widgets, Vista Sidebar Widgets, Opera Widgets are all examples of other widget systems (some of which are supported by Plasma as well).
A Plasmoid is the combination of files that go into creating a native Plasma widget. This includes:
An applet is the code part of a plasmoid, technically because it provides a Plasma::Applet object. To users, this will be an implementation detail they probably never see.
The Corona, a QGraphicsScene subclass, is the Plasma canvas. It contains all of the Containments that exist for the application, providing the "model" for the Views to use.
It handles initiating loading and saving of Containments and Applets and other such canvas-global tasks.
A Containment is a top level grouping of widgets. Each Containment manages the layout and configuration data of its set of widgets independently from other Containments.
A DataEngine is a plugin that provides a visualization access to a body of information in a standardized manner. Each unit of data is called a "source", and source may be created on demand. Sources are updated either when the data changes (such as in response to a hotplug event for the devices DataEngine) or in a timed interval as requested by the visualization.
The timings and memory management of the sources are handled by DataEngine, making implementation of DataEngines trivial.
The sources themselves are organized into a list, and each source can have zero or more key/value pairs. The values are QVariants and therefore quite flexible.
DataEngines send information to visualizations via the dataUpdated(QString source, Plasma::Data data) slot that all visualizations must implement to receive updates.