문제

할 수 없는 이유는 컴파일러를 작성하는 무엇을 해야 에서는 C++코드(즉그것을"CLR 호환")?

어쩌면 어떤 타협 같은 금지 void 포인터를 어떤 상황에서 등입니다.하지만 이러한 모든 추가 키워드 등입니다.무엇이 문제를 해결하고자 하는 이러한 추가?

내 생각에 대한 몇 가지 측면 및 수 있습니다 무엇을 해결하기 어려울,하지만 좋은 견고한 설명을 높게 평가 될 것입니다!

도움이 되었습니까?

해결책

나는에 동의하지 않는 답니다.

주요 문제를 이해하는 C++컴파일러를 만듭니다 코드를 매우 바보 같은 환경입니다.도 현대 CPU 지 않에 대해 알고 가상 기능을,지옥에도,함수는 스트레칭.CPU 정말로 걱정하지 않는 예외 처리 코드를 풀 스택은 외부는 어떤 기능을 위해 인스턴스입니다.CPU 의 거래에서 명령어 시퀀스,으로 점프하고 반환합니다.기능 확실히지 않는 이름으로 CPU 를 관계한다.

따라서,모든 것을 지원하는 데 필요한 개념의 기능을 넣어가 있습니다.E.g.vtables 은 단지 배열의 크기로,오른쪽의 값이에서 Cpu 관점이다. __func__ 끝으로 바이트 시퀀스에서 문자열 테이블의 마지막은 00 입니다.

지금 아무것도 그 대상 환경 는 벙어리.할 수 있는 확실히 표적 JVM.다시 컴파일러가 무엇을 채우지 않는 기본적으로 제공됩니다.아 raw 메모리?그 다음에 할당 큰 바이트 배열 및 대신에 그것을 사용하십시오.아 원 포인터?그냥 사용하여 정수 인덱스로 큰 바이트 배열입니다.

주요 문제는 C++프로그램으로 아주 인식 호스팅 환경입니다.JVM 지 않는 벙어리,그것에 대해 알고 있는 기능을 가지고 있지만 그것이 기대 그들어준다.그것은 기대하지 않을 가지고 그들을 <> 에서 자신의 이름입니다.할 수 있지만,무엇으로 당신은 기본적으로 이름을 mangling.과는 달리 이름을 엉망으로 오늘날,이러한 종류의 이름을 엉망으로기 위한 것이 아닙 C linkers 지만 똑똑한 환경입니다.그래서,그 반성 엔진이 될 수 있다는 것을 확신 클래스 c__plus__plus 회원 기능 __namespace_std__for_each__arguments_int_pointer_int_pointer_function_address, 는 여전히 좋은 예입니다.나는 원하지 않는 무슨 일을 알고 있는 경우 std::map 의 문자열을 반대로 반복기.

주변의 다른 방법이 실제로 많은 쉽게,일반적으로.거의 모든 추상화의 다른 언어로 마사지 할 수 있다에서는 C++.가비지 컬렉션?이미 허용하는 C++에서는 오늘,그래서 당신이 지원할 수 있는 것도 void*.

One thing I didn 주소가 아직는 성능이다.모방 raw 메모리에서 바이트 배열?기 위하여 려고 하고 있지 않는 빠른,특히 넣으면에서 복식니다.재생할 수 많은 트릭을 더 빨리,하지만에서는 가격입니까?당신은 아마 하지 않을 얻는 상업적으로 실행 가능한 제품입니다.사실,당신은 수 있습으로 언어를 결합하는 부분의 C++(의 많은 특이한 구현에 따라 달라 동작이)가 최악의 부분 VM(slow).

다른 팁

C ++ 표준에 따라 작성된 기존 올바른 코드, 즉 코드는 실수로 동작을 변경해서는 안됩니다.

C ++/CLI는 대부분 관리되는 코드와 관리되지 않는 코드 사이의 접착제입니다. 따라서 관리되지 않는 개념을 혼합 할 수있는 능력이 필요합니다. 동일한 코드로 관리 및 불가사의 객체를 할당 할 수 있어야하므로 별도의 키워드 주위에 방법이 없습니다.

CLR을 대상으로 네이티브 C ++ 코드를 컴파일 할 수없는 이유는 무엇입니까?

그렇습니다. 당신은 그것을 바로 추측했습니다. 너무 많은 타협이있을 것이므로 쓸모가 없습니다. 세 가지 예제 만 이름을 지정하고 싶습니다 ...

1.) 템플릿 : C ++는이를 지원하고 CLR은 그렇지 않습니다 (제네릭은 다릅니다). 따라서 코드에서 STL, 부스트 등을 사용할 수 없습니다.

2.) 다중 상속 : CLI가 아닌 C ++로 지원됩니다. Istream과 Ostream에서 물려받는 표준 iostream 클래스 및 파생 상품 (Stringstream, FStream과 같은)도 사용할 수 없었습니다.

거의 코드가 컴파일되지 않을 것이므로 표준 라이브러리조차 구현할 수 없었습니다.

3.) 쓰레기 수집 : 대부분의 C ++ 앱은 수동으로 메모리를 관리 (스마트 포인터 사용 등) 자동 메모리 관리를 가지고 있습니다. 따라서 C ++ 스타일 "New"및 "Delete"는 "gcnew"와 호환되지 않으므로이 새로운 컴파일러의 기존 C ++ 코드가 쓸모가 없습니다.

모든 중요한 기능, 심지어 표준 라이브러리 및 기존 코드도 컴파일하지 않아야한다면 ... 요점은 무엇입니까?

