Skip to content

Commit

Permalink
Merge pull request #4 from tchojnacki/wasm
Browse files Browse the repository at this point in the history
WASM
  • Loading branch information
tchojnacki authored Nov 1, 2023
2 parents 604c377 + 6ece8ee commit 39a9daa
Show file tree
Hide file tree
Showing 80 changed files with 3,507 additions and 125 deletions.
3 changes: 3 additions & 0 deletions .github/hooks/commit-msg
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env sh

commitlint --edit ${1}
3 changes: 3 additions & 0 deletions .github/hooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env sh

cargo clippy
5 changes: 5 additions & 0 deletions .github/setup-hooks.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/usr/bin/env sh

root="$(pwd)"
rm -rf "$root/.git/hooks"
ln -s "$root/.github/hooks" "$root/.git/hooks"
45 changes: 41 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
[workspace]
members = ["brainfuck/*"]
members = ["brainfuck/bf", "brainfuck/brainlib", "common/wasmitter"]
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ Implemented languages:
- [`brainlib` 📦](./brainfuck/brainlib#readme)
- [`bf` 🛠️](./brainfuck/bf#readme)

Common building blocks:

- [`wasmitter` 📦](./common/wasmitter#readme) - emits WebAssembly code

> [!NOTE]
> - 🛠️ - binary - this can be run from the command line
> - 📦 - library - this can be imported by a Rust program
> [!WARNING]
> All of the library crates in this repository are subject to breaking changes
> (with or without a version change) if they haven't reached `1.0.0` yet.
7 changes: 7 additions & 0 deletions brainfuck/bf/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
[package]
name = "bf"
version = "0.1.0"
authors = ["Tomasz Chojnacki <[email protected]>"]
edition = "2021"
description = "Command line interface for Brainfuck compilation."
repository = "https://github.com/tchojnacki/esolangs"
license = "MIT OR Apache-2.0"
keywords = ["brainfuck", "compiler", "cli"]
categories = ["command-line-interface", "compilers"]
publish = false

[dependencies]
brainlib = { path = "../brainlib" }
Expand Down
131 changes: 69 additions & 62 deletions brainfuck/bf/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
> [!NOTE]
> Visit the [brainfuck](../#readme) directory to learn more about the language.
![](./.github/docs/mandelbrot.gif)
![](./docs/mandelbrot.gif)

## Examples

Expand All @@ -16,71 +16,39 @@ $ bf --help
Usage: bf [OPTIONS] <--file <FILE>|--code <CODE>|--stdin>
Options:
-d, --debug Run code in debug mode (use # to set a breakpoint)
-h, --help Print help
-t, --target <TARGET>
[default: run]
Possible values:
- run: Run the code directly from the command line
- debug: Run the code in debug mode (use # to set a breakpoint)
- wasm-text: Compile the code to plain WASM text format
- wasm-wasi-text: Compile the code to WASM text format, using WASI
-h, --help
Print help (see a summary with '-h')
Input:
-f, --file <FILE> Path to the file containing the program code
-c, --code <CODE> Program code passed as an inline argument
-s, --stdin Pass the program code through stdin and (use ! to separate it from input)
-f, --file <FILE>
Path to the file containing the program code
-c, --code <CODE>
Program code passed as an inline argument
-s, --stdin
Pass the program code through stdin and (use ! to separate it from input)
Conventions:
--length <TAPE_LENGTH> Count of available memory cells [default: 30000]
--strict If enabled, stop execution when overflowing a cell or tape index
$ bf -f specs/mandelbrot.code.bf
AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDEGFFEEEEDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDEEEFGIIGFFEEEDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAABBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDEEEEFFFI KHGGGHGEDDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAABBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEEFFGHIMTKLZOGFEEDDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAABBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEEEFGGHHIKPPKIHGFFEEEDDDDDDDDDCCCCCCCCCCBBBBBBBBBBBBBBBBBB
AAAAAAAAAABBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEEFFGHIJKS X KHHGFEEEEEDDDDDDDDDCCCCCCCCCCBBBBBBBBBBBBBBBB
AAAAAAAAABBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEEFFGQPUVOTY ZQL[MHFEEEEEEEDDDDDDDCCCCCCCCCCCBBBBBBBBBBBBBB
AAAAAAAABBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEFFFFFGGHJLZ UKHGFFEEEEEEEEDDDDDCCCCCCCCCCCCBBBBBBBBBBBB
AAAAAAABBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEFFFFFFGGGGHIKP KHHGGFFFFEEEEEEDDDDDCCCCCCCCCCCBBBBBBBBBBB
AAAAAAABBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDEEEEEFGGHIIHHHHHIIIJKMR VMKJIHHHGFFFFFFGSGEDDDDCCCCCCCCCCCCBBBBBBBBB
AAAAAABBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDEEEEEEFFGHK MKJIJO N R X YUSR PLV LHHHGGHIOJGFEDDDCCCCCCCCCCCCBBBBBBBB
AAAAABBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDEEEEEEEEEFFFFGH O TN S NKJKR LLQMNHEEDDDCCCCCCCCCCCCBBBBBBB
AAAAABBCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDEEEEEEEEEEEEFFFFFGHHIN Q UMWGEEEDDDCCCCCCCCCCCCBBBBBB
AAAABBCCCCCCCCCCCCCCCCCCCCCCCCCDDDDEEEEEEEEEEEEEEEFFFFFFGHIJKLOT [JGFFEEEDDCCCCCCCCCCCCCBBBBB
AAAABCCCCCCCCCCCCCCCCCCCCCCDDDDEEEEEEEEEEEEEEEEFFFFFFGGHYV RQU QMJHGGFEEEDDDCCCCCCCCCCCCCBBBB
AAABCCCCCCCCCCCCCCCCCDDDDDDDEEFJIHFFFFFFFFFFFFFFGGGGGGHIJN JHHGFEEDDDDCCCCCCCCCCCCCBBB
AAABCCCCCCCCCCCDDDDDDDDDDEEEEFFHLKHHGGGGHHMJHGGGGGGHHHIKRR UQ L HFEDDDDCCCCCCCCCCCCCCBB
AABCCCCCCCCDDDDDDDDDDDEEEEEEFFFHKQMRKNJIJLVS JJKIIIIIIJLR YNHFEDDDDDCCCCCCCCCCCCCBB
AABCCCCCDDDDDDDDDDDDEEEEEEEFFGGHIJKOU O O PR LLJJJKL OIHFFEDDDDDCCCCCCCCCCCCCCB
AACCCDDDDDDDDDDDDDEEEEEEEEEFGGGHIJMR RMLMN NTFEEDDDDDDCCCCCCCCCCCCCB
AACCDDDDDDDDDDDDEEEEEEEEEFGGGHHKONSZ QPR NJGFEEDDDDDDCCCCCCCCCCCCCC
ABCDDDDDDDDDDDEEEEEFFFFFGIPJIIJKMQ VX HFFEEDDDDDDCCCCCCCCCCCCCC
ACDDDDDDDDDDEFFFFFFFGGGGHIKZOOPPS HGFEEEDDDDDDCCCCCCCCCCCCCC
ADEEEEFFFGHIGGGGGGHHHHIJJLNY TJHGFFEEEDDDDDDDCCCCCCCCCCCCC
A PLJHGGFFEEEDDDDDDDCCCCCCCCCCCCC
ADEEEEFFFGHIGGGGGGHHHHIJJLNY TJHGFFEEEDDDDDDDCCCCCCCCCCCCC
ACDDDDDDDDDDEFFFFFFFGGGGHIKZOOPPS HGFEEEDDDDDDCCCCCCCCCCCCCC
ABCDDDDDDDDDDDEEEEEFFFFFGIPJIIJKMQ VX HFFEEDDDDDDCCCCCCCCCCCCCC
AACCDDDDDDDDDDDDEEEEEEEEEFGGGHHKONSZ QPR NJGFEEDDDDDDCCCCCCCCCCCCCC
AACCCDDDDDDDDDDDDDEEEEEEEEEFGGGHIJMR RMLMN NTFEEDDDDDDCCCCCCCCCCCCCB
AABCCCCCDDDDDDDDDDDDEEEEEEEFFGGHIJKOU O O PR LLJJJKL OIHFFEDDDDDCCCCCCCCCCCCCCB
AABCCCCCCCCDDDDDDDDDDDEEEEEEFFFHKQMRKNJIJLVS JJKIIIIIIJLR YNHFEDDDDDCCCCCCCCCCCCCBB
AAABCCCCCCCCCCCDDDDDDDDDDEEEEFFHLKHHGGGGHHMJHGGGGGGHHHIKRR UQ L HFEDDDDCCCCCCCCCCCCCCBB
AAABCCCCCCCCCCCCCCCCCDDDDDDDEEFJIHFFFFFFFFFFFFFFGGGGGGHIJN JHHGFEEDDDDCCCCCCCCCCCCCBBB
AAAABCCCCCCCCCCCCCCCCCCCCCCDDDDEEEEEEEEEEEEEEEEFFFFFFGGHYV RQU QMJHGGFEEEDDDCCCCCCCCCCCCCBBBB
AAAABBCCCCCCCCCCCCCCCCCCCCCCCCCDDDDEEEEEEEEEEEEEEEFFFFFFGHIJKLOT [JGFFEEEDDCCCCCCCCCCCCCBBBBB
AAAAABBCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDEEEEEEEEEEEEFFFFFGHHIN Q UMWGEEEDDDCCCCCCCCCCCCBBBBBB
AAAAABBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDEEEEEEEEEFFFFGH O TN S NKJKR LLQMNHEEDDDCCCCCCCCCCCCBBBBBBB
AAAAAABBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDEEEEEEFFGHK MKJIJO N R X YUSR PLV LHHHGGHIOJGFEDDDCCCCCCCCCCCCBBBBBBBB
AAAAAAABBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDEEEEEFGGHIIHHHHHIIIJKMR VMKJIHHHGFFFFFFGSGEDDDDCCCCCCCCCCCCBBBBBBBBB
AAAAAAABBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEFFFFFFGGGGHIKP KHHGGFFFFEEEEEEDDDDDCCCCCCCCCCCBBBBBBBBBBB
AAAAAAAABBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEFFFFFGGHJLZ UKHGFFEEEEEEEEDDDDDCCCCCCCCCCCCBBBBBBBBBBBB
AAAAAAAAABBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEEFFGQPUVOTY ZQL[MHFEEEEEEEDDDDDDDCCCCCCCCCCCBBBBBBBBBBBBBB
AAAAAAAAAABBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEEFFGHIJKS X KHHGFEEEEEDDDDDDDDDCCCCCCCCCCBBBBBBBBBBBBBBBB
AAAAAAAAAAABBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEEEFGGHHIKPPKIHGFFEEEDDDDDDDDDCCCCCCCCCCBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAABBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEEFFGHIMTKLZOGFEEDDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAABBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDEEEEFFFI KHGGGHGEDDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDEEEFGIIGFFEEEDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBB
$ bf -f specs/add.code.bf -d
--length <TAPE_LENGTH>
Count of available memory cells
[default: 30000]
--strict
If enabled, stop execution when overflowing a cell or tape index
$ bf -f specs/add.code.bf -t debug
Debugger: Entering debugger due to a breakpoint hit.
| es ]␤#␤++␤>
| ^ breakpoint defined here
Expand Down Expand Up @@ -115,9 +83,48 @@ Executing up to 10 next instructions...
> :r
Resuming execution...
7
$ bf -c ",[.,]" -t wasm-text
(module
(import "bf" "input" (func $read_byte (result i32)))
(import "bf" "output" (func $write_byte (param i32)))
(memory (;0;) 1 1)
(global $ptr (mut i32) (i32.const 0))
(func $main
(global.get $ptr)
(call $read_byte)
(i32.const 255)
(i32.and)
(i32.store8)
(block
(global.get $ptr)
(i32.load8_u)
(i32.eqz)
(br_if 0)
(loop
(global.get $ptr)
(i32.load8_u)
(call $write_byte)
(global.get $ptr)
(call $read_byte)
(i32.const 255)
(i32.and)
(i32.store8)
(global.get $ptr)
(i32.load8_u)
(br_if 0)
)
)
)
(export "memory" (memory 0))
(export "_start" (func $main))
)
```

## Features

- Covered by integration tests.
- Reading code from file, as an argument or from stdin.
- Compilation to WebAssembly.
- Built-in debugger with breakpoints and stepping.
File renamed without changes
28 changes: 21 additions & 7 deletions brainfuck/bf/src/args.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
use brainlib::Settings;
use clap::{value_parser, Parser};
use clap::{value_parser, Parser, ValueEnum};

use super::input::Input;

#[derive(Parser)]
pub struct Arguments {
/// Run code in debug mode (use # to set a breakpoint)
#[arg(short, long)]
debug: bool,
pub(crate) struct Arguments {
#[arg(short, long, default_value = "run")]
pub(crate) target: Target,

#[command(flatten)]
pub input: Input,
pub(crate) input: Input,

#[command(flatten)]
conventions: Conventions,
Expand All @@ -21,12 +20,27 @@ impl From<&Arguments> for Settings {
Self::try_new(
args.conventions.tape_length,
args.conventions.strict,
args.debug,
args.target == Target::Debug,
)
.unwrap()
}
}

#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum Target {
/// Run the code directly from the command line
Run,

/// Run the code in debug mode (use # to set a breakpoint)
Debug,

/// Compile the code to plain WASM text format
WasmText,

/// Compile the code to WASM text format, using WASI
WasmWasiText,
}

#[derive(Parser)]
#[command(next_help_heading = "Conventions")]
#[group()]
Expand Down
2 changes: 1 addition & 1 deletion brainfuck/bf/src/debugger.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ enum ReplAction {
EndSilently,
}

pub fn run_debugger(mut eng: StdEngine, source: &str) -> Result<(), String> {
pub(crate) fn run_debugger(mut eng: StdEngine, source: &str) -> Result<(), String> {
macro_rules! enter_repl {
() => {
match repl(&mut eng, source) {
Expand Down
4 changes: 2 additions & 2 deletions brainfuck/bf/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use colored::Colorize;

use crate::source::highlight_source;

pub trait CliError {
pub(crate) trait CliError {
fn message(&self, source: &str) -> String;
}

Expand Down Expand Up @@ -41,6 +41,6 @@ impl CliError for RuntimeError {
}
}

pub fn show_error(message: &str) {
pub(crate) fn show_error(message: &str) {
eprintln!("\n{}", message.red());
}
4 changes: 2 additions & 2 deletions brainfuck/bf/src/input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use clap::Parser;
#[derive(Parser)]
#[command(next_help_heading = "Input")]
#[group(required = true)]
pub struct Input {
pub(crate) struct Input {
/// Path to the file containing the program code
#[arg(short, long)]
file: Option<PathBuf>,
Expand All @@ -21,7 +21,7 @@ pub struct Input {
}

impl Input {
pub fn get_source(self) -> Result<String, String> {
pub(crate) fn get_source(self) -> Result<String, String> {
match (self.file, self.code, self.stdin) {
(Some(path), None, false) => fs::read_to_string(&path).map_err(|_| {
format!(
Expand Down
Loading

0 comments on commit 39a9daa

Please sign in to comment.