Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

An Implementation in Python with a Compiler #653

Open
wants to merge 60 commits into
base: master
Choose a base branch
from

Conversation

jcguu95
Copy link

@jcguu95 jcguu95 commented Mar 20, 2024

Hello Joel Martin! Thanks for your inspiring work! Based on your python implementation, I implemented a compiled version: python-compile. It passes all relevant tests (for step2 to stepA, regular and soft), and it is 16 times faster per the performance test suite.

[./mal]$ make "perf^python"
----------------------------------------------
Performance test for python:
Running: env STEP=stepA_mal MAL_IMPL=js python_MODE=python ../python/run ../tests/perf1.mal
Elapsed time: 1 msecs
Running: env STEP=stepA_mal MAL_IMPL=js python_MODE=python ../python/run ../tests/perf2.mal
Elapsed time: 4 msecs
Running: env STEP=stepA_mal MAL_IMPL=js python_MODE=python ../python/run ../tests/perf3.mal
iters over 10 seconds: 9311

[./mal]$ make "perf^python-compile"
----------------------------------------------
Performance test for python-compile:
Running: env STEP=stepA_mal MAL_IMPL=js ../python-compile/run ../tests/perf1.mal
Running: env STEP=stepA_mal MAL_IMPL=js ../python-compile/run ../tests/perf2.mal
Running: env STEP=stepA_mal MAL_IMPL=js ../python-compile/run ../tests/perf3.mal
iters over 10 seconds: 148519

Would you like to merge this, or would you rather keep this maintained separately? Please let me know.

Cheers,
Jin

This took me a while.. and I need to redo the other operators. So far
only def! and +-*/ works.
Make it verbose and more easily debuggable.
1. Remove old commented code.
2. Give repls new prompts.
3. Refactor COMPILE in to smaller functions.
I feel the compiler should do more work, other than just delegating.
1. COMPILE now takes ast of function type.
2. Support eval and debugger toggle.
(by cheating I mean deferring compilation)
Made some changes that I don't fully understand.
It's not working yet.
I think I know what to do in the following ocmmits.
It's still a mess and unusable now. But I know what to do now.

When an AST (A) gets compiled, the end result is a code (C) to be
executed. Execution of C should return a *closure* (not a function,
which I've been doing, which is wrong), that holds a slot telling the
function where to look for literals (e.g. scalars, functions, objects..
etc). So far I've been trying to save those literals in a global
constant _consts. It was why my code failed so far because some compiled
ASTs may be alive even after the next compilation. As a consequence, as
they are reading from the global _consts, they read the wrong data.
The closure way is the right way to go. Woo hoo :)
make "test^python-compile^step6"
Pass test 4, 5 (except the last one), 6.
test^python-compile^step3~7
@kanaka
Copy link
Owner

kanaka commented Aug 6, 2024

@jcguu95 If it can be restructured to fit the code layout of other implementations (https://github.com/kanaka/mal/blob/master/docs/FAQ.md#code_split) then I would be willing to consider merging it. Otherwise, if that's too complicated or unwieldy then keeping it separate is probably best. Although I would be happy to include a link to it in the top level README if you like in the "External Implementations" section.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants