Software - Wikipedia
Software - Wikipedia
Software - Wikipedia
Software is a collection of programs and data that tell a computer how to perform specific
tasks. Software often includes associated software documentation.[1] This is in contrast to
hardware, from which the system is built and which actually performs the work.
At the lowest programming level, executable code consists of machine language instructions
supported by an individual processor—typically a central processing unit (CPU) or a graphics
processing unit (GPU). Machine language consists of groups of binary values signifying
processor instructions that change the state of the computer from its preceding state. For
example, an instruction may change the value stored in a particular storage location in the
computer—an effect that is not directly observable to the user. An instruction may also invoke
one of many input or output operations, for example, displaying some text on a computer screen,
causing state changes that should be visible to the user. The processor executes the
instructions in the order they are provided, unless it is instructed to "jump" to a different
instruction or is interrupted by the operating system. As of 2024, most personal computers,
smartphone devices, and servers have processors with multiple execution units, or multiple
processors performing computation together, so computing has become a much more
concurrent activity than in the past.
The majority of software is written in high-level programming languages. They are easier and
more efficient for programmers because they are closer to natural languages than machine
languages.[2] High-level languages are translated into machine language using a compiler, an
interpreter, or a combination of the two. Software may also be written in a low-level assembly
language that has a strong correspondence to the computer's machine language instructions
and is translated into machine language using an assembler.
History
An algorithm for what would have been the first piece of software was written by Ada Lovelace
in the 19th century, for the planned Analytical Engine.[3] She created proofs to show how the
engine would calculate Bernoulli numbers.[3] Because of the proofs and the algorithm, she is
considered the first computer programmer.[4][5]
The first theory about software, prior to the creation of computers as we know them today, was
proposed by Alan Turing in his 1936 essay, On Computable Numbers, with an Application to the
Entscheidungsproblem (decision problem).[6] This eventually led to the creation of the academic
fields of computer science and software engineering; both fields study software and its
creation.[7] Computer science is the theoretical study of computer and software (Turing's essay
is an example of computer science), whereas software engineering is the application of
engineering principles to development of software.[8]
In 2000, Fred Shapiro, a librarian at the Yale Law School, published a letter revealing that John
Wilder Tukey's 1958 paper "The Teaching of Concrete Mathematics"[9][10] contained the earliest
known usage of the term "software" found in a search of JSTOR's electronic archives, predating
the Oxford English Dictionary's citation by two years.[11] This led many to credit Tukey with
coining the term, particularly in obituaries published that same year,[12] although Tukey never
claimed credit for any such coinage. In 1995, Paul Niquette claimed he had originally coined the
term in October 1953, although he could not find any documents supporting his claim.[13] The
earliest known publication of the term "software" in an engineering context was in August 1953
by Richard R. Carhart, in a Rand Corporation Research Memorandum.[14]
Types
On virtually all computer platforms, software can be grouped into a few broad categories.
Programming tools
Programming tools are also software in the form of programs or applications that developers
use to create, debug, maintain, or otherwise support software.[25]
Software is written in one or more programming languages; there are many programming
languages in existence, and each has at least one implementation, each of which consists of its
own set of programming tools. These tools may be relatively self-contained programs such as
compilers, debuggers, interpreters, linkers, and text editors, that can be combined to accomplish
a task; or they may form an integrated development environment (IDE), which combines much or
all of the functionality of such self-contained tools. IDEs may do this by either invoking the
relevant individual tools or by re-implementing their functionality in a new way. An IDE can make
it easier to do specific tasks, such as searching in files in a particular project. Many
programming language implementations provide the option of using both individual tools or an
IDE.
Topics
Architecture
People who use modern general purpose computers (as opposed to embedded systems, analog
computers and supercomputers) usually see three layers of software performing a variety of
tasks: platform, application, and user software.
Platform software: The platform
includes the firmware, device drivers, an
operating system, and typically a
graphical user interface which, in total,
allow a user to interact with the
computer and its peripherals
(associated equipment). Platform
software often comes bundled with the
computer. On a PC one will usually have
the ability to change the platform
software.
Application software: Application
software is what most people think of
when they think of software. Typical
examples include office suites and video
games. Application software is often
purchased separately from computer
hardware. Sometimes applications are
bundled with the computer, but that
does not change the fact that they run
as independent applications.
Applications are usually independent
programs from the operating system,
though they are often tailored for
specific platforms. Most users think of
compilers, databases, and other "system
software" as applications.
User-written software: End-user
development tailors systems to meet
users' specific needs. User software
includes spreadsheet templates and
word processor templates. Even email
filters are a kind of user software. Users
create this software themselves and
often overlook how important it is.
Depending on how competently the
user-written software has been
integrated into default application
packages, many users may not be aware
of the distinction between the original
packages, and what has been added by
co-workers.
Execution
Computer software has to be "loaded" into the computer's storage (such as the hard drive or
memory). Once the software has loaded, the computer is able to execute the software. This
involves passing instructions from the application software, through the system software, to the
hardware which ultimately receives the instruction as machine code. Each instruction causes
the computer to carry out an operation—moving data, carrying out a computation, or altering the
control flow of instructions.
Data movement is typically from one place in memory to another. Sometimes it involves moving
data between memory and registers which enable high-speed data access in the CPU. Moving
data, especially large amounts of it, can be costly; this is sometimes avoided by using "pointers"
to data instead. Computations include simple operations such as incrementing the value of a
variable data element. More complex computations may involve many operations and data
elements together.
Many bugs are discovered and fixed through software testing. However, software testing rarely—
if ever—eliminates every bug; some programmers say that "every program has at least one more
bug" (Lubarsky's Law).[26] In the waterfall method of software development, separate testing
teams are typically employed, but in newer approaches, collectively termed agile software
development, developers often do all their own testing, and demonstrate the software to
users/clients regularly to obtain feedback. Software can be tested through unit testing,
regression testing and other methods, which are done manually, or most commonly,
automatically, since the amount of code to be tested can be large. Programs containing
command software enable hardware engineering and system operations to function much
easier together.[27]
License
The software's license gives the user the right to use the software in the licensed environment,
and in the case of free software licenses, also grants other rights such as the right to make
copies.[28]
Patents
Software patents, like other types of patents, are theoretically supposed to give an inventor an
exclusive, time-limited license for a detailed idea (e.g. an algorithm) on how to implement a
piece of software, or a component of a piece of software. Ideas for useful things that software
could do, and user requirements, are not supposed to be patentable, and concrete
implementations (i.e. the actual software packages implementing the patent) are not supposed
to be patentable either—the latter are already covered by copyright, generally automatically. So
software patents are supposed to cover the middle area, between requirements and concrete
implementation. In some countries, a requirement for the claimed invention to have an effect on
the physical world may also be part of the requirements for a software patent to be held valid—
although since all useful software has effects on the physical world, this requirement may be
open to debate. Meanwhile, American copyright law was applied to various aspects of the
writing of the software code.[32]
Software patents are controversial in the software industry with many people holding different
views about them. One of the sources of controversy is that the aforementioned split between
initial ideas and patent does not seem to be honored in practice by patent lawyers—for example
the patent for aspect-oriented programming (AOP), which purported to claim rights over any
programming tool implementing the idea of AOP, howsoever implemented. Another source of
controversy is the effect on innovation, with many distinguished experts and companies arguing
that software is such a fast-moving field that software patents merely create vast additional
litigation costs and risks, and actually retard innovation. In the case of debates about software
patents outside the United States, the argument has been made that large American
corporations and patent lawyers are likely to be the primary beneficiaries of allowing or continue
to allow software patents.
Software is usually developed in integrated development environments (IDE) like Eclipse, IntelliJ
and Microsoft Visual Studio that can simplify the process and compile the software.[33] As noted
in a different section, software is usually created on top of existing software and the application
programming interface (API) that the underlying software provides like GTK+, JavaBeans or
Swing. Libraries (APIs) can be categorized by their purpose. For instance, the Spring Framework
is used for implementing enterprise applications, the Windows Forms library is used for
designing graphical user interface (GUI) applications like Microsoft Word, and Windows
Communication Foundation is used for designing web services. When a program is designed, it
relies upon the API. For instance, a Microsoft Windows desktop application might call API
functions in the .NET Windows Forms library like Form1.Close() and Form1.Show()[34] to close or
open the application. Without these APIs, the programmer needs to write these functionalities
entirely themselves. Companies like Oracle and Microsoft provide their own APIs so that many
applications are written using their software libraries that usually have numerous APIs in them.
Data structures such as hash tables, arrays, and binary trees, and algorithms such as quicksort,
can be useful for creating software.
Computer software has special economic characteristics that make its design, creation, and
distribution different from most other economic goods.[35][36]
A person who creates software is called a programmer, software engineer or software developer,
terms that all have a similar meaning. More informal terms for programmer also exist such as
"coder" and "hacker" – although use of the latter word may cause confusion, because it is more
often used to mean someone who illegally breaks into computer systems.
See also
Computer program
Independent software vendor
Open-source software
Outline of software
Software asset management
Software release life cycle
References
External links
Software (https://www.britannica.com/t
echnology/software) at Encyclopædia
Britannica
Software (https://curlie.org/Computers/
Software) at Curlie