Content deleted Content added
→Abstraction penalty: viod calculate Tags: Reverted Visual edit |
Stevebroshar (talk | contribs) →Execution modes: interpreters can be either hardware or software |
||
(45 intermediate revisions by 32 users not shown) | |||
Line 1:
{{Short description|Programming language
{{Use dmy dates|date=May 2023}}
{{Use American English|date=January 2019}}
==History==
In the 1960s, a high-level programming language using a [[compiler]] was commonly called an ''[[autocode]]''.<ref name=kleith>{{cite book|last=London|first=Keith|year=1968|title=Introduction to Computers|publisher=Faber and Faber Limited|___location=24 Russell Square London WC1|isbn=0571085938|page=184|chapter=4, Programming|quote=The 'high' level programming languages are often called autocodes and the processor program, a compiler.}}<!--The book has no ISBN number, instead it has an SBN number. There is no typo in the prior sentence.--></ref>
Examples of autocodes are [[COBOL]] and [[Fortran]].<ref name=kleith2>{{cite book|last=London|first=Keith|title=Introduction to Computers|year=1968|publisher=Faber and Faber Limited|___location=24 Russell Square London WC1|isbn=0571085938|page=186|chapter=4, Programming|quote=Two high level programming languages which can be used here as examples to illustrate the structure and purpose of autocodes are COBOL (Common Business Oriented Language) and FORTRAN (Formular Translation).}}<!--The book has no ISBN number, instead it has an SBN number. There is no typo in the prior sentence.--></ref>
Line 10 ⟶ 13:
The first high-level programming language designed for computers was [[Plankalkül]], created by [[Konrad Zuse]].<ref>{{ill|Wolfgang Giloi{{!}}Giloi, Wolfgang, K.|de|Wolfgang Giloi}} (1997). "Konrad Zuse's Plankalkül: The First High-Level "non von Neumann" Programming Language". IEEE Annals of the History of Computing, vol. 19, no. 2, pp. 17–24, April–June, 1997. [http://doi.ieeecomputersociety.org/10.1109/85.586068 (abstract)]</ref> However, it was not implemented in his time, and his original contributions were largely isolated from other developments due to [[World War II]], aside from the language's influence on the "Superplan" language by [[Heinz Rutishauser]] and also to some degree [[ALGOL]]. The first significantly widespread high-level language was [[Fortran]], a machine-independent development of IBM's earlier [[Autocode]] systems. The [[ALGOL]] family, with [[ALGOL 58]] defined in 1958 and [[ALGOL 60]] defined in 1960 by committees of European and American computer scientists, introduced [[recursion]] as well as [[nested functions]] under [[lexical scope]]. ALGOL 60 was also the first language with a clear distinction between [[call by value|value]] and [[call by name|name-parameter]]s and their corresponding [[Semantics (computer science)|semantics]].<ref>Although it lacked a notion of [[call by reference|reference-parameter]]s, which could be a problem in some situations. Several successors, including [[ALGOL W]], [[ALGOL 68]], [[Simula]], [[Pascal (programming language)|Pascal]], [[Modula]] and [[Ada (programming language)|Ada]] thus included reference-parameters (The related C-language family instead allowed addresses as <code>value</code>-parameters).</ref> ALGOL also introduced several [[structured programming]] concepts, such as the <code>while-do</code> and <code>if-then-else</code> constructs and its [[Syntax (programming languages)|syntax]] was the first to be described in formal notation – ''[[Backus–Naur form]]'' (BNF). During roughly the same period, [[COBOL]] introduced [[Record (computer science)|record]]s (also called structs) and [[Lisp (programming language)|Lisp]] introduced a fully general [[lambda abstraction]] in a programming language for the first time.
A high-level language provides features that standardize common tasks, permit rich debugging, and maintain architectural agnosticism. On the other hand, a low-level language requires the coder to work at a lower-level of abstraction which is generally more challenging, but does allow for [[program optimization |optimizations]] that are not possible with a high-level language. This ''abstraction penalty'' for using a high-level language instead of a low-level language is real, but in practice, low-level optimizations rarely improve performance at the [[user experience]] level.<ref>{{cite journal
▲"High-level language" refers to the higher level of abstraction from [[machine language]]. Rather than dealing with registers, memory addresses, and call stacks, high-level languages deal with variables, arrays, [[object (computer science)|object]]s, complex arithmetic or Boolean expressions, subroutines and functions, loops, [[Thread (computer science)|thread]]s, locks, and other abstract computer science concepts, with a focus on [[usability]] over optimal program efficiency. Unlike low-level [[assembly language]]s, high-level languages have few, if any, language elements that translate directly into a machine's native [[opcode]]s. Other features, such as string handling routines, object-oriented language features, and file input/output, may also be present. One thing to note about high-level programming languages is that these languages allow the programmer to be detached and separated from the machine. That is, unlike low-level languages like assembly or machine language, high-level programming can amplify the programmer's instructions and trigger a lot of data movements in the background without their knowledge. The responsibility and power of executing instructions have been handed over to the machine from the programmer.
▲== Abstraction penalty ==
|author=Surana P
|title=Meta-Compilation of Language Abstractions.
Line 25 ⟶ 24:
|archive-date=2015-02-17
}}</ref><ref>{{cite web
| first = Argyn
| last = Kuketayev
| website = Application Development Trends
| title = The Data Abstraction Penalty (DAP) Benchmark for Small Objects in Java.
| url = http://www.adtmag.com/joop/article.aspx?id=4597
Line 42 ⟶ 43:
| pages = 367
| publisher = Springer
}}</ref>
{{Cite journal
|author1=Manuel Carro |author2=José F. Morales |author3=Henk L. Muller |author4=G. Puebla |author5=M. Hermenegildo | journal = Proceedings of the 2006 International Conference on Compilers, Architecture and Synthesis for Embedded Systems
Line 51 ⟶ 50:
| year = 2006
| publisher = ACM
}}</ref> Since a high-level language is designed independent of a specific computing [[Computer architecture |system architecture]], a program written in such a language can run on any computing context with a compatible compiler or interpreter.
== Relative meaning ==
{{refimprove section
The terms ''high-level'' and ''low-level'' are inherently relative, and languages can be compared as higher or lower level to each other. Sometimes the [[C (programming language)|C language]] is considered as either high-level or low-level depending on one's perspective. Regardless, most agree that C is higher level than assembly and lower level than most other languages.
C supports constructs such as expression evaluation, [[parameter |parameterized]] and recursive functions, data types and structures which are generally not supported in assembly or directly by a processor but C does provide lower-level features such as auto-increment and pointer math. But C lacks many higher-level abstracts common in other languages such as [[garbage collection]] and a built-in string type. In the introduction of [[The C Programming Language]] (second edition) by [[Brian Kernighan]] and [[Dennis Ritchie]], C is described as "not a very high level" language.<ref>{{cite book|last1=Kernighan|first1=Brian W.|last2=Ritchie|first2=Dennis M.|date=1988|title=The C Programming Language: 2nd Edition|url=https://books.google.com/books?id=FGkPBQAAQBAJ|url-status=bot: unknown|publisher=Prentice Hall|isbn=9780131103627|archive-url=https://web.archive.org/web/20221025180501/https://books.google.com/books?id=FGkPBQAAQBAJ|archive-date=25 October 2022|access-date=25 October 2022}}</ref>
Assembly language may itself be regarded as a higher level (but often still one-to-one if used without [[Macro (computer science)|macro]]s) representation of [[machine code]], as it supports concepts such as constants and (limited) expressions, sometimes even variables, procedures, and [[data structure]]s. [[Machine code]], in its turn, is inherently at a slightly higher level than the [[microcode]] or [[micro-operation]]s used internally in many processors.<ref>{{Cite book|title=The art of assembly language|last=Hyde, Randall.|date=2010|publisher=No Starch Press|isbn=9781593273019|edition= 2nd|___location=San Francisco|oclc=635507601|url=https://books.google.com/books?id=sYHtTvQ-ObIC}}</ref>▼
Assembly language is higher-level than machine code, but still highly tied to the processor hardware. But, assembly may provide some higher-level features such as [[Macro (computer science)|macro]]s, relatively limited expressions, constants, variables, procedures, and [[data structure]]s.
▲
== Execution modes ==
{{refimprove section|find=
The source code of a high-level language may be processed in various ways, including
; Compiled: A [[compiler]] transforms source code into other code. Sometimes, and traditionally, a compiler generates native machine code that is interpreted by the processor. But, today many execution models involve generating an [[intermediate representation]] (i.e. [[bytecode]]) that is later interpreted in software or converted to native code at runtime (via [[JIT compilation]]).
;
; Software interpreted: A [[interpreter (software)|software interpreter]] performs the actions encoded in source code without generating native machine code.
▲; Source-to-source translated or transcompiled: Code written in a language may be translated into terms of a lower-level language for which native code compilers are already common. [[JavaScript]] and the language [[C (programming language)|C]] are common targets for such translators. See [[CoffeeScript]], [[Chicken (Scheme implementation)|Chicken]] Scheme, and [[Eiffel (programming language)|Eiffel]] as examples. Specifically, the generated C and C++ code can be seen (as generated from the Eiffel language when using the [[EiffelStudio]] IDE) in the EIFGENs directory of any compiled Eiffel project. In Eiffel, the ''translated'' process is referred to as transcompiling or transcompiled, and the Eiffel compiler as a transcompiler or [[source-to-source compiler]].
Note that languages are not strictly ''interpreted'' languages or ''compiled'' languages. Rather, implementations of language behavior use interpreting or compiling. For example, [[ALGOL 60]] and [[Fortran]] have both been interpreted (even though they were more typically compiled). Similarly, Java shows the difficulty of trying to apply these labels to languages, rather than to implementations; Java is compiled to bytecode which is then executed by either interpreting (in a [[Java virtual machine]] (JVM)) or compiling (typically with a just-in-time compiler such as [[HotSpot (virtual machine)|HotSpot]], again in a JVM). Moreover, compiling, transcompiling, and interpreting is not strictly limited to only a description of the compiler artifact (binary executable or IL assembly).▼
▲Note that
▲Alternatively, it is possible for a high-level language to be directly implemented by a computer – the computer directly executes the HLL code. This is known as a ''[[high-level language computer architecture]]'' – the [[computer architecture]] itself is designed to be targeted by a specific high-level language. The [[Burroughs large systems]] were target machines for [[ALGOL 60]], for example.<ref>{{Citation|last=Chu|first=Yaohan|chapter=Concepts of High-Level Language Computer Architecture|date=1975|pages=1–14|publisher=Elsevier|isbn=9780121741501|doi=10.1016/b978-0-12-174150-1.50007-0|title=High-Level Language Computer Architecture}}</ref>
== See also ==
Line 93 ⟶ 95:
* http://c2.com/cgi/wiki?HighLevelLanguage - The [[WikiWikiWeb]]'s article on high-level programming languages
{{Types of programming languages
{{Authority control}}
|