Garbage collection (gc) 질문.

jwg286의 이미지

안녕하세요.

여러분들중에 자신의 프로그램에 garbage collection 을 넣어 보신 분 계신지 궁금합니다.

일반적으로 gc 는 프로그램 전체 단위로 적용하는게 보통인데, 모듈별로 (c 프로그램에서) gc 를 넣은 경험이 있으신 분이 있으신가요?

gc 가 적용된 메모리 관리시 어떻게 짜는게 효율적인지 궁금하네요. 물론 multi-thread 쪽으로요.

LispM의 이미지

jwg wrote:
안녕하세요.
gc 가 적용된 메모리 관리시 어떻게 짜는게 효율적인지 궁금하네요. 물론 multi-thread 쪽으로요.

쓰레드를 사용하든 그렇지 않든 간에 쓰레기가 많이 생기지 않도록 프로그래밍 하는 것이 효율적이고 제대로 된 사용입니다. 그렇게 하려면 때때로 memoize와 같은 테크닉을 사용하거나 pool 등을 만들어서 객체를 재사용 하는 것이 좋습니다. 그런 테크닉은 low 레벨 프로그래밍 언어로도 가능하지만 제대로 구현하려면 아무래도 high레벨 프로그래밍 언어를 사용하는 것이 상대적으로 쉽다는 것을 염두해 두세요. 프로그래밍 할 때 '여기서 필요 이상의 쓰레기가 생기겠다' 하는 것을 판단할 수 있는 안목이 있어야 하고, 필요하다면 쓰레기 발생량을 줄일 줄 알아야 합니다.

일단 쓰레기 발생을 최대한 막으면서 프로그래밍했는데도 불구하고 GC에 문제가 있다면, GC의 파라미터를 조정해야 하는데, 이런 경우는 거의 안 일어나야 정상입니다. 이렇게 되면 특정 GC 알고리듬에 어플리케이션이 발목을 묶여 버릴 수 있기 때문입니다.

http://lisp.or.kr http://lisp.kldp.org - 한국 리습 사용자 모임

jwg286의 이미지

질문을 조금만 더 드리겠습니다.

LispM wrote:
그런 테크닉은 low 레벨 프로그래밍 언어로도 가능하지만 제대로 구현하려면 아무래도 high레벨 프로그래밍 언어를 사용하는 것이 상대적으로 쉽다는 것을 염두해 두세요.

Low 레벨 프로그래밍 언어는 어떤 종류를 말씀하시는 거구, high 레벨 프로그래밍 언어는 무엇을 말하는지 조금만 더 이야기 해주시기 바랍니다.

지금 저의 경우, C 를 사용하고 있습니다. C 의 경우, medium 정도 되서요.

Quote:
프로그래밍 할 때 '여기서 필요 이상의 쓰레기가 생기겠다' 하는 것을 판단할 수 있는 안목이 있어야 하고, 필요하다면 쓰레기 발생량을 줄일 줄 알아야 합니다.

음.. 안목을 기르는 것이 무척 중요하다고 저도 생각하고 있는데요, 이 안목이라는 것이 경험이 아니면 얻기 참 힘든 것 같습니다. 좀 더 보는 눈을 높이기 위해서는 어떤 과정이 필요하나요?

그리고 쓰레기 발생량을 줄일 줄 알아야 한다고 말씀하셨는데, 구조체의 배열을 정적 할당으로 만들어야 된다는 건가요? 아니면 동적 할당으로 하되, GC 의 alloc 와 다른 malloc 을 직접 사용하시라는 말씀이신지. 제가 알기로는 gc 의 경우, mark pointer 를 이용해서, 나중에 GC 시 제외되는 것을 체크할 수 있도록 배려를 하는 것으로 알고 있는데, 어떠한 방식쪽으로 하는 것이 쓰레기 발생량을 줄일 수 있다는 건지 궁금합니다.

그리고 마지막으로. :-)

Quote:

일단 쓰레기 발생을 최대한 막으면서 프로그래밍했는데도 불구하고 GC에 문제가 있다면, GC의 파라미터를 조정해야 하는데, 이런 경우는 거의 안 일어나야 정상입니다.

GC 에 문제가 발생한다는 것은 어떤 의미로 말씀하신 건가요? 예로 설명해 주시면 정말 감사하겠습니다.

질문이 많아 죄송합니다. gc 에 초보라서. ^^;

답변해 주셔서 정말 감사합니다.

