관리/바이트 코드와 비관리/네이티브 코드의 차이점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/252014

  •  05-07-2019
  •  | 
  •  

문제

때때로 "우리 프로그래머"가 비프로그래머와 관리 유형에게 단순하다고 생각할 수 있는 일부 사항을 설명하기가 어렵습니다.

그래서...

프로그래머가 아닌 사람에게 관리 코드(또는 Java 바이트 코드)와 비관리/네이티브 코드의 차이점을 어떻게 설명하시겠습니까?

도움이 되었습니까?

해결책

관리 코드 == "전체 직원 또는 집단, 하녀, 요리사 및 정원사가있는 저택 집"

관리되지 않는 코드 == "내가 대학에 살았던 곳"

다른 팁

책상을 생각해보십시오. 정기적으로 청소하면 실제로 작업중 인 작업을 수행 할 공간이 있습니다. 청소하지 않으면 공간이 부족합니다.

이 공간은 RAM, 하드 디스크 등과 같은 컴퓨터 자원과 동일합니다.

관리되는 코드를 사용하면 시스템이 언제 어떻게 청소 해야하는지 자동으로 선택할 수 있습니다. 관리되지 않는 코드는 프로세스를 "매뉴얼"으로 만듭니다. 프로그래머가 시스템에 언제, 무엇을 청소 해야하는지 알려야한다는 점에서.

나는이 토론에서 나오는 것에 놀랐습니다 (실제로는 아니지만 수사적으로). 늦어도 뭔가를 추가하겠습니다.

가상 기계 (VMS) 및 쓰레기 수집 (GC) 수십 년입니다 그리고 두 가지 개념. 쓰레기 수집 된 기본 코드 컴파일 된 언어가 존재하며, 심지어 수십 년 동안의 언어가 존재합니다 (정식 예 : ANSI Common LISP; 글쎄, 적어도 a 컴파일 타임 쓰레기 수집 선언적 언어, 수은 - 그러나 분명히 대중은 프롤로그와 같은 언어로 비명을 지 릅니다).

갑자기 GCED 바이트 코드 기반 VM은 모든 IT 질병에 대한 만병 통치약입니다. 기존 바이너리의 샌드 박스 (다른 예 여기, 여기 그리고 여기)? 최소 권위의 원칙 (폴라)/기능 기반 보안? 슬림 한 바이너리 (또는 현대 변형 Safetsa)? 지역 추론? 아니요, 선생님 : Microsoft & Sun은 우리가 그러한 왜곡에 대해서만 생각할 수있는 권한을 부여하지 않습니다. 아니요,이 멋진 (???) New (???) 언어/API를 위해 전체 소프트웨어 스택을 더 잘 다시 작성하십시오. 우리 호스트 중 한 사람이 말했듯이, 그것은입니다 불과 움직임 전부 다시.

§ 어리석지 마십시오 : 나는 c#이 .net/mono를 대상으로하는 유일한 언어가 아니라는 것을 알고 있습니다. 하이퍼 볼.

편집하다: 보는 것은 특히 유익합니다 이 답변에 대한 의견 S.Lott에 의해 내가 지적한 메모리 관리/안전/코드 이동성을위한 대체 기술에 비추어.

내 요점은 기술이 아닌 사람들 이이 수준의 세부 사항에서 기술에 귀찮게 할 필요가 없다는 것입니다.

다른 한편으로, Microsoft/Sun 마케팅에 깊은 인상을받는다면, 그들이 바보가되고 있음을 설명해야합니다. 이러한 구현 기술에 대한 대안이 존재합니다 (일부는 더 좋습니다).

편집 2 : 쓰레기 수집은 메모리 관리 기술이며 모든 구현 기술이 올바르게 사용되는 것으로 이해되어야합니다. ITA 소프트웨어에서 어떻게 그들은 좋은 성능을 얻기 위해 GC를 우회합니다:

