Evolution of Programming Languages in Compiler Design

The Evolution of Programming Languages

The first computer came in the 1940s and was programmed in a binary language that told the computer what operations are to be performed and in which order. The operations were deficient level as well as the kind of programming was very slow, error-prone.

Evolution of Programming Languages in Compiler Design

Higher-level programming language

The first programming language, which was was developed in the 1950s, was more people-friendly. It was the mnemonic assembly language.

First, the instruction in assembly language was mnemonic representations of machine instructions. Later macro instructions were added to assembly language, which helped the programmer to define a parameterized shorthand for a frequently used sequence of machine instructions.

The first primary high-level programming language was FORTRAN, developed by IBM in the latter half of the 1950s. It was developed for scientific computation. FORTRAN was the first high–level programming language which had the function implementation.

Later in the 1950s, COBOL was developed by a short-range committee. It was developed for the purpose of business data processing. In 1958, John McCarthy developed LISP. It was developed for the purpose of symbolic computation.

    The main motive behind these programming languages was to create higher-level notation so that the programmer could easily write numerical computations, business applications, and symbolic programs. Due to its popularity, this programming language is still in use. 

There are many more programming languages that were created with much more creativity, which makes programming more accessible, robust, and more natural. Let's discuss some features of modern programming languages.

Classification of programming language

As of now, there are many programming languages available in the market. The programming language can be divided in different ways. One such way to classify the programming language is through generations.

  • Machine language is the first-generation language, Assembly language is the second-generation languages, and high-level programming languages like C, C++, LISP, FORTRAN, and JAVA are the third-generation languages.
  • Fourth-generation languages are NOMAD, which is used for report generation, SQL is used for the database, and the postscript is used for formating. Prolog and OPS5 are an example of fifth-generation languages.

Another way of classification is imperative for language; it specifies how a computation is to be done and declarative for language as it specifies which computation is to be done.

  •  C, C++, C#, JAVA are examples of an imperative language. Functional languages are considered a declarative language. ML, Haskel, and constraint logic-based are declarative language.

The programming languages in which the computational method is based on von Neumann architecture is considered as von Neumann language.

  • FORTRAN and C are von Neumann language.

A programming language that consists of class, object and support object-oriented programming is considered as an object-oriented language.

  • Language such as C++, C#, ruby, java is object-oriented languages.

Impacts on compiler

The design of programming language and compiler design are closely related to each other. With the evaluation of programming language, it has placed a new demand for compiler developers. They had to revise algorithm and representation to translate and support new features of programming language. They had to revise the translation algorithm in a way that would make the compiler more efficient.

   The compiler minimizes the execution overhead of the program in a high-level language. This promotes the use of high-level language. Compiler improves the performance of computer architecture on user applications.

Compiler writing is a very challenging task. The compiler is a large program. For creating and evolving a modern compiler, one should have hands on software engineering techniques.

         A compiler must translate correctly the infinite set of the program written in the source language. The compiler writer must tackle what problem will arise and what heuristic approach to be used to tackle the problem of gathering efficient code.

Compiler-Construction Tools

Like any software developer, compiler writers use software development environment tools such as language editor, debugger, profilers, test gear, and so on. Some other dedicated tools have been created for different appliance phases of the compiler. These tools use a certain language for implementing special components and algorithms. Following are some of the common tools used for compiler-construction:

Parser generator – It produces a syntax analyzer from the grammar of programming language.

Scanner generators – It generates a lexical analyzer from regular-expression of the tokens of programming language.

Syntax-directed translation engine – It produces a collection of routines for making parse trees and intermediate code generation.

Code-generator Generators – It produces code generators from a collection of rules that translates each operation of the intermediate into the machine code for the target machine.

Data-flow analysis engine – It gathers the information about how values are transferred from one part to another part of the program.

Compiler-construction toolkits – It provides a combined set of rules for the construction of various phases of the compiler.