문제

Ada가 개발된 당시에는 GC가 인기가 없었으며 임베디드 프로그래밍의 주요 사용 사례에서는 여전히 좋은 선택이 아니라는 것을 알고 있습니다.

그러나 Ada가 범용 프로그래밍 언어라는 점을 고려하면 언어의 이후 개정판과 컴파일러 구현에 도입된 부분적이고 선택적(명시적으로 태그가 지정된 메모리 객체만 추적) 가비지 수집기가 아니었던 이유는 무엇입니까?

더 이상 가비지 컬렉터 없이 일반 데스크톱 애플리케이션을 개발한다는 것은 생각할 수 없습니다.

도움이 되었습니까?

해결책

ADA는 군용 응용 프로그램을 염두에두고 설계되었습니다. 디자인의 큰 우선 순위 중 하나는 결정론이었습니다. 즉, ADA 프로그램은 모든 환경에서 모든 운영 체제에서 매번 같은 방식으로 정확히 같은 방식으로 수행하기를 원했습니다.

쓰레기 수집가는 하나의 응용 프로그램을 서로 대항하여 두 개의 응용 프로그램으로 바꿉니다. Java 프로그램은 GC가 일하러 가기로 결정할 때 무작위로 딸꾹질을 개발하고, 너무 느리면 응용 프로그램이 때때로 다른 사람이 아닌 힙이 부족할 가능성이 있습니다.

단순화 : 쓰레기 수집가는 디자이너가 원하지 않는 프로그램에 약간의 변동성을 소개합니다. 당신은 엉망이된다 - 당신은 그것을 정리합니다! 같은 코드, 매번 같은 동작.

Ada가 전 세계적으로 큰 성공을 거둔 것은 아닙니다.

다른 팁

Ada는 실시간으로 무기를 제어하는 ​​방어 시스템에 사용하도록 설계되었으며 가비지 수집이 애플리케이션 타이밍을 방해하기 때문입니다.이는 위험하기 때문에 수년 동안 Java는 의료 및 군사 제어 시스템에 사용되어서는 안 된다는 경고를 받았습니다.

Java에 더 이상 이러한 면책 조항이 없는 이유는 기본 하드웨어가 훨씬 빨라졌고 Java가 더 나은 GC 알고리즘과 GC에 대한 더 나은 제어 기능을 갖추고 있기 때문이라고 생각합니다.

Ada는 컴퓨터가 오늘날보다 성능이 훨씬 떨어지는 1970년대와 1980년대에 개발되었으며 제어 애플리케이션에서는 타이밍 문제가 가장 중요했습니다.

대답은 더 복잡합니다. ADA는 실시간 제약 및 그로 인해 쓰레기 수집가가 필요하지 않습니다. 그러나이 언어는 쓰레기 수집가의 구현을 위해 영리하게 설계되었습니다.

많은 (거의 모든) 컴파일러는 가비지 수집기를 포함하지 않지만 주목할만한 구현이 있습니다.

  • GNAT를위한 패치
  • Java Virtual Machine을 대상으로하는 ADA 컴파일러 (이러한 프로젝트가 여전히 지원되는지 모르겠습니다). JVM의 쓰레기 수집가를 사용했습니다.

ADA에는 웹 주변의 쓰레기 수집에 관한 다른 소스가 많이 있습니다. 이 주제는 주로 90 년대 중반에 Java와의 치열한 경쟁으로 인해 오랫동안 논의되었습니다 (살펴보십시오. 이 페이지: "Ada 95 is what the Java language should have been"), Java가 Microsoft Drew C#이전에 "다음 큰 일"이었을 때.

우선, 언어에는 실제로 금지합니다 쓰레기 수집.

둘째, 일부 구현 쓰레기 수집을 수행하십시오. 특히, JVM 쓰레기 수집을 목표로하는 모든 구현.

셋째, 많은 양의 쓰레기 수거를 얻는 방법이 있습니다. 모든 컴파일러와 함께. 접근 할 때 알 수 있습니다 유형 범위를 벗어나면서 언어에 물체를 저장할 수있는 공간의 공간을 따로 설정하라고 언어를 구체적으로 말하면 그 시점에서 그 공간이 파괴 될 것입니다. 나는 과거에 이것을 사용하여 가비지 컬렉션의 양식을 얻었습니다. 당신이 사용하는 선언은 다음과 같습니다.

type Foo is access Blah;
for Foo'storage_size use 100_000_000; --// 100K

이 작업을 수행하면 Foo 유형이 범위를 벗어나면 Foo Pointers가 가리키는 Blah 객체에 할당 된 모든 (100k의) 메모리가 정리됩니다. ADA를 사용하면 다른 서브 루틴 내부의 서브 루틴을 둥지로 만들 수 있으므로 특히 강력합니다.

