Compare commits

...

1 Commits

Author SHA1 Message Date
Johan B.W. de Vries
2039d11e19 Some repo cleanup 2022-08-20 18:14:28 +02:00
4 changed files with 60 additions and 50 deletions

View File

@ -25,7 +25,7 @@ examples: venv/.done $(subst .py,.wasm,$(wildcard examples/*.py)) $(subst .py,.w
venv/bin/python3 -m http.server --directory examples venv/bin/python3 -m http.server --directory examples
test: venv/.done test: venv/.done
WAT2WASM=$(WAT2WASM) venv/bin/pytest tests $(TEST_FLAGS) venv/bin/pytest tests $(TEST_FLAGS)
lint: venv/.done lint: venv/.done
venv/bin/pylint phasm venv/bin/pylint phasm

View File

@ -3,19 +3,67 @@ phasm
Elevator pitch Elevator pitch
-------------- --------------
A language that looks like Python, handles like Haskell, and compiles to A programming language, that looks like Python, handles like Haskell,
WebAssembly. and compiles directly to WebAssembly.
Naming Name origin
------ -----------
- p from python - p from python
- ha from Haskell - ha from Haskell
- asm from WebAssembly - asm from WebAssembly
You will need wat2wasm from github.com/WebAssembly/wabt in your path. Example
-------
For more examples, see the examples directory.
```py
def helper(n: u64, a: u64, b: u64) -> u64:
if n < 1:
return a + b
Ideas return helper(n - 1, a + b, a)
=====
- https://github.com/wasmerio/wasmer-python @exported
- https://github.com/diekmann/wasm-fizzbuzz def fib(n: u64) -> u64:
- https://blog.scottlogic.com/2018/04/26/webassembly-by-hand.html if n == 0:
return 0
if n == 1:
return 1
return helper(n - 1, 0, 1)
```
Gotcha's
--------
- When importing and exporting unsigned values to WebAssembly, they will become
signed, as WebAssembly has no native unsigned type. You may need to cast
or reinterpret them.
Contributing
------------
At this time, I'm mostly looking for use cases for WebAssembly, other than to
compile existing C code and running them in the browser. The goal of WebAssembly
is to enable high-performance applications on web pages[5]. Though most people
seem to use it to have existing code run in the browser.
If you have a situation where WebAssembly would be useful for it's speed, I'm
interested to see what you want to use it for.
Also, if you are trying out Phasm, and you're running into a limitation, I'm
interested in a minimal test case that shows what you want to achieve and how
Phasm currently fails you.
Additional required tools
-------------------------
At the moment, the compiler outputs WebAssembly text format. To actually
get a binary, you will need the wat2wasm tool[6].
.
References
----------
[1] https://www.python.org/
[2] https://www.haskell.org/
[3] https://webassembly.org/
[4] https://www.w3.org/TR/wasm-core-1/
[5] https://en.wikipedia.org/w/index.php?title=WebAssembly&oldid=1103639883
[6] https://github.com/WebAssembly/wabt

View File

@ -1,49 +1,11 @@
import io
import os
import subprocess
import sys import sys
from tempfile import NamedTemporaryFile
import pywasm
import wasm3
import wasmer
import wasmer_compiler_cranelift
import wasmtime
from phasm.codestyle import phasm_render from phasm.codestyle import phasm_render
from phasm.compiler import phasm_compile
from phasm.parser import phasm_parse
from . import runners from . import runners
DASHES = '-' * 16 DASHES = '-' * 16
def wat2wasm(code_wat):
path = os.environ.get('WAT2WASM', 'wat2wasm')
with NamedTemporaryFile('w+t') as input_fp:
input_fp.write(code_wat)
input_fp.flush()
with NamedTemporaryFile('w+b') as output_fp:
subprocess.run(
[
path,
input_fp.name,
'-o',
output_fp.name,
],
check=True,
)
output_fp.seek(0)
return output_fp.read()
class SuiteResult: class SuiteResult:
def __init__(self): def __init__(self):
self.returned_value = None self.returned_value = None

View File

@ -5,7 +5,7 @@ import pytest
from pywasm import binary from pywasm import binary
from pywasm import Runtime from pywasm import Runtime
from .helpers import wat2wasm from wasmer import wat2wasm
def run(code_wat): def run(code_wat):
code_wasm = wat2wasm(code_wat) code_wasm = wat2wasm(code_wat)