Portál AbcLinuxu, 30. dubna 2025 16:33
Už som rok nepísal blog, tak to bude len podnet na krátke zamyslenie, nič viac.
Prečo nie je oficiálna implementácia Pythonu v Pythone, ale v C. Má Guido Radšej C ako Python? Alebo je Python na takúto úlohu úplne nevhodný jazyk?
Obecnejšie, veľa jazykov (presnejšie implementácií ich kompilátor/interpretrov) sa píše v C a nie v nich samých. Je to preto, že ľudia svojím vlastným jazykom neveria, nechce sa im kašľať s bootstrappingom, alebo čím to je?
Tiskni
Sdílej:
myslim ze je to zduvodu aby byl python rychlejsi. Prece jenom C je rychlejsi nez nejaky interpretovany jazyk.
Skutočne sa pri interpretovanom jazyku, ktorý je pomalý tak či tak, prejaví to, či interpreter je v C, alebo v pythone? IMHO bottleneck je inde ako v jazyku kompilátora/interpretru. A obecne pri kompilovaných jazykoch, alebo jazykoch, ktorých rýchlosť je porovnateľná s C tento argument vôbec neplatí. Navyše, tým, že sa kompilátor/interpreter píše v C, prichádza sa o všetky výhody Pythonu (prototype programming, duck typing, atď...) a je to skoro ako deklarácia, že C je na danú úlohu vhodnejšie, čo je od autora daného jazyka skutočne čudné
Čiže sa nikomu nechce srať s bootstrappingom -- to som trafil. Len mi už nedošlo, že sa s nim treba srať nie raz, ale na každej novej architektúre, to mi už nedocvaklo. Díky!
Tak to prosím vysvetli. Vôbec netuším, čo som na jednej vete mohol nepochopiť
Á, tak to som nevedel (zabudol), že pán je anti-Céčkar Ničmenej, aj keď to bol flame-bait, ja s tým 100% súhlasím. Pre použitie C (a C++
) nevidím vôbec žiadny dôvod (sú vyššie jazyky s rovnakou rýchlosťou, napríklad LISP), preto mi ten skrytý význam unikol
Nádopotne. C++ je jazyk, v ktorom som napísal tisíce prográmkov a programov a je to tiež môj hlavný jazyk (alebo aspoň býval, už ho moc nepoužívam, ale stále neviem v ničom robiť tak ako v C++). Ale ovládnuť všetky jeho syntaktické a sémantické zákutia, to je robota na ďalších 10 rokov a tú už do toho skutočne nemienim investovať, zvlášť od doby, čo som zistil aké všetky má C++ nedostatky a objavil kopu iných geniálnych jazykov
Mňa napadol ešte jeden dôvod: proste sa s tým tak začalo, či už preto, že na začiatku nebolo jasné, o čo sa vlastne Guido ide pokúšať a nemal ani žiadnu hrubú predstavu jazyka, v ktorom by rovno vedel napísať kompilátor, alebo proste nemal v pythone ešte veľkú prax (čo je bez kompilátora celkom pochopiteľné, dovtedy mal len papier ), no a keď už to v tom C bolo, tak sa mu to nechcelo prepisovať a tak to bobtnalo a bobtnalo a bobtná to dodnes
Na to PyPy sa pozriem, som zvedavý jak moc je pomalé. Ale tam skôr AFAIK ide o to, že ešte nie je zďaleka kompletné. Ale idem na to pozrieť, aby som nešíril FUDy
To teda nie je hovadina. Ak je jazyk X lepší ako jazyk Y (či už objektívne, alebo pre niekoho subjektívne), tak jazyk X logicky používam na písanie všetkého kódu (alebo aspoň toho, ktorý sa v tom jazyku lepšie píše). Ak tak nerobím, tak musím mať nejaké zvláštne dôvody. Mňa zaujímalo, aké to sú.
Ad assembler: Kompilátor C (napríklad gcc) nie je napísaný v assembleri, takže to nie je validný argument Ničmenej, ak by bol, tak by si sa skutočne o výhody pripravil, je to presne rovnaké ako s tým Pythonom a C
To samozrejme zrejmé nie je. Ale ja som to ani nikde nepredpokladal. Tento blogpost sa práve pýtal, že prečo je upredňostňované C pred Pythonom. Ak je to ako hovoríš, tak beriem, ale nezdá sa mi to ako ten pravý dôvod.
Jasné, to beriem. Portabilita je IMHO jediný argument pre zvolenie jazyka hlavného kompilátoru (alebo aspoň toho minimalistického).
a neni to proto ze na lovlevel system programovani je nejvhodnejsi C?Osobně tedy interpret Pythonu nepovažuju za nějaké echt systémové programování.
Low level -- možno. Hoci aj tam by som si dovolil polemizovať. Určite je najrozšírenejšie, ale nie nutne najvhodnejšie.
Ale na kompilátory, čo obecne nie je nič iné ako manipulácia textového súboru (kompilácia nie je nič iné ako zobrazenie "text jazyka" -> "text binárky"), určite nie je najvhodnejšie C, o tom by som sa mohol pokojne hádať
Nevidím tam žiadne jeho vyjadrenie k implementácii pythonu v pythone. A IMHO mu to určite nie je jedno, lebo by to de facto znamenalo, že jemu osobne sa v jeho vlastnom jazyku nepracuje lepšie ako v C, čomu sa mi skutočne nechce veriť.
Aký je rozdiel medzi bootstrappingom interpretra a kompilátoru? Interpreter nie je nič iné ako on-the-fly kompilátor (veľmi zjednodušene povedané), nevidím tam veľký rozdiel. A o bootstrappingu kompilátora sa snáď rozpisovať nemusím, možnosti sú zrejmé. A ak ani to nie, odporučím Vás na wikipédiu
Mrzí ma to, ale uniká mi pointa. Robíme si srandu z úplne bežného procesu bootstrappingu?
Nerozumiem. Prečo by som mal písať interpret kvôli bootstrapovaniu interpretra? Napíšem si proste kompilátor
Nebavím sa o náročnosti, je mi jasné, že s bootstrappingom je to veľmi nepohodlné, takže asi ľudia upredňostňujú jazyky, ktoré už fungujú všade (hoci dnes tam už patrí aj Python).
Jj, tiež som si to našiel. A k môjmu úžasu som zistil, že nie je určený len pre python, ale obecne pre ľubovoľný dynamický jazyk (ak sa niekomu bude chcieť napísať gramatiku, etc), takže je to v podstate taká mašinka, kam si človek zadá jazyk, architektúru, množinu optimalizácií a vypadne mu binárka. Veľmi šikovné
Ono je zaujimave projekt PyPy priebezne sledovat. Postupne robia rozne optimalizacie az do takej miery, ze dobiehaju CPython co do rychlosti. Navyse je to pomerne zaujimavy priestor na rozne pokusy, proste taka pythonova hracka.
He? Python je jazyk Ako taký sa dá napísať ako interpret aj kompilátor. Preto je možné bootstrappovať z kompilátora a to potom aplikovať na ten interpreter
A aby sme nepokračovali v blbej diskusii, priznávam sa, že som si pod pojmom interpret predstavil len jednu z dvoch možných realizácií (ale nápodobne aj Vy tú druhú), z toho vznikol rozpor.
> Interpreter nie je nič iné ako on-the-fly kompilátor (veľmi zjednodušene povedané)
Kdepak. Interpret je obvykle implementovan tak, ze prechrousta program do nejake interni reprezentace, a tu potom sam interpretuje (proto take nelze udelat bootstraping - behem behu interpretovaneho kodu stale bezi interpret). Je mnohem jednodussi napsat interpret nez kompilator - interpret je v podstate bezny program, ktery se da napsat plne portabilne, zatimco kompilator je treba upravovat pro kazdou 'vystupni' architekturu. Nektere interprety mohou byt implementovane jako on-the-fly kompilatory do nativniho kodu, ale to jsou IMHO spis vyjimky (a bezny interpret pythonu AFAIK takovy neni).
Nerozumiem časti "interpret je v podstate bezny program, ktery se da napsat plne portabilne". Na konci celého interpretovania predsa aj tak musí byť vykonávanie inštrukcií, takže je zrejmé, že to bude závislé na danej architektúre
Je pravda, že v prípade obyčajného interpretru sa bootstrappovať nedá. Ja som práve bral tie on-the-fly kompilátory, som na ne zvyknutý z LISPu. Takže sa ospravedlňujem, že som spôsobil zmätok v diskusii
Interpret je výpočetní stroj, který prochází vstupní kód (python), chápe jeho slova (syntaxe, sémantika) a jejich význam reflektuje ve stavu výpočetního/virtuální stroje, který je součástí definice vstupního jazyka (v pythonu to budou slovníky, objekty a tak). Tudíž pro běh interpretovaného kódu je třeba běžící interpret.
Tento přístup je velmi obecný, ale také velmi časové náročný. Příkladem je třeba bash nebo basic.
Proto se dnes emulovaný výpočetní stroj nahrazuje just-in-time překladačem, kde jednotlivé konstrukce „interpretovaného“ jazyka jsou přeloženy do funkcí emulujících výpočetní stroj a takto vzniklý strojový kód se nechá vykonat skutečným procesorem. Takže „interpret“ pak je ve skutečnosti překladačem do strojového kódu, který navíc poskytuje základní knihovnu funkcí jako je garbage collector a jiné jazykové specifické funkce. Klidně je pak možné vzít přeložený stroják, přilinkovat k němu onu základní knihovnu a vyplivnout standardní spustitelný soubor (třeba ELF) a ten pouštět zcela samostatně.
Takhle to dělá (nebo může dělat) JRE, perl nebo javascriptový interpret od Googlu.
To je všetko zrejmé, ničmenej to neodpovedalo na moju otázku, že ako môže byť interpreter nezávislý na architektúre? Samozrejme, že môže, ak beží nad virtuálnym strojom a teda vykonáva len virtuálne inštrukcie (v kontraste tým skutočným hardvérovým), ale toto AFAIK nie je prípad pythonu.
K tej just-in-time kompilácii: to je presne to, čo ja volám on-the-fly kompiláciou, možno len používam nesprávny termín. A presne tak to funguje pri mnohých LISPoch, človek si pracuje v REPL, ale je možné z toho dostať aj binárku.
> To je všetko zrejmé, ničmenej to neodpovedalo na moju otázku, že ako môže byť interpreter nezávislý na architektúre?
Zdrojovy kod interpretu je nezavisly na architekture. Ten se pak prelozi normalnim kompilatorem.
> A presne tak to funguje pri mnohých LISPoch,
Ano, ale spousta (AFAIK vcetne Pythonu) takhle nefunguje, ale funguji vyrazne jednoduseji.
Môžeš to trochu upresniť? Je to presne to, čo som už písal, totiž, že interpreter pythonu bude v pythone a bootstrapping toho interpretru sa vykoná kompiláciou pomocou kompilátora pythonu v inom jazyku? Alebo myslíš niečo trochu iné?
Je to možné, ba priam pravdepodobné. Holt, neprichádzam s tými obyčajnými interpretrami veľmi do styku (aspoň nie priamo)
Abys mel funkcni interpret pythonu napsany v jazyce X, potrebujes kompilator jazyka X. Napsat kompilator pythonu bude o dost tezsi, nez napsani (stavajiciho) interpretu, proto take nikdo nebude psat kompilator jenom kvuli bootstrapu. Obvykle se take bootstrap dela asi naopak - mas kompilator jazyka X napsany v jazyce X, a napises (nebo sezenes) bezny interpret jazyka X. V nem pak spustis ten kompilator na sebe sama.
To je samozrejme pravda, ale nejak sa mi zdá, že sám sebe odporuješ Pôvodne si písal "Zdrojovy kod interpretu je nezavisly na architekture. Ten se pak prelozi normalnim kompilatorem." Ja som na to odpísal, že interpret pythonu určite môže byť v pythone a je to nezávislé na architektúre a ten sa dá preložiť kompilátorom pythonu. Čiže presná realizácia tvojho príkladu. A ty si moju a teda (efektívne) aj svoju myšlienku odhodil, čo mi pripadá nekonzistentné. Takže som asi niečo nepochopil, keď sa mi zdá, že odporuješ sám sebe
Čiže, jednotlivé tvoje príspevký sú úplne zrejmé, ale keď ich človek dá dokopy, tak nedávajú zmysel
Please explain.
Je to jednoduche. Tvuj puvodni dotaz byl, proc neni python napsany v pythonu.
Odpoved:
1) Guido van Rossum napsal interpret Pythonu.
2) Kdyby ho mel psat v Pythonu, tak potrebuje jeste kompilator Pythonu.
3) Kdyby existoval kompilator Pythonu, byl by interpret Pythonu vicemene k nicemu.
3 je sprostosť
Tak tu 3) upresnim - nemelo by smysl psat novy interpret pythonu, protoze by interaktivni pythonove prostredi ('interpret') slo nejspis ziskat upravou kompilatoru.
Kazdopadne zadny kompilator pythonu neexistoval. A Guido van Rossum si sam zvolil latku 'napsat interpret', nikoliv o rad obtiznejsi 'napsat kompilator' (nebo interpret obsahujici JIT kompilator, to uz je jedno).
I kdyz je pravda, ze s vyuzitim kodu existujicich nastroju jako LLVM nebo backendu GCC by napsat kompilator nemuselo byt tak slozite.
S týmto upresnením súhlasím
[Citation Needed]
Neviem. Osobne si myslím, že hlavný dôvod je, že Guida to ani nenapadlo, proste to napísal v C (zrejme na počiatku nemal poriadne ani rozmyslené, čo ten jazyk má všetko robiť, čo je jasne vidieť na vývoji 1->2->3), proste to neriešil, už to tak zostalo. Plus tá portabilita a rýchlosť C tiež mohla hrať rolu.
> vzhledem k tomu ze Python ma funkci eval kompilator bude stejne muset k vyslednymu kodu prilinkovat interpreter...
Anebo na dany kod v runtime zavolat kompilator a vysledek prilinkovat a spustit.
Ak mi teda nechceš tvrdiť, že kompilátor je len lepší interpret (čo je možno pravda v prípade tých interpretrov, ktoré sú realizované pomocou on-the-fly kompilátorov, ale určite nie pri tých bežných) a inak je to úplne to isté
To sú takmer všetko opäť raz zrejmé veci, navyše napísané tak zložito, že ak ich niekto neovládal už dopredu, tak ich z tohoto nepochopí ani omylom
Navyše, podobne ako Vaši kolegovia, používate implicitný predpoklad, že interpret != on-the-fly (just-in-time) kompilátor, čo nie je pravda, aj táto realizácia sa pomerne často používa
Samozrejme, že napísať kompilátor je zložitejšie. Ale ja som tu tú diskusiu o bootstrappingu interpretov nezačal (resp., jak sa to vezme. Založil som blogpost, takže si za to môžem sám ).
Je to tak. Též to například dělá Eiffel.
Yup, to je ďalšia možnosť. Otázka je, či je výhodnejšie napísať prekladač python do binárky v C, alebo písať prekladač pythonu do C v pythone
Odpoved na puvodni otazku proc: Kvuli rychlosti. Myslim, ze portabilita nebyla pro Guida podstatna v dobe, kdy to psal, a take, ze pro nej byla vzdy podstatna prakticnost, tedy chtel od zacatku Python jako jazyk z C rozsiritelny (z C protoze je to na Unixech nejpouzivanejsi jazyk, nebo byl v te dobe). Nechtel IMHO proste vytvorit novy Smalltalk - svet sam pro sebe, ale chtel neco, co budou lide pouzivat jako nadstavbu nad low-level kod v C. Musite si take uvedomit, ze to rozhodnuti padlo v roce 1991, takze tyto duvody teoreticky muzete oznacit za historicke.
Mimochodem, jde to vubec? Nejake zakladni funkce kazdeho jazyka musite napsat v C (nebo jinem kompilovanem jazyce), a to je IMHO prave to, co je napsane v C. Rada modulu zakladni knihovny byla poprve naimplementovana v Pythonu (nebo slo o vazby na existujici knihovny) a teprve pozdeji re-implementovana v C (napriklad pickle).
Ďakujem za odpoveď. Nechcel som nikoho napádať (a Guida už vôbec nie), len som bol zvedavý. A btw, argument rýchlosti nie je asi relevantný, pretože PyPy (implementácia Pythonu v Pythone, okrem iného) produkuje kód rýchlostne porovnateľný s CPythonom.
Dá sa to. Ten proces sa volá bootstrapping. Kompilátor jazyka X napíšete v jazyku X. Samozrejme vyvstáva otázka, ako ten kompilátor skompilovať. Možností je niekoľko: skompilovať to ručne do strojového kódu (znie to smiešne, kvôli obrovskej náročnosti, ale aj také príklady sú). Ďalšia možnosť je napísať minimálny kompilátor (v zmysle, že nepodporuje vlastnosti, ktoré treba na skompilovanie toho kompilátora a zároveň nerobí žiadne optimalizácie) jazyka X v jazyku Y. Tak sa skompiluje kompilátor v jazyku X a ten sa potom prípadne spustí sám na seba (ak chce človek získať zoptimalizovaný kompilátor). Ďalšia možnosť je cross-platformové kompilovanie, kde binárny kód pre danú architektúru vyrobíte z nejakej mašinky (takto funguje PyPy, vie vyrábať (nielen) Python konkrétne pre danú architektúru. Celkovo vzaté, nie je to jednoduchý proces, ale dá sa to.
Čo sa týka tej interakcie s C knižnicami, tak to má tiež svoje meno a volá sa to "foreign function interface". Nie je nutné písať kompilátor v jazyku C, aby mal podporu pre jazyk C. Ostatne a čo podpora ostatných jazykov než C? Tým sa toto vôbec neadresuje. Pomocou jednotného FFI môžete jazyk (do určitej miery) integrovať s hocijakým iným jazykom.
Ďakujem za odpoveď. Nechcel som nikoho napádať (a Guida už vôbec nie), len som bol zvedavý. A btw, argument rýchlosti nie je asi relevantný, pretože PyPy (implementácia Pythonu v Pythone, okrem iného) produkuje kód rýchlostne porovnateľný s CPythonom.PyPy je v podstatě jen jiný způsob, jak vyrobit ten C kód, který je u CPythonu psaný ručně. No a s tou rychlostí to žádná sláva zatím není, i když "řádově" už je to stejné. Dospěli k tomu po mnoha letech vývoje. Zkrátka: napsat interpreter v C je mnohem praktičnější a výsledný běh programu rychlejší.
Jiste ze muzete napsat kompilator primo v tom jazyce, a jiste ze muzete psat ten jazyk v necem jinem nez v tom, v cem ho chcete pak rozsirovat, ale proc se s tim delat? Guido nechtel psat kompilator, konec pribehu. Proto musel napsat jadro Pythonu v kompilovanem jazyce. Podle me to proste byla nejlogictejsi volba. A osobne si myslim, ze napsal v C prave tolik, kolik potreboval. Vsechna ostatni reseni, o kterych mluvite, jsou strasne pres ruku.
Nehovorím, že nie sú cez ruku. Ale prinášajú obrovskú výhodu: písať v svojom vlastnom jazyku a nie furt v C (čo je ostatne zrejme hlavný dôvod, prečo nové jazyky vznikajú: niekto si myslel, že sú v istých ohľadoch lepšie ako veľa ostatných jazykov). Pravda, pre interpreter sa to moc nehodí + portabilita C + rýchlosť C + už to v tejto diskusii bolo všetko rozobraté
Veľmi Vám nerozumiem. Tá transformačná tabuľka je predsa bytekód (alebo iná interná reprezentácia jazyka) <-> strojový kód a rovnako dobre ju môžete použiť ako pri kompilátore, tak pri interpretri (pri interpretri proste vykonáte strojovú inštrukciu danú tabuľkou). Ostatne už to, že interpret sa dá realizovať ako JIT kompilátor vyvracia Vaše tvrdenie
načti_znak
, vypiš_znak
a transformuj
není žádná operace, kterou byste ten strojový kód mohl spustit. Což je právě ta podstatná operace/instrukce, která vám v interpretu chybí.
Ja nejak nevidim tu principialne vetsi narocnost operace transformuj
oproti operaci spust
. Proste misto aby add
v tabulce ukazovala na string se dvema instrukcema, bude ukazovat na funkci ktere ta dve cisla secte.
No pockat, resime situaci kompilator vs. interpret, bootstrapping je k tomuhle problem ortogonalni.
On tech dotazu polozil vic. Jestli jste si vybral tenhle, tak proc do toho tahate kompilator a srovnavate ho s interpretem?
Interpret pythonu napsany v pythonu nepotrebuje zadny kus nativniho kodu, jedine co potrebuje je funkcni kompilator/interpret pythonu (ale to je snad jasne).
#!/usr/bin/env bajecny-novy-jazyk runtime.interpreter.eval(io.file.read.byName(runtime.arguments[0]))
To je ale preci jasne tak nak samo sebou, ze pokud mate program x napsany v jazyku y, tak pro ten jazyk y musite mit nejaky funkcni prekladac/interpret, jinak si svuj program muzete akorat vytisknout na triko. Uplne prvni prekladac cecka take nemohl byt napsan v cecku. Pokud ovsem mam funkcni prekladac/interpret pythonu/cecka (ktery jste trba napsal v assembleru), tak neni problem napsat prekladac/interpret pythonu/cecka v pythonu/cecku aniz bych potreboval nejaky bootstrapping nebo dodatecny nativni kod. (A porad nevim, jak do toho zapada srovnani kompiler vs. interpret.)
A na to jste prisel jak? Myslite, ze Guido nekde hluboko v utrobach zdrojaku pythonu ukryl podminku, ktera kdyz je detekovan pokus spustit interpret pythonu, tak ukonci program s chybou? A co kdyz v pythonu napisu interpret c++, taky me to vykopne? LISPu? Emulatoru x86 procesoru?
Abych se priznal, ja ani nevim, co resim, protoze mi neni jasne, co vlastne resite a na co odpovidate vy.
A jak spustite nejaky program v cecku, kdyz nemate prekladac/interpret cecka? Uz jsem vam trikrat ruznymi slovy napsal, ze, pochopitelne, abyste spustil jakykoliv program v jazyku x potrebujete mit funkcni prekladac/interpret jazyka x. Prvni prekladac cecka nemohl byt napsan v cecku, prvni interpret pythonu nemohl byt napsan v pythonu. To ale neznamena, ze nelze napsat prekladac cecka v cecku a interpret pythonu v pythonu (a tim myslim ciste v pythonu, bez nejakych dodatecnych "nativnich" implementaci vybranych operaci).
Tak predne bychom si meli vyjasnit terminologii. Programem v cecku jsem samozrejme myslel jeho zdrojaky, tzn. treba soubor "program.c" nikoliv vyslednou binarku.
Ve vasem priklade je mezi obema moznostma jeden zasadni rozdil. Zatimco ke zdrojakum prekladace cecka v cecku jste pribalil zkompilovanou binarku c prekladace, u pythonu jste z nejakeho duvodu funkcni (tzn. normalne spustitelny z toho shellu) interpret/prekladac nedodal. To je pak jasne, ze interpret napsany v pythonu (a jakykoliv jiny zdrojak napsany v pythonu) je mi k nicemu. Kdybych vam analogicky sebral tu binarku c prekladace, tak si taky neskrtnete.
Pokud oznacujete nativni prekladac cecka, vznikly ze zdrojaku cecka, jako "program napsany v cecku", proc by nativni prekladac/interpret pythonu, vznikly z pythonich zdrojaku, nemohl byt oznacen za "program napsany v pythonu"?
u pythonu jste z nejakeho duvodu funkcni (tzn. normalne spustitelny z toho shellu) interpret/prekladac nedodalSláva, konečně se dostáváme k podstatě. Původní otázka byla, proč není interpret Pythonu napsaný v Pythonu. Odpověď je ta, že zdrojový kód programu v Pythonu a spustitelný kód programu v Pythonu je jedno a totéž. A něco, co je „normálně spustitelné ze shellu“ není programem v Pythonu (interpret Pythonu to nebude umět interpretovat).
Nazvu ji proste program. Rikat binarce program v C mi projde podivne, to uz byste to rovnou mohl nazyvat "program v C, vimu, make a gcc".
Aha aha, takze jadro problemu bude v tom, za mate ponekud nekonzistentni nazvoslovi. Binarce vznikle zkompilovanim c zdrojaku rikate "program v c", ale u pythonu jsou "programem v pythonu" pouze zdrojaky. By me zajimalo, jak rikate programum napsanym v c/c++, ktere jsou spousteny c/c++ interpretrem, takze zadny binarni soubor nevznika. A take jak byste nazval nativni program, vznikly kompilaci pythonich zdrojaku (pokud by pythoni kompilator do nativniho kodu existoval, coz jiste teoreticky mozne je).
Takze kdyz svou myslenku preformuluji: mam binarni, nativni, "nezdrojakovy", na procesoru primo bezici program, ktery umi interpretovat textove zdrojaky pythonu. Potom je mozne zkonstruovat takovy pythoni textovy zdrojak, ze jeho spustenim v existujicim binarnim interpretru vznikne bezici program, ktery je schopny nacist textovy nebinarni zdrojak v pythonu a vypsat binarni nativni soubor, ktery po spusteni v shellu bude presne vykonavat prikazy, popsane v nactenem zdrojaku pythonu.
Souhlasite?
Pokud ano, tak jiste lze ucinit ruzne modifikace, napr. ze vystupem nebude binarni nativni soubor, ale dojde primo k interpretaci nactenych pythonich zdrojaku a provedeni prikazu (takze to bude interpreter v interpretru). Voila - interpreter pythonu napsany v pythonu!
Voila - interpreter pythonu napsany v pythonu! Váš komentářKdepak. Pořád tam máte onen nativní zavaděč, takže onen interpretr není celý v Pythonu. A o v původním příspěvku evidentně šlo – pokud by šlo jen o to, proč není nějaká část interpretru, byla by jediná správná odpověď „ale ona je“. Stačí si třeba vzpomenout na funkci
eval
.
Vasi nomeklature fakt nehovim. Django take neni cele v pythonu, protoze na jeho spusteni potrebujete "zavadec", aka interpreter? To vlastne znamena, ze neexistuje zadny program zcela napsany v pythonu, protoze zatim mame jenom interpreter. Az nekdo napise kompilator, tak mavnutim kouzelneho proutku najednou vsechny programy, ktere nebyly zcela v pythonu, zcela v pythonu budou?
Abychom to shrnuli: jde vyrobit takove zdrojaky v pythonu (a tim nemyslim jednoradkovy eval), ze po jejich spusteni (at uz iterpretrem nebo po kompilaci) bude tento program schopen spoustet/kompilovat jine pythoni zdrojaky. Vy jste se zasekl na tom, ze kdyz tento interpretr/kompilator budu chtit spoustet v pythonim interpretru, budu muset mit ten interpretr po ruce. To je samozrejme pravda, ale ja v tom nevidim principialni prekazku, ktera by jaksi branila python v pythonu napsat.
Skutecny duvod, proc neni prakticke (nikoliv nemozne!) vytvaret interpretr pythonu napsany v pythonu kdyz ho muzeme spoustet jenom v dalsim interpretru pythonu, je ten, ze upravama pythonich zdrojaku naseho interpretru neni mozne provadet bugfixy/optimalizace/rozsireni v nativnim interpretru, takze bychom vzdy byli limitovani tou nativni verzi.
To je samozrejme pravda, ale ja v tom nevidim principialni prekazku, ktera by jaksi branila python v pythonu napsat.Principiální překážka to samozřejmě není. Akorát když budete mít jedinou implementaci kompilátoru/interpretu Pythonu, a tou bude právě interpret v Pythonu, můžete na něj akorát smutně koukat. No a pokud nechcete hned na začátku psát těch interpretrů víc, je dobré napsat právě ten, který půjde spustit nativně.
Vyjadrujte sa jasnejšie. Python != interpreter Pythonu. Zdrojový kód v pythone a spustiteľný kód v pythone má rovnaký dichotómiu ako v každom inom jazyku. Zdrojový kód je ten jazyk samotný a spustiteľný kód je bytekód nejakej mašiny (či už virtuálnej, alebo reálnej). Nie, pôvodná otázka bola, prečo nie je kompilátor/intepreter pre python napísaný v pythone, nešlo o to, že priamo interpreter, to je tam nepodstatné. A ako sinuhet správne podotkol, tých otázok tam bolo oveľa viac. Zrovna ste si vybrali tú, ktorá je úplne zrejmá a nikoho nezaujíma a navyše ste to tak domotali, že tu vznikla ďalšia 10 komentárová diskusia o ničom, ktorá spočíva len na vzájomnom nepochopení
So whatcha don' get, nigga?
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.