Programing

C #은 부분적으로 해석되거나 실제로 컴파일됩니까?

crosscheck 2020. 11. 20. 08:39
반응형

C #은 부분적으로 해석되거나 실제로 컴파일됩니까?


이것에 대해 모순되는 정보가 많이 있습니다. 어떤 사람들은 C #이 컴파일되었다고 말하지만 (IL로 컴파일 된 다음 실행될 때 네이티브 코드로 컴파일 됨) 다른 사람들은 .NET이 필요할 때 해석된다고 말합니다. EN Wiki 말한다 :

많은 해석 언어는 먼저 어떤 형태의 가상 머신 코드로 컴파일 된 다음 런타임시 네이티브 코드로 해석되거나 컴파일됩니다.

그래서 꽤 혼란 스럽습니다. 누구든지 이것을 명확하게 설명 할 수 있습니까?


C #은 C # 컴파일러에 의해 IL로 컴파일됩니다.

그런 다음이 IL은 필요에 따라 JIT (Just-In-Time)를 호스트 컴퓨터의 기본 어셈블리 언어로 컴파일합니다. 대신 IL을 해석하는 .NET 런타임을 작성할 수 있습니다. 이 작업을 수행하더라도 C #은 컴파일 된 언어라고 주장합니다.


순전히 컴파일 된 언어에는 몇 가지 장점이 있습니다. 일반적으로 속도 및 종종 작업 세트 크기. 순전히 해석 된 언어에는 몇 가지 장점이 있습니다. 제자리에서 편집 할 수있는 명시적인 컴파일 단계가 필요하지 않은 유연성과 더 쉬운 이식성.

이 경우 jitted 언어는 중간 수준에 적합합니다.

그것이 우리가 달성하고자하는 메트릭의 위치와 둘 중 하나에 대한 편견에 따라 컴파일되거나 해석되는 것으로 jitted 언어를 생각할 수있는 이유입니다.

C #은 ASP.NET에서 발생하는 것처럼 처음 실행할 때도 컴파일 할 수 있으므로이 경우 해석에 가깝습니다 (이 경우 여전히 IL로 컴파일 된 다음 jitted). 확실히, 이것은 컴파일의 많은 장점과 함께이 경우 해석의 거의 모든 장점 (클래식 ASP에서 사용되는 VBScript 또는 JScript와 비교)을 가지고 있습니다.

엄밀히 말하면, 어떤 언어도 쿼 언어로 지트, 해석 또는 컴파일되지 않습니다. C #을 네이티브 코드로 NGen 할 수 있습니다 (어셈블리를 동적으로로드하는 것과 같은 작업을 수행하는 경우에도 여전히 IL 및 지팅을 사용합니다). 우리는 C 또는 C ++ 용 정수기를 작성할 수 있습니다 (여러 사람이 그렇게했습니다). 하지만 가장 일반적인 사용 사례에서 C #은 IL로 컴파일 된 다음 jitted되며, 이는 해석되거나 컴파일 된 것에 대한 고전적인 정의가 아닙니다.


의견에 기반한 의미와 진술이 너무 많습니다.

우선 : C #은 통역 언어가 아닙니다. CLR과 JVM은 "런타임"또는 "미들웨어"로 간주되지만 동일한 이름이 Perl과 같은 것에 적용됩니다. 이것은 이름과 관련된 사람들 사이에 많은 혼란을 야기합니다.

런타임을 참조하는 "통역사"라는 용어는 일반적으로 기존 코드가 일부 비원시 코드를 해석 함을 의미합니다. 두 가지 큰 패러다임이 있습니다. 파싱은 원시 소스 코드를 읽고 논리적 작업을 수행합니다. 바이트 코드 실행은 먼저 코드를 네이티브가 아닌 바이너리 표현으로 컴파일하므로 해석하는 데 훨씬 적은 CPU주기가 필요합니다.

자바는 원래 바이트 코드로 컴파일 된 다음 인터프리터를 거쳤습니다. 이제 JVM은 바이트 코드를 읽고 Just-In-Time을 원시 코드로 컴파일합니다. CIL은 동일합니다. CLR은 네이티브 코드에 대한 Just-In-Time 컴파일을 사용합니다.

소스 코드 실행, 바이트 코드 실행, 네이티브 컴파일, Just-in-time 컴파일, 컴파일러를 통한 소스 코드 실행, Just-in-time 네이티브 등의 모든 조합을 고려하십시오. 언어가 컴파일되거나 해석되는지의 의미는 무의미 해집니다.

예를 들어, 많은 통역 언어는 Just-In-Time 바이트 코드 컴파일을 사용합니다. C #은 JIT가 네이티브로 컴파일하는 CIL로 컴파일됩니다. 반대로 Perl은 즉시 스크립트를 바이트 코드로 컴파일 한 다음 인터프리터를 통해이 바이트 코드를 실행합니다. CIL 바이트 코드 형식으로 만 C # 어셈블리를 실행할 수 있습니다. 원시 소스 코드 형식으로 만 Perl 스크립트를 실행할 수 있습니다.

