A programming paradigm is often closely connected to a certain school of software architecture, software engineering or similar and is often associated with a certain family of programming languages. Many languages are designed to implement a particular paradigm. For instance, Smalltalk and Java are associated with object-oriented programming, while Haskell and Scheme are associated with functional programming. Other languages, such as Common Lisp and Python, are intended to allow the use of multiple paradigms. The relationship between paradigms and languages can be more complex, however; for instance, C++ adds aspects of Object-oriented programming to C, a structured programming language.