익명 사용자의 이미지

jwg wrote:

지금 저의 경우, C 를 사용하고 있습니다. C 의 경우, medium 정도 되서요.

제 기준으로는 Low 레벨 입니다. :) 제가 말한 High 레벨은 스몰토크, 리습, 등 메모리 alloc/free 등이 불가능한 프로그래밍 언어들이 되겠습니다.

Quote:

그리고 쓰레기 발생량을 줄일 줄 알아야 한다고 말씀하셨는데, 구조체의 배열을 정적 할당으로 만들어야 된다는 건가요? 아니면 동적 할당으로 하되, GC 의 alloc 와 다른 malloc 을 직접 사용하시라는 말씀이신지. 제가 알기로는 gc 의 경우, mark pointer 를 이용해서, 나중에 GC 시 제외되는 것을 체크할 수 있도록 배려를 하는 것으로 알고 있는데, 어떠한 방식쪽으로 하는 것이 쓰레기 발생량을 줄일 수 있다는 건지 궁금합니다.

High 레벨 언어에서는 대부분 동적 할당 + GC만 있기 때문에 앞서 말한 memoize나 pool을 이용한 객체 재사용 등 다른 테크닉들이 발달했습니다. 프로그래머가 직접 메모리를 alloc/free 해준다면 GC가 불필요해지겠죠.

Quote:

GC 에 문제가 발생한다는 것은 어떤 의미로 말씀하신 건가요? 예로 설명해 주시면 정말 감사하겠습니다.

(대부분 그렇지 않지만) 여러가지 테크닉으로 GC를 최적화했다고 생각해도 원하는 것을 얻지 못하는 경우가 있습니다(예를들면 GC가 그래도 빈번히 일어난다). High 레벨 언어라면 GC 알고리듬등을 알고 있어야 하는 불편함이 없어야 하지만, 이런 경우 어쩔 수 없이 GC의 파라미터 조정을 위해 알아야 합니다. "GC에 문제가 발생"한다는 것은 파라미터를 조정해야 하는 문제가 발생하는 것을 말한 것입니다. 단, 이런 경우는 거의 일어나지 않아야 정상입니다.

Low 레벨 프로그래밍 언어에서도 GC를 사용하는 것이 불가능 한것은 아니지만 필요이상으로 많은 시간을 자신이 풀어야 할 문제이외의 것에 투입하게될 가능성이 있으므로, 잘 판단하여 결정하시는 것이 좋을 듯.

accent88의 이미지

jwg wrote:

여러분들중에 자신의 프로그램에 garbage collection 을 넣어 보신 분 계신지 궁금합니다.

자신의 프로그램이라고 하는 것은 user application을 의미하시는 건가요? 일반적으로 이렇게 되면 해당 application에 dedicated된 gc가 되어버리기 때문에 재사용도 힘들어질 뿐만 아니라 때로는 application의 debugging보다도 GC쪽 debugging 때문에 배보다 배꼽(?)이 커질 수도 있습니다. 그래서 보통 System + Language 의 지원 형태로 GC가 제공이 됩니다.

jwg wrote:

일반적으로 gc 는 프로그램 전체 단위로 적용하는게 보통인데, 모듈별로 (c 프로그램에서) gc 를 넣은 경험이 있으신 분이 있으신가요?

모듈별로 gc를 넣는다는 것은 예를 들어 C 언어에서 malloc/free를 사용하여 명시적으로 메모리 관리를 하겠다는 것과 동시에 GC에서 제공해주는 api등을 통해 자동적으로 메모리를 관리하겠다는 것으로도 해석이 되는군요. 물론 이 방법도 가능하긴 합니다. 일반적으로 명시적 또는 자동화된 메모리 관리 방법 둘 중 한가지만을 제공하는데(C는 전자, Java는 후자) 두 개를 동시에 적용한 예는 없습니다만 전혀 불가능하지도 않을 것 같습니다.

C/C++ 에서 GC를 이용하고 싶으시다면 아래 GC의 대가 Hans Boehm의 library를 이용해보시지요.
http://www.hpl.hp.com/personal/Hans_Boehm/gc/index.html

jwg286의 이미지

Quote:

High 레벨 언어에서는 대부분 동적 할당 + GC만 있기 때문에 앞서 말한 memoize나 pool을 이용한 객체 재사용 등 다른 테크닉들이 발달했습니다. 프로그래머가 직접 메모리를 alloc/free 해준다면 GC가 불필요해지겠죠.

