Некоторая косвенность необходима для сложных программ (например, рекурсивные или структуры данных переменного размера). Однако нет необходимости реализовывать это косвенное обращение с помощью указателей.
Большинство языков программирования высокого уровня (т.е. не ассемблер) достаточно безопасны для памяти и не допускают неограниченного доступа к указателю. Семья C здесь самая странная.
C развился из B, который был очень тонкой абстракцией по сравнению с необработанной сборкой. У Б был один тип: слово. Слово может быть использовано как целое число или как указатель. Эти два эквивалентны, когда вся память рассматривается как один непрерывный массив. C сохранил этот довольно гибкий подход и продолжал поддерживать небезопасную арифметику указателей. Вся система типов C - это скорее запоздалая мысль. Эта гибкость доступа к памяти сделала C очень подходящим для его основной цели: создание прототипа операционной системы Unix. Конечно, Unix и C оказались довольно популярными, так что C также используется в приложениях, где этот низкоуровневый подход к памяти на самом деле не нужен.
Если мы посмотрим на языки программирования, которые были до C (например, диалекты Fortran, Algol, включая Pascal, Cobol, Lisp, ...), то некоторые из них поддерживают указатели, подобные C. Примечательно, что концепция нулевого указателя была изобретена для Algol W в 1965 году. Но ни один из этих языков не пытался быть C-подобным, эффективным языком систем с низкой абстракцией: Fortran предназначался для научных вычислений, Algol разработал несколько довольно продвинутых концепций, Lisp был больше исследовательский проект, чем язык промышленного уровня, и Cobol был сосредоточен на бизнес-приложениях.
Сбор мусора существовал с конца 50-х годов, то есть задолго до C (начала 70-х). Для правильной работы GC требуется безопасность памяти. Языки до и после C использовали GC как обычную функцию. Конечно, это делает язык намного сложнее и, возможно, медленнее, что было особенно заметно во времена мэйнфреймов. Языки GC, как правило, ориентированы на исследования (например, Lisp, Simula, ML) и / или требуют мощных рабочих станций (например, Smalltalk).
С меньшими, более мощными компьютерами вычисления в целом и языки GC, в частности, стали более популярными. Для приложений не в реальном времени (а иногда даже тогда) GC сейчас является предпочтительным подходом. Но алгоритмы GC также были предметом интенсивных исследований. В качестве альтернативы улучшена безопасность памяти без GC, особенно в последние три десятилетия: заметными нововведениями являются RAII и интеллектуальные указатели в C ++ и средство проверки системы / заимствования Rust.
Java не вводила новшеств, будучи безопасным для памяти языком программирования: она в основном брала семантику GCed, безопасного языка памяти Smalltalk, и сочетала их с синтаксисом и статической типизацией C ++. Затем он продавался как лучший, более простой C / C ++. Но это только внешне потомок C ++. Отсутствие указателей в Java во многом связано с объектной моделью Smalltalk, а не с отказом от модели данных C ++.
Таким образом, «современные» языки, такие как Java, Ruby и C #, не должны интерпретироваться как преодоление проблем необработанных указателей, таких как C, но должны рассматриваться как основанные на многих традициях - включая C, но также и на более безопасных языках, таких как Smalltalk, Simula, или Лисп.