답변

사용자 이러한 언어가 선택적 가비지 수집기를 포함하도록 업데이트되지 않은 이유를 물어보십시오.

선택적 가비지 수집의 문제는 다른 모델을 사용하는 코드를 혼합 할 수 없다는 것입니다. 즉, 가비지 수집기를 사용하고 있다고 가정하는 코드를 작성하면 가비지 수집이 꺼져있는 프로그램에서 사용할 수 없습니다. 사용하면 모든 곳에서 누출됩니다.

답변

다음을 포함한 다양한 문제가 있습니다.

  • GC는 C ++ 이전에, 아마도 C 이전에 개발되었지만 C와 C ++는 GC가 실용적으로 널리 채택되기 전에 구현되었습니다.
  • 쉽게 구현할 수 없습니다. 기본 비 GC 언어가없는 GC 언어 및 플랫폼.
  • 일반적인 시간 척도 등에서 개발 된 일반적인 애플리케이션 코드에 대해 GC가 GC가 아닌 것보다 훨씬 효율적이지만 더 많은 개발 노력이 좋은 거래가되는 문제가 있습니다. -off 및 특수 메모리 관리는 범용 GC보다 성능이 뛰어납니다. 게다가 C ++는 일반적으로 추가 개발 노력 없이도 대부분의 GC 언어보다 훨씬 효율적입니다.
  • GC는 C ++ 스타일 RAII보다 보편적으로 안전하지 않습니다. . RAII를 사용하면 기본적으로 신뢰할 수 있고시기 적절한 소멸자를 지원하기 때문에 메모리 이외의 리소스를 자동으로 정리할 수 있습니다. 참조주기 문제로 인해 기존 GC 방법과 결합 할 수 없습니다.
  • GC 언어에는 고유 한 특성이 있습니다. 기억의 종류 누수, 특히 다시 사용되지 않는 메모리와 관련되어 있지만 무효화되거나 덮어 쓰지 않은 기존 참조가 존재하는 경우. 이를 명시 적으로 수행해야하는 필요성은 명시 적으로 delete 또는 free를 수행해야하는 것과 원칙적으로 다르지 않습니다. GC 접근 방식은 여전히 장점이 있습니다. 즉, 댕글 링 참조가 없으며 정적 분석은 일부 경우를 포착 할 수 있지만 “모든 경우에 대한 완벽한 솔루션은 없습니다.

기본적으로 부분적으로는 그렇습니다.” 언어의 시대에 대한 것이지만 어쨌든 GC 언어가 아닌 언어를위한 장소는 항상있을 것입니다. 그리고 진지하게, C ++에서 GC의 부족은 큰 문제가 아닙니다. 메모리는 다르게 관리되지만 관리되지 않는 것은 아닙니다.

Microsoft의 관리되는 C ++는 GC와 비 동일한 응용 프로그램에서 GC를 사용하여 각각의 장점을 혼합하여 사용할 수 있지만 실제로 이것이 얼마나 잘 작동하는지 말할 수있는 경험이 없습니다.

Rep-whoring 관련 답변 링크 내 것 …

Answer

가비지 수집을 사용하는 언어로 기기 핸들러를 작성하는 것을 상상할 수 있습니까? GC가 실행되는 동안 줄?

또는 운영 체제? 커널을 시작하기 전에 실행중인 가비지 수집을 어떻게 시작할 수 있습니까?

C는 하드웨어 작업에 가까운 낮은 수준을 위해 설계되었습니다. 문제? 많은 상위 수준의 작업에도 좋은 선택이 될만큼 좋은 언어입니다. 언어 황제는 이러한 용도를 알고 있지만 우선적으로 장치 드라이버, 임베디드 코드 및 운영 체제의 요구 사항을 지원해야합니다.

