문제

내가 읽기 이 질문 을 사이의 차이점을 찾아 Java Virtual Machine 및니다.데이고 벤지의 대답이 나는 이유를 궁금 가상 컴퓨터에 필요한 첫 번째 장소입니다.

에서 내의 이해를 벤지의 설명,JIT 컴파일러의 가상 기계를 해석하는 중간에 코드를 실제 어셈블리 코드에서 실행되는 CPU.는 이유가 이 때문입 Cpu 종종의 다른 번호를 등록에 따라 벤지,"어떤 레지스터는 특수한 목적,그리고 각각 지대를 피연산자에서 다른 레지스터입니다." 이 말이 다 있는 것에 필요한 중간 통역을 다음과 같은 Virtual Machine 도록 동일한 코드에서 실행할 수 있습니다 모든 CPU.

하지만,이 경우,다음 내가 이해하지 못하는 것입니다 왜 C 또는 C++코드를 컴파일로 컴퓨터 코드할 수 있는 컴퓨터에서 실행하는 만큼 그것은 올바른 OS.왜 그때는 C 프로그램 컴파일된 내용을 사용하여 기계 펜티엄을 실행할 수 있에 다른 윈도우를 사용하여 기계 AMD?

경 C 코드에서 실행할 수 있습 CPU 다음의 목적은 무엇인가 Virtual Machine?그것은 그렇게는 동일한 코드에서 실행할 수 있습니다 모든 OS?난 자바 VM 버전에 거의 모든 OS 가 CLR 에 대한 다른 운영체제의 외 Windows?

또는 다른 무언가가있다 내가 누락?가 OS 몇 가지 다른 해석을 어셈블리 코드를 실행에 적응하기 위해 특정 CPU 또는 뭔가?

나우스는 방법에 대해 이 모든 작업,그래서 명확한 설명을 주시면 감사하겠습니다.

참고:그 이유는 내가 하지 않았 게시물 내 검색어로 의견을 JVM 에서 대CLR 질문이 있지 않기 때문에 나가하기에 충분한 포인트 포스트는 아직 의견=b.

편집:감사에 대한 모든 훌륭한 답변!그래서 그것은 보인다 내가 누락되었었지만 모든 프로세서는 차이가 일반적인 표준화,주로 86 건축,제공하는 큰 충분한 설정의 일반적인 기능을 하는 C 컴파일된 코드에서 하나 86 프로세서에는 작업에 대부분의 다른 X86processor.이들의 연구는 정당성에 대한 가상 머신을 언급하지 않는 잊었의 중요성에 대해 가비지 컬렉션입니다.

도움이 되었습니까?

해결책

AMD 와 인텔 프로세서를 사용하여 동일한 명령을 설정하고 컴퓨터 아키텍처(의 관점에서 실행의 컴퓨터 코드).

C 및 C++컴파일러를 컴파일하는 컴퓨터 코드,헤더에 적합한 OS 들을 대상으로.컴파일하면 그들은 중단을 연결에서 어떤 방법이나 형태로 그들은 언어로 컴파일되었고 단지 바이너리 파일.(가 있는 유물 taht 보여줄 수 있습 무엇을 언어에서 컴파일하지 않는 점을 여기)

그래서 컴파일하면,그들은 연결된 기기(X86,intel 과 amd 명령어 세트 및 건물)및 수 있습니다.

이런 이유들에서만 실행할 수 있 86 호환 기기와 호환되는 OS(win95 을 통해 winvista,어떤 소프트웨어).

그러나,그들은 실행할 수 없음에 OSX 기계,심지어 실행중인 경우에는 인텔 프로세서는 바이너리 호환되지 않습니다 실행하지 않는 경우에는 추가적인 에뮬레이션 소프트웨어(과 같은 평행선 또는 VM windows).

는,그 이상을 실행하려는 경우에는 팔 프로세서,또는 MIPS,또는 파워,다음을 실행해야 전체 기계 명령어 집합을 에뮬레이터를 해석하는 바이너리 기계에서 코드 86 으로 무엇이든 기계에 당신은 그것을 실행한다.

대조하는 것이 있습니다.NET.

니다.NET 가상 기계되어 있으며 있었더라도 훨씬 더 나은 프로세서는 세계에서 프로세서를 이해하는 개체 메모리 할당 및 가비지 컬렉션,및 다른 높은 수준 구성 합니다.그것은 매우 복잡한 기계할 수 없습장에서 직접 실리콘제(좋은 성과를 가진다)하지만 에뮬레이터 기록할 수 있다는 것을 실행할 수 있에서 기존 프로세서입니다.

