spasmlang
is a simple Python assembly language. It is
essentially a high-level interface on top of the bytecode package
that allows you to generate bytecode from a simple assembly-like syntax.
Table of Contents
pip install spasmlang
The spasmlang
package provides a single class, Assembly
, that allows you to
generate bytecode from a simple assembly-like syntax. See the examples
below for a taste of its API.
You can also use the spasm
command-line utility to compile assembly files
directly to Python bytecode:
spasm example.pya # generates example.pyc
This is how the classic "Hello, World!" program looks like, targeting the CPython 3.12 bytecode:
from spasm import Assembly
asm = Assembly()
asm.parse(
r"""
push_null
load_const print
load_const "Hello, World!"
call 1
return_value
"""
)
exec(asm.compile())
This is how you can compile the file example.pya
to example.pyc
to create
a "Hello, World!" module, again targeting CPython 3.11:
# example.pya
resume 0
push_null
load_name $print
load_const "Hello, spasm!"
precall 1
call 1
pop_top
load_const None
return_value
Compile the assembly code with (assuming that you have installed spasmlang
with CPython 3.11)
spasm example.pya
and then execute the generated module with e.g.
python3.11 -m example
This example shows how to create a module that exports a greet
function that
takes one argument, targeting CPython 3.11:
# greet.pya
code greet(who)
resume 0
load_global (True, "print")
load_const "Hello, "
load_fast $who
format_value 0
build_string 2
precall 1
call 1
return_value
end
resume 0
load_const .greet
make_function 0
store_name $greet
load_const None
return_value
Again, compile the assembly code with
spasm greet.pya
and test it with
$ python3.11 -c "from greet import greet; greet('spasmlang')"
Hello, spasmlang
spasmlang
is distributed under the terms of the
MIT license.