4- 빠른 액세스가 필요한 정적 데이터의 약 2 공간이 있기 때문에 C ++ 코드를 사용하여 메모리 맵을 포함합니다. 포인터가 없습니다 C 스트러크 (항공편, 요금 등), 외국 데이터 액세스를 사용하여 일반적인 LISP에서 액세스하십시오. Struct Field Access는 2 ~ 3 개의 지침으로 컴파일하므로 실제로 성능이 없습니다. LISP 객체보다는 C에 액세스하기위한 페널티. 이것을함으로써 우리는 LISP 쓰레기 수집가가 데이터를 보지 못하게합니다. (LISP에게는 C 객체에 대한 각 포인터는 단지 fixnum이지만, 우리는 종종 LISP 객체에 이러한 포인터를 일시적으로 랩핑하여 디버그 가능성을 향상시킵니다). 따라서 우리의 LISP 이미지는 약 250 Meg의 "작동"데이터 구조 및 코드입니다.

...

9- 800MHz 상자에서 10 초의 LISP 계산을 수행하고 5K 미만의 데이터를 수행 할 수 있습니다. 이것은 우리가 필요한 모든 데이터 구조를 사전 할당하고이를 초과하는 쿼리에서 죽기 때문입니다. 이로 인해 많은 LISP 프로그래머가 울부 짖을 수 있지만 250 메가 이미지와 실시간 제약 조건으로 우리는 쓰레기를 생산할 여유가 없습니다. 예를 들어, 단점을 사용하는 대신 우리는 "cons!"를 사용합니다. "Cons!"는 우리가 Preallocated와 모든 쿼리를 재설정하는 10,000,000 개의 셀 배열에서 셀을 가져옵니다.

편집 3 : (오해를 피하기 위해) GC는 포인터와 직접 피어링하는 것보다 더 나은가요? 대부분의 경우, 확실히, 그러나 대안이 있습니다. 둘 다. 귀찮게 할 필요가 있습니까? 사용자 이 세부 사항과 함께? 필요할 때 마케팅 과대 광고를 없애는 것 외에도 이것이 사실이라는 증거는 보이지 않습니다.

기본 해석은 다음과 같습니다.

  • 관리 = 런타임에 의해 관리되는 리소스 정리 (예 : 쓰레기 수집)
  • 관리되지 않습니다 = 자신을 후에 정리하십시오 (즉 malloc & free)

아마도 그것을 주식 시장에 투자하는 것과 비교할 수 있을 것입니다.

당신은 최고의 위험/보상을 줄 수 있는 전문가가 되기 위해 스스로 주식을 사고 팔 수 있습니다. 또는 당신을 대신해 그 일을 해줄 "전문가"가 관리하는 펀드에 투자할 수도 있습니다. 일부 통제력을 상실하고 일부 커미션을 잃을 수도 있습니다.(물론 저는 트래커 펀드의 팬이고, 주식 시장 "전문가"들이 최근에 제대로 된 성과를 내지는 못했지만...)

내 대답은 다음과 같습니다.

관리 (.NET) 또는 바이트 코드 (Java)는 시간과 비용을 절약합니다.

이제 두 가지를 비교해 봅시다 :

관리되지 않거나 기본 코드

자신의 자원 (RAM / 메모리) 할당 및 정리를 수행해야합니다. 무언가를 잊어 버리면 컴퓨터를 충돌시킬 수있는 "메모리 누출"이라고 불립니다. 메모리 누출은 애플리케이션이 UP (Eating Up) RAM/메모리를 사용하기 시작할 때의 용어이지만 컴퓨터가 다른 애플리케이션에 사용할 수 있도록 사용할 수 있도록 놓치지 않습니다. 결국 이것은 컴퓨터가 충돌하게됩니다.

다른 운영 체제 (MAC OSX, Windows 등)에서 응용 프로그램을 실행하려면 각 운영 체제에 대해 코드를 특별히 컴파일하고 운영 체제별로 특정 코드를 변경하여 각 운영 체제에서 작동 할 수 있습니다.

.NET 관리 코드 또는 Java 바이트 코드

