Aspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing separation of cross-cutting concerns. It does this through aspects, which can encapsulate code that implements a cross-cutting concern and attach it to other code, known as join points. There are two main AOP styles - interception, which modifies code execution at runtime through decorators, and IL weaving, which modifies the code during compilation. Both allow clean separation of concerns while maintaining full debuggability.