literate programming functional programming declarative programming reactive programming logic programming imperative programming call by sharing prototype-oriented programming comprehension metaprogramming