The principle that any operation that achieves a well-defined effect can be treated by its users as a single entity, despite the fact that the operation may actually be achieved by some sequence of lower-level operations (see also abstraction). Procedural abstraction has been extensively employed since the early days of computing, and virtually all programming languages provide support for the concept (e.g. the SUBROUTINE of Fortran, the procedure of Algol, Pascal, Ada, the function of C, C++, and Java).