Let us first understand how VB6 or C++ programs (Non Dotnet applications) used to execute.
We know that
computers only understand machine level code. Machine level code is also
called as native or binary code. So, when we execute a VB6 or C++
program, the respective language compiler, compiles the respective
language source code into native code, which can then be understood by
the underlying operating system and hardware. This process is depicted
in the image below.
Native code is specific (native)
to the operating system on which it is generated. If you take this
compiled native code and try to run on another operating system it will
fail. So the problem with this style of program execution is that, it is
not portable from one platform to another platform.
Let us now
understand, how a .Net program executes. Using dotnet we can create
different types of applications. A few of the common types of .NET
applications include Web, Windows, Console and Mobile Applications.
Irrespective of the type of the application, when you execute any .NET
application the following happens
1. The .NET
application gets compiled into Intermediate language (IL). IL is also
referred as Common Intermediate language (CIL) and Microsoft
Intermediate language (MSIL). Both .NET and non .NET applications
generate an assembly. Assemblies have an extension of .DLL or .EXE. For
example if you compile a windows or Console application, you get a .EXE,
where as when we compile a web or Class library project we get a .DLL.
The difference between a .NET and NON .NET assembly is that, DOTNET
Assembly is in intermediate language format where as NON DOTNET assembly
is in native code format.
2. NON DOTNET
applications can run directly on top of the operating system, where as
DOTNET applications run on top of a virtual environment called as Common
Language Runtime (CLR). CLR contains a component called Just In-Time
Compiler (JIT), which will convert the Intermediate language into native
code which the underlying operating system can understand.
So, in .NET the application execution consists of 2 steps
1. Language compiler, compiles the Source Code into Intermediate Language (IL)
2. JIT compiler in CLR converts, the IL into native code which can then be run on the underlying operating system.
This process is shown in the image below.
Since, a .NET
assembly is in Intermedaite Language format and not native code, .NET
assemblies are portable to any platform, as long as the target platform
has the Common Language Runtime (CLR). The target platform's CLR
converts the Intermedaite Language into native code that the underlying
operating system can understand. Intermediate Languge is also called as
managed code. This is because CLR manages the code that runs inside it.
For example, in a VB6 program, the developer is responsible for
de-allocating the memory consumed by an object. If a programmer forgets
to de-allocate memory, we may run into hard to detecct out of memory
exceptions. On the other hand a .NET programmer need not worry about
de-allocating the memory consumed by an object. Automatic memory
management, also known as grabage collection is provided by CLR. Apart,
from garbage collection, there are several other benefits provided by
the CLR, which we will discuss in a later session. Since, CLR is
managing and executing the Intermediate Language, it (IL) is also called
as managed code.
.NET supports
different programming languages like C#, VB, J#, and C++. C#, VB, and J#
can only generate managed code (IL), where as C++ can generate both
managed code (IL) and un-managed code (Native code).
The native code
is not stored permanently anywhere, after we close the program the
native code is thrown awaya. When we execute the program again, the
native code gets generated again.
.NET program is
similar to java program execution. In java we have byte codes and JVM
(Java Virtual Machine), where as in .NET we Intermediate Language and
CLR (Common Language Runtime)
No comments:
Post a Comment