Aspect-Oriented Programming (commonly abbreviated AOP) entails breaking down a program into distinct parts (cohesive areas of functionality commonly referred to as concerns, components or modules).
All programming paradigms support some level of grouping and encapsulation of concerns into separate, independent entities by providing abstractions (e.g. procedures, modules, classes, methods) that can be used for implementing, abstracting and composing these concerns. But some concerns defy these forms of implementation and are called crosscutting concerns because they "cut across" multiple abstractions in a program.
Both Logging and Testing are common examples of "crosscutting" concerns because a logging strategy typically affects every single logged part of the system, and a good Testing strategy should test each component in addition to each component's inter-operation (integration). Logging thereby crosscuts all logged classes and methods, while Testing crosscuts all tested classes and methods.
Aspect-oriented Applications (also known as Aspect-oriented Programs) are those software applications/programs which are built following a rapid AOP paradigm for their development.