결과적으로 C 수준의 언어에서 자신의 user application 에서 gc 를 사용할 경우, 직접 메모리 alloc 는 되도록 피하고, GC 에게 전체 메모리 관리를 맡기는 것이 좋다는 말씀으로 알겠습니다. :-) 좋은 말씀 감사합니다.

Quote:

"GC에 문제가 발생"한다는 것은 파라미터를 조정해야 하는 문제가 발생하는 것을 말한 것입니다.

파라미터가 무엇을 뜻하는지 제가 잘 이해를 못하겠습니다. 기본적인 mark-sweep 의 경우, Parameter 를 조절하는 부분은 제가 보는 C 코드에서는 존재하지 않습니다. 오히려 balanced tree 가 되지 못할 경우를 주위하라고 합니다. 어떤 역활을 하는 파라미터를 말씀하시는지 답변해 주시면 감사하겠습니다.

Quote:

자신의 프로그램이라고 하는 것은 user application을 의미하시는 건가요? 일반적으로 이렇게 되면 해당 application에 dedicated된 gc가 되어버리기 때문에 재사용도 힘들어질 뿐만 아니라 때로는 application의 debugging보다도 GC쪽 debugging 때문에 배보다 배꼽(?)이 커질 수도 있습니다. 그래서 보통 System + Language 의 지원 형태로 GC가 제공이 됩니다.

동의를 할 수 없는 부분이 있습니다. 물론 구현과 시각의 문제가 있을 수 있겠지만, application 에 dedicated 된 gc 가 된다는 것은 동의할 수 없습니다. 라이브러리 형태로도 제작을 할 수 있기 때문입니다. accent88 님께서 말씀해 주신 Hans Boehm의 library 또한 그러한 형식으로 제공되는 것이구요. 물론 대부분의 gc 의 경우, application 에서 효율적인 관리를 위해서 전역 변수?로 관리를 하기 때문에 application 에 dedicated 된 gc 가 될 수 밖에 없는 듯 합니다. 이 부분은 앞에서 말씀드린 구현과 시각의 문제인 듯 합니다.

제가 알기로는 GC 를 적용해야 하는 프로그램은 보통 작은 프로그램이 아닐 것입니다. Compiler 나 virtual machine 이나, web browser 등등 나름대로 큰 프로그램에서 채용을 하는 것으로 알고 있구요. 거기에 비한다면 gc 는 사실 사소한 것이 아닐까합니다. 물론 알고리즘의 복잡도에 따라서 그 구현에 따른 시간이 무시하지 못할 정도로 들 수 있겠지만, 프로젝트의 수준에 따라서 알고리즘 수준을 적당히 선택한다면 java, perl, lisp 등등 자동 GC 가 적용된 컴파일러가 아니더라도, C 와 같은 GC 가 적용안되는 application 수준에서 gc 를 간단히 구현, 적용 가능한 것 같습니다.

Quote:

모듈별로 gc를 넣는다는 것은 예를 들어 C 언어에서 malloc/free를 사용하여 명시적으로 메모리 관리를 하겠다는 것과 동시에 GC에서 제공해주는 api등을 통해 자동적으로 메모리를 관리하겠다는 것으로도 해석이 되는군요. 물론 이 방법도 가능하긴 합니다. 일반적으로 명시적 또는 자동화된 메모리 관리 방법 둘 중 한가지만을 제공하는데(C는 전자, Java는 후자) 두 개를 동시에 적용한 예는 없습니다만 전혀 불가능하지도 않을 것 같습니다.

원래 질문의 의도를 위에서 accent88 님께서 잘 정리해 주신 것 같습니다. ㅡ.ㅠ 즉, 명시적인 메모리 관리 방법과 자동화된 메모리 관리 방법을 둘다 혼합해서 사용하는 것은 어리석은 것인가 였습니다.

모듈별로 gc 를 넣는다는 것은 실제 프로그램을 큰 조각으로 나누었을 때, 특정 조각에서만 gc 를 사용하도록 할 수 있느냐의 질문이었습니다. 그리고 이를 실제로 적용한 경험이 있으신 분들에 대한 이야기를 듣고 싶었습니다.

지금도 듣고 싶습니다. :o

익명 사용자의 이미지

jwg wrote:

Quote:

"GC에 문제가 발생"한다는 것은 파라미터를 조정해야 하는 문제가 발생하는 것을 말한 것입니다.

