7 ms·
A Python Interpreter Written in Python
- tekknolagi 5mo agoSee also https://github.com/nedbat/byterun https://github.com/nedbat/byterun and https://github.com/rocky/x-python https://github.com/rocky/x-python
- bjoli 5mo agoAnd, in some ways, PyPy. I still think it is the sanest way to implement Python. It makes me sad that I have to write C to make any meaningful changes to Python. Same goes for ruby. Rubinius was such a nice project. Hacking on schemes and lisps made me realize how much more fun it is when the language is implemented in the language itself. It also makes sure you have the right abstractions for solving a bunch of real problems.
- anitil 5mo ago> And, in some ways, PyPy What do you mean by that? I'm not familiar with PyPy
- nxpnsv 5mo agoPyPy is python implemented in python. It is fast.
- Doxin 5mo agoPyPy is python implemented in RPython, which is technically a python subset. It's so restricted it might as well be a different language though.
- bjoli 5mo agoIt is restricted in a way that you would restrict yourself to write high speed software in most languages, and I found it is not that restrictive compared to C that you would have to use if you were to write a fast Python library.
- Doxin 5mo agooh for sure, but I still feel like telling people pypy is written in python is misleading. it's written in something significantly like python, but it's not python.
- mjmas 5mo ago> technically a python subset So it can just run under CPython? If so, then that isn't too misleading.
- bjoli 5mo agoYes. It can run under Cpython (2.7).
- nxpnsv 5mo agoPyRPy is just less catchy sounding
- notpushkin 5mo agohttps://pypy.org/ https://pypy.org/ It lags behind CPython in features and currently only supports Python versions up to 3.11. There was a big discussion a month ago: https://news.ycombinator.com/item?id=47293415 https://news.ycombinator.com/item?id=47293415 But you can help! https://pypy.org/howtohelp.html https://pypy.org/howtohelp.html https://opencollective.com/pypy https://opencollective.com/pypy
- wyldfire 5mo agoThe fact that it's written in python is often brought up in order to explain its name. But really, it's much less interesting than the fact that it has a tracing JIT. If it were called PyJIT I'd bet it would be clearer and more obvious that it's fast. And people would prob get less hung up on the distinction between python/rpython.
- actionfromafar 5mo agoWell, one could rewrite Python (perhaps piece by piece?) in Shedskin. Shedskin is very nearly Python compatible, one could say it is an implementation of Python.
- anitil 5mo agoOooh it's a bytecode interpreter! I was wondering how they'd fit a parser/tokenizer in 500 lines unless the first was `import tokenizer, parser`. And it looks like 1500ish lines according to tokei I think because python is a stack-based interpreter this is a really great way to get some exposure to how it works if you're not too familiar with C. A nice project!
- hcfman 5mo agoJust wondering why you stopped there? Why not a python interpreter for a python interpreter for python ?
- dnnddidiej 5mo agoIt already is that.
- woadwarrior01 5mo agoaka A Metacircular Interpreter
- mapontosevenths 5mo agoDo you think God stays in heaven because he too lives in fear of what he's created?
- kevinten10 5mo ago[flagged]
- blueybingo 5mo agothe article glosses over something worth pausing on: the `getattr` trick for dispatching instructions (replacing the big if-elif chain) is actaully a really elegant pattern that shows up in a lot of real interpreters and command dispatchers, not just toy ones -- worth studying that bit specifically if you're building anything with extensible command sets.
- johndough 5mo agoAre you a bot? All your recent comments point out a thing in an article and contain LLM-isms.
- bdangubic 5mo agoyou asking a bot if it is a bot? :)
- blueybingo 5mo agohaha no im not a bot, but starting to realise i sound like one. need to be less cynical.
- bdangubic 5mo agoexactly what the bot would say lol :)
- blueybingo 5mo agodamn brain is becoming bot mush
- gbacon 5mo agoYou know that Voight-Kampff test of yours? Did you ever take that test yourself?
- andltsemi3 5mo ago"Yaw dog I heard you liked python, so I put python in your python so you can interpret python while you interpret python"
- vachanmn123 5mo agoVery well written! Everyone used to tell me during Uni that stacks are used for running programs, never ACTUALLY understood where or how.
- BoppreH 5mo ago> Byterun is a Python interpreter written in Python. This may strike you as odd, but it's no more odd than writing a C compiler in C. I'm not so sure. The difference between a self-hosted compiler and a circular interpreter is that the compiler has a binary artifact that you can store. With an interpreter, you still need some binary to run your interpreter, which will probably be CPython, making the new interpreter redundant. And if you add a language feature to the custom interpreter, and you want to use that feature in the interpreter itself, you need to run the whole chain at runtime: CPython -> Old Interpreter That Understand New Feature -> New Interpreter That Uses New Feature -> Target Program. And the chain only gets longer, each iteration exponentially slower. Meanwhile with a self-hosted compiler, each iteration is "cached" in the form a compiled binary. The chain is only in the history of the binary, not part of the runtime. --- Edit since this is now a top comment: I'm not complaining about the project! Interpreters are cool, and this is genuinely useful for learning and experimentation. It's also nice to demystify our tools.
- gwerbin 5mo agoPyPy handled this by implementing PyPy in a restricted minimal subset of Python that they called RPython, and that seemed to work out well for them.
- mikepurvis 5mo agoI was never a user of PyPy but I really appreciated the (successful) effort to cleanly extract from Python a layer that of essential primitives upon which the rest of the language's features and sugar could be implemented. It's more than just what is syntax or a language feature, for example RPython provides nts classes, but only very limited multiple inheritance; all the MRO stuff is implemented using RPython for PyPy itself.
- paulddraper 5mo agoThe key difference is that RPython is actually a compiled language. I.e. PyPy DOESN'T have an interpreter written in an interpreted language.
- 5mo ago
- gield 5mo ago(2012)
- em-bee 5mo agoactually it was published as a chapter in "500 lines or less" in 2016: https://news.ycombinator.com/item?id=11796253 https://news.ycombinator.com/item?id=11796253 the text is based on python 3.5 which was released in 2015 other discussions: https://news.ycombinator.com/item?id=16795049 https://news.ycombinator.com/item?id=16795049 https://news.ycombinator.com/item?id=12455104 https://news.ycombinator.com/item?id=12455104 https://news.ycombinator.com/item?id=11796253 https://news.ycombinator.com/item?id=11796253
- throwpoaster 5mo agoHow does it define ‘\n’? ;) cf: https://www.cs.cmu.edu/~rdriley/487/papers/Thompson_1984_ReflectionsonTrustingTrust.pdf https://www.cs.cmu.edu/~rdriley/487/papers/Thompson_1984_Ref...
- jgbuddy 5mo agoone liner: eval(str)
- nasretdinov 5mo agoWent into comments looking for this exact comment. Wasn't disappointed
- _blk 5mo agoGreat minds think alike ;)
- PhunkyPhil 5mo agoI can do you one better: ```python3 from openai import OpenAI import sys client = OpenAI() response = client.chat.completions.create( model="gpt-4", messages=[{ "role": "user", "content": f"generate valid python byte code this program compiles to: {sys.argv[1]}" }] ) print(response.choices[0].message.content) ``` Actually, probably not better.
- nagaiaida 5mo agoand as soon as one tries to meaningfully add features to this sort of metainterpreter, the usefulness of homoiconic syntax becomes abundantly clear
- 060880 5mo ago[dead]
- cestith 5mo agoThe article contrasts Python to Perl, saying Perl is purely interpreted while Python has compilation. This is factually incorrect. Perl is transformed into an AST. Then that is decorated into an opcode tree. The thing runs code nearly as fast as C in many instances, once the startup has completed and the code is actually running.