Already lots of impressive references in the comments! But let's try to do it short:
Module: a self-contained piece of software (e.g. types, data structure, functions), that can be combined with other modules to construct a more complex software.
References that support this definition:
- In 1978, it was proposed to introduce modules for Algol68, in order to to address needs for separate compilation and protection (encapsulation). The notion was explicitly considered as orthogonal to abstract types.
- In 1978, the Modula 2 language was introduced, that was built on the notion of modules to offer separate compilation and encapsulation. It distinguished the module definition (interface) from the module implementation.
- In 1983, the ADA language was made available with all the concepts required to build very complex systems. The modules therein are called ADA packages. They offer the possibility of separate compilation, but the purpose is also to group logically related entities.
- In 1996, the Java language appeared, and offered also the notion of package, to group in a namespace logically related classes. But here separate compilation and encapsulation is already offered by the classes. The goal is more the grouping of related classes.
All these examples (as well as future C++ modules), fit in this proposed definition.
Plugin: a plugin is a ready to use software component that can be added to an existing software to change adds features.
References and arguments that support this definition:
- Intuitively, a plugin is something that you just have to put into an existing plug to make it work instantaneously.
- According to wikipedia it is a software component that adds a specific feature to an existing computer program.
- I added "ready to use" to this definition because all the wikipedia examples are ready to use components: you download them and integrate it in the existing software without the need or compiling/building. Without "ready to use" you wouldn't make the difference with module.
- "Dynamic" and "Application Binary Interface" are recurring issue in plugin frameworks.
- Actually, the OSGI alliance defines a java architecture for a "dynamic module system". The underlying JSR291 java specifications refers to "dynamic package import". This matches perfectly with the our understanding of modules. Unfortunately, this architecture use the terms "module" in complement of "service" which -when the word dynamic is omitted- could be very ambiguous.
I think there is no consensus around the term extension. Personally, I see it as a synonym for plugin. But the notion of dynamic/ready-to-use is not at all suggested by this term, so that it could also mean an extension at compile/built time. Some people might even use it for a tailorised version of a software.
There are many, many interpretations of the terms modules, plugins, and extensions-- That's your answer.