One of the concepts I see confused quite a bit is the relationship between Apache Sling and AEM. Many developers think of Sling as a specification, like the JCR with a distinct version. To understand this why this concept is incorrect and why it arises, we first need to understand exactly what Apache Sling is.
Apache Sling is an application framework for building web applications. Apache Sling uses OSGi as an inversion of control container to allow developers to dynamically add and modify the application during runtime. As such Sling provides an engine for running the OSGi container and a collection of modules which can be used to create Sling-derived applications. Each module, including the API, core functionality such as the resource resolver or servlet support not are versioned be separately, so you can compose Sling applications from any set if modules as long as they are compatible.