Compilers were the first sort of
translator program to be written. The
idea is simple: You write the program,
then hand it to the compiler which
translates it. Then you run the
result.
Interpreters
An interpreter is also a program that
translates a high-level language into
a low-level one, but it does it at the
moment the program is run. You write
the program using a text editor or
something similar, and then instruct
the interpreter to run the program. It
takes the program, one line at a time,
and translates each line before
running it: It translates the first
line and runs it, then translates the
second line and runs it etc.
Compiler characteristics:
spends a lot of time analyzing and
processing the program
the resulting executable is some form
of machine- specific binary code
the computer hardware interprets
(executes) the resulting code
program execution is fast
Interpreter characteristics:
relatively little time is spent
analyzing and processing the program
the resulting code is some sort of
intermediate code
the resulting code is interpreted by
another program
An S -> T translator accepts code expressed in source language S, and translates it to equivalent code expressed in another (target) language T.
Examples of translators:
Compilers - translates high level code to low level code, e.g. Java -> JVM
Assemblers - translates assembly language code to machine code, e.g. x86as -> x86
High-level translators - translates code from one PL to another, e.g. Java -> C
Decompilers - translates low-level code to high-level code, e.g. Java JVM bytecode -> Java
What is an interpreter?
An S interpreter accepts code expressed in language S, and immediately executes that code. It works by fetching, analysing, and executing one instruction at a time.
Great when user is entering instructions interactively (think Python) and would like to get the output before putting in the next instruction. Also useful when the program is to be executed only once or requires to be portable.
Interpreting a program is much slower than executing native machine code
Interpreting a high-level language is ~100 times slower
Interpreting an intermediate-level (such as JVM bytecode) language is ~10 slower
If an instruction is called repeatedly, it will be analysed repeatedly - time-consuming!
No need to compile code
Differences
Behaviour
A compiler translates source code to machine code, but does not execute the source or object code.
An interpreter executes source code one instruction at a time, but does not translate the source code.
Performance
A compiler takes quite a long time to translate the source program to native machine code, but subsequent execution is fast
An interpreter starts executing the source program immediately, but execution is slow
Interpretive compilers
An interpretive compiler is a good compromise between compilers and interpreters. It translates source program into virtual machine code, which is then interpreted.
An interpretive compiler combines fast translation with moderately fast execution, provided that:
VM code is lower than the source language, but higher than native machine code
VM instructions have simple formats (can be quickly analysed by an interpreter)
Example: JDK provides an interpretive compiler for Java.
A: Most programs are written in High-level languages (c#,java...). High-level languages are which contain understandable words and phrases. On the other hand computer (by the time I wrote this article that is) understand machine code which is 0's and 1's only aka Binary/Machine Code. Therefore we need to convert the High-level code into source code which is (Machine code/binary). Hence the word converting.
So we conclude a Compiler/interpreter job is to Translate high-level code into machine code.
But both have a different way of 'Translating' the code
Difference:
Compiler:
converts source code to some kind of intermediate form. For static language, a compiler usually converts the source code to assembly, which usually did not get stored to disk, then the assembler is invoked to convert the assembly to binary code, which is usually stored as object file(.o or .obj suffix usually), then linker is invoked to link object file(s) to binary executable. Also it is common to refer to this whole process of compiling, assembling, linking as compiling. So you may call gcc a compiler, but it actually invokes cc1 which is the compiler to compile, as which is the assembler to assemble, ld which is the linker to link.
Interpreter:
language which has a intermediate so called bytecode form, the source code is first converted to byte code, this process can be called compiling, javac serves as an example.
Bytecode cannot be run on host machines, it needs a program, which is actually the process from the viewpoint of OS, to interpret the bytecode to the host machine, this program is called a interpreter, think of java. Some language, like python, do the compiling and interpreting work with a single
This book centers on writing interpreter for dynamic language in Scheme (dr.Racket), using it you can write your own interpreter for any language, and add some tips on OOP from
All modern interpreters include compiler inside: compile highlevel elements into low-level but portable byte-code, or use JIT for compiling into machine code into RAM.
PS: If anybody wants to write SmallTalk system on Python, please note me.
Then machine-language targeted program produced by the compiler is much faster than the interpreter at mapping inputs to output. However, since interpreter executes source program line by line it gives better error diagnostics than compiler.