勤め先のブログに「CarbonでHello Worldしてみた」みたいな記事を書いたのですが、自分でかいたコードを動かすところまでできず消化不良気味だったので、この記事でFizzBuzzをかいて動かすところまでやってみます。
Carbonとは
Googleが新しく2022年7月20日に発表した新しいプログラミング言語です。PHPの日時操作ライブラリ1ではありません。
C++の後継となる言語を目指しているとのこと。Rustでいいじゃんという方はそれでいい2そうです。
見た感じ、CarbonからC++の既存モジュールを利用したり、反対にC++から新しくCarbonで作ったモジュールを呼び出せたり、生のポインタを扱えたりといった特徴があります。既存のC++プロジェクトをRustにしてリファクタするのは大変みたいな状況で、Carbonを取り入れるような使い方を想定しているのでしょうか。
英語が分かる方はCppNorth 2022の動画を見ると良いと思います。英語が分からない私は雰囲気だけ理解しました。
Hello World
READMEのGetting startedにしたがってHello Worldしてみます
環境を準備する
Ubuntu 22.04 LTS(Windows 10 の WSL2)でやります。
まず必要となるHomebrew3を導入します。このページのコマンドでインストールしてから、このページにあるコマンドでパスを確認します。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
test -d ~/.linuxbrew && eval "$(~/.linuxbrew/bin/brew shellenv)"
test -d /home/linuxbrew/.linuxbrew && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
test -r ~/.bash_profile && echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.bash_profile
echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.profile
導入したbrewでbazeliskとLLVMをインストールします。Macの人はexport PATH="$(brew --prefix llvm)/bin:${PATH}"
も必要だそうです。
brew install bazelisk
brew install llvm
bazeliskとはGoogleの作ったビルドツールで、いわばmakeみたいなものらしいです。
ビルドして実行してみる
適当な場所でcarbon-langプロジェクトをgit cloneして、ビルドを実行します。
git clone https://github.com/carbon-language/carbon-lang
cd carbon-lang
bazel run //explorer -- ./explorer/testdata/print/format_only.carbon
ビルドのログが流れた後、"Hello World!"と表示されました。
bazelの使い方がいまひとつ分かりませんが、//explorer
という名前の環境でformat_only.carbonを実行しているようです。
FizzBuzzを実行してみる
Hello Worldしたので、簡単なサンプルプログラムとしてFizzBuzzを実行してみます。数字を数え上げていき、3の倍数はFizzと表示し、5の倍数はBuzzと表示し、どちらも当てはまる場合はFizzBuzzと表示するやつです。
適当な場所にファイルを作って次のコードを書きます。
package FizzBuzz api;
fn Main() -> i32 {
var i: i32 = 1;
while (i < 100) {
var f: bool = i % 3 == 0;
var b: bool = i % 5 == 0;
if (f && b) {
Print("FizzBuzz");
} else if (f) {
Print("Fizz");
} else if (b) {
Print("Buzz");
} else {
Print("{0}", i);
}
i = i + 1;
}
return 0;
}
次のように実行します。Hello Worldと同様にbazel run //explorer -- /path/to/FizzBuzz_NG.carbon
でも良いのですが、これでもできました 4
cd /path/to/carbon-lang # git cloneしたディレクトリをcdしておく
./bazel-bin/explorer/explorer /path/to/FizzBuzz_NG.carbon #
ファイル名がネタバレ気味でしたがエラーです。\x3C
つまり5行目の不等号<
がだめだそうです。
これ以外にもf32
型、剰余演算子%
、日本語文字列などが使えませんでした。まだ実験段階、しかも数日前に公開されたばかりなので仕方ありません。
%
や<
を使えないのはFizzBuzzで致命的ですが、幸いif
や==
は使えたので頑張ってFizzBuzzしてみます。
package FizzBuzz api;
fn Main() -> i32 {
var i: i32 = 1;
var f: i32 = 3; // 3の倍数フラグ、1のとき3の倍数
var b: i32 = 5; // 5の倍数フラグ、1のとき5の倍数
while (true) {
if (i == 100) {
break;
}
if (f * b == 1) {
Print("FizzBuzz");
} else if (f == 1) {
Print("Fizz");
} else if (b == 1) {
Print("Buzz");
} else {
Print("{0}", i);
}
i = i + 1;
f = if f == 1 then 3 else f - 1;
b = if b == 1 then 5 else b - 1;
}
return 0;
}
あまりスマートなコードではありませんが、実行してみるとうまくいきました。満足です。
文法については、Hello Worldのコードと同じexplorerのテストコードや言語設計のドキュメントを見るとなんとなく分かります。例えば&&
が使えないと思ったらand
で書けばよかったりしたので、コードを書いてみる前に目を通すと良さそうです。
あとがき・雑感
Carbonの立ち位置を考えると私は今後使う機会があるとは思わないのですが、遊びがてら最新のプログラミング言語を試してみました。
Rustが人気な理由の一因はCargoにあるイメージがあります[要出典]が、Carbonもツールチェインを頑張るそうです。ひょっとしたら数年後にはC++やRustと並んでCarbonが選択肢に並ぶ未来があるのでしょうか
-
https://github.com/carbon-language/carbon-lang/blob/trunk/docs/project/faq.md#if-you-can-use-rust-ignore-carbon ↩
-
ちなみにこのページによると「本来ならaptを使いたいが、DebianのLLVMには不具合があってしょうがなくbrewにしている」とのことです ↩
-
講演でのCarbon Explorerのデモを真似ただけです https://youtu.be/omrY53kbVoA?t=2244 ↩