댓글

  • 높은 수준에 적합합니까? 키보드 전체에서 음료수를 코로 골랐습니다.
  • 글쎄, 그는 " 많은 상위 수준 작업 "을 말했습니다. 그는 트롤 카운팅 (하나, 둘, 많음 …) 할 수 있습니다. 그리고 그는 ' 실제로 무엇보다 더 높게 말하지 않았습니다. 농담은 제쳐두고 ' 사실입니다. 많은 중요한 상위 레벨 프로젝트가 C로 성공적으로 개발되었다는 증거입니다. 더 나은 선택이있을 수 있습니다. 지금은 이러한 많은 프로젝트에 대해 설명하고 있지만 실제 프로젝트는 과거에 대한 추측보다 더 강력한 증거입니다.
  • 일부 관리되는 운영 체제가 ' 있습니다. 그들은 오히려 잘 작동합니다. 실제로 전체 시스템을 관리하면 관리 코드 사용으로 인한 성능 저하가 실제 시나리오에서 관리되지 않는 코드보다 빠르게 떨어집니다. 물론 모두 " 연구 OS "입니다. '는 거의 없습니다. 관리되는 OS 내에서 완전히 가상화 된 관리되지 않는 OS를 만드는 것 외에도 기존의 관리되지 않는 코드와 호환되도록 만드는 방법입니다. Microsoft는 .NET에 점점 더 많은 서버 코드가 작성됨에 따라 Windows Server를 이들 중 하나로 대체 할 수 있다고 제안했습니다.

Answer

이 질문에 대한 짧고 지루한 대답은 가비지 컬렉터를 작성하는 사람들을 위해 비 쓰레기 수집 언어가 필요하다는 것입니다. 메모리 레이아웃을 매우 정밀하게 제어 할 수 있고 GC가 맨 위에 실행되는 언어를 갖는 것은 개념적으로 쉽지 않습니다.

다른 질문은 C와 C ++에 가비지 수집기가없는 이유.글쎄요, 저는 C ++에 몇 가지가 있다는 것을 알고 있습니다.하지만 그들은 처음에 GC로 설계되지 않은 언어를 다루도록 강요 당하기 때문에 인기가 없습니다. 그리고 여전히 C ++를 사용하는 사람들은 이 시대는 실제로 GC를 놓치는 종류가 아닙니다.

또한 GC를 기존의 비 GC 언어에 추가하는 대신 실제로 대부분의 언어를 사용하는 새 언어를 만드는 것이 더 쉽습니다. GC를 지원하는 동안 동일한 구문. Java 및 C #이 이에 대한 좋은 예입니다.

