Computer software
{{redirect|Software}}
{{redirect|Scientific software|the company|Scientific Software (company)}}
[[Image:OpenOffice.org Writer.png|thumb|300px|A [[screenshot]] of the [[OpenOffice.org Writer]] software]]
'''Computer software,''' or just '''software''' is a general term used to describe a collection of [[computer program]]s, [[procedures]] and documentation that perform some tasks on a computer system.[{{cite web
| title = Wordreference.com: WordNet® 2.0
| publisher = Princeton University, Princeton, NJ
| url = http://www.wordreference.com/definition/software
| accessdate = 2007-08-19 }}]
The term includes [[application software]] such as [[word processor]]s which perform productive tasks for users, [[system software]] such as [[operating system]]s, which interface with [[hardware]] to provide the necessary services for application software, and [[middleware]] which controls and co-ordinates [[Distributed computing|distributed systems]].
"Software" is sometimes used in a broader context to mean anything which is not hardware but which is ''used'' with hardware, such as film, tapes and records.[software..(n.d.). ''Dictionary.com Unabridged (v 1.1)''. Retrieved [[2007-04-13]], from Dictionary.com website: http://dictionary.reference.com/browse/software]
==Relationship to computer hardware==
{{main|Computer hardware}}
[[Computer]] software is so called to distinguish it from [[computer hardware]], which encompasses the physical interconnections and devices required to store and execute (or run) the software. At the lowest level, software consists of a [[machine language]] specific to an individual processor. A machine language consists of groups of binary values signifying processor instructions which change the state of the computer from its preceding state. Software is an ordered sequence of instructions for changing the state of the computer hardware in a particular sequence. It is usually written in [[high-level programming language]]s that are easier and more efficient for humans to use (closer to [[natural language]]) than machine language. High-level languages are [[compiler|compiled]] or [[interpreter (computing)|interpreted]] into machine language object code. Software may also be written in an [[assembly language]], essentially, a mnemonic representation of a machine language using a natural language alphabet. Assembly language must be assembled into object code via an [[assembly language#Assembler|assembler]].
The term "software" was first used in this sense by [[John W. Tukey]] in [[1958]].[John Tukey, 85, Statistician; Coined the Word 'Software', ''[[New York Times]]'', Obituaries, [[2000-07-28]].] In [[computer science]] and [[software engineering]], '''computer software''' is all computer programs. The theory that is the basis for most modern software was first proposed by [[Alan Turing]] in his [[1935]] essay ''Computable numbers with an application to the Entscheidungsproblem''.[Hally, Mike (2005:79). ''Electronic brains/Stories from the dawn of the computer age''. British Broadcasting Corporation and Granta Books, London. ISBN 1-86207-663-4.]
==Types==
Practical [[computer system]]s divide [[software system]]s into three major classes: [[system software]], [[programming software]] and [[application software]], although the distinction is arbitrary, and often blurred.
*'''[[System software]]''' helps run the [[computer hardware]] and [[computer system]]. It includes [[operating system]]s, [[device driver]]s, diagnostic tools, [[Server (computing)|server]]s, [[windowing system]]s, [[software utility|utilities]] and more. The purpose of systems software is to insulate the applications programmer as much as possible from the details of the particular computer complex being used, especially memory and other hardware features, and such as accessory devices as communications, printers, readers, displays, keyboards, etc.
*'''[[Programming software]]''' usually provides tools to assist a [[programmer]] in writing [[computer program]]s, and software using different [[programming language]]s in a more convenient way. The tools include [[text editors]], [[compilers]], [[interpreter (computing)|interpreters]], [[linkers]], [[debuggers]], and so on. An [[Integrated development environment]] (IDE) merges those tools into a software bundle, and a programmer may not need to type multiple [[command]]s for compiling, interpreting, debugging, tracing, and etc., because the IDE usually has an advanced ''[[graphical user interface]],'' or GUI.
*'''[[Application software]]''' allows end users to accomplish one or more specific (non-computer related) [[task]]s. Typical applications include [[Industry|industrial]] [[automation]], [[business software]], [[educational software]], [[medical software]], [[database]]s, and [[computer games]]. Businesses are probably the biggest users of application software, but almost every field of human activity now uses some form of application software
==Program and library==
A [[Computer program|program]] may not be sufficiently complete for execution by a [[computer]]. In particular, it may require additional software from a [[software library]] in order to be complete. Such a library may include software components used by [[stand-alone]] programs, but which cannot work on their own. Thus, programs may include standard routines that are common to many programs, extracted from these libraries. Libraries may also ''include'' 'stand-alone' programs which are activated by some [[event-driven programming|computer event]] and/or perform some function (e.g., of computer 'housekeeping') but do not return data to their calling program. Libraries may be [[Execution (computers)|called]] by one to many other programs; programs may call zero to many other programs.
==Three layers==
[[Image:Packagedsoftwareatretail.jpg|thumb|right|Starting in the 1980s, application software has been sold in mass-produced packages through retailers.]]
{{see also|Software architecture}}
Users often see things differently than programmers. People who use modern general purpose computers (as opposed to [[embedded system]]s, [[analog computer]]s, [[supercomputer]]s, etc.) usually see three layers of software performing a variety of tasks: platform, application, and user software.
;Platform software: [[Platform (computing)|Platform]] includes the [[firmware]], [[device driver]]s, an [[operating system]], and typically a [[graphical user interface]] which, in total, allow a user to interact with the computer and its [[peripheral]]s (associated equipment). Platform software often comes bundled with the computer. On a [[Personal computer|PC]] you will usually have the ability to change the platform software.
;Application software: [[Application software]] or Applications are 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 almost always 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 include spreadsheet templates, word processor macros, scientific simulations, and scripts for graphics and animations. 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 purchased application packages, many users may not be aware of the distinction between the purchased packages, and what has been added by fellow co-workers.
==Creation==
{{main|Computer programming}}
==Operation==
Computer software has to be "loaded" into the [[computer storage|computer's storage]] (such as a ''[[hard drive]]'', ''memory'', or ''[[RAM]]''). Once the software has loaded, the computer is able to ''execute'' the software. This involves passing [[instruction (computer science)|instructions]] from the application software, through the system software, to the [[hardware]] which ultimately receives the instruction as [[machine language|machine code]]. Each instruction causes the computer to carry out an operation -- moving [[data (computing)|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. So, 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.
Instructions may be performed sequentially, conditionally, or iteratively. Sequential instructions are those operations that are performed one after another. Conditional instructions are performed such that different sets of instructions execute depending on the value(s) of some data. In some languages this is known as an "if" statement. Iterative instructions are performed repetitively and may depend on some data value. This is sometimes called a "loop." Often, one instruction may "call" another set of instructions that are defined in some other program or [[module (programming)|module]]. When more than one computer processor is used, instructions may be executed simultaneously.
A simple example of the way software operates is what happens when a user selects an entry such as "Copy" from a menu. In this case, a conditional instruction is executed to copy text from data in a 'document' area residing in memory, perhaps to an intermediate storage area known as a 'clipboard' data area. If a different menu entry such as "Paste" is chosen, the software may execute the instructions to copy the text from the clipboard data area to a specific location in the same or another document in memory.
Depending on the application, even the example above could become complicated. The field of [[software engineering]] endeavors to manage the complexity of how software operates. This is especially true for software that operates in the context of a large or powerful [[computer system]].
Currently, almost the only limitations on the use of computer software in applications is the ingenuity of the designer/programmer. Consequently, large areas of activities (such as playing grand master level chess) formerly assumed to be incapable of software simulation are now routinely programmed. The only area that has so far proved reasonably secure from software simulation is the realm of human art— especially, pleasing music and literature.{{Fact|date=June 2007}}
Kinds of software by operation: [[computer program]] as [[executable]], [[source code]] or [[script (computer programming)|script]], [[computer configuration|configuration]].
==Quality and reliability==
[[Software reliability]] considers the errors, faults, and failures related to the design, implementation and operation of software.
'''See''' [[Computer security audit|Software auditing]], [[Software quality]], [[Software testing]], and [[Software reliability]].
==License==
[[Software license]] gives the user the right to use the software in the licensed environment, some software comes with the license when purchased off the shelf, or an OEM license when bundled with hardware. Other software comes with a [[free software licence]], granting the recipient the rights to modify and redistribute the software. Software can also be in the form of [[freeware]] or [[shareware]]. See also [[License Management]].
==Patents==
The issue of [[software patent]]s is controversial. Some believe that they hinder [[software development]], while others argue that software patents provide an important incentive to spur software innovation. See [[software patent debate]].
==Ethics and rights for software users==
Being a new part of society, the idea of what rights users of software should have is not very developed. Some, such as the [[free software community]], believe that software users should be free to modify and redistribute the software they use. They argue that these rights are necessary so that each individual can control their computer, and so that everyone can cooperate, if they choose, to work together as a community and control the direction that software progresses in. Others believe that software authors should have the power to say what rights the user will get.
==Software companies and non-profit organizations==
Examples of non-profit software organizations : [[Free Software Foundation]], [[GNU Project]], [[Mozilla Foundation]]
Examples of large software companies are: [[Microsoft]], [[IBM]], [[Oracle_Corporation|Oracle]], [[SAP AG|SAP]] and [[HP]].[{{cite web
| title = Software Top 100: the world's largest software companies
| publisher = the Top 100 research foundation
| url = http://www.softwaretop100.org
| accessdate = 2008-04-28 }}]
==See also==
{{portal|Software}}
* [[system software]]
* [[application software]]
* [[computer program]]
* [[Computing]]
* [[Software as a Service]]
* [[List of computer term etymologies|Origins of computer terms]]
* [[Software industry]]
* [[Custom Software]]
* [[Computer programming]]
* [[List of basic computer programming topics]]
* [[List of computer programming topics]]
* [[Programming language]]
* [[Software development process]]
* [[Software engineering]]
* [[Software license]]
* [[Proprietary software]]
* [[Free software]]
* [[Open source software]]
* [[Copyright infringement of software]]
* [[Freeware]]
* [[Shareware]]
* [[History of free software]]
* [[World's largest software companies]]
==References==
==Economic Aspects==
*Cockburn, Iain M. & MacGarvie, Megan (2007): [http://ideas.repec.org/p/nbr/nberwo/13644.html, "Patents, Thickets, and the Financing of Early-Stage Firms: Evidence from the Software Industry," NBER Working Papers 13644.]
*v. Engelhardt, Sebastian (2008): [http://ideas.repec.org/p/jrp/jrpwrp/2008-045.html, "The Economic Properties of Software", Jena Economic Research Papers, Volume 2 (2008), Number 2008-045.] (in Adobe [[Portable Document Format|pdf]] format)
* Richardson, George B. (1997): [http://ideas.repec.org/p/aal/abbswp/97-4.html, "Economic Analysis, Public Policy and the Software Industry," DRUID Working Papers 97-4.] (in Adobe [[Portable Document Format|pdf]] format)
==External links==
{{Wikiquote|software}}
* [http://open-dictionary.com/Software Open Dictionary]
* [http://coolsw.intel.com/ Cool Software]
[[Category:Software| ]]
[[Category:Software systems]]
[[Category:Reconfigurable computing]]
[[af:Sagteware]]
[[ar:برمجيات]]
[[ast:Programa d'ordenador]]
[[zh-min-nan:Nńg-thé]]
[[bs:Softver]]
[[br:Meziant]]
[[bg:Програмно осигуряване]]
[[ca:Programari]]
[[cs:Software]]
[[da:Computerprogram]]
[[de:Software]]
[[et:Tarkvara]]
[[es:Software]]
[[eo:Programaro]]
[[eu:Software]]
[[fa:نرمافزار]]
[[fr:Logiciel]]
[[gl:Programa informático]]
[[gu:સૉફ્ટવેર]]
[[zh-classical:軟體]]
[[ko:컴퓨터 소프트웨어]]
[[hi:सॉफ्टवेयर]]
[[hr:Programska podrška]]
[[id:Perangkat lunak]]
[[ia:Software]]
[[iu:ᐊᕿᑦᑐᖅ ᖃᕆᑕᐅᔭᐅᑉ ᑎᑎᕋᕐᕕᖓ/aqittuq qaritaujaup titirarvinga]]
[[is:Hugbúnaður]]
[[it:Software]]
[[he:תוכנה]]
[[ku:Nermalav]]
[[la:Res informatica]]
[[lv:Programmatūra]]
[[lb:Software]]
[[lt:Programinė įranga]]
[[hu:Szoftver]]
[[ml:സോഫ്റ്റ്വെയര്]]
[[ms:Perisian komputer]]
[[nl:Software]]
[[new:सफ्टवेर]]
[[ja:ソフトウェア]]
[[no:Dataprogram]]
[[nn:Programvare]]
[[nds:Software]]
[[pl:Oprogramowanie]]
[[pt:Software]]
[[ro:Software]]
[[ru:Программное обеспечение]]
[[sq:Software]]
[[scn:Software]]
[[simple:Software]]
[[sk:Softvér]]
[[sl:Programska oprema]]
[[fi:Tietokoneohjelma]]
[[sv:Programvara]]
[[tl:Software]]
[[tt:Sanaq programı]]
[[th:ซอฟต์แวร์]]
[[vi:Phần mềm]]
[[tr:Yazılım]]
[[uk:Програмне забезпечення]]
[[vec:Software]]
[[yi:ווייכווארג]]
[[zh:软件]]