프로그램 자신이 새로운 프로그램을 만들어내는 것은 두가지 방식으로 가능할 수 있습니다.   첫째는 프로그램 자체에 분석 및 예상이라는 기능을 부여하여, 주어진 코드들을 어떻게 조합하면 원하는 것이 나오는지를 예측해서 원하는 프로그램을 만들어내는 방법입니다.(\'창조형\' 프로그램이라고 해 둡시다.)   또 하나는 프로그램의 코드 자체가 복제, 치환, 변이 등의 진화를 거쳐 새로운 프로그램을 탄생시키는 방법입니다.(\'자기 진화형\' 프로그램이라고 해 둡시다.)   전자의 프로그램은 주어진 목적을 스스로 인식해서 스스로 해답을 찾는 시스템입니다.   이는 위 그림처럼 처리를 하게 됩니다. 즉, 주어진 명령(목적)이 무엇인지를 확인하고, 현재 갖고 있는 코드(재료) 중에서 무엇이 어떤 역할을 하는지를 확인한 후에, 그 중에서 가장 적합한 코드를 선택해서 그것을 조합합니다.   그리고, 조합된 프로그램이 원하던 프로그램과 같다면, 그것을 완성하여 테스트 한 후에 마치게 됩니다.   이는 무언가를 만드는 인간의 사고 패턴과 비슷합니다. 이를테면 위의 그림처럼 블럭으로 배를 만들 경우,   1. 배를 만든다(목적)을 인식   2. 갖고 있는 블럭의 모양과 개수를 확인   3. 갖고 있는 블럭을 맞추어서 어떤 모양이 만들어질지를 생각한다.   4. 블럭을 맞추어서 배 모양을 만든다.   이 과정을 거치게 되는 것이지요.   이 과정은 지극히 단순하지만, 여기에는 매우 어려운 문제가 준비되어 있습니다. 물론, 목적을 인식하는 것도 쉽지는 않지만, 정말로 문제가 되는 것은 재료 확인과 조합 예측의 부분이지요.   다양한 모양을 만들기 위해서 제작자에게는 여러가지 모양의 수많은 레고 블럭이 있습니다. 제작자는 이러한 모든 레고의 모양과 개수, 여기에 어디에 어떻게 끼워 맞추어야 하는지에 대한 것을 알고 있어야 합니다.(블럭의 숫자가 많아질수록 이 정보의 양은 기하급수적으로 증가합니다.)   게다가 레고 블럭을 맞추어서 나올 수 있는 모양의 개수는 레고 블럭의 숫자가 많을수록 기하급수적으로 증가하기 때문에, 그 양 또한 만만치 않지요. 즉, 레고 블럭에 대한 정보, 그리고 레고 블럭을 짜맞추었을때 나오는 모양의 예상이 데이터베이스로서 존재해야 합니다.(이를 인간의 기준으로 생각하면 지식이나 경험이라고 부릅니다.)   위의 그림에서는 마침 만들려는 모양을 조립하는데 필요한 만큼의 양 밖에는 없었지만, 실제의 경우 블럭의 숫자는 엄청나게 늘어나고 배 모양이 나올 수 있는 가능성 역시 무수하게 많겠지요.   레고 블럭의 경우, 모양이 다르다고 해도 큰 지장없이 완성시킬 수 있습니다.(2x1 블럭 2개건, 4x1블럭 한개건 큰 차이는 없겠지요.) 하지만, 프로그램의 경우, 사소한 차이로 인해서 엉뚱한 결과가 나오기도 하고, 아예 시스템이 정지해 버리기도 하기 때문에, \' 조합 및 예측 \'을 위한 데이터베이스는 예상 밖으로 커지게 되고, 결국 프로그램의 규모가 상상을 초월하는 크기로 바뀌게 됩니다.   프로그램 코드가 복잡할수록, 그리고 명령이 복잡해질수록 이를 위해 필요한 데이터 베이스의 크기는 급증하게 되고, 인식, 예측 등에 상상을 초월하는 자원을 할당하게 됩니다. 때문에 이러한 프로그램은 개발하지 않습니다. 필요에 따라 프로그래머에게 맡기면 충분하니까요. (* 어떤 측면에서 초보적인 개발 프로그램은 존재하고 있습니다. 이를테면, 아래에서 다른 분이 말한 C 컴파일러 같은 것을 생각해 보지요.(컴파일러와 인터프린터는 \'명령\' 해석기라는 것에는 차이가 없으므로 굳이 구별하지 않겠습니다만.)   컴퓨터는 당연히 인간의 말을 알아듣지 못합니다. 그들은 그들만의 언어(기계어)로 대화를 나누지요. 이래서는 인간의 명령을 컴퓨터에게 인식시키기 어렵기 때문에 인간 기준의 언어를 컴퓨터가 알아들을 수 있게 해 주는 프로그램이 필요합니다. 이를테면, 1+1 이라는 것을 입력해 주었을때, 이 명령이 1과 1을 더하라는 명령이라는 것을 인식하게 해 주는 과정이 필요하지요. 여기서 등장하는 것이 이러한 명령을 \'번역\'해 주는 해석기입니다.   이런 초보적인 개발 프로그램에는 비단 컴퓨터용 언어의 해석기만 존재하는 것이 아닙니다. 나모 웹에디터와 같은 html 제작기, 혹은 MATLAB 같은 수학 프로그램 제작기도 마찬가지이지요. 이들은 인간이 하고자 하는 것을 그대로 컴퓨터용(혹은 다른 해석기용) 코드로 바꾸어 주는 역할을 하고 있어, 어떤 측면에서는 개발 프로그램이라 할 수 있습니다. 하지만, \'명령\'을 인식해서 해석하는게 아니라, 단지 \'번역\' 만을 하는 것이기 때문에 원하는 프로그램(예를 들어, 심시티 같은 게임)을 스스로 만드는 프로그램에 해당하지는 않습니다.)   후자의 경우에는 본 프로그램은 그다지 복잡할 필요가 없습니다. 그 프로그램은 자기 자신의 코드를 적당히 자르고 붙이고 바꾸는 등의 작업을 통해서 다음 프로그램을 창조하기 때문에, 이 프로그램에는 바뀐 코드를 분석해서 작동시키는 기능 만으로 충분합니다.   이 프로그램은 프로그램 코드를 복제, 치환, 변이 등을 하는 과정을 통해서 자유롭게 조합하는 기능을 갖고 있습니다. 만들어진 블럭을 조각조각 내어 자기 마음대로 다시 조립한다고 생각해도 좋습니다.   그 결과는 전혀 생각치 못한 이상한 모양이 될 수도 있겠지만, 여하튼 처음의 블럭(여기서는 배)과는 전혀 다른 무언가가 만들어지게 됩니다. 다만, 이 프로그램에서는 어떤 프로그램이 완성될지 예측하는 기능이 없기 때문에, 원하는 프로그램은 만들지 못합니다.   단지, 무언가 새로운 프로그램(결과)을 만들어낼 뿐이지요.   따라서, 이 과정을 통해 만들어진 프로그램은 제대로 작동하지 않을 수도 있습니다. 아니, 무작위로 조합을 하는 이상 제대로 작동하는게 훨씬 적겠지요. 이런 프로그램은 윈도에서 흔히 나오는 응답없는 응용 프로그램이 되어, 시스템의 메모리와 CPU, 즉 자원을 장악하고 낭비하게 되기 때문에, 이 프로그램에서는 프로그램을 해석해서 버그가 있는 것을 제거하는 기능이 포함되어야 합니다.   물론, 이 프로그램의 코드 중 일부는 제대로 작동할 수도 있지만, 프로그램의 해석기는 그 버그의 원인을 찾아낼 수 없으므로(20행에서 에러가 사실은 1행의 계산 결과가 잘못되었기 때문일지도 모릅니다.) 모든 코드를 통채로 버리는 편이 효율적인 것이지요.   하지만, 이러한 과정을 계속 반복하다보면, 결과적으로 제대로 작동하는 프로그램이 탄생할 수 있습니다. 그것이 사용자가 바라는 프로그램은 아닐지라도(이를테면 아무 의미 없이 루프를 반복하다 끝나는 프로그램(주로 시간 지연 프로그램)같은 것에 불과하더라도) 무한 루프나 버그처럼 치명적인 문제를 주는 게 아닌 이상, 새로운 프로그램이라고 불러도 지장은 없는 것입니다.   이러한 과정은 계속되고, 그 결과 수많은 종류의 새로운 프로그램이 탄생합니다. 이론적으로 말하면, 무한한 시간동안 프로그램을 작동시키면 그 중에서 내가 바라고 있던 프로그램이 나올 가능성도 있는 것입니다.(블럭을 오랫동안 떨어뜨리다보면 우연히 \'배\'가 만들어질 수 있는 것처럼...)   하지만, 이 것을 ‘개발’이라고 부를 수는 없을 것입니다. 왜냐하면 이것은 ‘원하는 목적’을 달성하기 위해 ‘생각’을 갖고 ‘예측’을 해서 만드는 것이 아니기 때문입니다.   이는 어떻게 보면 적당히 쌀을 흩뿌려놓고 그 안에서 그림을 찾는 점쟁이와 같은 상황이기도 합니다. 즉, ‘우연에 의한 탄생’이라고 할 수 있겠지요.   하지만, 이 ‘우연에 의한 탄생’은 어떤 점에서 데이터베이스에 의한 개발 이상의 효과를 낳을 수도 있습니다. 왜냐하면, 제한된 재료(코드)를 가지고 데이터베이스에 의한 예측을 통해 만들어지는 프로그램의 종류는, 코드와 DB의 제약으로 한계가 있게 마련이지만(간단히 말하면, 사각형 블럭 밖에 없다면 둥근 기둥은 만들 수 없습니다.) 이렇게 무작위로 복제, 치환, 변이를 거치는 우연에 의한 탄생에서는 생각지도 못했던 가능성이 탄생할 수 있기 때문입니다.   그에 따라 때로는, 원래 만들고자 했던 프로그램보다 우수한 어떤 것이 나올 가능성도 제로라고는 할 수 없습니다. 즉, 이 또한 일종의 \'새로운 프로그램\'을 만들어내는 \'개발 시스템\'이라고 할 수 있겠지요. (개인적인 견해를 말하자면, 프로그램에 대해서 이런 걸 바라는 건 바보 짓이라고 생각합니다. 정말 필요한 프로그램이 있다면, 어떤 시스템보다 풍부한 데이터베이스를 가지고, 어떤 시스템보다 뛰어난 예측 능력과 함께, 기존의 코드 이상의 어떤 것을 고안할 수 있는 프로그래머가 스스로 만들어내는 편이 훨씬 빠르고 편하고 효율적일테니까요. 수십억년의 수명을 가진 자연이라면 우연히 심시티 게임이 만들어지기를 기다릴 수 있을지 모르지만, 100년도 살까 말까한 인간으로선, 그러한 우연에 걸고 싶은 생각이 없으니 말입니다.) p.s) 여담이지만, 이러한 진화형 프로그램 시스템의 원리는 DNA의 시스템과 같은 것입니다.   DNA에는 4종류의 염기가 존재하고 있으며, 이것이 코드(재료, 혹은 블록) 역할을 해서 조립됩니다. 그리고, DNA에는 이 DNA 코드의 위치와 조합에 따라서 그것이 어떤 의미를 갖고 있는지를 해석하는 기능이 포함되어 있기 때문에, DNA를 사용해서 여러가지 생명체의 정보를 저장하고, 생명체를 만들어낼 수 있습니다.   하지만, DNA에는 코드가 조합되었을때 나오는 결과에 대한 예측 기능은 존재하고 있지 않습니다. 각각의 코드가 어떻게 배치되면 어떤 결과가 나오므로, 이러한 방향으로 조립되어야 한다는 것은 DNA 시스템에 존재하고 있지 않습니다.   DNA의 진화라는 것은, 위에서 살펴본 진화형 프로그램과 마찬가지로 완벽하게 \'무작위적\'으로 이루어집니다. 이에 따라서 DNA 프로그램은 무수한 종류를 갖게 되지만, 그것은 필요한 어떤 것이 아니라, 단지 우연히 발생한 어떤 것일 따름입니다.   하지만, DNA에는 매우 강력한 제약이 존재합니다. 그것은 일단 완성된 DNA가 후대로 전달되기 위해서는 그 DNA를 갖고 있는 생명체가 살아남아서 자손을 만들어내야 한다는 제약입니다.   이는 자연 도태라는 형태로서 종의 제약을 가하는 역할을 하게 됩니다. DNA에 의해서 만들어진 생명체가 그 생명체가 있는 환경에서 다른 대상과 생존 경쟁을 벌이기에 부적합하다면, 그 생명체는 결국 자손을 남기지 못하고 사멸하게 되고 그 개체가 갖고 있는 DNA는 후손에게 전달되지 못하는 것이지요.   자연계에서 이 역할은 지극히 냉혹한 \'생태계\'가 맡게 됩니다.(컴퓨터 프로그램의 경우, 이 역할을 프로그램 자신, 혹은 사용자가 담당합니다. 자신에게 도움이 되는(필요한) 프로그램은 삭제하지 않지만, 자신에게 도움이 되지 않는 프로그램은 바로 삭제해 버리겠지요. 물론, 따로 보관하는 이들도 있겠지만, 적어도 그 컴퓨터(환경)에서 그 프로그램의 자손은 끊기는 것입니다.)   하지만, 생태계는 그만큼 넓고 다양성을 지니고 있기 때문에, 모든 생태계에서 같은 결과가 나오지는 않습니다. 컴퓨터 프로그램도 사용자의 시스템이나 취향에 따라 살아남는 것이 달라지듯이, 생태계에서도 그 생태계의 상황에 따라서 살아남는 DNA가 달라지게 되는 것이지요.   이러한 것을 보다보면, DNA 스스로가 의지를 갖고 생태계에서 살아가려고 하는 것처럼 보이겠지만, 프로그램에 의지가 없듯이 DNA에도 의지는 존재하지 않습니다.(위에서 말했듯이, DNA에는 조합 결과를 예측하는 시스템도, 그리고 이를 위한 데이터베이스도 존재하지 않기 때문입니다.) 단지 결과적으로 볼때 DNA가 의지를 갖고 살아남아서 자손을 남기려고 하는 것처럼 보일 따름이지요.   지극히 냉혹한 얘기처럼 들리겠지만, DNA가 살아남는 것, 그리고 결과적으로 지금과 같은 지구의 생태계가 완성된 것은 완벽하게 우연한 결과에 지나지 않습니다. 그리고 그 결과로 지구의 생태계가 지금의 모습으로 안정되어 있는 것도 단순한 우연에 지나지 않는 것입니다.(안정적이지 못한 생태계는 이미 무너지고, 결국 이런 생태계가 남았기 때문입니다.)   하지만, 역설적으로 말하자면, 지구의 생태계가 이처럼 풍부한 다양성을 갖고 있게 되는 것에는, 의지따위는 개입되지 않는 우연의 진화 프로그램이 기여한 바가 큽니다. 위에서 잠깐 이야기했지만, 어떠한 목적과 방향성(이를 사람들은 의지라고 부릅니다.)을 갖고, 원하는 목표를 만들어내기 위해서 움직이는 프로그램은 그러한 이유로 인해서 제약이 생기게 되고, 이 제약을 넘어설 수 없지만, 우연한 기회로서 완성되는 프로그램에는 무한한 가능성이 존재하고 있기 때문입니다. P.S) 이렇게 우연으로 인한 생태계의 구성을 아주 단순하게 재현하는 프로그램 중에서 생명(Life)이라는 프로그램이 있습니다. 세계 최초의 컴퓨터 게임이라고 할 수 있는 이 프로그램은 셀이 주변의 상황에 따라서 살아남고 죽어가는 매우 단순한 법칙으로 구성됩니다.   개인적으로는, 이 프로그램을 직접 작동시켜본 경험이 없는 사람은 생명 과학에 대해서 논할 자격이 없다고 생각되는 프로그램입니다만... 실제로도 전세계적으로 많은 이들의 관심과 사랑을 받고 있습니다. 왠만한 생명 공학 관련 책을 보면 반드시 나오는 프로그램이기도 하고 말입니다.   이 프로그램의 법칙은 단 두가지에 불과하지만, 그 가능성은 무한대에 가깝습니다. 도트 하나의 차이만으로도 전혀 다른 결과를 낳을 수 있는 것이 생명 게임의 특징이지요. 그리고 그것이 바로 생명 게임의 재미있는 점이기도 합니다. (게임으로서 즐기고자 한다면, 맥시스사의 심어스나 심라이프를 해 보는 것도 좋습니다. 심어스에서는 가이아 이론에서 제시하는 여러가지 사례(대표적으로 데이지 세계)를 직접 시험해 볼 수도 있으며, 심라이프에서는 다양한 진화 가능성을 체험해 볼 수 있습니다.) (참고로, 가이아 이론을 잘못 이해하고 있는 사람들 중에는 생태계에 의지가 있어서, 그 의지에 따라서 생태계가 안정된다고 생각하는 이들이 있지만, 가이아 이론에 대한 어떤 책을 보아도 그런 내용은 나오지 않습니다. 단지 안정화된 생태계는 \' 마치 \' 의지가 있는 것처럼 안정성을 유지한다는 것일 뿐이지요.) P.S) 인공 지능이라는 것은 결국에는 첫번째로 이야기했던 창조형 프로그램과 같습니다. 현상에 대해 \'해석\'을 하고, \'예상\'을 거쳐서 행동할 수 있는 프로그램 코드와 그와 관련된 데이터 베이스가 복잡해진다면, 그것은 한없이 인간에 가까운 존재로 여겨지게 될 것입니다.   이를테면, 인간 사회의 모든 규범과 인간 행동 패턴들을 DB로 갖고 있는 로봇이 있다면 지극히 모범적이고 인간적인 행동을 하게 될 것입니다. 그런 로봇을 한 눈에 보고 구별할 수 있을까요?(현재의 인공 지능 연구에서는 기본적으로 주어진 DB 만이 아니라, 스스로 DB를 확장하고 보다 능동적으로 운영될 수 있는 인공 지능 시스템을 개발하고자 합니다만 아직까지 모연한 것이 사실입니다.)   하지만, 그러한 시스템은 개발 등에 들어가는 비용이나 연구 기간이 상상을 초월하는 것도 사실입니다. 인간적인 행동을 입력하기 위해서는 인간이 행동 기준으로 삼은 모든 사항을 입력해야 하고, 그것을 일일이 분석해 줄 필요가 있습니다. 나이가 많은 인간일수록 다채로운 행동 기준을 갖고 있으며, 시대와 장소, 상황에 따라서 각기 다른 행동 기준들이 추가됩니다. 그것을 모두 DB로서 컴퓨터에 넣어준다는 것은 조금, 아니 상당히 많이 낭비라고 밖에는 할 수 없는 일이지요.   설사 이를 DB화 했다고 해도, 처음 생산된 컴퓨터는 모두 똑같은 패턴으로 똑같은 행동을 하게 될 것입니다. 그렇다고 경험에 의해서 자율적으로 배워나가도록 설계한다면, 당초 개발 의도와는 전혀 다른 행동 패턴을 갖게 될 수도 있습니다.(이에 따라서 효율성이 떨어질 수 있겠지요.) 그것은 창조주인 인간의 의도와는 벗어나는 것이 아닐까요?   요리 로봇이라면 해당 식당에서 필요한 요리에 대한 DB를 갖고, 필요에 따라 이를 업데이트 해 주는 것으로 충분합니다.(자율적으로 학습을 해서 새로운 것을 창조하도록 하면, 어느 날 갑자기 엉뚱한 요리를 내오는 경우가 생길 수 있으므로 그다지 적합하지 않습니다.) 건설 로봇이라면 현재 건설할 건물에 대한 DB를 넣어두는 것으로 충분할 것입니다. 수술을 맡기는 로봇이라면 현재 수술하려는 환자와 관련된 DB를 갖는 것으로 충분할 것입니다.(모든 경우에 있어 DB에는 일어날 가능성이 있는 문제들이 포함되어 있어야 하겠지만, 모든 경우를 다 예측해서 넣어줄 필요없이 필요한 경우 인간이 지시를 내리도록 하는 것이 효율적일 것입니다. 물론, 이 지시 내용은 DB에 추가해서, 다음 번에는 인간의 지시 없이 대응하도록 할 수도 있겠습니다만...)   모든 분야에서 완성된 DB를 갖춘 로봇은 지금 즉시 현장에 투입할 수 있는 고급 인력이라는 이점을 갖습니다.   하지만, 어느 시대나 전문가들은 존재하는 법이고, 인간 자신이 전문가가 되려는 노력을 게을리하지 않는 이상 인간에 필적하는 수준의 (창조성을 갖춘) 전문가 시스템은 필요치 않을 것입니다. 어차피 로봇에 DB를 입력하는 것도 특정 전문가 집단에 불과한 이상, 로봇의 시스템도 완벽하다고 할 수는 없을테니까요. 필요한 부분에 필요한 만큼. 그것이 바로 효율적인 DB의 운용 방안인 것입니다.(새로운 것을 자동으로 배우는 시스템도 그다지 필요치 않습니다. 아무리 우수한 교육 시스템을 갖고 있다고 해도 갑자기 닥친 상황을 완벽하게 이해해서 처리하는 것은 불가능합니다. 이 경우 보다 경험이 많은 인간(전문가)이 그에 대한 지시를 내리고, 이를 시스템이 인식해서 DB에 추가하면 되겠지요.) 출처:Sfwar.com 이 글 쓴 횽이 정말 존경스럽다..ㅠㅠ