우선, "간단한 C ++"와 "관리 된 C ++"의 구별은 의도적이었다. MC ++ 목적 중 하나는 기존 C ++ 코드와 CLR 사이의 브리지를 제공하는 것이기 때문이다.

다음으로 CLR 모델에 맞지 않는 C ++ 기능이 너무 많습니다. 다중 상속, 템플릿, 포인터 산술 ... 명확한 라인을 그리지 않으면 서 프로그래머는 컴파일 및 런타임 모두에서 암호 오류에 직면하게됩니다.

C ++에 관리 된 코드 기능을 추가하면 C ++가 느리게 진행되고 컴파일러가 더 복잡해지기 때문이라고 생각합니다. C ++가 처음에 설계된 것을 잃을 정도로 너무 많습니다. C ++의 멋진 것 중 하나는 작업하기에 좋은 언어이며 충분히 낮은 수준이지만 다소 휴대 가라는 것입니다. 그리고 아마도 그것이 C ++ 표준위원회가 그렇게 유지할 계획 일 것입니다. 어쨌든 나는 C ++가 완전히 "관리"될 수 있다고 생각하지 않습니다. 왜냐하면 C ++로 작성된 프로그램은 실행하기 위해 VM이 필요하다는 것을 의미하기 때문입니다. 이 경우 C ++/CLI를 사용하지 않는 이유는 무엇입니까?

QT 프레임 워크 거의 그렇게합니다. 즉, 스마트 포인터가있어서 가리키는 물체가 파괴 될 때 자동으로 NULL로 설정됩니다. 그리고 여전히 MOC (Meta Object Compiler)에 의해 구문 분석 된 후에는 기본 C ++입니다.

예, C ++가 관리 될 수 있다고 생각합니다. 그러나 .NET은 있어야합니다 다시 작성 C ++의 경우 기본에 대한 편견이 아닙니다. 같은 지붕 아래에 많은 언어가 있습니다. 특정 기능이 진행되었습니다. VB.NET 또는 C ++ 중에서 선택한 것이었고 VB.NET이 선택되었습니다. 내가 듣는 재미있는 것은 C#이 vb.net보다 더 인기가 있다는 것입니다.

.NET CLR은 관리되는 객체에 대한 참조가 런타임이 알지 못하는 곳에서는 아무도 존재할 수 없어야합니다. 성능이 좋으면 물체를 가능한 한 적게 고정해야합니다. .NET CLR은 C ++ 내에서 사용할 수있는 모든 데이터 구조를 이해할 수 없으므로 관리되는 객체에 대한 언급이 그러한 구조에 지속되지 않는 것이 필수적입니다. C ++ 언어를 변경하지 않고 "일반"C ++ 코드가 .NET 코드와 상호 작용할 수 있지만 C ++ 코드가 .NET 객체에 대한 "참조"를 유지할 수있는 유일한 방법은 일부를 갖는 것입니다. .NET 쪽의 코드 각 객체에 어떤 종류의 핸들을 할당하고, 핸들과 관련된 객체의 정적 테이블을 유지합니다. 객체를 조작하려는 C ++ 코드는 .NET 래퍼에게 핸들로 식별 된 객체에 대한 일부 작업을 수행하도록 요청해야합니다. 새 구문을 추가하면 컴파일러가 .NET 프레임 워크가 알아야 할 객체의 종류를 식별하고 필요한 제한을 시행 할 수 있습니다.

가장 먼저 고려해야 할 것은 모든 것을 만드는 것입니다 c++ "빠른"은 사라질 것입니다. C ++의 전체 쓰레기 수집 시스템은 불가능합니다. 왜냐하면 c++ 코드의 거의 모든 곳에서 포인터를 가질 수 있습니다. Langauge 시스템에 직접 내장되지 않으면 런타임 유형 정보가 비용이 많이 듭니다. 진정한 기본 성능을 활용할 수 있습니다. 템플릿이 해독됩니다. 진정한 포인터는 해독 될 것입니다. 메모리에 직접 접근 할 수 있습니다.

시행해야 할 것들의 목록

1. no direct pointers(pointers will get replace with complex refernces)
2. templates (generics pay for preformance)
3. simple c-style arrays (will get wrapped with array structures)
4. programmer no longer has control of whether data is on the stack or
the heap.
5. garbage collection will be enforced(this will cause the most changes to the syntax)
6. runtime type data will get added extensively to the code.
(larger code size)
7.  inlining will become more difficult for the compiler
(no more inline key word)
8. no more inline assembly.
9. the new langauge by now will become incompatible c code.(unless you go through hoops) 

5 해머에 동의합니다! Java 및 기타 관리 언어를 남기지 않은 경우에는 아무것도 아닌 다른 관리 언어를 남겼다면 컴퓨터를 완전히 제어해야합니다. 메모리에 액세스 메모리를 직접 관리하고 컴퓨터가 내 코드를 실행하는 방법을 제어하고 C 라이브러 (LUA 등)와 통합됩니다. 그 유연성을 느슨하게하면 C ++를 떠나 C로 돌아가고 C도 관리되면 Assembler로 이동합니다.

관리되는 언어는 모든 게임 플랫폼/복잡한 프로그램에서 최악의 언어입니다. 하드웨어에 직접 액세스 할 수없는 일부 샌드 박스의 주변에서 당신을 묶고 컴파일 된 언어보다 훨씬 느립니다.

C ++의 주요 목적은 항상 수행되었습니다. 큰 게임을위한 최고의 언어 중 하나입니다. 그리고이 언어 공연이 없으면 많은 게임이 존재하지 않을 것입니다!

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