Computer programming: Difference between revisions

Content deleted Content added
Blanked the page
Tag: Blanking
m Reverted 2 edits by 2605:A000:C2C7:F900:18E6:289C:2200:3559 (talk) to last revision by Ohnoitsjamie. (TW)
Line 1:
{{software development process}}
'''Computer programming''' is a process that leads from an original formulation of a [[computing]] problem to [[executable]] [[computer program]]s. Programming involves activities such as analysis, developing understanding, generating [[algorithm]]s, verification of requirements of algorithms including their correctness and resources consumption, and implementation (commonly referred to as '''coding'''<ref>{{cite web| author=Shaun Bebbington| year=2014| url=http://yearofcodes.tumblr.com/what-is-coding| title=What is coding| accessdate=2014-03-03}}</ref><ref>{{cite web| author=Shaun Bebbington| year=2014| url=http://yearofcodes.tumblr.com/what-is-programming| title=What is programming| accessdate=2014-03-03}}</ref>) of algorithms in a target [[programming language]]. [[Source code]] is written in one or more programming languages. The purpose of programming is to find a sequence of instructions that will automate performing a specific task or solving a given problem. The process of programming thus often requires expertise in many different subjects, including knowledge of the [[application ___domain]], specialized algorithms, and formal [[logic]].
 
Related tasks include [[Software testing|testing]], [[debugging]], and maintaining the [[source code]], implementation of the build system, and management of derived artifacts such as [[machine code]] of computer programs. These might be considered part of the programming process, but often the term ''[[software development]]'' is used for this larger process with the term ''programming'', ''implementation'', or ''coding'' reserved for the actual writing of source code. [[Software engineering]] combines [[engineering]] techniques with software development practices.
 
==History==
{{See also|History of programming languages}}
[[File:Ada lovelace.jpg|thumb|[[Ada Lovelace]], whose notes added to the end of [[Luigi Menabrea]]'s paper included the first [[algorithm]] designed for processing by an [[Analytical Engine]]. She is often recognized as history's first computer programmer.]]
 
Programmable devices have existed at least as far back as 1206 AD, when the [[automata]] of [[Al-Jazari]] were programmable, via pegs and [[cam]]s, to play various rhythms and drum patterns;<ref>{{Cite journal|title=The Museum of Music: A History of Mechanical Instruments|first=Charles B.|last=Fowler|journal=Music Educators Journal|volume=54|issue=2|date=October 1967|pages=45–49|doi=10.2307/3391092|jstor=3391092|publisher=Music Educators Journal, Vol. 54, No. 2|postscript=<!--None-->}}</ref> and the 1801 [[Jacquard loom]] could produce entirely different weaves by changing the "program" - a series of [[Card stock|pasteboard]] cards with holes punched in them.
 
However, the first computer program is generally dated to 1843, when mathematician [[Ada Lovelace]] published an [[algorithm]] to calculate a sequence of [[Bernoulli numbers]], intended to be carried out by [[Charles Babbage]]'s [[Analytical Engine]].<ref name="IEEE">{{Cite journal | last1 = Fuegi | first1 = J. | last2 = Francis | first2 = J. | title = Lovelace & Babbage and the Creation of the 1843 'notes' | journal = IEEE Annals of the History of Computing | volume = 25 | issue = 4 | pages = 16 | year = 2003 | doi = 10.1109/MAHC.2003.1253887}}</ref>
 
[[File:PunchCardDecks.agr.jpg|thumb|Data and instructions were once stored on external [[punched card]]s, which were kept in order and arranged in program decks.]]
In the 1880s [[Herman Hollerith]] invented the concept of storing ''data'' in machine-readable form.<ref>{{cite web|url=http://www.columbia.edu/acis/history/hollerith.html |title=Columbia University Computing History - Herman Hollerith |publisher=Columbia.edu |accessdate=2010-04-25}}</ref> Later a [[plugboard|control panel]] (plugboard)<!-- see text in plugboard article, "control panel" is the application specific term for plugboards used in unit record applications --> added to his 1906 Type I Tabulator allowed it to be programmed for different jobs, and by the late 1940s, [[unit record equipment]] such as the [[IBM 602]] and [[IBM 604]], were programmed by control panels in a similar way; as were the first [[electronic computer]]s. However, with the concept of the [[stored-program computer]]s introduced in 1949, both programs and data were stored and manipulated in the same way in [[computer memory]].
 
[[Machine code]] was the language of early programs, written in the [[instruction set]] of the particular machine, often in [[binary numeral system|binary]] notation. [[Assembly language]]s were soon developed that let the programmer specify instruction in a text format, (e.g., ADD X, TOTAL), with abbreviations for each operation code and meaningful names for specifying addresses. However, because an assembly language is little more than a different notation for a machine language, any two machines with [[Comparison of instruction set architectures|different instruction sets]] also have different assembly languages.
 
[[File:IBM402plugboard.Shrigley.wireside.jpg|thumb|Wired control panel for an [[IBM 402 Accounting Machine]].]]
[[High-level language]]s allow the programmer to write programs in terms that are more [[abstraction (computer science)|abstract]], and less bound to the underlying hardware. They harness the power of computers to make programming easier<ref>{{cite web|url=http://www.msnbc.msn.com/id/17704662/|title=Fortran creator John Backus dies|work=msnbc.com|accessdate=19 November 2014}}</ref> by allowing programmers to specify calculations by entering a formula directly (e.g., {{nowrap|Y &#0061; X*2 + 5*X + 9}}). [[FORTRAN]], the first widely used high-level language to have a functional implementation, came out in 1957<ref>{{cite web|author=|url=http://www.msnbc.msn.com/id/17704662/ |title=Fortran creator John Backus dies - Tech and gadgets- msnbc.com |publisher=MSNBC |date=2007-03-20 |accessdate=2010-04-25}}</ref> and many other languages were soon developed - in particular, [[COBOL]] aimed at commercial data processing, and [[Lisp (programming language)|Lisp]] for computer research.
 
Programs were mostly still entered using punched cards or [[paper tape]]. See [[computer programming in the punch card era]]. By the late 1960s, [[data storage device]]s and [[computer terminal]]s became inexpensive enough that programs could be created by typing directly into the computers. [[Text editor]]s were developed that allowed changes and corrections to be made much more easily than with punched cards.
 
==Modern programming==
{{refimprove section|date=August 2010}}
 
===Quality requirements===
Whatever the approach to development may be, the final program must satisfy some fundamental properties. The following properties are among the most important:
*[[Reliability engineering#Software reliability|Reliability]]: how often the results of a program are correct. This depends on conceptual correctness of algorithms, and minimization of programming mistakes, such as mistakes in resource management (e.g., [[buffer overflow]]s and [[race condition]]s) and logic errors (such as division by zero or [[off-by-one error]]s).
*[[Robustness (computer science)|Robustness]]: how well a program anticipates problems due to errors (not bugs). This includes situations such as incorrect, inappropriate or corrupt data, unavailability of needed resources such as memory, operating system services and network connections, user error, and unexpected power outages.
*[[Usability]]: the [[ergonomics]] of a program: the ease with which a person can use the program for its intended purpose or in some cases even unanticipated purposes. Such issues can make or break its success even regardless of other issues. This involves a wide range of textual, graphical and sometimes hardware elements that improve the clarity, intuitiveness, cohesiveness and completeness of a program's user interface.
*[[Software portability|Portability]]: the range of [[computer hardware]] and [[operating system]] platforms on which the source code of a program can be [[compiled]]/[[interpreter (computing)|interpreted]] and run. This depends on differences in the programming facilities provided by the different platforms, including hardware and operating system resources, expected behavior of the hardware and operating system, and availability of platform specific compilers (and sometimes libraries) for the language of the source code.
*[[Maintainability]]: the ease with which a program can be modified by its present or future developers in order to make improvements or customizations, fix [[Software bug|bugs]] and [[Vulnerability (computing)|security holes]], or adapt it to new environments. Good practices<ref>{{Cite web|url=http://wisdomgeek.com/programming/tips-become-good-programmer/|title=Programming 101: Tips to become a good programmer - Wisdom Geek|date=2016-05-19|website=Wisdom Geek|language=en-US|access-date=2016-05-23}}</ref> during initial development make the difference in this regard. This quality may not be directly apparent to the end user but it can significantly affect the fate of a program over the long term.
*[[Algorithmic efficiency|Efficiency]]/[[performance engineering|performance]]: Measure of system resources a program consumes (processor time, memory space, slow devices such as disks, network bandwidth and to some extent even user interaction): the less, the better. This also includes careful management of resources, for example cleaning up [[temporary file]]s and eliminating [[memory leak]]s.
 
===Readability of source code===
In computer programming, [[readability]] refers to the ease with which a human reader can comprehend the purpose, [[control flow]], and operation of source code. It affects the aspects of quality above, including portability, usability and most importantly maintainability.
 
Readability is important because programmers spend the majority of their time reading, trying to understand and modifying existing source code, rather than writing new source code. Unreadable code often leads to bugs, inefficiencies, and [[Code duplication|duplicated code]]. A study<ref>James L. Elshoff, Michael Marcotty, [http://doi.acm.org/10.1145/358589.358596 Improving computer program readability to aid modification], Communications of the ACM, v.25 n.8, p.512-521, Aug 1982.</ref> found that a few simple readability transformations made code shorter and drastically reduced the time to understand it.
 
Following a consistent [[programming style]] often helps readability. However, readability is more than just programming style. Many factors, having little or nothing to do with the ability of the computer to efficiently compile and execute the code, contribute to readability.<ref>{{cite web | url=http://docforge.com/wiki/Readability | title=Readability | author=Multiple (wiki) | work=Docforge | accessdate=2010-01-30 }}</ref> Some of these factors include:
*Different [[indent style]]s (whitespace)
*[[Comment (computer programming)|Comments]]
*[[decomposition (computer science)|Decomposition]]
*[[Naming conventions (programming)|Naming conventions]] for objects (such as variables, classes, procedures, etc.)
 
The [[separation of presentation and content|presentation]] aspects of this (such as indents, line breaks, color highlighting, and so on) are often handled by the [[source code editor]], but the content aspects reflect the programmer's talent and skills.
 
Various [[visual programming language]]s have also been developed with the intent to resolve readability concerns by adopting non-traditional approaches to code structure and display. [[Integrated development environment]]s (IDEs) aim to integrate all such help. Techniques like [[Code refactoring]] can enhance readability.
 
===Algorithmic complexity===
The academic field and the engineering practice of computer programming are both largely concerned with discovering and implementing the most efficient algorithms for a given class of problem. For this purpose, algorithms are classified into ''orders'' using so-called [[Big O notation]], which expresses resource use, such as execution time or memory consumption, in terms of the size of an input. Expert programmers are familiar with a variety of well-established algorithms and their respective complexities and use this knowledge to choose algorithms that are best suited to the circumstances.
 
===Methodologies===
The first step in most formal software development processes is requirements analysis, followed by testing to determine value modeling, implementation, and failure elimination (debugging). There exist a lot of differing approaches for each of those tasks. One approach popular for [[requirements analysis]] is [[Use Case]] analysis. Many programmers use forms of [[Agile software development]] where the various stages of formal software development are more integrated together into short cycles that take a few weeks rather than years. There are many approaches to the Software development process.
 
Popular modeling techniques include Object-Oriented Analysis and Design ([[OOAD]]) and Model-Driven Architecture ([[Model-Driven Architecture|MDA]]). The Unified Modeling Language ([[Unified Modeling Language|UML]]) is a notation used for both the OOAD and MDA.
 
A similar technique used for database design is Entity-Relationship Modeling ([[Entity-Relationship Model|ER Modeling]]).
 
Implementation techniques include imperative languages ([[Object-oriented programming|object-oriented]] or [[procedural programming|procedural]]), [[functional programming|functional languages]], and [[logic programming|logic languages]].
 
===Measuring language usage===
{{Main|Measuring programming language popularity}}
It is very difficult to determine what are the most popular of modern programming languages. Methods of measuring programming language popularity include: counting the number of job advertisements that mention the language,<ref>[http://www.computerweekly.com/Articles/2007/09/11/226631/sslcomputer-weekly-it-salary-survey-finance-boom-drives-it-job.htm Survey of Job advertisements mentioning a given language]</ref> the number of books sold and courses teaching the language (this overestimates the importance of newer languages), and estimates of the number of existing lines of code written in the language (this underestimates the number of users of business languages such as COBOL).
 
Some languages are very popular for particular kinds of applications, while some languages are regularly used to write many different kinds of applications. For example, [[COBOL]] is still strong in corporate data centers<ref>{{cite web|last1=Mitchell|first1=Robert|title=The Cobol Brain Drain|url=http://www.computerworld.com/article/2504568/data-center/the-cobol-brain-drain.html|publisher=Computer World|accessdate=9 May 2015}}</ref> often on large [[mainframe computer]]s, [[Fortran]] in engineering applications, [[scripting language]]s in [[World Wide Web|Web]] development, and [[C (programming language)|C]] in [[embedded software]]. Many applications use a mix of several languages in their construction and use. New languages are generally designed around the syntax of a prior language with new functionality added, (for example [[C++]] adds object-orientation to C, and Java adds memory management and [[bytecode]] to C++, but as a result, loses efficiency and the ability for low-level manipulation).
 
===Debugging===
[[File:H96566k.jpg|thumb|The [[Software bug|bug]] from 1947 which is at the origin of a popular (but incorrect) etymology for the common term for a software defect.]]
{{main|Debugging}}
Debugging is a very important task in the software development process since having defects in a program can have significant consequences for its users. Some languages are more prone to some kinds of faults because their specification does not require compilers to perform as much checking as other languages. Use of a [[static code analysis]] tool can help detect some possible problems. Normally the first step in debugging is to attempt to reproduce the problem. This can be a non-trivial task, for example as with parallel processes or some unusual software bugs. Also, specific user environment and usage history can make it difficult to reproduce the problem.
 
After the bug is reproduced, the input of the program may need to be simplified to make it easier to debug. For example, a bug in a compiler can make it crash when parsing some large source file. However, after simplification of the test case, only few lines from the original source file can be sufficient to reproduce the same crash. Such simplification can be done manually, using a divide-and-conquer approach. The programmer will try to remove some parts of original test case and check if the problem still exists. When debugging the problem in a GUI, the programmer can try to skip some user interaction from the original problem description and check if remaining actions are sufficient for bugs to appear.
 
Debugging is often done with [[Integrated development environment|IDE]]s like [[Eclipse (software)|Eclipse]], [[Visual Studio]], [[Xcode]], [[Kdevelop]], [[NetBeans]] and [[Code::Blocks]]. Standalone debuggers like [[GDB]] are also used, and these often provide less of a visual environment, usually using a [[command line]]. Some text editors such as [[Emacs]] allow GDB to be invoked through them, to provide a visual environment.
 
==Programming languages==
{{Main|Programming language|List of programming languages}}
 
Different programming languages support different styles of programming (called ''[[programming paradigm]]s''). The choice of language used is subject to many considerations, such as company policy, suitability to task, availability of third-party packages, or individual preference. Ideally, the programming language best suited for the task at hand will be selected. Trade-offs from this ideal involve finding enough programmers who know the language to build a team, the availability of compilers for that language, and the efficiency with which programs written in a given language execute. Languages form an approximate spectrum from "low-level" to "high-level"; "low-level" languages are typically more machine-oriented and faster to execute, whereas "high-level" languages are more abstract and easier to use but execute less quickly. It is usually easier to code in "high-level" languages than in "low-level" ones.
 
[[Allen Downey]], in his book ''How To Think Like A Computer Scientist'', writes:
 
:The details look different in different languages, but a few basic instructions appear in just about every language:
:*Input: Gather data from the keyboard, a file, or some other device.
:*Output: Display data on the screen or send data to a file or other device.
:*Arithmetic: Perform basic arithmetical operations like addition and multiplication.
:*Conditional Execution: Check for certain conditions and execute the appropriate sequence of statements.
:*Repetition: Perform some action repeatedly, usually with some variation.
 
Many computer languages provide a mechanism to call functions provided by [[shared library|shared libraries]]. Provided the functions in a library follow the appropriate run-time conventions (e.g., method of passing [[argument (computer science)|arguments]]), then these functions may be written in any other language.
 
==Programmers==
{{Main|Programmer}}
{{See also|Software developer|Software engineer}}
 
Computer programmers are those who write computer software. Their jobs usually involve:
{{div col|colwidth=30em}}
*Coding
*Debugging
*[[Documentation]]
*[[System integration|Integration]]
*[[Software maintenance|Maintenance]]
*Requirements analysis
*[[Software architecture]]
*Software testing
*[[Specification]]
{{div col end}}
 
==See also==
{{Portal|Computer Science|Computing|Computer networking|Computer programming}}
 
{{Main|Outline of computer programming}}
 
*[[ACCU (organisation)|ACCU]]
*[[Association for Computing Machinery]]
*[[Computer network]]ing
*[[Hello world program]]
*[[Institution of Analysts and Programmers]]
* [[National Coding Week]]
*[[System programming]]
*''[[The Art of Computer Programming]]''
 
==References==
{{reflist|30em}}
 
==Further reading==
* A.K. Hartmann, ''[http://www.worldscibooks.com/physics/6988.html Practical Guide to Computer Simulations]'', Singapore: [[World Scientific]] (2009)
* A. Hunt, D. Thomas, and W. Cunningham, ''The Pragmatic Programmer. From Journeyman to Master'', Amsterdam: Addison-Wesley Longman (1999)
* Brian W. Kernighan, ''The Practice of Programming'', Pearson (1999)
* [[Gerald Weinberg|Weinberg, Gerald M.]], ''The Psychology of Computer Programming'', New York: Van Nostrand Reinhold (1971)
* [[Edsger W. Dijkstra]], ''A Discipline of Programming'', Prentice-Hall (1976)
* O.-J. Dahl, [[Edsger W. Dijkstra|E.W.Dijkstra]], C.A.R. Hoare, ''Structured Pogramming'', Academic Press (1972)
* [[David Gries]], ''The Science of Programming'', Springer-Verlag (1981)
 
==External links==
{{Wikibooks|Computer Programming}}
{{Wikibooks|Windows Programming}}
{{Wikiversity|Computer Programming}}
{{Library resources box|onlinebooks=yes}}
*{{Commons category-inline|Programming}}
*{{Wikiquote-inline|Programming}}
<!--Please see this URL before adding external links here: http://meta.wikimedia.org/wiki/When_should_I_link_externally-->
* {{dmoz|Computers/Software/Software_Engineering/|Software engineering}}
 
{{Computer science}}
{{Software engineering}}
{{Authority control}}
 
{{DEFAULTSORT:Computer Programming}}
[[Category:Computer programming| ]]
[[Category:Computers|Programming]]