Storage_size와 저장 풀이 당신을 위해 무엇을 할 수 있는지에 대한 자세한 내용은 LRM 13.11

넷째, 잘 작성된 ADA 프로그램은 C 프로그램만큼이나 동적 메모리 할당에 의존하는 경향이 없습니다. C 실습자들이 포인터를 사용하여 페인트 칠하는 법을 배운 많은 디자인 구멍이있었습니다. 그 많은 관용구는 Ada에서 Nessecary가 아닙니다.

우선 요즘 누가 ADA를 사용하고 있는지 알고 싶습니다. 나는 실제로 언어를 좋아하고 Linux/ADA를위한 GUI 라이브러리도 있지만, 수년간 Active ADA 개발에 대해서는 듣지 못했습니다. 군사적 관계 덕분에, 나는 그것이 고대 역사인지, 너무 성공적인지 잘 모르겠습니다. 그 사용에 대한 모든 언급이 분류됩니다.

ADA에는 GC가없는 이유가 몇 가지 있다고 생각합니다. 먼저, 가장 중요한 것은 대부분의 편집 된 언어가 주로 스택 또는 정적 메모리를 사용하거나 몇 가지 경우에 명시 적 힙을 할당/무료로 거슬러 올라갑니다. 일반 철학으로서의 GC는 실제로 1990 년 정도 떨어진 곳에서 이륙했을 때, OOP가 메모리 관리 알고리즘과 프로세서를 개선했을 때 사이클을 모두 실행할 수있을 정도로 강력한 프로세서를 개선했습니다. 단순히 ADA를 컴파일하는 것은 1989 년 IBM 4331 메인 프레임에 할 수있는 일은 단순히 무자비한 일이었습니다. 이제 기계의 CPU를 능가 할 수있는 휴대 전화가 있습니다.

또 다른 좋은 이유는 엄격한 프로그램 디자인에 메모리 자원에 대한 정확한 제어가 포함되어 있다고 생각하는 사람들이 있고, 동적 인 획득 한 객체가 떠 다니는 데 대한 내성이 없어야하기 때문입니다. 슬프게도, 너무 많은 사람들이 역동적 인 메모리가 점점 더 많은 규칙이되면서 기억을 유출했습니다. 또한, 고급 언어에 대한 어셈블리 언어의 "효율성"과 같은 ORM 시스템에 대한 원시 JDBC의 "효율성"과 마찬가지로 수동 메모리 관리의 "효율성"은 확장 할 때 반전되는 경향이 있습니다 (ORM 벤치 마크를 보았습니다. JDBC 등가가 절반에 불과한 경우). 반 직관적이지만, 나는 알고 있지만, 요즘 시스템은 전 세계적으로 대규모 응용 프로그램을 최적화하는 데 훨씬 우수하며, 피상적으로 사소한 변화에 대한 반응으로 급진적 인 다시 최적화 할 수 있습니다. 짐.

실시간 시스템이 GC 메모리를 감당할 수 없다고 말하는 사람들과 달라야 할 것이 두렵습니다. GC는 더 이상 몇 분마다 전체 시스템을 동결시키는 것이 아닙니다. 요즘 기억을 되 찾는 훨씬 더 지능적인 방법이 있습니다.

나는 무료 () 절차를 구현하는 방법에 대한 정말 간단한 예를 공유 할 것이라고 생각했다 (모든 C 프로그래머에게 친숙한 방식으로 사용될 것임) ...

with Ada.Integer_Text_IO, Ada.Unchecked_Deallocation;
use Ada.Integer_Text_IO;

procedure Leak is
   type Int_Ptr is access Integer;
   procedure Free is new Ada.Unchecked_Deallocation (Integer, Int_Ptr);

   Ptr : Int_Ptr := null;
begin
   Ptr := new Integer'(123);
   Free (Ptr);
end Leak;

프로그램이 끝날 때 무료로 전화하면 할당 된 정수를 스토리지 풀 ( "힙"으로 반환). Valgrind를 사용하여 실제로 4 바이트의 메모리가 새는 것을 방지한다는 것을 증명할 수 있습니다.

ADA.unchecked_deallocation (일반적으로 정의 된 절차)을 "새"키워드를 사용하여 할당 할 수있는 모든 유형에서 사용할 수 있습니다. ADA 참조 매뉴얼 ( "13.11.2 확인되지 않은 스토리지 거래")에 자세한 내용이 있습니다.

귀하의 질문이 잘못되었습니다. 그렇습니다. GC를 처리하는 패키지 ada.finalization을 참조하십시오.

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