Just-in-time 컴파일러는 또한 많은 외부 및 내부 계측을 실행합니다. 런타임은 다양한 기능의 실행을 추적 한 다음 코드 레이아웃을 조정하여 특정 실행 흐름에 대한 분기 및 코드 구성을 최적화합니다. 즉, JIT가 실행될 때 코드의 실제 실행 사례에 맞게 최적화 전략을 조정하기 때문에 JIT 코드가 네이티브 컴파일 된 코드 (일반적으로 C ++ 또는 IL2CPP를 통해 실행되는 C #과 같이)보다 빠르게 실행될 수 있습니다.

컴퓨터 프로그래밍의 세계에 오신 것을 환영합니다. 우리는 그것을 극도로 복잡하게 만들고 모든 것에 설명 적이 지 않은 이름을 붙이기로 결정했습니다. 목적은 실질적인 의미가없는 단어의 정의에 대한 불화를 일으키는 것입니다.


여기를보세요 : http://msdn.microsoft.com/library/z1zx9t92

C #으로 작성된 소스 코드는 CLI 사양을 준수하는 IL (중간 언어)로 컴파일됩니다.

(...)

C # 프로그램이 실행되면 어셈블리가 CLR에로드되어 매니페스트의 정보를 기반으로 다양한 작업을 수행 할 수 있습니다. 그런 다음 보안 요구 사항이 충족되면 CLR은 JIT (Just In Time) 컴파일을 수행하여 IL 코드를 기본 기계 명령어로 변환합니다.


컴파일 된 EXE가 소스에서 기계 코드로 이동한다고 느끼거나 배웠거나 구식이라면 C #이 해석됩니다. 컴파일이 소스 코드를 바이트 코드와 같은 다른 코드로 변환하는 것을 의미한다고 생각하면 변환됩니다. 나를 위해, 그것이 만들어진 OS에서 작동하기 위해 런타임 처리가 필요한 모든 것이 해석됩니다.


먼저 해석과 컴파일의 정의를 이해합시다.

"컴파일"(코드를 언급 할 때) 은 코드를 한 언어에서 다른 언어로 번역하는 것을 의미합니다. 일반적으로 사람이 읽을 수있는 소스 코드에서 대상 프로세서가 처리 할 수있는 기계 코드로.

"해석"(코드를 언급 할 때) 또한 한 언어에서 다른 언어로 코드를 번역하는 것을 의미합니다. 그러나 이번에는 일반적으로 사람이 읽을 수있는 소스 코드에서 가상 머신이 가져가는 중간 코드로 이동하여이를 머신 코드로 해석하는 데 사용됩니다.

그냥 명확하게하기 위해
소스 코드 -> 컴파일러 -> 기계 코드
소스 코드 -> 컴파일러 -> 바이트 코드 -> 통역 -> 기계 코드

이론적으로 모든 언어는 해석 되거나 컴파일 될 수 있습니다 . 일반적으로 Java는 Java 가상 머신에 의해 기계 코드로 해석되는 바이트 코드로 컴파일됩니다. C #은 일반적으로 CLR, 공용 언어 런타임, 또 다른 가상 머신에 의해 컴파일되는 바이트 코드로 해석됩니다.

지금까지 모든 것은 마케팅 기믹입니다. "해석 된"이라는 용어가 추가 (적어도 사용량이 증가)하여 Just-In-Time 컴파일얼마나 깔끔한 보여줍니다 . 그러나 그들은 "컴파일"을 사용했을 수도 있습니다. 구별은 기술적 인 성격보다는 영어와 비즈니스 트렌드에 대한 연구입니다.


C 번호입니다 모두 해석 및 수명에 컴파일. C #은 VM에서 해석되는 가상 언어로 컴파일됩니다.

혼란은 "컴파일 된 언어"라는 모호한 개념에서 비롯됩니다.

"컴파일 된 언어"는 어떤 의미에서 잘못된 이름입니다. 컴파일되거나 해석되는 것은 언어의 속성이 아니라 런타임의 속성이기 때문입니다.

예를 들어 C 인터프리터를 작성할 수 있지만 C 구현은 기계 코드로 컴파일되고 언어는 컴파일을 염두에두고 설계 되었기 때문에 사람들은 일반적으로 "컴파일 된 언어"라고 부릅니다.


전부는 아니지만 대부분의 언어는 CPU가 그것을 이해하고 실행할 수 있도록 스크립트를 기계 코드로 번역하는 인터프리터가 필요합니다!

각 언어는 번역 과정을 다르게 처리합니다!

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.


C# is compilable language.

Probbably, I repeat, probbably, 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).


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


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

참고URL : https://stackoverflow.com/questions/8837329/is-c-sharp-partially-interpreted-or-really-compiled

반응형