{
  "schemaVersion": 2,
  "hash": "9be847d8fdc649efd5b30bd7fddda864033c462fa953140c804b11e3e39fb688",
  "purpose": "html-region",
  "page": "/en/metaprogram/",
  "sourceLang": "CS",
  "targetLang": "EN-US",
  "glossaryRevision": "add1dfc20d8352f2a4e504e328cbb510e423fc74147c44fd605dcd453720e196",
  "glossaryId": "08f85824-1a74-45c3-94c8-6d5965be47b9",
  "deepl": {
    "tagHandling": "html",
    "tagHandlingVersion": "v2",
    "splitSentences": "nonewlines",
    "preserveFormatting": true
  },
  "selectorPolicyRevision": 2,
  "manual": false,
  "locked": false,
  "edited": false,
  "editedAt": null,
  "editedBy": null,
  "sourceFragment": " <div class=\"post-header\">  <h1 class=\"post-title\">Metaprogram</h1> <p class=\"post-meta\"> April 2020 </p> </div> <div class=\"post-body\"> <p>Pro tuto úvahu jsem vytvořil program, který dokáže vygenerovat všechny možné programy jazyka Python a následně je spustit. Budeme mu říkat metaprogram – tedy jakýsi „nad-program“. Jde ho zjednodušeně popsat následujícími pravidly:</p>\n<ol>\n<li>Vytvoř seznam všech znaků, které používá programovací jazyk Python.</li>\n<li>n = 1</li>\n<li>Z tohoto seznamu vytvoř všechny možné permutace n symbolů</li>\n<li>Každou tuto permutaci spusť jako program a pokud nevznikne chybové hlášení (error), tuto permutaci ulož</li>\n<li>n = n + 1</li>\n<li>vrať se k třetímu kroku</li>\n</ol>\n<p>Pokud bych měl nějak slovně popsat, co dělá, řekl bych, že program vytvoří složku, která obsahuje veškeré možné programy, které lze spustit bez chybového hlášení. Začne tím nejkratším programem o jednom symbolu (proto n = 1) a vytvoří veškeré permutace. Ty pak spustí a programy, u nichž nevzniklo chybové hlášení, uloží. Takové chybové hlášení může nastat velice jednoduše tím, že se spustí taková permutace znaků, která v jazyce Python nedává smysl. Například takový program, jehož obsah bude print(‘Ahoj’) dává v jazyce Python smysl, a proto se tento program spustí bez chybového hlášení a jeho výstupem bude slovo „Ahoj“. Pokud bude ale obsah programu třeba YFag##A7, výstupem programu bude chybové hlášení (nejspíš typu „SYNTAX ERROR“).</p>\n<p>Tento program by tedy měl být schopný systematicky vytvořit a spustit veškeré programy. Samozřejmě, že takových programů je nekonečně mnoho, takže tento metaprogram je nikdy nevygeneruje všechny v konečném čase. Je zajímavé se chvilku zamyslet nad tím, co všechno mohou tyto programy dělat a jaké to bude mít důsledky.<br>\nTakové programy mohou být schopny textového výstupu. Z toho vyplývá, že mataprogram (za předpokladu, že je spuštěný nekonečně dlouho) vytvoří nekonečně mnoho programů s textovými výstupy. Tyto programy mohou tedy vytvořit cokoliv psaného – slovo „Ahoj“, mé telefonní číslo, přesné datum mé smrti, tuto úvahu, Shakespearovo dílo, Einsteinovu rovnici E = mc2, několik platných číslic π, ale i kód tohoto programu samotného.<br>\nDalší možný výstup je vizuální. Program tak může vytvořit vektorovou či bitmapovou grafiku. Tím pádem tyto programy mohou vytvořit Mona Lisu, fotku mléčné dráhy, logo Facebooku či fotografii mě píšícího tuto úvahu, kterou nikdo nikdy skutečně nevyfotil.<br>\nMožný je samozřejmě i výstup zvukový. Program tedy může přehrát písničku Lucy in the Sky with Diamonds od hudební skupiny The Beatles, Krabí kánon od J. S. Bacha, rádiové vysílání z 29. prosince 1989 a tak dále. Samozřejmě máme zase nekonečně mnoho možností.</p>\n<p>Nejzajímavější je ale to, že Python dokáže ovládat i operační systém počítače. Dokáže tak třeba vypnout počítač, vymazat některé soubory a tak dále. Teoreticky by tedy měl být schopný vytvořit a rozšířit počítačový virus po celém světě, hacknout vládu nebo zmanipulovat volby. Jsou to sice trochu přehnané příklady, ovšem vychází z předpokladu, že metaprogram jednou vytvoří a spustí všechny možné programy. Tady ale nastává problém. Od začátku jsme nějak intuitivně předpokládali, že se metaprogram nikdy nezastaví. Ostatně i to byla podmínka pro tvrzení, že vytvoří opravdu všechny možné programy. Jelikož jazyk Python dokáže tímto způsobem ovládat operační systém, dokáže také vytvořit program, který vypne či restartuje počítač, smaže původní soubor metaprogramu nebo ho nějak poškodí. Může také poškodit celý operační systém. Pokud se něco z toho stane, metaprogram se zastaví.  Z toho ovšem vyplývá, že se tento metaprogram jednou zastaví v konečném čase a že tedy nikdy nedokáže opravdu vytvořit všechny programy pro jazyk Python. Připomíná mi to takový ten „boží paradox“: Pokud je Bůh všemocný, může vytvořit kámen, který on sám nedokáže zvednout? Pokud takový kámen dokáže vytvořit, ale nedokáže ho zvednout, není všemocný. Pokud takový kámen vytvořit nedokáže, také není všemocný.<br>\nLogickým krokem by bylo vytvořit v programu nějaké pravidlo, které by vynechalo program, který může způsobit zastavení metaprogramu. Tak například tento program by dokázal vypnout počítač:</p>\n<p><strong>import os</strong><br>\n<strong>os.system (‘shutdown /s /t 1’)</strong></p>\n<p>První řádek programu řekne, že budou použity příkazy z balíčku os. Pomocí tohoto balíčku neboli modulu pak dokáže program provádět příkazy, které pracují s operačním systémem počítače. Druhý řádek programu pak vypne počítač. Proč tedy prostě nevytvořit v metaprogramu pravidlo, které zamezí použití příkazu <strong>import os</strong>? Sice by pak náš nekonečný seznam všech možných programů nebyl kompletní, nicméně by obešel tuto záludnost. Tak to ovšem nefunguje. I kdybychom do metaprogramu toto pravidlo přidali, metaprogram by jednou vytvořil svou vlastní kopii, která neobsahuje toto pravidlo – tedy vytvořil by náš původní program bez nového pravidla. Této neúplné kopii by poté nic nebránilo vytvářet programy, ve kterých by byl použít příkaz import os. A právě tento příkaz by nakonec ukončil náš původní metaprogram. Další možností je jednotlivé programy vůbec nespouštět, ale jen ukládat, nicméně tím náš metaprogram neudělá vše naprogramovatelné v jakzyce Python. Nenapadá mě žádná cesta, jak tento problém obejít. Teoreticky by bylo možné použít „slabší“ programovací jazyk, který nedokáže vypnout počítač či nějakým jiným způsobem zastavit metaprogram.</p>\n<p>Zde je zdrojový kód tohoto programu:</p>\n<span data-i18n-protected=\"p0\" translate=\"no\" class=\"notranslate\"></span> </div> ",
  "translatedFragment": " <div class=\"post-header\">  <h1 class=\"post-title\">Metaprogram</h1> <p class=\"post-meta\"> April 2020 </p> </div> <div class=\"post-body\"> <p>For this discussion, I created a program that can generate all possible Python programs and then run them. We’ll call it a metaprogram—that is, a kind of “super-program.” It can be described simply by the following rules:</p>\n<ol>\n<li>Create a list of all characters used by the Python programming language.</li>\n<li>n = 1</li>\n<li>From this list, generate all possible permutations of n symbols</li>\n<li>Run each of these permutations as a program, and if no error occurs, save that permutation</li>\n<li>n = n + 1</li>\n<li>Return to step 3</li>\n</ol>\n<p>If I had to describe what it does in words, I would say that the program creates a folder containing all possible programs that can be run without an error message. It starts with the shortest program consisting of a single symbol (hence n = 1) and generates all permutations. It then runs them and saves the programs that do not produce an error message. An error message can occur very easily if a character permutation is run that doesn’t make sense in Python. For example, a program with the content `print(&#x27;Hello&#x27;)` makes sense in Python, so this program will run without an error message and its output will be the word “Hello.” However, if the program’s content is, say, YFag##A7, the program’s output will be an error message (most likely of the “SYNTAX ERROR” type).</p>\n<p>\nThis program should therefore be able to systematically create and run all programs. Of course, there are infinitely many such programs, so this metaprogram will never generate them all in finite time. It’s interesting to pause for a moment and consider what these programs might be capable of and what the consequences would be.<br>\nSuch programs may be capable of producing text output. It follows that the metaprogram (assuming it runs for an infinite amount of time) will create an infinite number of programs with text outputs. These programs can therefore generate anything written—the word “Hello,” my phone number, the exact date of my death, this reflection, Shakespeare’s works, Einstein’s equation E = mc², several valid digits of π, and even the code for this program itself.<br>\nAnother possible output is visual. The program can thus generate vector or bitmap graphics. Consequently, these programs can create the Mona Lisa, a photo of the Milky Way, the Facebook logo, or a photograph of me writing this essay—a photo that no one has ever actually taken.<br>\nAudio output is, of course, also possible. The program can play the song “Lucy in the Sky with Diamonds” by The Beatles, J. S. Bach’s “Crab Canon,” a radio broadcast from December 29, 1989, and so on. Of course, we again have an infinite number of possibilities.</p>\n<p>\nBut the most interesting thing is that Python can even control the computer’s operating system. It can, for example, shut down the computer, delete certain files, and so on. Theoretically, it should therefore be capable of creating and spreading a computer virus worldwide, hacking the government, or manipulating elections. These are admittedly somewhat exaggerated examples, but they are based on the assumption that the metaprogram will eventually create and run every possible program. Here, however, a problem arises. From the beginning, we have somehow intuitively assumed that the metaprogram will never stop. After all, that was a prerequisite for claiming that it would indeed create every possible program. Since the Python language can control the operating system in this way, it can also create a program that shuts down or restarts the computer, deletes the original metaprogram file, or corrupts it in some way. It can also damage the entire operating system. If any of these things happen, the metaprogram will stop.  This, however, implies that this metaprogram will eventually stop at some finite time and that it can therefore never truly create all programs for the Python language. It reminds me of the “God paradox”: If God is omnipotent, can He create a rock that He Himself cannot lift? If He can create such a rock but cannot lift it, He is not omnipotent. If He cannot create such a rock, He is not omnipotent either.<br>\nThe logical step would be to create a rule in the program that would exclude any program capable of causing the metaprogram to halt. For example, this program could shut down the computer:</p>\n<p><strong>import os</strong><br><strong>os.system(&#x27;shutdown /s /t 1&#x27;)</strong></p>\n<p>The first line of the program specifies that commands from the `os` package will be used. Using this package—or module—the program can then execute commands that interact with the computer’s operating system. The second line of the program then shuts down the computer. So why not simply create a rule in the metaprogram that prevents the use of the <strong>`import os`</strong> command? Although our infinite list of all possible programs would then be incomplete, it would circumvent this pitfall. But of course, that’s not how it works. Even if we added this rule to the metaprogram, the metaprogram would eventually create its own copy that does not contain this rule—in other words, it would create our original program without the new rule. Nothing would then prevent this incomplete copy from creating programs that use the `import os` statement. And it is precisely this statement that would ultimately terminate our original metaprogram. Another option is not to run the individual programs at all, but simply to save them; however, this would prevent our metaprogram from doing everything that can be programmed in Python. I can’t think of any way to get around this problem. Theoretically, it would be possible to use a “weaker” programming language that cannot shut down the computer or otherwise stop the metaprogram.</p>\n<p>Here is the source code for this program:</p>\n<span data-i18n-protected=\"p0\" translate=\"no\" class=\"notranslate\"></span> </div> ",
  "createdAt": "2026-07-11T10:54:14.909Z"
}