파라미터가 무엇을 뜻하는지 제가 잘 이해를 못하겠습니다. 기본적인 mark-sweep 의 경우, Parameter 를 조절하는 부분은 제가 보는 C 코드에서는 존재하지 않습니다. 오히려 balanced tree 가 되지 못할 경우를 주위하라고 합니다. 어떤 역활을 하는 파라미터를 말씀하시는지 답변해 주시면 감사하겠습니다.


하하 꽤나 집요하시군요. 참고로 제가 사용하는 제품의 GC 파라미터 조정관련 매뉴얼 링크를 겁니다.
http://www.lispworks.com/reference/lw43/LWRM/html/lwref-181.htm#marker-1043124

제 의견으로는 GC를 갖고 있는 프로그래밍 언어를 주 언어로 프로그래밍 하고 Low 레벨 부분이 필요한 경우 그런 언어에서 제공하는 외부함수인터페이스(Foreign Function Interface, FFI)를 사용하는 편이 훨씬 자연스럽고 문제발생시 해결하기 쉽습니다.
하고자 하시는 일은 무슨 이유에서 GC를 필요로 하는지는 모르겠지만, 문제 자체가 GC를 사용하는 것이 편하다면 왜 GC를 갖고 있는 프로그래밍 언어를 사용하지 않는지 궁금하군요. 예를 들자면 스몰토크나 커먼리습은 GC를 갖춘것이 족히 20-30년 이상 되기 때문에 GC 자체에 대해 여러 문제들이 해결된 안정된 제품들이 있지만, 그렇지 않은 프로그래밍 언어에서 제공하는 GC가 얼마나 쓸만한 물건인지는 의문입니다.
Low레벨언어에서 High레벨 언어의 기능을 구현하는 것이 가능하다 불가능하다 이야기가 아니라 얼마나 편하고 안정적인가 하는 이야기입니다.
소스코드없는 상업용 GC의 버그를 찾아낸 적도 있었는데 그 이후 어설프게 구현된 GC가 의외로 많다는 것을 깨달았습니다. 그런 GC를 부자연스러운 프로그래밍 언어와 함께 쓰는것 자체가 큰 모험입니다. 물론 개발 대상이 자주 리부팅해도 된다면 괜찮겠지만 말입니다(사실 GC는 그 반대의 경우를 위해 존재하는 것이지만).
개인적으로 GC를 지원하는 프로그래밍 언어와 그렇지 않은 프로그래밍 언어(프로그래머가 직접 alloc/free해야 하는 부분이 존재하는 언어)를 섞어 쓴다면, 대략 95:5 비율 정도가 되어야지 예를들어 50:50이라고 한다면 오히려 예상치 못한 문제를 해결하는 비용이 GC로 얻는 이득보다 클 수 있다고 생각합니다.
(메모리 관리 부분 버그는 악몽이지만, GC의 버그는 그중에에서도 최악입니다. Reproduce하기가 상당히 어렵거든요.)

LispM의 이미지

