Moved project into Raccoon
Viper is a language with Python 3.x syntax that is amenable to static analysis. The repository both defines the spec of the language and contains a reference implementation of the compiler, which compiles a legal Viper code to WebAssembly.
Viper will not maintain complete syntactic and semantic compatibility with Python. Several dynamic elements known of Python are not available in Viper. For example, Viper doesn't have runtime module modification.
There are other similarly oriented projects, but they are all objectively different from Viper.
MicroPython is a well-optimized Python interpreter (with some JIT support) while Nuitka compiles Python to C. These two projects still allow dynamic aspects of Python, which means their performances may suffer from those parts.
Vyper (not to be mistaken for Viper) primarily targets Ethereum VM and not designed for general-purpose programming.
Also unlike Nim, Boo and Cobra, Viper tries to stick to Python syntax and semantics as much as possible and wherever it makes sense.
RPython is quite similar to this project, but the developers have made it clear that their goal is not to make RPython a standalone language.
- Python 3.7+ - Python interpreter
- Pipenv - Python package manager
-
Clone project
git clone https://www.github.com/appcypher/viper.git
-
Move to project's directory
cd viper
-
Install dependencies
pipenv install
-
Build the project [macOS and Linux]
sh build.sh setup
-
Compile and run sample viper code [WIP]
viper samples/class.vi
- Same as setting up the project
- You can run all the tests in a single command.
pipenv run pytest
-
Show help info
viper --help
-
Compile and execute a Viper source file [WIP]
viper samples/class.vi
Viper is similar to Python in a lot of ways, but being a statically-typed language, it made some trade-offs to ensure predictable performance. In this respect, Viper is not always compatible with Python.
Viper's type system is also similar to Python's although it is a bit more fleshed out. While Viper prioritizes a design that benefits static analysis, it still allows Python's level of flexibility where statically determinable. This is why type inference and structural typing are an important part of Viper.
For more details, check NOTES.md
Attributions can be found here