Существует ли язык с подсчетом RAII + Ref, в котором нет небезопасной арифметики указателей? - PullRequest
6 голосов
/ 17 января 2010

RAII = Приобретение ресурса - инициализация

Ref Counting = "GC бедного человека"

Вместе они довольно мощные (как пересчитанный 3D-объект, содержащий VBO, который он высвобождает при вызове деструктора).

Теперь вопрос в том, существует ли RAII в любом языке, кроме C ++? В частности, язык, который не допускает переполнения арифметических / буферных указателей?

Ответы [ 6 ]

3 голосов
/ 17 января 2010

Хотя это и не совсем RAII, в Python есть оператор с оператором , а в C # - оператор , использующий.

3 голосов
/ 17 января 2010

D имеет RAII, но все еще имеет арифметику с указателями :( НО, вам на самом деле не нужно его использовать. Пожалуйста, обратите внимание, что получение D на работу было для меня болью в заднице, поэтому я просто говорю.

2 голосов
/ 17 января 2010

Python (стандартный CPython, а не такие варианты, как Jython, Unladen Swallow и IronPython) использует подсчет ссылок для своих объектов.

При этом он также имеет RAII и (в основном) детерминированную сборку мусора. Например, это должно работать при детерминированном закрытии файлов:

def a():
   fp = open('/my/file', 'r')
   return fp.read()

Примечание fp.close() никогда не вызывается. Как только fp выходит из области видимости, объект должен быть уничтожен. Однако в некоторых случаях детерминированная финализация не гарантируется, например:

  • Что-то генерирует исключение, и в настоящее время выполняется обратный вызов или на него сохраняется ссылка (примечание sys.last_traceback сохраняет последний обратный вызов)
  • В объекте существуют циклические ссылки, в результате чего счетчик ссылок не обнуляется

Следовательно, хотя python теоретически имеет детерминистическую финализацию, лучше явно закрыть любые ресурсы, где возможно исключение (например, IOError или подобное), которое может привести к тому, что объект останется живым.

2 голосов
/ 17 января 2010

perl, python (C), php и tcl имеют счетчик ссылок и имеют механизмы для уничтожения объекта, когда его счетчик ссылок становится равным нулю, что может произойти, как только переменная выйдет из области видимости.встроенные типы выпускаются автоматически.У пользовательских классов есть способ определить деструктор, который будет вызываться при выпуске.

Существуют некоторые крайние случаи: глобальные переменные могут не освобождаться до конца, а циклические ссылки не могут быть освобождены до концахотя php недавно реализовал gc, который обрабатывает этот случай, а python 2 добавил детектор циклов).

2 голосов
/ 17 января 2010

В Perl 5 есть подсчет ссылок и деструкторы, которые гарантированно будут вызываться, когда все ссылки выходят за рамки, поэтому RAII доступен на языке, хотя большинство программистов на Perl не используют этот термин.

ИPerl 5 не предоставляет необработанных указателей на код Perl.

Однако Perl 6 имеет настоящий сборщик мусора и фактически позволяет отключать сборщик мусора;поэтому нельзя полагаться на то, что вещи собираются в каком-то определенном порядке.

Я считаю, что Python и Lua используют подсчет ссылок.

1 голос
/ 05 июля 2014

Vala управление памятью объектов основано на подсчете ссылок и имеет RAII (в том смысле, что его деструкторы называются детерминистически). Типичный вариант использования - создание графических интерфейсов, где издержки от пересчета часто незначительны. Вы можете использовать указатели и обойти пересчет, например, для совместимости или если вам нужна дополнительная производительность, но в большинстве случаев вы можете жить без указателей. Он также делает что-то умное, вы можете пометить ссылки как owned или unowned и передать право собственности, и во многих случаях он может исключить подсчет ссылок (например, если объект не экранирует функцию). Vala тесно связана с GObject / GTK, поэтому использовать ее имеет смысл, только если вы хотите работать в этой экосистеме.

Другим интересным кандидатом будет Rust . Хотя он также имеет указатели и сборщик мусора, оба являются необязательными. Вы можете писать программы полностью с эквивалентом интеллектуальных указателей C ++, с гарантией отсутствия утечек, и он поддерживает RAII. У него также есть понятие ссылочной собственности, как у Vala, но немного более сложное. По сути, Rust дает вам полный контроль над тем, как вы управляете памятью. Вы можете работать на уровне «голого металла» и даже написать ядро ​​в нем, или вы можете работать на высоком уровне с GC, или чем-то промежуточным, и большую часть времени это защищает вас от утечки памяти или других указателей. связанные ошибки. Недостатком является то, что он довольно сложный, и, поскольку он все еще находится в разработке, все может измениться.

...