physis#22
Ez tényleg olyan dolog, amihez egy nem-triviálisnak tűnő ,,szellemesség'' kell, de ez a trükk nem beláthatatlanul kifinomult, ,,csak'' meglepő. Programozáshoz vagy matematikához szokott emberrel úgy lehet a leggyorsabban érzékeletetni a dolog ,,lényegét'', hogy megkérjük, írjon egy quine-t (tetszés szerinti programnyelven, akár mondjuk C-ben).
A quine az egy olyan program, ami saját forráskódját képes kinyomtatni. (Természetesen bizonyos jól körülhatárolható ,,csaló'' ,,megoldások'' tiltva vannak). A feladat elsőre nem hangzik különösebben érdekesnek, de ha az ember elkezd próbálkozni vele, hamar rájön, hogy épp az a nehézség, amit Te is említettél: a programnak egyszerre kellene ,,gyárként'' is és ,,tervrajzként'' is működnie: össze is kell rakni a kiíratandó forráskódot mint stringet, de minden művelet, amit ehhez szeretnénk használni, egyúttal maga is a forráskód részévé válik, tehát azok kiíratásáról is legott gondoskodni kell. A feladat látszólag végtelen körbe bonyolódik, de valójában egy nem túl bonyolult (bár szellemes) trükkel megoldható (ami leginkább a szimbólumok escape-eléséhez hasonlít).
David Madore: [url="http://www.madore.org/~david/computers/quine.html"]Quines (self-replicating programs)[/url]
http://www.madore.org/~david/computers/quine.html
A dolog szorosabban úgy jön ide, hogy a természet is lényegében ezzel analóg megoldást alkalmaz. (És a Conway-féle sejtautomata-világban felfedezett önreprodukáló gép alapötlete is ez).
A lényeg az, ahogy Te is elkezdted írni: van egy ,,gyár'', egy hús-vér fizikai alkarészekből álló üzem, és van egy ,,halott'' tervrajz, ami csak le van írva szimbólumokkal egy ,,szalagra'' (stringre, DNS-re). A teljes reprodukálandó rendszer a gyárból és a tervrajzból áll **együtt**.
A gyár fogja a tervrajzot, és elkészít belőle egy másik gyárat (ezt megteheti, mert a tervrajz a gyár teljes leírását tartalmazza). Ez persze még nem megoldás, hiszen a teljes rendszer reprodukálásához nemcsak a gyárat, hanem a tervrajzot is duplikálni kéne. Itt jön a lényeg: a tervrajz duplikálása nem különösebben nehéz, hiszen az csak egy szimbólumstring, azt csak le kell másolni.
Az általam látott quine-okban a dolog úgy néz ki konkrétan, hogy van egy ,,gyár'' (mindenféle stringkezelő és kiírató függvények, tehát lényegében maga a program), és van egy tervrajz (egy hosszú string). A teljes quine program forráskódja nem más, mint a jól definiált stringkezelő-és-kirató függvény (gyár), plusz a tervrajz-string **együtt egy fájlban**.
A stringkiírató résznek (gyárnak) argumentumul adjuk a nagy stringet (tervrajzot), erre ez kiírja majdnem a teljes program forráskódját, kivéve magát a tervrajz-stringet. Tehát a gyár a tervrajz alapján új gyárat duplikál, de a tervrajz reprodukálása kimarad. Éppen ezért a tervrajz-stringben van egy ,,copy''-metakarakter, amely a ,,gyárat'' arra utasítja, hogy azon a ponton magát a teljes tervrajz másolatát ,szúrja bele' az éppen születőfélben lévő új gyárba. Az eredmény az, hogy a gyárból és a tervrajzból alló rendszer egy új gyárat rak össze, és a tervrajz is lemásolódik, tehát ugyanolyan új rendszer képződik a régi mellé.