COM111 Lecture
Schedule 12
Programming
paradigms, Introduction to Programming Languages
Programming
paradigms:
A programming
paradigm is a fundamental style
of computer programming, serving as a way of
building the structure and elements of computer programs. Capabilities and
styles of various programming languages are defined by their
supported programming paradigms; some programming languages are designed to follow
only one paradigm, while others support multiple paradigms.Programming paradigms that are often distinguished include imperative, declarative, functional, object-oriented, procedural, logic and symbolic programming. With different paradigms, programs can be seen and built in different ways; for example, in object-oriented programming, a program is a collection of objects interacting in explicitly defined ways, while in declarative programming the computer is told only what the problem is, not how to actually solve it.
Procedural
languages:
The next advance was the development
of procedural languages. These third-generation languages (the first described as high-level languages) use vocabulary related to the
problem being solved. For example,
- COBOL (COmmon Business Oriented Language) – uses terms like file, move and copy.
- FORTRAN (FORmula TRANslation) – using mathematical language terminology, it was developed mainly for scientific and engineering problems.
- ALGOL (ALGOrithmic Language) – focused on being an appropriate language to define algorithms, while using mathematical language terminology and targeting scientific and engineering problems just like FORTRAN.
- PL/I (Programming Language One) – a hybrid commercial/scientific general purpose language supporting pointers.
- BASIC (Beginners All purpose Symbolic Instruction Code) – it was developed to enable more people to write programs.
- C – a general-purpose programming language, initially developed by Dennis Ritchie between 1969 and 1973 at AT&T Bell Labs.
All these languages follow the
procedural paradigm. That is, they describe, step by step, exactly the
procedure that should, according to the particular programmer at least, be
followed to solve a specific problem. The efficacy and efficiency of any such solution are both therefore entirely subjective
and highly dependent on that programmer's experience, inventiveness and
ability.
Object-oriented
programming:
Following the widespread use of
procedural languages, object-oriented languages like Simula, Smalltalk, C++, C#, Eiffel and Java were created. In these languages, data and methods of manipulating the
data are kept as a single unit called an object. The only way that a user can
access the data is via the object's "methods"; as a result, the inner
workings of an object may be changed without affecting any code that uses the
object. There is still some controversy raised by Alexander Stepanov, Richard
Stallman and other programmers, concerning the
efficacy of the OOP paradigm versus the procedural
paradigm. The necessity of every object to have associative methods leads some
skeptics to associate OOP with software
bloat. Polymorphism was developed as one attempt to
resolve this dilemma.
Because object-oriented programming
is considered a paradigm, not a language, it is possible to create even an
object-oriented assembler language. High Level Assembly (HLA) is an example of this that
fully supports advanced data types and object-oriented assembly language
programming – despite its early origins. Thus, differing programming
paradigms can be thought of as more like "motivational memes" of their advocates –
rather than necessarily representing progress from one level to the next.
Precise comparisons of the efficacy of competing paradigms are frequently made
more difficult because of new and differing terminology applied to similar
entities and processes together with numerous implementation distinctions
across languages.
Further
paradigms:
Literate programming, as a form of imperative programming, structures programs as a
human-centered web, as in a hypertext essay: documentation is integral to
the program, and the program is structured following the logic of prose
exposition, rather than compiler convenience.
Independent of the imperative
branch, declarative programming paradigms were developed. In these
languages the computer is told what the problem is, not how to solve the
problem – the program is structured as a collection of properties to find
in the expected result, not as a procedure to follow. Given a database or a set
of rules, the computer tries to find a solution matching all the desired
properties. The archetypical example of a declarative language is the fourth generation
language SQL, as well as the family of functional languages and logic
programming.
Functional programming is a subset of declarative
programming. Programs written using this paradigm use functions, blocks of code intended to behave
like mathematical functions. Functional languages discourage
changes in the value of variables through assignment, making a great deal of use of recursion instead.
The logic
programming
paradigm views computation as automated reasoning over a corpus of knowledge. Facts
about the problem
domain are
expressed as logic formulae, and programs are executed by applying inference rules over them until an answer to the problem is found, or the
collection of formulae is proved inconsistent.
Symbolic programming is a paradigm that describes
programs able to manipulate formulas and program components as data. Programs
can thus effectively modify themselves, and appear to "learn", making
them suited for applications such as artificial intelligence, expert
systems, natural language processing and computer games. Languages that
support this paradigm include LISP and Prolog.
Multi-paradigm:
A multi-paradigm programming language is a programming language that supports more than one
programming paradigm. The design goal of such languages is to allow programmers
to use the most suitable programming style and associated language constructs
for a particular job, considering that no single paradigm solves all problems
in the easiest or most efficient way.
One example is C#, which includes imperative and object-oriented paradigms as well as some support
for functional programming with features like delegates (allowing functions to be treated as first-order objects), type inference, anonymous functions and Language Integrated Query. Other examples are F# and Scala, which provides similar
functionality to C# but also includes full support for functional programming (including currying, pattern
matching, algebraic data types, lazy
evaluation,
tail recursion, immutability, etc.). Perhaps the most extreme
example is Oz, which has subsets that adhere to logic (Oz descends from logic
programming), functional, object-oriented, dataflow
concurrent,
and other paradigms. Oz was designed over a ten-year period to combine in a
harmonious way concepts that are traditionally associated with different
programming paradigms. Lisp, while often taught as a functional
language, is known for its malleability and thus its ability to engulf many
paradigms.
Programming
language
A programming language is a notation for writing programs,
which are specifications of a computation or algorithm.
Some, but not all, authors restrict the term "programming language"
to those languages that can express all
possible algorithms. Traits often considered important for what constitutes a
programming language include:
Function
and target
A
computer programming language
is a language
used to write computer
programs, which involve a computer
performing some kind of computation or algorithm
and possibly control external devices such as printers,
disk drives,
robots,
and so on. For example, PostScript
programs are frequently created by another program to control a computer
printer or display. More generally, a programming language may describe
computation on some, possibly abstract, machine.
It
is generally accepted that a complete specification for a programming language
includes a description, possibly idealized, of a machine or processor for that
language. In most practical contexts, a programming language involves a
computer; consequently, programming languages are usually defined and studied
this way. Programming languages differ from natural
languages in that natural languages are only
used for interaction between people, while programming languages also allow
humans to communicate instructions to machines.
Abstractions
Programming
languages usually contain abstractions
for defining and manipulating data
structures or controlling the flow of execution.
The practical necessity that a programming language support adequate
abstractions is expressed by the abstraction principle;
this principle is sometimes formulated as recommendation to the programmer to
make proper use of such abstractions.
Expressive
power
The
theory of computation
classifies languages by the computations they are capable of expressing. All Turing complete
languages can implement the same set of algorithms.
ANSI/ISO
SQL-92 and Charity
are examples of languages that are not Turing complete, yet often called
programming languages.[11][12]
Markup
languages like XML,
HTML or troff, which define structured
data, are not usually considered programming languages. Programming
languages may, however, share the syntax with markup languages if a
computational semantics is defined. XSLT, for example, is a Turing complete XML dialect. Moreover, LaTeX, which is
mostly used for structuring documents, also contains a Turing complete subset.
The term computer language is sometimes used interchangeably with
programming language. However, the usage of both terms varies among authors,
including the exact scope of each. One usage describes programming languages as
a subset of computer languages. In this vein, languages used in computing that
have a different goal than expressing computer programs are generically
designated computer languages. For instance, markup languages are sometimes
referred to as computer languages to emphasize that they are not meant to be
used for programming.
Another usage regards
programming languages as theoretical constructs for programming abstract
machines, and computer languages as the subset thereof that runs on physical
computers, which have finite hardware resources. John
C. Reynolds emphasizes that formal specification languages are just as
much programming languages as are the languages intended for execution. He also
argues that textual and even graphical input formats that affect the behavior
of a computer are programming languages, despite the fact they are commonly not
Turing-complete, and remarks that ignorance of programming language concepts is
the reason for many flaws in input formats.
No comments:
Post a Comment