복잡한 프로그램 (예 : 재귀 또는 가변 크기 데이터 구조)에는 어떤 종류의 간접적 인 지시가 필요합니다. 그러나 포인터를 통해이 간접 명령을 구현할 필요는 없습니다.
대부분의 고급 프로그래밍 언어 (예 : 어셈블리가 아님)는 상당히 메모리 안전하며 무제한 포인터 액세스를 허용하지 않습니다. C 가족은 여기에서 이상합니다.
C는 원시 어셈블리에 대한 매우 얇은 추상화였던 B에서 진화했습니다. B는 단일 유형 인 단어입니다. 단어는 정수 또는 포인터로 사용될 수 있습니다. 이 두 가지는 전체 메모리가 하나의 연속 배열로 볼 때 동일합니다. C는이 유연한 접근 방식을 유지했으며 본질적으로 안전하지 않은 포인터 산술을 계속 지원했습니다. C의 전체 유형 시스템은 나중에 생각할 것입니다. 메모리 액세스에 대한 이러한 유연성 덕분에 C는 Unix 운영 체제 프로토 타이핑이라는 주요 목적에 매우 적합했습니다. 물론 유닉스와 C는 꽤 인기가 있었기 때문에 메모리에 대한 저수준 접근이 실제로 필요하지 않은 응용 프로그램에서도 C가 사용됩니다.
C 이전의 프로그래밍 언어 (예 : Fortran, Algol dialects in Pascal, Cobol, Lisp 등)를 보면 C와 같은 포인터를 지원하는 언어가 있습니다. 특히, 널 포인터 개념은 1965 년 Algol W에 대해 발명되었습니다. 그러나 그러한 언어 중 어느 것도 C와 같은 효율적인 저 추출 시스템 언어로 시도하지 않았습니다. Cobol은 업계 수준의 언어보다 더 많은 연구 프로젝트를 수행했으며 비즈니스 응용 프로그램에 중점을 두었습니다.
가비지 콜렉션은 50 년대 후반, 즉 C 이전 (70 년대 초) 이전에 존재했습니다. GC가 제대로 작동하려면 메모리 안전이 필요합니다. C 이전과 이후의 언어는 GC를 일반 기능으로 사용했습니다. 물론 이것은 언어를 훨씬 더 복잡하고 느리게 만들어 주는데, 이는 특히 메인 프레임 시대에 두드러졌습니다. GC 언어는 연구 중심적 (예 : Lisp, Simula, ML)이거나 강력한 워크 스테이션 (예 : 스몰 토크)이 필요한 경향이있었습니다.
일반적으로 컴퓨터가 작고 강력한 컴퓨터를 사용하고 GC 언어가 더 대중화되었습니다. 비 실시간 응용 프로그램의 경우 (때로는 때때로) GC가 선호되는 방식입니다. 그러나 GC 알고리즘은 또한 강렬한 연구의 주제였습니다. 대안으로, 특히 지난 30 년 동안 GC가없는 더 나은 메모리 안전성이 추가로 개발되었습니다. 주목할만한 혁신은 C ++의 RAII 및 스마트 포인터 및 Rust의 평생 시스템 / 빌러 검사기입니다.
Java는 메모리 안전 프로그래밍 언어로 혁신을 이루지 못했습니다. 기본적으로 GCed, 메모리 안전 스몰 토크 언어의 의미를 취하고이를 C ++의 구문 및 정적 형식과 결합했습니다. 그런 다음 더 좋고 간단한 C / C ++로 판매되었습니다. 그러나 그것은 피상적으로 C ++ 자손입니다. Java의 포인터 부족은 C ++ 데이터 모델을 거부하는 것보다 스몰 토크 객체 모델에 더 많이 있습니다.
따라서 Java, Ruby 및 C #과 같은 "현대"언어는 C에서와 같이 원시 포인터의 문제를 극복하는 것으로 해석되어서는 안되며 C를 포함한 많은 전통에서 유래 한 것뿐만 아니라 Smalltalk, Simula, 또는 Lisp.