모든 리소스 (RAM / 메모리) 할당 및 정리는 귀하를 위해 수행되며 "메모리 누출"을 생성 할 위험이 최소로 줄어 듭니다. 이를 통해 기능을 자원 관리에 사용하는 대신 기능을 코딩 할 수 있습니다.

다른 운영 체제 (Mac OSX, Windows 등)에서 응용 프로그램을 실행하려면 한 번만 컴파일하면 주어진 프레임 워크를 지원하는 한 각각 실행됩니다. / 단핵증 또는 Java).

요컨대

.NET 프레임 워크 (관리 코드) 또는 Java (바이트 코드)를 사용하여 개발하면 여러 운영 체제를 쉽게 타겟팅 할 수있는 응용 프로그램을 구축하고 평범한 메모리 작업 대신 풍부한 기능을 구축하는 데 더 많은 시간을 할애 할 수 있습니다. /자원 관리.

또한 .NET 프레임 워크가 여러 운영 체제를 지원하지 않는다고 지적하기 전에 기술적으로 Windows 98, WinXP 32 비트, WinXP 64 비트, WinVista 32 비트, WinVista 64 비트 및 Windows를 지적해야합니다. 서버는 모두 다른 운영 체제이지만 동일한 .NET 앱이 각각 실행됩니다. 그리고, 또한 있습니다 모노 프로젝트 그것은 .net을 Linux 및 Mac OSX로 가져옵니다.

관리되지 않는 코드는 컴퓨터가 따라야 할 지침 목록입니다. 관리 코드는 컴퓨터에 대한 작업 목록으로 컴퓨터가 컴퓨터를 수행하는 방법에 대해 스스로 해석 할 수 있다고합니다.

가장 큰 차이점은 메모리 관리입니다. 기본 코드를 사용하면 메모리를 직접 관리해야합니다. 이것은 어려울 수 있으며 버그를 추적하는 데 많은 버그와 많은 개발 시간의 원인입니다. 관리되는 코드를 사용하면 여전히 문제가 있지만 훨씬 적은 문제가 있으며 추적하기가 더 쉽습니다. 이것은 일반적으로 버그가 적은 소프트웨어와 개발 시간이 줄어 듭니다.

다른 차이점이 있지만 메모리 관리가 가장 큰 것일 수 있습니다.

그들이 여전히 관심이 있다면, 나는 버퍼 오버런에서 많은 악용이 어떻게되는지 언급 할 수 있고, 관리 코드로는 그것을 얻지 못하거나 해당 코드 재사용이 쉬우거나 더 이상 COM을 처리 할 필요가 없다고 언급 할 수 있습니다. '어쨌든 운이 좋다). 나는 아마도 com에서 길을 머물 렀을 것입니다. 그렇지 않으면 그것이 얼마나 끔찍한 지에 대한 타이레이드를 시작했습니다.

가장자리를 따라 범퍼가 있거나없는 수영장의 차이와 같습니다. 당신과 다른 모든 플레이어가 항상 완벽한 샷을 만들지 않는 한, 공을 테이블 위에 보관할 무언가가 필요합니다. (의도적 인 Ricochets 무시 ...)

또는 사이드 라인과 엔드 라인 대신 벽이있는 축구, 또는 백스톱이없는 야구, 또는 골 뒤에 그물이없는 하키, 또는 장벽이없는 NASCAR 또는 헬멧이없는 축구를 사용하십시오 ...)

"특정 용어 관리 코드는 Microsoft 세계에서 특히 널리 퍼져 있습니다."

MacOS와 Linux 세계에서 일하기 때문에 사용하거나 만난 용어가 아닙니다.

브래드 아브람 "관리되는 코드"블로그 게시물에는".NET Framework Common Language Runtime "과 같은 정의가 있습니다.

내 요점은 이것입니다. 용어를 전혀 설명하는 것은 적절하지 않을 수 있습니다. 버그, 해킹 또는 근로자 인 경우 그다지 중요하지 않습니다. 정교한 평신도 설명을 작성하기에 충분히 중요하지 않습니다. MS 제품 배치의 다음 릴리스로 사라질 수 있습니다.

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