💍

Onyx 入門

2023/12/13に公開

Onyx とは

wasm を第一のコンパイルターゲットとした新しいプログラミング言語です。

コンパイラ、パッケージマネージャ、LSP、VSCode Extension などのエディタサポート、などを公式で用意しています。

構文的には、 Go, Jai, Odin などの影響を受けています。ベースはC言語ライクな文法です。個人的にはカスタムアロケータや data-oriented なメモリレイアウト機能、などは特徴的に見えます。また、 パイプ演算子 |> で関数型ライクな処理チェーンの記述が可能です。

LLVM や Binaryan などを使用せず直接 wasm バイナリにコンパイルされます。コンパイラは C で書かれています。

インストール

Homebrew や npm のパッケージはないようなので、インストールスクリプトを実行するしかなさそうです、今のところ。
最初にランタイムもインストールするか聞かれます。 wasmer, OVM(Onyx VM?), None、の3択です。

$ sh <(curl https://get.onyxlang.io -sSfL)
                   ######
               ####++++++###
            ###+++++++++++++###
         ###+++++++++++++++++++###
      ###++++++++++++++++++++++++++###
  ###+++++++++++++++++++++++++++++++++###
  #++++++++++++++++++++++++++++++++++++#-#
  #--------------------------------++#####
  #-----------------------------+##+++####
  #--------------------------+##+++++#####      The Onyx Programming Language
  #-----------------------+##+++++++######
  #--------------------##++++++++++#######             Brendan Hansen
  #----------------+##+++++++++++#########
  #-------------+##+++++++++++++##########
  #----------##++++++++++++++++###########
  #------+##++++++++++++++++++############
  #---+##++++++++++++++++++++#############
  ####++++++++++++++++++++++##############
  ###++++++++++++++++++++++##############
     ####+++++++++++++++++############
         ###+++++++++++++##########
            ###+++++++++########
               ####++++######
                   ######


Please choose a WebAssembly runtime to use with your Onyx installation.
1) Wasmer: An industry standard WebAssembly runtime. Very fast. (default)
2) OVM: A custom, lightweight runtime made for Onyx. Supports debugging. Slower than Wasmer.
3) None: Omit using a runtime and only use Onyx as a compiler to WebAssembly.
Which runtime would you like to use? [1/2/3] 1
downloading: onyx-darwin-wasmer-arm64
Latest release: v0.1.8-beta
Downloading archive from https://github.com/onyx-lang/onyx/releases/download/v0.1.8-beta/onyx-darwin-wasmer-arm64.tar.gz

100.0%
installing: /Users/****/.onyx
Updating bash profile /Users/****/.zshrc
we've added the following to your /Users/****/.zshrc
If you have a different profile please add the following:
# Onyx config
export ONYX_PATH="/Users/****/.onyx"
export PATH="$ONYX_PATH/bin:$PATH"
check: Error: ONYX_PATH environment variable is not set. Please set this to the location of your Onyx installation. installed successfully ✓
onyx will be available the next time you open the terminal.

Which runtime would you like to use? [1/2/3] で 2 を選ぶと Apple Silicon に対応していないのか、次のように吐いて落ちました。残念。なので↑ではランタイムとしては 1 の wasmer を指定しています。

downloading: onyx-darwin-ovm-arm64
Latest release: v0.1.8-beta
Downloading archive from https://github.com/onyx-lang/onyx/releases/download/v0.1.8-beta/onyx-darwin-ovm-arm64.tar.gz

100.0%
error: Your platform is not yet supported (darwin-ovm-arm64).
Please open an issue on the Onyx repository if you want to use Onyx in your project: https://github.com/onyx-lang/onyx

インストールの確認

パスが勝手に通って、自分の環境だと zshrc にパス設定か何かが書き込まれたよう。

$ tail -3 ~/.zshrc
# Onyx config
export ONYX_PATH="~/.onyx"
export PATH="$ONYX_PATH/bin:$PATH"

