1
1
mirror of https://github.com/anoma/juvix.git synced 2024-09-20 13:07:20 +03:00
Juvix empowers developers to write code in a high-level, functional language, compile it to gas-efficient output VM instructions, and formally verify the safety of their contracts prior to deployment and execution.
Go to file
Paul Cadman 60236e7b58
Add C code generation backend (#68)
* [cbackend] Adds an AST for C

This should cover enough C to implement the microjuvix backend.

* [cbackend] Add C serializer using language-c library

We may decide to write our own serializer for the C AST but this
demonstrates that the C AST is sufficient at least.

* [cbackend] Declarations will always be typed

* [cbackend] Add CPP support to AST

* [cbackend] Rename some names for clarity

* [cbackend] Add translation of InductiveDef to C

* [cbackend] Add CLI for C backend

* [cbackend] Add stdbool.h to file header

* [cbackend] Allow Cpp and Verbatim code inline

* [cbackend] Add a newline after printing C

* [cbackend] Support foreign blocks

* [cbackend] Add support for axioms

* [cbackend] Remove code examples

* [cbackend] wip FunctionDef including Expressions

* [parser] Support esacping '}' inside a foreign block

* [cbackend] Add support for patterns in functions

* [cbackend] Add foreign C support to HelloWorld.mjuvix

* hlint fixes

* More hlint fixes not picked up by pre-commit

* [cbackend] Remove CompileStatement from MonoJuvix

* [cbackend] Add support for compile blocks

* [cbackend] Move compileInfo extraction to MonoJuvixResult

* [minihaskell] Fix compile block support

* [chore] Remove ununsed isBackendSupported function

* [chore] Remove unused imports

* [cbackend] Use a Reader for pattern bindings

* [cbackend] Fix compiler warnings

* [cbackend] Add support for nested patterns

* [cbackend] Use functions to instantiate argument names

* [cbackend] Add non-exhaustive pattern error message

* [cbackend] Adds test for c to WASM compile and execution

* [cbackend] Add links to test dependencies in quickstart

* [cbackend] Add test with inductive types and patterns

* [cbackend] Fix indentation

* [cbackend] Remove ExpressionTyped case

https://github.com/heliaxdev/minijuvix/issues/79

* [lexer] Fix lexing of \ inside a foreign block

* [cbackend] PR review fixes

* [chore] Remove unused import

* [cbackend] Rename CJuvix to MiniC

* [cbackend] Rename MonoJuvixToC to MonoJuvixToMiniC

* [cbackend] Add test for polymorphic function

* [cbackend] Add module for string literals
2022-05-05 14:12:17 +01:00
.github/workflows Add C code generation backend (#68) 2022-05-05 14:12:17 +01:00
app Add C code generation backend (#68) 2022-05-05 14:12:17 +01:00
assets add integer and string literals 2022-03-15 12:37:33 +01:00
lab Add terminating keyword (#71) 2022-05-04 14:05:58 +02:00
minijuvix-mode [emacs] Add copy of agda-input to minijuvix-mode (#57) 2022-04-11 17:11:31 +02:00
minijuvix-stdlib@ad8392f76e [stdlib] update 2022-02-28 18:24:52 +01:00
notes Monomorphization (#70) 2022-05-04 10:50:03 +02:00
src/MiniJuvix Add C code generation backend (#68) 2022-05-05 14:12:17 +01:00
test Add C code generation backend (#68) 2022-05-05 14:12:17 +01:00
tests Add C code generation backend (#68) 2022-05-05 14:12:17 +01:00
.github_changelog_generator Add automatically updates/issues/merged PRs to the changelog (#74) 2022-05-04 14:06:29 +02:00
.gitignore Add automatically updates/issues/merged PRs to the changelog (#74) 2022-05-04 14:06:29 +02:00
.gitmodules [ CI ] Add Haskell Github Action with Stack test and ormolu check 2022-04-04 15:55:15 +02:00
.hlint.yaml Monomorphization (#70) 2022-05-04 10:50:03 +02:00
.pre-commit-config.yaml [ pre-commit ] Add support and hooks 2022-04-04 17:44:08 +02:00
.pre-commit-hooks.yaml [ CI ] New jobs: ormolu and hlint 2022-04-05 19:57:21 +02:00
CHANGELOG.org Add automatically updates/issues/merged PRs to the changelog (#74) 2022-05-04 14:06:29 +02:00
hie.yaml [tests] setup basic testing 2022-02-15 14:12:53 +01:00
LICENSE First commit, initial project template. 2021-09-26 18:59:51 +02:00
Makefile Add C code generation backend (#68) 2022-05-05 14:12:17 +01:00
package.yaml Add C code generation backend (#68) 2022-05-05 14:12:17 +01:00
README.org Add C code generation backend (#68) 2022-05-05 14:12:17 +01:00
stack.yaml bump stackage version and remove allow-newer (#76) 2022-05-04 12:57:42 +02:00

MiniJuvix

<a href="https://github.com/heliaxdev/minijuvix/blob/main/LICENSE"> <img alt="LICENSE" src="https://img.shields.io/badge/license-GPL--3.0--only-blue.svg" /> </a>

<a href="https://github.com/heliaxdev/MiniJuvix/actions/workflows/ci.yml"> <img alt="CI status" src="https://github.com/heliaxdev/MiniJuvix/actions/workflows/ci.yml/badge.svg" /> </a>

Description

MiniJuvix is a programming language for writing efficient formally-verified validity predicates, which can be deployed to various distributed ledgers. This is software released for experimentation and research purposes only. No warranty is provided or implied.

MiniJuvix addresses many issues that we have experienced while trying to write and deploy decentralized applications present in the ecosystem of smart-contracts:

  • the difficulty of adequate program verification,
  • the ceiling of compositional complexity,
  • the illegibility of execution costs, and
  • the lock-in to particular backends.

Quick Start

To install MiniJuvix, you can download its sources using Git from the Github repository. Then, the program can be downloaded and installed with the following commands. You will need to have Stack installed.

   $ git clone https://github.com/heliaxdev/minijuvix.git
   $ cd minijuvix
   $ stack install

If the installation succeeds, you must be able to run the minijuvix command from any location. To get the complete list of commands, please run minijuvix --help.

  • To test everything works correctly, you can run the following command. You will need to have emscripten and wasmer installed.
  $ stack test

Emacs mode

There is an Emacs mode available for MiniJuvix. Currently, it supports syntax highlighting for well-scoped modules.

To install it add the following lines to your Emacs configuration file:

(push "/path/to/minijuvix/minijuvix-mode/" load-path)
(require 'minijuvix-mode)

Make sure that minijuvix is installed in your PATH.

The MiniJuvix major mode will be activated automatically for .mjuvix files.

Keybindings

Key Function Name Description
C-c C-l minijuvix-load Runs the scoper and adds semantic syntax highlighting

CLI Auto-completion Scripts

The MiniJuvix CLI can generate auto-completion scripts. Follow the instructions below for your shell.

NB: You may need to restart your shell after installing the completion script.

Bash

Add the following line to your bash init script (for example ~/.bashrc).

  eval "$(minijuvix --bash-completion-script minijuvix)"

Fish

Run the following command in your shell:

  $ minijuvix --fish-completion-script minijuvix > ~/.config/fish/completions/minijuvix.fish

ZSH

Run the following command in your shell:

  $ minijuvix --zsh-completion-script minijuvix > $DIR_IN_FPATH/_minijuvix

where $DIR_IN_FPATH is a directory that is present on the ZSH FPATH variable (which you can inspect by running echo $FPATH in the shell).

Community

We would love to hear what you think of MiniJuvix! Join us on Discord