LINUX.ORG.RU

Garbage Collector для собственных объектов.

 , ,


1

4

Доброго дня.

А есть какая-нить книга/дока в которой написано как GC реализовать для своего языка?

Сейчас пишу для саморазвития реализацию интерпретатора из книги http://interpreterbook.com/ Пишу на С++. И вот понял, что нужно писать что-то типа GC. Потому как разрулить времена жизней путем shared/weak указателей я не осилил.

Может делал кто подобное?

Посмотри реализацию в том же perl. У Шилдта (надо будет клавиатуру протереть и руки помыть после написания этой фамилии) в этой книге разобрано написание GC для C++ и написание интерпретатора C++ (вроде с GC).

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

точно. У меня ж эта книга даже есть, но так и не добрался. Спасибо, что напомнил.

Посмотри реализацию в том же perl.

Я смотрел lua, говорят там проще. Но это как читать, когда все слова понятны, а общий смысл не доходит. Поэтому теорию хочу.

seryoga
() автор топика

Книг не помню, но на Coursera раньше был курс по компиляторам и в нём была часть видео на эту тему. Первое тут и несколько следующих тоже о GC.

xaizek ★★★★★
()

И вот понял, что нужно писать что-то типа GC. Потому как разрулить времена жизней путем shared/weak указателей я не осилил.

Как будто первое проще, чем второе...

UVV ★★★★★
()

Потому как разрулить времена жизней путем shared/weak указателей я не осилил.

и правильно, так как их нужно использовать чуть чаще, чем голые владеющие указатели - т.е. почти никогда

правильный подход - стандартные контейнеры и unique_ptr, в общем, гугл RAII

next_time ★★★★★
()

А есть какая-нить книга/дока в которой написано как GC реализовать для своего языка?

THE GARBAGE COLLECTION HANDBOOK

utf8nowhere ★★★
()
Ответ на: комментарий от next_time

Потому как разрулить времена жизней путем shared/weak указателей я не осилил.

и правильно, так как их нужно использовать чуть чаще, чем голые владеющие указатели - т.е. почти никогда

Но как же тогда диды писали и пишут на Си??

Virtuos86 ★★★★★
()
Ответ на: комментарий от next_time

стандартные контейнеры и unique_ptr

Ошн может быть. AST на них и строится. Вопрос у меня с окружением, которое могут «держать» несколько замыканий. Да и объекты не очень удобно в юниках держать, так как придется полностью их копировать при присваиваниях.

seryoga
() автор топика

А общем накачал себе книгу, которую посоветовал utf8nowhere. Выглядит многообещающе. Книга Шилда из первого ответа описывает GC на подсчете ссылок. То есть фактически просто список shared_ptr, что не решает проблем с циклами. До http://www.hboehm.info/gc пока не добрался, думаю лучше сначала накачаться веществ теорией.

Еще сейчас накорябал нечто вроде простого GC c небольшим анализом окружения, который может решить вот такое например

let test = fn( ) {
  let a = [1, 2, 3, 4, 5]
  let impl0 = fn( ) { a }
  let impl1 = impl0
  let impl  = fn( ) { impl1 }
  return impl( )
}
let r0 = test( ) 
let r1 = test( )
r0()[0] = 100
r1()[0] = -100

r0( ) // [100, 2, 3, 4, 5]
r1( ) // [-100, 2, 3, 4, 5]

r0 = r1 = 0 // уничтожит окружения 

но не может пока решить вот такое:

let rec = fn( c ) {
  let test = fn( ) {
    let a = [1, 2, 3, 4, 5]
    let impl0 = fn( ) { a }
    let impl1 = impl0
    let impl  = fn( ) { impl1 }
    return impl( )
  }
  let tmp = test
  if( c > 0 ) {
     rec( c - 1 )
  } else {
     tmp( )
  }
}

let r0 = rec( 10 ) 
let r1 = rec( 10 )
r0()[0] = 100
r1()[0] = -100

r0( ) // [100, 2, 3, 4, 5]
r1( ) // [-100, 2, 3, 4, 5]

r0 = r1 = 0 // вот тут утечка будет из-за `let tmp = test`

Думаю это надо как-то графами разруливать нужно.

В общем всем спасибо, буду курить теорию.

seryoga
() автор топика
Ответ на: Hans Boemh's GC от anonymous

в Project Oberon есть простой mark-and-sweep GC, написаный на паскале обероне.

в Nim есть тоже GC написанный сам на себе, на Nim.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.