Getting Started
===============
Prerequisites
-------------
- `Zig 0.15.2 `_
- QBE (optional, required for ``bear qbe -c``)
- LLVM (optional, required for ``bear llvm -c``)
Building from Source
--------------------
Clone the repository and build with Zig::
git clone https://github.com/navid-m/bearvm
cd bearvm
zig build
This produces the ``bear`` binary in ``zig-out/bin/``. Add it to your
``PATH`` or invoke it directly.
Platform Support
----------------
BearVM runs on macOS, Linux, and Windows.
The experimental JIT backend (``bear jit``) only targets aarch64 (Apple
Silicon) and is not available on other platforms or architectures.
Your First Program
------------------
Create a file called ``hello.bear``::
@main(): int {
call puts("Hello, world!")
ret 0
}
Run it through the interpreter::
bear hello.bear
Expected output::
Hello, world!
A Slightly Larger Example
--------------------------
The following program computes the 10th Fibonacci number using an iterative
loop in SSA form::
@fib(%n: int): int {
entry:
%a0 = const 0
%b0 = const 1
%i0 = const 0
jmp loop_cond
loop_cond:
%a = phi [entry: %a0, loop_body: %a_next]
%b = phi [entry: %b0, loop_body: %b_next]
%i = phi [entry: %i0, loop_body: %i_next]
%cond = lt %i, %n
br_if %cond, loop_body, loop_end
loop_body:
%tmp = add %a, %b
%a_next = %b
%b_next = %tmp
%i_next = add %i, 1
jmp loop_cond
loop_end:
ret %a
}
@main(): int {
entry:
%n = const 10
%result = call fib(%n)
call puts(%result)
call flush()
ret 0
}
Run it::
bear fib.bear
The same program using the high-level ``while`` sugar, which lowers to the
same representation::
@fib(%n: int): int {
%a = const 0
%b = const 1
%i = const 0
while (lt %i, %n) {
%tmp = add %a, %b
%a = %b
%b = %tmp
%i = add %i, 1
}
ret %a
}
@main(): int {
%result = call fib(10)
call puts(%result)
call flush()
ret 0
}
Next Steps
----------
- See :doc:`language` for a full description of the IR syntax.
- See :doc:`instructions` for the complete instruction reference.
- See :doc:`backends` for compiling to native code via QBE or LLVM.
- See :doc:`cli` for all available CLI flags.