High-level programming language
A high-level programming language is a programming language with strong abstraction from the details of the computer. In contrast to low-level programming languages, it may use natural language elements, be easier to use, or may automate (or even hide entirely) significant areas of computing systems (e.g. memory management), making the process of developing a program simpler and more understandable than when using a lower-level language. The amount of abstraction provided defines how "high-level" a programming language is.[1]
High-level refers to a level of abstraction from the hardware details of a processor inherent in machine and assembly code. Rather than dealing with registers, memory addresses, and call stacks, high-level languages deal with variables, arrays, objects, arithmetic and Boolean expressions, functions, loops, threads, locks, and other computer science abstractions, intended to facilitate correctness and maintainability. Unlike low-level assembly languages, high-level languages have few, if any, language elements that translate directly to a machine's native opcodes. Other features, such as string handling, object-oriented programming features, and file input/output, may also be provided. A high-level language allows for source code that is detached and separated from the machine details. That is, unlike low-level languages like assembly and machine code, high-level language code may result in data movements without the programmer's knowledge. Some control of what instructions to execute is handed to the compiler.
History
[edit]In the early decades of electronic computing, programs were usually written in machine code or assembly language, which closely reflected the instruction set of a particular machine. High-level programming languages developed as a way to express algorithms in forms closer to mathematics, business rules, or human-readable procedure, while a compiler or interpreter translated the program into machine-executable instructions. In the 1950s and 1960s, the term autocode was often used for compiler-based high-level languages; examples included early Autocode systems as well as languages such as Fortran and COBOL.[2]
The earliest high-level language designed for a computer is generally identified as Plankalkül, developed by Konrad Zuse in the 1940s.[3] It included advanced features such as structured data, assignment, conditional execution, iteration, and subroutines, but it was not implemented during Zuse's lifetime. Because Zuse worked in wartime and postwar Germany, his work remained largely isolated from the main line of language development, though it influenced Heinz Rutishauser's Superplan and, to a lesser extent, early work associated with ALGOL.[4]
The first high-level language to achieve wide practical adoption was Fortran, developed at IBM in the 1950s under John Backus.[5] Fortran was aimed at scientific and numerical computing, allowing programmers to write algebraic formulas and loops without manually managing every machine instruction. Its success helped demonstrate that compiled high-level languages could produce efficient programs while greatly reducing programming effort.[6]
Several other influential languages appeared around the same period. Lisp, created by John McCarthy, introduced symbolic list processing and made ideas from the lambda calculus central to practical programming-language design.[7] COBOL was designed for business data processing and became associated with English-like syntax, records, and file-oriented commercial applications.[8] The ALGOL family, especially ALGOL 60, influenced later language design through block structure, nested procedures, recursion, lexical scoping, a distinction between call by value and call by name, and the use of Backus–Naur form to define syntax formally.[9]
During the 1960s and 1970s, high-level languages diversified into distinct programming styles. BASIC made interactive programming accessible in time-sharing and educational environments, while Pascal emphasized structured programming and teaching. C combined high-level control structures with comparatively low-level access to memory and hardware, making it influential in operating systems and systems software. Simula introduced the class-and-object model that became central to object-oriented programming, and Smalltalk later developed object-oriented programming around message passing and a highly interactive programming environment.[10][11]
By the 1980s and 1990s, high-level language development increasingly reflected large-scale software engineering, graphical computing, and the growth of the Internet. Ada was designed for large, long-lived systems, particularly in defense and embedded contexts. C++ extended C with classes and other abstraction mechanisms, allowing object-oriented and generic programming while retaining systems-programming capabilities.[12] Scripting and rapid-application languages such as Perl, Python, Ruby, and PHP emphasized programmer productivity and text, web, or application scripting. Java promoted portable bytecode execution through the Java virtual machine, while JavaScript became the standard high-level scripting language of web browsers.[13][14][15]
In the 21st century, newer high-level languages have often focused on safer abstraction, concurrency, large codebases, and interoperability with existing platforms. C# developed alongside the .NET platform, Scala and F# blended object-oriented and functional programming, and Kotlin targeted interoperability with Java while adding concise syntax and null-safety features.[16] Go was designed for simple syntax, fast compilation, and built-in concurrency support.[17] Rust emphasized memory safety and thread safety without a garbage collector, while Swift was introduced as a modern language for Apple-platform software development.[18][19] TypeScript extended JavaScript with static typing for large-scale JavaScript applications.[20]
Abstraction penalty
[edit]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 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.[21][permanent dead link][22][23] None the less, code that needs to run quickly and efficiently may require the use of a lower-level language, even if a higher-level language would make the coding easier to write and maintain. In many cases, critical portions of a program mostly in a high-level language are coded in assembly in order to meet tight timing or memory constraints. A well-designed compiler for a high-level language can produce code comparable in efficiency to what could be coded by hand in assembly, and the higher-level abstractions sometimes allow for optimizations that beat the performance of hand-coded assembly.[24] Since a high-level language is designed independent of a specific computing system architecture, a program written in such a language can run on any computing context with a compatible compiler or interpreter.
Unlike a low-level language that is inherently tied to processor hardware, a high-level language can be improved, and new high-level languages can evolve from others with the goal of aggregating the most popular constructs with improved features. For example, Scala maintains backward compatibility with Java. Code written in Java continues to be usable even if a developer switches to Scala. This makes the transition easier and extends the lifespan of a codebase. In contrast, low-level programs rarely survive beyond the system architecture which they were written for.
Relative meaning
[edit]This section needs additional citations for verification. (October 2018) |
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 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, 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.[25]
Assembly language is higher-level than machine code, but still highly tied to the processor hardware. However, assembly may provide some higher-level features such as macros, relatively limited expressions, constants, variables, procedures, and data structures.
Machine code is at a slightly higher level abstraction than the microcode or micro-operations used internally in many processors.[26]
Execution modes
[edit]This section needs additional citations for verification. (October 2018) |
The source code of a high-level language may be processed in various ways, such as:
- Compiled
- A compiler transforms source code into other code. In some cases, a compiler generates native machine code that is interpreted by the processor; however, many execution models today involve generating an intermediate representation (i.e. bytecode) that is later interpreted in software or converted to native code at runtime (via JIT compilation).
- Sometimes the hardware is optimized to the run time requirements of specific languages. For example, the Burroughs Large Systems were target machines for ALGOL 60.[27]
- Transpiled
- Code may be translated into source code of another language (typically lower-level) for which a compiler or interpreter is available. JavaScript and the C are common targets for such translators. For example, C and C++ code can be seen as generated from Eiffel code when using the EiffelStudio IDE. In Eiffel, the translated process is referred to as transcompiling or transcompiled, and the Eiffel compiler as a transcompiler or source-to-source compiler.
- Software interpreted
- A software interpreter performs the actions encoded in source code without generating native machine code.
- Hardware interpreted
- Although uncommon, a processor with a high-level language computer architecture can process a high-level language without a programmed compilation step.[28]
Note that a language is not strictly interpreted or compiled. Rather, an execution model involves a compiler or an interpreter and the same language might be used with different execution models. 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 JIT compiled.
See also
[edit]- Generational list of programming languages
- Categorical list of programming languages
- Very high-level programming languages
- Low-level programming languages
- High-level assembler
- Abstraction (computer science)
References
[edit]- ^ "HThreads - RD Glossary". Archived from the original on 26 August 2007.
- ^ London, Keith (1968). Introduction to Computers. Faber and Faber.
- ^ Rojas, Raúl; Hashagen, Ulf (2000). Plankalkül: The First High-Level Programming Language and its Implementation (Report). Freie Universität Berlin.
- ^ Rojas, Raúl (2000). "Konrad Zuse's legacy: the architecture of the Z1 and Z3". In Rojas, Raúl (ed.). The First Computers: History and Architectures. MIT Press. ISBN 978-0-262-18197-6.
- ^ "Software & Languages: FORTRAN". Computer History Museum. Retrieved 25 May 2026.
- ^ "Programming languages". Encyclopædia Britannica. Retrieved 25 May 2026.
- ^ McCarthy, John (1960). "Recursive functions of symbolic expressions and their computation by machine, Part I". Communications of the ACM. 3 (4): 184–195. doi:10.1145/367177.367199.
- ^ Sammet, Jean E. (1978). "The Early History of COBOL". ACM SIGPLAN Notices. 13 (8): 121–161. doi:10.1145/960118.808378.
- ^ Backus, J. W.; Bauer, F. L.; Green, J.; Katz, C.; McCarthy, J.; Naur, P.; Perlis, A. J.; Rutishauser, H.; Samelson, K.; Vauquois, B.; Wegstein, J. H.; van Wijngaarden, A.; Woodger, M. (1963). "Revised report on the algorithmic language ALGOL 60". Communications of the ACM. 6 (1): 1–17. doi:10.1145/366193.366201.
- ^ Dahl, Ole-Johan; Nygaard, Kristen (1978). "The Development of the SIMULA Languages". History of Programming Languages. ACM. pp. 439–480. doi:10.1145/800025.1198392.
- ^ Kay, Alan C. (1993). "The early history of Smalltalk". ACM SIGPLAN Notices. 28 (3): 69–95. doi:10.1145/155360.155364.
- ^ Stroustrup, Bjarne (1993). "A History of C++: 1979–1991". History of Programming Languages II. ACM. pp. 699–769. doi:10.1145/154766.155375.
- ^ "History and License". Python documentation. Retrieved 25 May 2026.
- ^ "The Java Language Specification" (PDF). Oracle. Retrieved 25 May 2026.
- ^ "JavaScript". MDN Web Docs. Mozilla. Retrieved 25 May 2026.
- ^ "Kotlin 1.0 Released: Pragmatic Language for JVM and Android". JetBrains. 15 February 2016. Retrieved 25 May 2026.
- ^ "Frequently Asked Questions". The Go Programming Language. Retrieved 25 May 2026.
- ^ "Rust Programming Language". Retrieved 25 May 2026.
- ^ "Swift Programming Language". Retrieved 25 May 2026.
- ^ "Announcing TypeScript 1.0". Microsoft. 2 April 2014. Retrieved 25 May 2026.
- ^ Pankaj Surana (2006). Meta-Compilation of Language Abstractions (Thesis). Northwestern University. ISBN 978-0-542-74444-0. Retrieved 17 March 2008.
- ^ Kuketayev, Argyn. "The Data Abstraction Penalty (DAP) Benchmark for Small Objects in Java". Application Development Trends. Archived from the original on 11 January 2009. Retrieved 17 March 2008.
- ^ Chatzigeorgiou; Stephanides (2002). "Evaluating Performance and Power Of Object-Oriented Vs. Procedural Programming Languages". In Blieberger; Strohmeier (eds.). Proceedings - 7th International Conference on Reliable Software Technologies - Ada-Europe'2002. Springer. p. 367.
- ^ Manuel Carro; José F. Morales; Henk L. Muller; G. Puebla; M. Hermenegildo (2006). "High-level languages for small devices: a case study" (PDF). Proceedings of the 2006 International Conference on Compilers, Architecture and Synthesis for Embedded Systems. ACM.
- ^ Kernighan, Brian W.; Ritchie, Dennis M. (1988). The C Programming Language: 2nd Edition. Prentice Hall. ISBN 9780131103627. Archived from the original on 25 October 2022. Retrieved 25 October 2022.
{{cite book}}: CS1 maint: bot: original URL status unknown (link) - ^ Hyde, Randall. (2010). The art of assembly language (2nd ed.). San Francisco: No Starch Press. ISBN 978-1-59327-301-9. OCLC 635507601.
- ^ Chu, Yaohan (1975). "Concepts of High-Level Language Computer Architecture". High-Level Language Computer Architecture. Elsevier. pp. 1–14. doi:10.1016/b978-0-12-174150-1.50007-0. ISBN 978-0-12-174150-1.
- ^ Texas Instruments SYMBOL high-level language computer
- Texas Instruments Computer Research Laboratory (1972). SYMBOL: A High-Level Language Computer Architecture (PDF) (Technical report). Texas Instruments Incorporated. TI-SYMBOL-TR-1972. Retrieved 4 May 2026.
- R. A. Kowalski; Texas Instruments Research Staff (1973). The SYMBOL Computer: An Experimental High-Level Language Machine. AFIPS National Computer Conference. AFIPS Press. AFIPS-1973-SYMBOL. Retrieved 4 May 2026.
{{cite conference}}: CS1 maint: multiple names: authors list (link) - Texas Instruments SYMBOL Project Group (1974). "Direct Execution of High-Level Languages in the SYMBOL Architecture". Communications of the ACM. 17 (8). Association for Computing Machinery: 453–460. CACM-SYMBOL-1974. Retrieved 4 May 2026.
- Texas Instruments Advanced Systems Division (1971). SYMBOL System Overview (PDF) (Technical report). Texas Instruments Incorporated. TI-SYMBOL-OVERVIEW-1971. Retrieved 4 May 2026.
- "Texas Instruments SYMBOL Computer Documentation Index". Bitsavers. Retrieved 4 May 2026.
External links
[edit]- https://c2.com/cgi/wiki?HighLevelLanguage – The WikiWikiWeb's article on high-level programming languages