댓글

  • programmers.se 또는 SO의 어딘가에 ' 누군가자가 부트 스트랩 가비지 수집 물을 작업하고 있다고 주장합니다. IIRC는 기본적으로 GC 자체를 구현하는 데 사용되는 부트 스트랩 하위 집합과 함께 GC 언어를 사용하여 VM을 구현합니다. . 이름을 잊어 버렸습니다. 이름을 살펴 보았을 때 ' 기본적으로 GC가없는 하위 집합에서 작동하는 GC 수준으로 도약하지 못했습니다. 원칙적으로 가능하지만 AFAIK는 실제로 달성 된 적이 없습니다. ' 확실히 어려운 방식으로 일을하는 경우입니다.
  • @ Steve314 : I ' 어디서 찾았는지 기억 나시면보고 싶습니다!
  • 찾았습니다! Klein VM을 참조하는 stackoverflow.com/questions/3317329/ … 의 주석을 참조하십시오. 문제를 찾는 데 일부 문제가있었습니다. 질문이 닫혔습니다.
  • BTW-@missingno로 댓글을 시작할 수없는 것 같습니다. 무엇을 제공합니까?
  • @ steve314 : 답을 찾았습니다. 스레드가 첨부되어 있으면 이미 모든 댓글에 대한 알림을 받았습니다. 이 경우 @ -post를 수행하는 것은 중복되며 SE에서 허용하지 않습니다 (' 이유 를 묻지 마십시오). (진짜 원인은 내 번호가 없기 때문입니다.)

답변

쓰레기 수집은 기본적으로 DMA 가능 하드웨어 용 드라이버를 개발하는 데 사용되는 시스템 언어입니다.

객체에 대한 유일한 포인터가 일부 주변 장치의 하드웨어 레지스터에 저장되는 것은 전적으로 가능합니다. 가비지 수집기는 알 수 없기 때문입니다. 이것에 대해 객체에 도달 할 수 없다고 생각하고 수집합니다.

이 인수는 GC 압축을 위해 double을 유지합니다. 하드웨어 주변 장치에서 사용하는 개체에 대한 메모리 내 참조를 유지하려고하더라도 GC가 개체를 재배치하면 주변 장치 구성 레지스터에 포함 된 포인터를 업데이트하는 방법을 알 수 없습니다.

그래서 이제 고정 된 DMA 버퍼와 GC 관리 객체를 혼합해야합니다. 즉, 두 가지의 모든 단점이 있습니다.

댓글

  • 두 가지의 모든 단점이 있지만 각 단점의 경우는 적고 장점은 동일합니다. 더 많은 종류의 메모리 관리를 처리하는 데는 분명히 복잡성이 있지만 코드 내 각 과정에 적합한 말을 선택하여 복잡성을 피할 수도 있습니다. 상상할 수는 없지만 ' 거기에 이론적 인 차이가 있습니다. 나는 ' 전에 GC와 non-GC를 동일한 언어로 혼합하는 것에 대해 추측했지만 장치 드라이버에는 해당되지 않습니다. 대부분 GC 애플리케이션을 사용하는 경우 더 많지만 일부 수동 메모리 관리는 낮습니다. 레벨 데이터 구조 라이브러리.
  • @ Steve314 : ' 수동으로 해제해야하는 객체를 기억하는 것이 모든 것을 해제하는 것을 기억하는 것만 큼 번거 롭다고 말하지 않겠습니까? (물론 스마트 포인터도 도움이 될 수 있으므로 둘 다 큰 문제는 아닙니다.) 압축이 수행되지 않으므로 수동으로 관리되는 개체와 수집 된 / 압축 가능한 개체에 대해 다른 풀이 필요합니다. ' 전체에 흩어져있는 고정 된 물체가있을 때 잘 작동합니다. 따라서 아무 것도없이 많은 추가 복잡성이 발생합니다.
  • ' 모두 GC 인 상위 수준 코드와 하위 수준 코드 사이에 명확한 구분이 없다면 GC에서 옵트 아웃하는 코드. 저는 주로 몇 년 전에 D를 살펴보면서 아이디어를 개발했습니다. 이렇게하면 GC에서 옵트 아웃 할 수는 있지만 ' 다시 옵트 인 할 수는 없습니다. 예를 들어 B + 트리 라이브러리를 보겠습니다. . 컨테이너 전체는 GC 여야하지만 데이터 구조 노드는 그렇지 않을 수 있습니다. GC가 작업을 수행하도록하는 것보다 리프 노드를 통해서만 사용자 지정 스캔을 수행하는 것이 ' 더 효율적입니다. 분기 노드를 통한 재귀 검색. 그러나 해당 스캔은 포함 된 항목을 GC에보고해야합니다.
  • 요점은 '가 포함 된 기능 부분이라는 것입니다. B + 트리 노드를 특수 WRT 메모리 관리로 처리하는 것은 특수 WRT B + 트리 노드 인 으로 처리하는 것과 다르지 않습니다. '는 캡슐화 된 라이브러리이며 애플리케이션 코드는 GC 동작이 우회되었거나 특수한 경우를 알 필요가 없습니다. '적어도 당시에는 D에서는 불가능했습니다. 제가 말했듯이 다시 옵트 인하여 포함 된 항목을 잠재적 GC 루트로 GC에보고 할 방법이 없습니다.

Answer

C & C ++는 비교적 낮은 수준의 언어이므로 일반적인 용도로 사용됩니다. 내장형 시스템에서 1MB의 메모리가있는 16 비트 프로세서에서 실행하기 위해 gc로 메모리를 낭비 할 수 없습니다.

댓글

  • " 임베디드 시스템 "? C가 표준화 (1989)되었을 때 PC

를 처리 할 수 있어야했습니다. i> 1MB의 메모리가 있습니다.

  • 동의합니다. 더 최신 예제를 인용했습니다.
  • 1MB ??? 이런 schmoley, 누가 그렇게 많은 RAM이 필요할까요? < / billGates >
  • 답변

    C ++ 및 C에는 가비지 수집기가 있습니다. 이것이 C에서 어떻게 작동하는지 확실하지 않지만 C ++에서는 RTTI 를 활용하여 개체 그래프를 동적으로 검색하고이를 가비지 수집에 사용할 수 있습니다.

    내 지식으로는 Java를 작성할 수 없습니다. 가비지 수집기없이. 약간의 검색으로 가 나타났습니다.

    Java와 C / C ++의 주요 차이점은 C / C ++에서 선택은 항상 귀하의 것이라는 점입니다. , 반면 Java에서는 설계 상 옵션이없는 경우가 많습니다.

    댓글

    • 또한 전용 가비지 수집기가 더 잘 구현되고 더 효율적입니다. 언어에 더 잘 맞습니다. 🙂
    • 아니요. ' RTTI를 사용하여 C / C ++에서 개체 그래프를 동적으로 검색 할 수 없습니다. It '는 모든 것을 망칠 수있는 일반 오래된 데이터 개체입니다. 가비지 수집기가 해당 개체 내에서 포인터와 비 포인터를 구분할 수 있도록하는 일반 오래된 데이터 개체에 저장된 RTTI 정보가 없습니다. 더 나쁜 것은 포인터가 모든 하드웨어에서 완벽하게 정렬 될 필요가 없기 때문에 16 바이트 객체가 주어지면 64 비트 포인터를 저장할 수있는 9 개의 가능한 위치가 있으며 그 중 2 개만 저장할 수 있습니다. ' 겹치지 않습니다.

    답변

    성능과 안전 간의 균형입니다.

    가비지가 Java로 수집된다는 보장은 없습니다. 오랜 시간 동안 공간을 사용하고있을 수 있지만 참조되지 않은 개체 (예 : 쓰레기)를 검색하는 것은 사용하지 않는 개체를 명시 적으로 삭제하거나 해제하는 것보다 더 오래 걸립니다.

    물론 장점은 다음과 같습니다. 포인터없이 또는 메모리 누수없이 언어를 빌드 할 수 있으므로 올바른 코드를 생성 할 가능성이 더 높습니다.

    때로는 이러한 논쟁에 약간의 “종교적”우위가있을 수 있습니다. 경고를 받으십시오!

    답변

    다음은 C와 같은 시스템 언어에서 사용할 수 없게 만드는 GC 고유의 문제 목록입니다.

    • GC는 자신이 관리하는 객체를 소유 한 코드 수준 아래에서 실행되어야합니다. 커널에는 그러한 수준이 없습니다.

    • GC는 관리 코드를 수시로 중지해야합니다. 이제 커널에 그렇게하면 어떻게 될지 생각해보십시오. 컴퓨터의 모든 처리는 예를 들어 밀리 초 동안 중지되고 GC는 기존의 모든 메모리 할당을 스캔합니다. 이것은 엄격한 실시간 요구 사항에 따라 작동하는 시스템을 생성하려는 모든 시도를 중단합니다.

    • GC는 포인터와 비 포인터를 구별 할 수 있어야합니다. 즉, 존재하는 모든 메모리 객체를 볼 수 있어야하며 포인터를 찾을 수있는 오프셋 목록을 생성 할 수 있어야합니다.

      이 발견은 완벽해야합니다. GC는 가능해야합니다. 발견 한 모든 포인터를 추적합니다. 거짓 긍정을 역 참조하면 충돌 할 가능성이 있습니다. 거짓 부정을 발견하지 못하면 “아직 사용중인 객체를 파괴하여 관리 코드를 손상 시키거나 데이터를 조용히 손상시킬 수 있습니다.

      이렇게하려면 모든 단일 항목에 유형 정보를 저장해야합니다. 그러나 C와 C ++ 모두 유형 정보가없는 평범한 오래된 데이터 객체를 허용합니다.

    • GC는 본질적으로 느린 비즈니스입니다. Java와 사회화 한 프로그래머 이를 인식하지 못할 수도 있지만 프로그램은 Java로 구현되지 않으면 훨씬 더 빨라질 수 있습니다. Java를 느리게 만드는 요인 중 하나는 GC입니다. 이것이 Java와 같은 GCed 언어가 슈퍼 컴퓨팅에서 사용되는 것을 배제하는 이유입니다. 연간 전력 소비로 백만 달러가 들기 때문에 가비지 수집 비용의 10 %도 지불하고 싶지 않습니다.

    C 및 C ++는 지원을 위해 만들어진 언어입니다. 가능한 모든 사용 사례. 그리고 보시다시피 이러한 사용 사례 중 상당수는 가비지 수집에서 제외됩니다. 따라서 이러한 사용 사례를 지원하기 위해 C / C ++는 가비지 수집 될 수 없습니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다