自分はこの記述は適切なところに移動。そのままでも良いと思います。

インストール先を見てみると、サンプルコードのファイルがたくさん入ってた。

$ ls ~/.onyx
LICENSE  bin      core     examples include  lib      misc     tests    tools

$ ls ~/.onyx/bin
onyx

$ ls ~/.onyx/examples
01_hello_world.onyx       04_fixed_arrays.onyx      07_structs.onyx           10_switch_statements.onyx 13_use_keyword.onyx       16_pipe_operator.onyx     19_do_blocks.onyx         22_interfaces.onyx
02_variables.onyx         05_slices.onyx            08_enums.onyx             11_map.onyx               14_overloaded_procs.onyx  17_operator_overload.onyx 20_auto_return.onyx       50_misc.onyx
03_basics.onyx            06_dynamic_arrays.onyx    09_for_loops.onyx         12_varargs.onyx           15_polymorphic_procs.onyx 18_macros.onyx            21_quick_functions.onyx

しかし、このサンプル群にブラウザで実行するサンプルらしきものはなかったです。

onyx コマンドを実行してみる

$ onyx
zsh: command not found: onyx

インストール時のメッセージで言われたとおりシェルを開き直して再度試してみる。

$ onyx
Onyx toolchain version v0.1.8
Built on Wed Nov 29 01:49:45 2023
Runtime: wasmer-custom

The toolchain for the Onyx programming language, created by Brendan Hansen.

Usage:
	onyx <subcommand>

Subcommands:
	help      Shows this help message. Use "onyx help <subcommand>".
	build     Compiles an Onyx program into an executable.
	run       Compiles and runs an Onyx program, all at once.
	check     Checks syntax and types of an Onyx program.
	package   Package manager
	version   Prints version information

問題なく実行できてた。

Hello, World

hello.onyx というファイルを作って次のように書き込む

use core {*}

main :: () {
    println("Hello, World!");
}

run サブコマンドでコンパイルと実行を一気にやってくれる

$ onyx run hello.onyx
Hello, World!

続いて wasm バイナリにコンパルする。run ではバイナリは生成されない。
build コマンドを使う。

$ onyx build hello.onyx -o hello.wasm

$ onyx run hello.wasm
Hello, World!

wat は生成しないようなので、バイナリを覗いてみる

4F 4E 59 58O N Y X で先頭バイトが始まっている。
あれ、普通 wasm バイナリの先頭バイトって
00 61 73 6D\0 a s m[1] というマジックナンバーのはずでは?

(追記 2024-01-08) Discord 上のやり取りで作者の Brendan Hansen さんが、 Onyx が非標準の方法でwasmバイナリを作るこの挙動は nightly では既に修正されていて v0.19 に含まれる、とのこと。

https://discord.com/channels/1180961614984388683/1181249331630719036/1190788434378358956 より

👋 To compile Onyx to be able to be run in the browser, you need to specify the -r js flag. This tell it to use the javascript platform layer. The error you are hitting is that in the 0.1.8 and previous versions, Onyx made WASM binaries in a non-standard way when compiling for Onyx's runtime (not WASI or JS). The magic bytes were changed from \x00asm to ONYX, hence the bytes being 4f 4e 59 58. This was deemed a very bad decision and in the nightly release of the compiler, this is fixed. The nightly version will become version 0.1.9 soon, there are just a couple of outstanding thing I am working on first

開発環境

VSCode の Extension が公式から出ている

https://marketplace.visualstudio.com/items?itemName=onyxlang.onyxlang

入れると Syntax Highlight されるよ

README がないので機能がよく分からないけどデバッガもあると書いてはある。
リポジトリは onyx 自体にモノレポとして入っている → https://github.com/onyx-lang/onyx/tree/master/misc/vscode

続き

続きも書きました
https://zenn.dev/hatappo/articles/09ff4f8546f805

脚注
  1. asm.js とかの頃からの経緯とかなんだと思う。 ↩︎

Discussion