갑자기 작성할 수 있습 중 하나는 기계 특유의 에뮬레이터를 위한 프로세서에서 당신이 원하는 실행됩니다.순서 다음이다.NET 프로그램을 실행할 수 있습니다.에 대해 걱정할 필요가 없 OS 또는 기본 CPU 아키텍처가 있는 경우.NET VM,다음 소프트웨어 실행됩니다.

그러나 조금 더 일단 당신이이 일반적인 언어,왜 컴파일러로 변환하는 다른 언어로 그것은?

그래서 이용하실 수 있습 C,C#,C++,Java,javascript,가능하고 최적화를 하는 c 컴파일러,lua,또는 다른 언어로 컴파일러로 변환하는 작성된 코드 그래서 그것을 실행에 이상 기계입니다.

을 분리하는 기계에서 언어에 의해 2 번,그리고 가진 너무 많은 작업을하지 않을 사람에게 코드를 작성하고 그것을 실행하는 모든 컴퓨터에만큼 컴파일러와 VM 존재하지도 두 도시의 분리입니다.

는 경우 당신은 여전히 왜 이것은 좋은 일을 고려 초기 DOS 기계,그리고 무엇 Microsoft's 실시 세계에 공헌하였다:

Autocad 을 써야했다 드라이버에 대한 각 프린터 인쇄할 수 있었습니다.그래서 lotus1-2-3.사실,당신이 원하는 소프트웨어를 인쇄,당신은 자신이 쓰 드라이버가 있습니다.는 경우가 있었 10 프린터와 10 개 프로그램,100 개의 조각 기본적으로 동일 코드로 작성해야했 별도로와 독립적으로.

Windows3.1 려고 달성(함께 보석,그리고 많은 다른 추상화 계층)을 만들도록 그것을 인쇄 기계 제조자를 썼다 하나의 드라이버들은 프린터와 프로그래머이 쓴 한 driver for windows 프린터 클래스입니다.

지금 10 프로그램과 프린터 10,20 조각의 코드 작성해야하고,이후 마이크로소프트 측의 코드가 동일한 모두를 위해 다음 예에서 MS 했다는 의미는 아주 작은 작업을 할 수 있습니다.

지금 프로그램이지만 국한되는 10 린 그들을 지지하는 쪽을 선택하였지만,모든 인쇄 기계의 제조업체 제공을 위한 드라이버에서 윈도우.

과 같은 문제에서 발생하는 응용 프로그램 개발.정말 깔끔한 응용 프로그램을 사용할 수 없기 때문에 나지 않을 사용합니다.의 톤이있 복제(얼마나 많은 세계 수준의 워드 프로세서 우리가 정말 필요로 하는가?).

Java 것이지만,그것은 많은 제한이 없는 정말 해결합니다.

.그물에 가까운,그러나 아무도 세계 수준의 Vm 플랫폼에 다른 Windows(모노이 너무 가까...그리고 아직 꽤 있다).

그래서...그 이유는 우리가 필요 Vm.싶지 않기 때문에 자신을 제한 작은 관객이기 때문에 단순히 그들이 선택한 OS/기계 조합에서 다른 나 자신입니다.

-Adam

다른 팁

모든 프로세서에서 C 코드가 실행될 수 있다고 가정하는 것이 잘못되었습니다. 레지스터 및 엔디네스와 같은 것이 하나의 플랫폼에서 전혀 작동하지 않으며 다른 플랫폼에서 작동 할 수 있습니다.