손님이 되어버려서 수정이 안되는 군요 :(

Anonymous wrote:
jwg wrote:

Quote:

"GC에 문제가 발생"한다는 것은 파라미터를 조정해야 하는 문제가 발생하는 것을 말한 것입니다.

파라미터가 무엇을 뜻하는지 제가 잘 이해를 못하겠습니다. 기본적인 mark-sweep 의 경우, Parameter 를 조절하는 부분은 제가 보는 C 코드에서는 존재하지 않습니다. 오히려 balanced tree 가 되지 못할 경우를 주위하라고 합니다. 어떤 역활을 하는 파라미터를 말씀하시는지 답변해 주시면 감사하겠습니다.


하하 꽤나 집요하시군요. 참고로 제가 사용하는 제품의 GC 파라미터 조정관련 매뉴얼 링크를 겁니다.
http://www.lispworks.com/reference/lw43/LWRM/html/lwref-181.htm#marker-1043124

말씀하신 C용 GC의 경우는 조정할 수 있는 파라미터가 없을 수도 있습니다. 개인적으로 그런 완성도가 떨어지는 GC를 사용하는 것은 피하겠습니다.

http://lisp.or.kr http://lisp.kldp.org - 한국 리습 사용자 모임

chunsj의 이미지

jwg wrote:
모듈별로 gc 를 넣는다는 것은 실제 프로그램을 큰 조각으로 나누었을 때, 특정 조각에서만 gc 를 사용하도록 할 수 있느냐의 질문이었습니다. 그리고 이를 실제로 적용한 경험이 있으신 분들에 대한 이야기를 듣고 싶었습니다.

지금도 듣고 싶습니다. :o

이전에 정부 지원 프로젝트를 할 때(학교에 있던 시절입니다.) 최적화를 수행하는 부분에 GC(Boehm)를 사용했던 적이 있습니다. 웃긴 것은 malloc/free를 일일이 손으로 한 것에 비해서 상당히 빨랐다는 것입니다. (나중에 물론 알았지만, 미리 크게 할당을 하고 따로 메모리를 관리하면 속도가 더 빨라진다는 것을 알았습니다, 그래서 수정을 했죠, 제가 직접 메모리 풀을 만들고 관리하는 식으로... 하지만 GC를 쓴 것에 비해서 크게 성능상의 이득이 있었던 것 같지는 않습니다. 제가 쓴 GC라이브러리가 상당한 성능을 보여주더군요.)
요는, 문제 없더라 입니다. 그런데, 특별히 한 부분만 쓰고 다른 부분을 쓰지 말아야 하는 이유가 있나요? 저는 다른 학교와 협업이어서 그 코드는 제가 바꾸고 싶지 않아서 따로 따로 했었습니다. 그리고 UI부분은 윈도의 모든 플랫폼에서 돌아야 되어서 (그당시 제가 뭔가를 잘 못했는지는 몰라도 UI부분에도 GC를 적용하면 95/98에서 오류가 잘 나는 경향이 있었습니다.) 그런 부분은 어쩔 수 없이 직접하는 방법을 사용했습니다.
그리고 GC를 써서 이득을 얻으려면 자주 할당과 해제를 반복하는 경우에는 이득이 크지만 그렇지 않다면 코드상의 이득도, 성능상의 이득도 별로 없는 것으로 알고 있습니다.

jwg286의 이미지

안녕하세요~ ^0^ 저를 귀찮게 생각하지 마시고, 그냥 단순한 회사원(ㅠ.ㅠ 학생때가 그리운)으로 생각해 주세요~

Quote:

하하 꽤나 집요하시군요. 참고로 제가 사용하는 제품의 GC 파라미터 조정관련 매뉴얼 링크를 겁니다.
http://www.lispworks.com/reference/lw43/LWRM/html/lwref-181.htm#marker-1043124

:-) LispM 님께서 올려주신 link, 잘 보았습니다. 파라미터가 memory 및 object 에 관한 조절이었군요. 이런 부분은 c 에서도 조정이 가능합니다. 물론 lisp 처럼 세세하게 지정하는 것은 어렵습니다. ^^ 사실 제가 Lisp 는 거의 모르는 지라, Lisp 관련 gc 파라미터가 무엇을 뜻하는지 정확하게 몰랐습니다. 보내주신 link 잘 보았습니다.

Quote:

하고자 하시는 일은 무슨 이유에서 GC를 필요로 하는지는 모르겠지만, 문제 자체가 GC를 사용하는 것이 편하다면 왜 GC를 갖고 있는 프로그래밍 언어를 사용하지 않는지 궁금하군요. 예를 들자면 스몰토크나 커먼리습은 GC를 갖춘것이 족히 20-30년 이상 되기 때문에 GC 자체에 대해 여러 문제들이 해결된 안정된 제품들이 있지만, 그렇지 않은 프로그래밍 언어에서 제공하는 GC가 얼마나 쓸만한 물건인지는 의문입니다.

Quote:

그런데, 특별히 한 부분만 쓰고 다른 부분을 쓰지 말아야 하는 이유가 있나요?

저의 경우, gc 를 지원하지 않는 low 레벨에서의 프로그래밍을 해야 하기 때문에 이러한 고민을 하고 있는 것입니다.

하고자 하는 일은 단순히 다음과 같이 비유 할 수 있겠습니다. Java Virtual machine 이 있다면, 각 class 에 대한 load 시 각각의 thread 를 생성시키고, 해당 bytecode 를 실행하면서 각 bytecode 상황에 따라서 gc 를 해야 합니다. 물론 하나의 class 만 load 되는 것이 아닙니다. 여러개가 동시에 올라갈 수 있어야 합니다. 단순히 OS 의 process 개녕이라고 생각하셔도 됩니다. (GC 를 사용하든, 다른 MM 알고리즘을 사용하든 모두 서울로 가기만 하면 됩니다.) 나중에 OS 수준으로 구현이 되어야 합니다. 즉 플로피를 넣고 부핑하면 os 가 떠면서 class 가 load 되는 형식이라고 할까요. 그래서 OS 수준의 구현을 고려해서 언어 c 를 선택하였습니다. 그래서 high 레벨에서 구현하자니, linux 같은 reference 를 제가 찾을 수 없어 고민입니다.

