I'm struggling to find where will the reference be created for an object and at which phase it will be created From Program to Intermediate Code or Intermediate Code to Native Code.
This article might help:
Typically, apps that target the .NET Framework are compiled to intermediate language (IL). At run time, the just-in-time (JIT) compiler translates the IL to native code. In contrast, .NET Native compiles Windows apps directly to native code.
So, as you see, IL is not even a prerequisite, it can be omitted fully (though in most cases, it shouldn't)
As mentioned in the CLR guide:
The runtime automatically handles object layout and manages references to objects, releasing them when they are no longer being used. Objects whose lifetimes are managed in this way are called managed data. Garbage collection eliminates memory leaks as well as some other common programming errors.
So since the executed code is turned into native code before running and the objects are created then I think it answers your question.
Objects are actually created in runtime, your code is merely the instructions for it to be created, your code will be compiled to IL when you compile it.
The runtime then (JIT compiler) will interpret this code to native code, anyway this all isn't actually creating your objects. the objects and the references of it will be created just when the CPU executes the interpreted code and stores some value in the memory.
I'm modifying an assembly using Mono.Cecil, and I want to check it for validity (whether the result will run at all). I'm trying to use PEVerify, but I'm having a problem.
It was designed for ensuring code is verifiable, so it just says ERROR whether the error means the IL is completely invalid and will not execute, or whether it's a verifiability issue that would be ignored in full trust. Here are some examples:
Using pointers and the like.
Not setting .locals init when the method has locals.
Calling .ctor from a non-constructor method.
Issues that make the IL fail to run include:
Member isn't accessible from the location it is used in.
Member doesn't exist.
Is there a way to make it give me some indication of the severity of the issue? If not, is there another tool that can do this?
#HansPassant already tried to explain it, but just so that we all understand each other, here's what's going on.
PEVerify checks your assembly for constructs that are not okay. That said, PEVerify is not the JIT compiler. The JIT compiler itself doesn't check the IL assembly - it just grabs the method it's going to call, changes it into an SSA form, optimizes it, compiles it and then calls the resulting binary assembly.
Now, the compiler will evolve over time. Optimizations are changed and added, and the role of the compiler is not necessarily to check for error (if it finds one as a by-product, it'll probably report it, but no guarantees). Remember, the JIT compiler is relentlessly optimized for just one thing, and that is to produce pretty good assembler byte code (because it's a JIT'ted language, the time it takes to compile something is really important). So, two different tools.
This basically results in the following:
The compiler will compile and execute what it was given.
PEVerify will tell you if the result of the method / assembly is defined.
If you ignore an error of PEVerify, this basically means that the result will be undefined behavior - which can be anything from a working executable to a hard crash. There is no such thing as a 'warning'.
There is a lot of contradicting information about this. While some say C# is compiled (as it is compiled into IL and then to native code when run), others say it's interpreted as it needs .NET. EN Wiki says:
Many interpreted languages are first compiled to some form of virtual
machine code, which is then either interpreted or compiled at runtime
to native code.
So I'm quite confused. Could anyone explain this clearly?
C# is compiled into IL, by the c# compiler.
This IL is then compiled just-in-time (JIT) as it's needed, into the native assembly language of the host machine. It would be possible to write a .NET runtime that interpreted the IL instead though. Even if this was done, I'd still argue that c# is a compiled language.
A purely compiled language has some advantages. Speed, as a rule, and often working set size.
A purely interpreted language has some advantages. Flexibility of not needing an explicit compilation stage that allows us to edit in place, and often easier portability.
A jitted language fits in a middle ground in this case.
That's a reason alone why we might think of a jitted language as either compiled or as interpreted depending on which position on which metric we care about attaining, and our prejudices for and against one or the other.
C# can also be compiled on first run, as happens in ASP.NET, which makes it close to interpreted in that case (though it's still compiled to IL and then jitted in this case). Certainly, it has pretty much all the advantages of interpreted in this case (compare with VBScript or JScript used in classic ASP), along with much of the advantages of compiled.
Strictly, no language is jitted, interpretted or compiled qua language. We can NGen C# to native code (though if it does something like dynamically loading an assembly it will still use IL and jitting). We could write an intepretter for C or C++ (several people have done so). In its most common use case though, C# is compiled to IL which is then jitted, which is not quite the classic definition of interpreted nor of compiled.
Too many semantics and statements based on opinion.
First off: C# isn't an interpreted language; the CLR and JVM are considered "runtimes" or "middleware", but the same name applies to things like Perl. This creates a lot of confusion among people concerned with names.
The term "Interpreter" referencing a runtime generally means existing code interprets some non-native code. There are two large paradigms: Parsing reads the raw source code and takes logical actions; bytecode execution first compiles the code to a non-native binary representation, which requires much fewer CPU cycles to interpret.
Java originally compiled to bytecode, then went through an interpreter; now, the JVM reads the bytecode and just-in-time compiles it to native code. CIL does the same: The CLR uses just-in-time compilation to native code.
Consider all the combinations of running source code, running bytecode, compiling to native, just-in-time compilation, running source code through a compiler to just-in-time native, and so forth. The semantics of whether a language is compiled or interpreted become meaningless.
As an example: many interpreted languages use just-in-time bytecode compilation. C# compiles to CIL, which JIT compiles to native; by contrast, Perl immediately compiles a script to a bytecode, and then runs this bytecode through an interpreter. You can only run a C# assembly in CIL bytecode format; you can only run a Perl script in raw source code format.
Just-in-time compilers also run a lot of external and internal instrumentation. The runtime tracks the execution of various functions, and then adjusts the code layout to optimize branches and code organization for its particular execution flow. That means JIT code can run faster than native-compiled code (like C++ typically is, or like C# run through IL2CPP), because the JIT adjusts its optimization strategy to the actual execution case of the code as it runs.
Welcome to the world of computer programming. We decided to make it extremely complicated, then attach non-descriptive names to everything. The purpose is to create flamewars over the definition of words which have no practical meaning.
If you feel, learned, or are old school, that a compiled EXE is going from source to machine code then C# is interpreted.
If you think compiled means converting source code into other code such as byte code, then yes its converted. For me, anything that takes run-time processing to work in the OS it was built for is interpreted.
Look here: http://msdn.microsoft.com/library/z1zx9t92
Source code written in C# is compiled into an intermediate language
(IL) that conforms to the CLI specification.
(...)
When the C# program is executed, the assembly is loaded into the CLR,
which might take various actions based on the information in the
manifest. Then, if the security requirements are met, the CLR performs
just in time (JIT) compilation to convert the IL code to native
machine instructions.
First off let's understand the definitions of interpreted and compiled.
"Compile" (when referring to code) means to translate code from one language to another. Typically from human readable source code into machine code that the target processer can... process.
"Interpret" (when referring to code) ALSO means to translate code from one language to another. But this time it's typically used to go from human readable source code into an intermediate code which is taken by a virtual machine which interprets it into machine code.
Just to be clear
Source code -> Compiler -> Machine code
Source code -> Compiler -> Byte Code -> Interpreter -> Machine code
Any language can, in theory, be interpreted or compiled. Typically Java is compiled into bytecode which is interpreted by the Java virtual machine into machine code. C# is typically interpreted into bytecode which is compiled by the CLR, the common language runtime, another virtual machine.
By and far the whole thing is a marketing gimmick. The term "interpreted" was added (or at least, increased in usage) to help showcase how neat just-in-time compiling was. But they could have just used "compiled". The distinction is more a study of the English language and business trends rather than anything of a technical nature.
C# is both interpreted and compiled in its lifetime. C# is compiled to a virtual language which is interpreted by a VM.
The confusion stems from the fuzzy concept of a "Compiled Language".
"Compiled Language" is a misnomer, in a sense, because compiled or interpreted is not a property of the language but of the runtime.
e.g. You could write a C interpreter but people usually call it a "Compiled Language", because C implementations compile to machine code, and the language was designed with compilation in mind.
Most languages, if not all, requires an interpreter that translates their scripts to machine codes in order to allow the cpu to understand and execute it!
Each language handles the translation process differently!
For example, "AutoIt" is what we can describe as being a 100% interpreted language!
why?
Because "AutoIt" interpreter is constantly needed while its script is being executed! See example below:
Loop, 1000
Any-Code
"AutoIt" interpreter would have to translate "Any-Code" 1000 times to machine code, which automatically makes "AutoIt" a slow language!
In the other hand, C# handles the translation process differently, C#'s interpreter is required only once, before script execution, after that it is not required anymore during script execution!
C#'s interpreter would have to translate "Any-Code" only once to machine code, which automatically makes "C#" a fast language!
So basically,
A language that requires its interpreter during script execution is an "Interpreted Language"!
A language that requires its interpreter only once (before script execution) is a "Compiled Language"!
Finally,
"AutoIt" is an "Interpreted Language"!
"C#" is a "Compiled Language"!
I believe this is a pretty old topic.
From my point of view, interpreted code will go through an interpreter, line by line translate and execute at the same time. Like example javascript, it is an interpreted code, when a line of javascript ran into an error, the script will just break.
While compiled code, it will go through a compiler, translate all code to another form of code at once, without execute it first. The execution is in another context.
If we agree with the definition of interpreter «In computer science, an interpreter is a computer program that directly executes, i.e. performs, instructions written in a programming or scripting language, without requiring them previously to have been compiled into a machine language program.» there is no doubt: C# is not an interpreted language.
Interpreter on Wikipedia
C#, like Java, has a hybrid language processor. Hybrid processors perform the jobs of both interpretation and compilation.
Since a computer can only execute binary code, any language will lead to the production of binary code at one point or another.
The question is : does the language let you produce a program in binary code?
If yes, then it is a compiled language : by definition "compiled" in "compiled language" refers to compilation into binary code, not transformation into some intermediary code.
If the language lead to the production of such intermediary code for a program, it will need an additional software to perform the binary compilation from this code : it is then an interpreted language.
Is a program "compiled" by C# directly executable on a machine without any other software at all installed on this machine? if no, then it is an interpreted language.
For an interpreted language, it is an interpreter that will generate the underlying binary code, most of the time in a dynamic way since this mechanism is the basis of the flexibility of such languages.
rem. : sometimes it does not look obvious because the interpreter is bundled into the OS
C# is compilable language.
Probably, as I met too those kind of opinions, the fact that someone thinks that there is an Interpreter for C# language, is due the kind of projects like
C# Interpreter Console
or, for example, famous
LinqPAD
where you can write just lines of the code and execute them, which brings to think that it's Python like language, which is not true. It compiles those lines and executes them, like a ordinary compilable programming language (from workflow point of view).
Great debate going on here. I have read all the answers and want to express some conclusions, based on my research and Programming language implementation concept.
There is a concept of Programming language implementation.
Programming language implementation: In computer programming, a programming language implementation is a system for executing computer programs. There are two general approaches to programming language implementation:
Compilation:
The program is read by a compiler, which translates it into some other language, such as bytecode or machine code. The translated code may either be directly executed by hardware, or serve as input to another interpreter or another compiler.
Interpretation:
An interpreter is a computer program that directly executes instructions written in a programming or scripting language, without requiring them previously to have been compiled into a machine language program.
Parse the source code and perform its behavior directly.
Translate source code into some efficient intermediate representation or object code and immediately execute that.
Explicitly execute stored precompiled bytecode made by a compiler and matched with the interpreter Virtual Machine.
Conclusions:
So any language which converts the code to intermediate byte code or machine code are compiled languages.
There are multiple types of Interpreters like Byte Code Interpreters, Just-in-time interpreters, etc.
Famous Compiled Languages:
JAVA C# C C++ GO Kotlin Rust
Famous Interpreted Languages:
JavaScript PHP Python
Directly Compiled Languages v/s Languages which are compiled to bytecode first:
Bytecode interpreters (virtual machines) are generally slower than direct execution of machine code. Any interpreter has some overhead when converting bytecode to actual machine instructions.
Interpreters do line by line execution.
So, directly compiled languages like C++/C are faster then Java/C#
There are an implementation of C# that is a compiled language.
It is Remobjects c# island that compiles directly to binary machine code and run without an VM and without an Runtime but uses directly platform API (win32 on microsoft, Cocoa on apple and posix on linux).
Also remobjects c# interoperate directly with C/C++ compiled librarres because it's calling convention translate to c calling convention.
My question is whether JIT compiler which converts the IL to Machine language is exactly a compiler or an interpreter.
One more question :
Is HTML, JavaScript a compiled language or interpreted language?
Thanks in Advance
JIT (just in time) compiler is a compiler. It does optimizations as well as compiling to machine code. (and even called a compiler)
HTML, Javascript are interpreted, they are read as-is by the web browser, and run with minimal bug fixes and optimizations.
Technically, a compiler translates from one language to another language. Since a JIT compiler receives an IL as its input and outputs native machine binary, it easily fits this criteria and should be called a compiler.
Regarding Javascript, making a distinction here is more difficult. If you want to be pedantic, there's no such thing as a "compiled language" or "interpreted language". I mean, it's true that in practice most languages have one common way of running them and if that is an interpreter they are usually called interpreted languages, but interpretation or compilation are (usually) not traits of the language itself. Python is almost universally considered interpreted, but it's possible to write a compiler which compiles it to native binary code; does it still deserve the "interpreted" adjective?
Now to get to the actual answer: Javascript is typically ran by an interpreter which, among other things, uses a JIT compiler itself. Is that interpreted or compiled, then? Your call.
From Wiki's , just-in-time compiler(JIT), also known as dynamic translator, is used to improve the runtime performance of computer programs.
Just-in-time compilation is the conversion of non-native code, for example bytecode, into native code just before it is executed.JIT compiler is the one who compiles the IL code and output the native code which is cached, where as an interpreter will execute line by line code,
i.e in the case of java the class files are the input to the interpreter.
More on JIT here :
Difference between JIT Compiler and Interpreter (a)
Difference between JIT Compiler and Interpreter (b)
JIT-Compiler in detail
What a JIT compiler do ?
Yes, HTML, JavaScript are interpreted languages since they aren't compiled to any code. It means that scripts execute without preliminary compilation.
Also a good read here on JavaScript/HTML not being the compiled languages.
JIT processors like IL are compilers, mostly. JavaScript processors are interpreters, mostly. I understand your curiosity for this question, but personally I've come to think that there really isn't any 'right' anwser.
There are JavaScript interpreters that compiler parts or all of the code for efficiency reasons. Are those really interpreters?
JIT acts at runtime, so it can be understood as a clever, highly optimized interpreter. Which is it?
It's like "it's a plant" or "it's an animal" questions. There are live things that don't quite fit either mold very well: nature is what nature is, and 'classification' of things is a purely human intellectual effort that has its limitations. Even man-made things like 'code' are subject to the same considerations.
Ok; so maybe there is one right answer:
The way JavaScript is processed (say, as of 5 years ago) is called an 'Interpreter'. The way C++ is processed is considered a 'compiler'.
The way IL is processed is simply... a 'JIT'.
CLI (.Net bytecode) has features not found in native CPU's, so JIT is most definitively a compiler. Contrary to what some write here most of the optimizations has already been done however.
HTML is not programing language, so it is hard to say if it is compiled or interpreted... In sence of "if result of compilation is reused" HTML is not compiled by any browsers (it is parsed any time page is renderd).
JavaScript in older browsers is interpreted (preprocessed into intermediate representation, but not to machine code). Latest versions of browsers have JavaScript JIT compilers - so it is much harder to define if it is interpreted or compiled language now.
JIT (Just In Time) Compiler is a compiler only and not an interpreter,because JIT compiler compiles or converts certain pieces of bytecodes to native machine code at run-time for high performance,but it does'nt execute the instructions.
Whereas,an Interpreter reads and executes the instructions at runtime.
HTML and Javascript are interpreted,it is directly executed by browser without compilation.
When I am reading F# stuff, they are talking about inlining methods, but I thought .NET didn't expose this functionality to programmers. If it's exposed then it has to be in the IL? And so can C# make use of it as well?
Just wondering if this thing is the same as C++ inline functionality.
It is actually more complicated when compared to C++ inlining, because F# works on top of .NET, which has IL as an intermediate language, so there are actually two layers where some inlining can be done:
At the F# -> IL level - The inline keyword allows you to specify that an F# function should be inlined when generating .NET IL code. In this case, the IL instructions of the function will be placed in place of a IL instruction representing a method call.
At the IL -> assembly level - This is fully controlled by JITter (.NET just-in-time compiler), which compiles the IL (intermediate language) to actual executable assembly code. This is done fully automatically, so you cannot specify that something should be inlined at this level. However, JITter also inlines some simple calls (such as calls to property getters and setters).
To answer some of your specific questions, inline is an F#-specific construct that interacts with both the type system (e.g. static member constraints) and code generation (inlining code for optimization purposes). The F# compiler deals with these things, and the information regarding inlining is stored in F#-specific metadata in the assembly, which enables functions to be inlined across F# assembly boundaries.
Guess I'll post as an answer... didn't really want to do such because I don't know anything about F# beyond the basics. :p
http://msdn.microsoft.com/en-us/library/dd548047%28VS.100%29.aspx