그러나 프로세서가 공유하는 특정 유사성 (예 : Intel X86 프로세서 및 AMD 프로세서는 대부분의 코드가 다른 코드에 대해 컴파일 할 수있는 충분히 큰 속성 세트를 공유합니다. 그러나 프로세서 별 속성을 사용하려면 컴파일러 또는 라이브러리 세트가 필요합니다.

가상 머신을 원하는 이유에 대해서는 프로세서의 차이를 처리한다는 진술을 넘어서 가상 머신이 오늘날 C ++ (관리되지 않음)에서 컴파일 된 프로그램에 사용할 수없는 코드에 서비스를 제공한다는 사실도 있습니다.

가장 두드러진 서비스는 CLR과 JVM이 제공하는 쓰레기 수집입니다. 이 가상 머신은 모두 무료 로이 서비스를 제공합니다. 그들은 당신을 위해 메모리를 관리합니다.

바운드 점검, 액세스 위반과 같은 것들 (여전히 가능하지만 매우 어렵음)도 제공됩니다.

CLR은 또한 귀하를 위해 코드 보안 형태를 제공합니다.

이들 중 어느 것도 가상 머신에서 작동하지 않는 여러 언어에 대한 기본 런타임 환경의 일부로 제공되지 않습니다.

라이브러리를 사용하여 일부를 얻을 수 있지만 라이브러리와 함께 사용 패턴을 강요하는 반면 CLR 및 JVM을 통해 제공되는 .NET 및 Java 서비스에서는 액세스가 일치합니다.

기본적으로 '관리 코드'를 허용합니다. 이는 정확히 말하는 것을 의미합니다. 가상 머신은 코드가 실행될 때 코드를 관리합니다. 이것의 세 가지 주요 장점은 정시 편집, 관리 포인터/가비지 수집 및 보안 관리입니다.

정시 컴파일 1의 경우, 가상 컴퓨터는 코드가 실행되는 것을 시청하므로 코드가 더 자주 실행되면 더 빨리 실행되도록 다시 최적화됩니다. 기본 코드로는 이것을 할 수 없습니다.

가상 머신은 가상 머신이 주변을 돌아 다니면서 추적하여 크기와 수명에 따라 다양한 방식으로 관리하기 때문에 관리되는 포인터도 최적화하기가 더 쉽습니다. 포인터가 코드를 읽는 곳을 실제로 알 수 없기 때문에 C ++ 에서이 작업을 수행하는 것은 어렵습니다.

보안은 자체 설명적인 것입니다. 가상 머신은 코드가보고 있기 때문에하지 말아야 할 일을하는 것을 막습니다. 개인적으로 저는 이것이 아마도 Microsoft가 C#에 대한 관리 코드를 선택한 가장 큰 이유 일 것입니다.

기본적으로 내 요점은 가상 머신이 코드를 볼 수 있기 때문에 프로그래머의 삶을 더 쉽게 만들고 코드를 더 빨리 만들 수있는 일을 할 수 있습니다.

대부분의 컴파일러, 기본 코드 컴파일러는 일종의 중간 언어를 사용합니다.

이것은 주로 컴파일러 건설 비용을 줄이기 위해 수행됩니다. 세계에는 많은 (n) 프로그래밍 언어가 있습니다. 세계에는 많은 (M) 하드웨어 플랫폼도 있습니다. 컴파일러가 중간 언어를 사용하지 않고 작동하면 모든 하드웨어 플랫폼의 모든 언어를 지원하기 위해 작성 해야하는 총 "컴파일러"수는 N*M입니다.

그러나 중간 언어를 정의하고 컴파일러를 2 개의 부품, 프론트 엔드 및 백엔드로 나누면 프론트 엔드가 소스 코드를 IL로 컴파일하고 백엔드를 컴파일하는 IL을 컴퓨터 코드로 컴파일하면 글쓰기만으로 도망 갈 수 있습니다. N+M 컴파일러. 이것은 막대한 비용 절감이됩니다.

CLR / JVM 컴파일러와 기본 코드 컴파일러의 큰 차이점은 프론트 엔드와 백엔드 컴파일러가 서로 연결되는 방식입니다. 기본 코드 컴파일러에서 두 구성 요소는 일반적으로 동일한 실행 파일로 결합되며 둘 다 프로그래머가 IDE에서 "빌드"를 때릴 때 실행됩니다.

CLR / JVM 컴파일러를 사용하면 프론트 엔드와 백엔드가 다른 시간에 실행됩니다. 프론트 엔드는 컴파일 타임에 실행되며 실제로 고객에게 배송되는 IL을 생산합니다. 그런 다음 백엔드는 런타임에 호출되는 별도의 구성 요소로 구현됩니다.

그렇다면 이것은 "런타임까지 백엔드 컴파일을 지연시키는 이점은 무엇입니까?"라는 대안적인 질문을 제기합니다.

대답은 "그것은 의존한다"입니다.

런타임까지 백엔드 컴파일을 지연시킴으로써 여러 하드웨어 플랫폼에서 실행할 수있는 한 세트의 바이너리 세트를 배송 할 수 있습니다. 또한 프로그램이 재배치하지 않고 백엔드 컴파일 기술의 개선을 활용할 수 있습니다. 또한 많은 동적 언어 기능을 효율적으로 구현하기위한 토대를 제공 할 수 있습니다. 마지막으로, 선행 기계 코드 컴파일에서는 불가능한 별도로 컴파일 된 동적으로 연결된 라이브러리 (DLL) 사이에 보안 및 신뢰성 제약 조건을 도입 할 수있는 기능을 제공합니다.

그러나 도출도 있습니다. 광범위한 컴파일러 최적화를 구현하는 데 필요한 분석은 비용이 많이들 수 있습니다. 이는 "JIT"백엔드가 선결제 백엔드보다 최적화가 적다는 것을 의미합니다. 이것은 성능을 해칠 수 있습니다. 또한 런타임에 컴파일러를 호출해야 할 필요성은 또한 프로그램을로드하는 데 필요한 시간을 증가시킵니다. "선불"컴파일러로 생성 된 프로그램에는 이러한 문제가 없습니다.

첫째, 기계 코드는 CPU에 대한 가장 낮은 형태의 지침이 아닙니다. 오늘날 x86 CPU 자체는 X86 명령어를 마이크로 코드를 사용하여 다른 내부 형식으로 해석합니다. 실제로 마이크로 코드를 프로그래밍하는 유일한 사람들은 칩 개발자 엔지니어 유형으로, 오늘날 기술을 사용하여 최대 성능을 달성하기 위해 레거시 x86 명령 칩을 충실하고 고통스럽게 모방합니다.

개발자 유형은 항상 전력과 기능으로 인해 추가 추상화 계층을 추가하고 있습니다. 더 나은 추상화 후에는 새로운 응용 프로그램이 더 빠르고 안정적으로 작성 될 수 있습니다. 비즈니스는 코드가 무엇을 어떻게 또는 어떻게 보이는 것처럼 보이는지 신경 쓰지 않습니다. 응용 프로그램의 C 버전이 몇 밀리 초 적은 시간이 줄어들지만 개발 시간이 두 배가되는지 실제로 중요합니까?

속도 질문은 수백만 명의 사람들에게 서비스를 제공하는 많은 엔터프라이즈 응용 프로그램이 Java -Gmail, Gmaps와 같은 플랫폼/언어로 작성되므로 거의 논쟁의 여지가 없습니다. 어떤 언어/플랫폼이 가장 빠른지 잊어 버리십시오. 더 중요한 것은 올바른 알고리즘을 사용하고 효과적인 코드를 작성하고 작업을 완료한다는 것입니다.

AMD 및 Intel 프로세서에는 X86 아키텍처가 있습니다. 다른 아키텍처에서 C/C ++ 프로그램을 실행하려면 해당 아키텍처에 컴파일러를 사용해야합니다. 동일한 바이너리 실행 가능은 다른 프로세서 아키텍처에서 실행되지 않습니다.

Java는 거의 모든 OS에 VM 버전이 있지만 Windows 외에 다른 OS에 대한 CLR이 있습니까?

단핵증

매우 단순화 된 방식으로, 인텔과 AMD는 동일한 수의 레지스터 등으로 동일한 어셈블리 언어를 구현하기 때문입니다 ...

따라서 C 컴파일러는 Linux에서 작동하도록 코드를 컴파일합니다. 그 어셈블리는 Linux를 사용하고 있습니다 아비, 컴파일 프로그램이 Linux, x86 어셈블리 및 올바른 기능 서명에서 실행되는 한, 모두 댄디입니다.

이제 컴파일 된 코드를 가져 와서 Linux/PPC (예 : 오래된 iBook의 Linux)를 사용하십시오. 그것은 작동하지 않을 것입니다. JVM이 Linux/PPC 플랫폼에서 구현 되었기 때문에 Java 프로그램의 경우.

요즘 어셈블리 Langauge는 기본적으로 프로그래머가 프로그래밍 할 수있는 또 다른 인터페이스입니다. X86 (32 비트)을 사용하면 범용 정수 레지스터 용 EAX, EBX, ECX, EDX, Floating Point의 경우 F00-F07에 액세스 할 수 있습니다. 무대 뒤에서 CPU는 실제로 백 년 더 레지스터를 가지고 있으며, 그 물건을 뒤죽박죽으로 성능을 짜내었다.

당신은 당신의 분석에 옳다. 그러나 Virtual Machine 접근법은 코드가 실행되는 환경을 완전히 제어 할 수 있으므로 VM은 올바른 보안 액세스 권한이있는 명령이 암호 변경 또는 HD Bootsector 업데이트와 같은 잠재적으로 손상된 코드를 수행 할 수있는 보안 샌드 박스를 만듭니다. 다른 많은 혜택이 있지만 그것이 살인자 이유입니다. C#에서 stackoverflow를 얻을 수 없습니다 ...

나는 당신의 질문의 전제가 유효하다고 생각합니다. 당신은 확실히이 질문을 처음으로 물어 보는 것이 아닙니다. 그러니 체크 아웃 http://llvm.org 대체 접근 방식을 보려면 (현재 프로젝트가 실행 중이거나 Apple이 후원하는)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top