이와 유사한 상황을 경험하신 분들은 이것을 특히, 메모리 관리 부분에서 어떻게 해결하며 나아가셨는지요. 물론 다른 gc 를 유용하게 사용했을 때의 경험도 정말 환영합니다.

Quote:

말씀하신 C용 GC의 경우는 조정할 수 있는 파라미터가 없을 수도 있습니다. 개인적으로 그런 완성도가 떨어지는 GC를 사용하는 것은 피하겠습니다.

하지만, 완성도가 떨어지는 GC 를 사용하고 있는 것이 C 에서는 현실입니다. 예를 들어 설명한다면 안정적이라는 평가를 받고 있는 gcc, kaffe (java virtual machine) 등등이 c 언어로 구성된 gc 를 사용하고 있습니다. gcc 는 bag-of-pages garbage collector 를, kaffe 는 tricolor scheme garbage collector 를 내부적으로 사용하고 있습니다. 물론 안정적으로 프로그램을 실행되구요.

제가 high 레벨의 언어를 사용할 수 없기 때문에, 저에게 주어진 선택권은 그렇게 많이 않습니다. 다른 C application 에서 사용하는 것을 reference 하는 수준으로 실제 gc 가 적용된 model 을 찾는 것입니다. 물론 LISP 와 같이 오랜 시간 동안 검증받은 컴파일러를 저는 존경합니다.

Quote:

이전에 정부 지원 프로젝트를 할 때(학교에 있던 시절입니다.) 최적화를 수행하는 부분에 GC(Boehm)를 사용했던 적이 있습니다. 웃긴 것은 malloc/free를 일일이 손으로 한 것에 비해서 상당히 빨랐다는 것입니다. (나중에 물론 알았지만, 미리 크게 할당을 하고 따로 메모리를 관리하면 속도가 더 빨라진다는 것을 알았습니다, 그래서 수정을 했죠, 제가 직접 메모리 풀을 만들고 관리하는 식으로... 하지만 GC를 쓴 것에 비해서 크게 성능상의 이득이 있었던 것 같지는 않습니다. 제가 쓴 GC라이브러리가 상당한 성능을 보여주더군요.)
요는, 문제 없더라 입니다. 그런데, 특별히 한 부분만 쓰고 다른 부분을 쓰지 말아야 하는 이유가 있나요? 저는 다른 학교와 협업이어서 그 코드는 제가 바꾸고 싶지 않아서 따로 따로 했었습니다. 그리고 UI부분은 윈도의 모든 플랫폼에서 돌아야 되어서 (그당시 제가 뭔가를 잘 못했는지는 몰라도 UI부분에도 GC를 적용하면 95/98에서 오류가 잘 나는 경향이 있었습니다.) 그런 부분은 어쩔 수 없이 직접하는 방법을 사용했습니다.
그리고 GC를 써서 이득을 얻으려면 자주 할당과 해제를 반복하는 경우에는 이득이 크지만 그렇지 않다면 코드상의 이득도, 성능상의 이득도 별로 없는 것으로 알고 있습니다.

정말 잘 읽었습니다. :-)

LispM의 이미지

GC는 일반적으로 어플리케이션이 크고 복잡할수록 이득이 많습니다. 그렇지 않다면 굳이 GC를 사용할 이유가 없을 듯. JWZ의 GC에 대한 생각을 참고로 링크 겁니다. http://www.jwz.org/doc/gc.html

http://lisp.or.kr http://lisp.kldp.org - 한국 리습 사용자 모임

yielding의 이미지

메모리 관리에 대해 lisp 프로그래머와 c프로그래머의 차이에 대한 오래된 유머가 생각나는군요

lisp프로그래머는 메모리 관리처럼 중요한것을 프로그래머에게 맡기면 안된다고 생각하는 반면 c 프로그래머는 메모리 관리처럼 중요한것을 프로그램에게 맡기면 안된다고 생각한답니다.

Life rushes on, we are distracted

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.