While developing software, certain parts of my applications are not planned to be necessarily deployed with the main software. And they need to be named correctly.

Now I understand apparently there are many, many interpretations of the terms modules, plugins, and extensions. There are even answers on Stack Overflow for proprietary software.

However, I am looking for a valid, reasonable and general definitions for these terms which properly differentiate them without tying them to any software. Providing examples are fine, however.

Any input regarding this is greatly appreciated.

  • 1
    What about other terms, like add-on, layer, stack, framework, library, and DLL ? – Erik Eidt Apr 19 '16 at 15:28
  • 1
    So you understand there is no universally agreed upon definition for these terms? So what is it you are asking for? – JacquesB Apr 19 '16 at 16:47
  • 1
    There are many, many interpretations of the terms modules, plugins, and extensions -- That's your answer. – Robert Harvey Apr 19 '16 at 16:48
  • @ErikEidt would also be great to hear those definitions as well. – David Refoua Apr 19 '16 at 17:01
  • @JacquesB True, but terms usually share a close definition. – David Refoua Apr 19 '16 at 17:06

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.

Extensions: ??

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.

  • 1
    Some other interesting and/or important module systems: Racket's Units, Standard ML's Parameterized Functors, and Newspeak and Scala are interesting, because they unify modules with objects and module definitions with classes (traits). Scala's type system, specifically, has been extended with features that are explicitly intended to match features normally found in module systems. That way, Newspeak and Scala don't need a separate module system, plus first-class and higher-order modules are completely natural: modules are just objects, and objects are obviously first-class in OO. – Jörg W Mittag Apr 19 '16 at 23:01
  • Module - group of thingies. Plugin - ready to use thingy that adds functionality. Extensions - thingy that extends functionality of other thingies. – C.L. Oct 2 '20 at 6:36
  • @C.L. Thank you for this very intuitive summary. Maybe you could add "and that taken alone is useless" to your informal plugin definition. The issue I have with extending is that different people use it for very different purpose. For a java developper extending is very concrete. And for an ERP vendor a "module" may extend functionality of other "thingies" ;-) – Christophe Oct 2 '20 at 7:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.