Different programming languages support varying levels and styles of metaprogramming. While some languages have built-in features or libraries that enable metaprogramming, others require external tools or frameworks. For instance, Lisp, a functional language, uses macros to achieve metaprogramming. Macros are functions that take code as input and return code as output, allowing users to define new syntax, control structures, or operators. Ruby, an object-oriented language, uses reflection to inspect and modify its own structure and behavior. This enables users to dynamically define classes, methods, variables, or constants, as well as alter the inheritance hierarchy, access control, or method dispatch of existing objects. Python, a multi-paradigm language, achieves metaprogramming through decorators - functions that wrap or modify other functions or classes - and introspection - the ability of a program to examine its own state and environment. Python code is compiled into bytecode which can be manipulated by metaprogramming tools.