0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

新しいプログラミング言語Carbonで実際にFizzBuzzしてみた

Posted at

勤め先のブログに「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!"と表示されました。
2022-07-24_00h33_31.png
bazelの使い方がいまひとつ分かりませんが、//explorerという名前の環境でformat_only.carbonを実行しているようです。

FizzBuzzを実行してみる

Hello Worldしたので、簡単なサンプルプログラムとしてFizzBuzzを実行してみます。数字を数え上げていき、3の倍数はFizzと表示し、5の倍数はBuzzと表示し、どちらも当てはまる場合はFizzBuzzと表示するやつです。

適当な場所にファイルを作って次のコードを書きます。

FizzBuzz_NG.carbon
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行目の不等号<がだめだそうです。
image.png
これ以外にもf32型、剰余演算子%、日本語文字列などが使えませんでした。まだ実験段階、しかも数日前に公開されたばかりなので仕方ありません。

%<を使えないのはFizzBuzzで致命的ですが、幸いif==は使えたので頑張ってFizzBuzzしてみます。

FizzBuzz.carbon
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;
}

あまりスマートなコードではありませんが、実行してみるとうまくいきました。満足です。
image.png
文法については、Hello Worldのコードと同じexplorerのテストコード言語設計のドキュメントを見るとなんとなく分かります。例えば&&が使えないと思ったらandで書けばよかったりしたので、コードを書いてみる前に目を通すと良さそうです。

あとがき・雑感

Carbonの立ち位置を考えると私は今後使う機会があるとは思わないのですが、遊びがてら最新のプログラミング言語を試してみました。

Rustが人気な理由の一因はCargoにあるイメージがあります[要出典]が、Carbonもツールチェインを頑張るそうです。ひょっとしたら数年後にはC++やRustと並んでCarbonが選択肢に並ぶ未来があるのでしょうか

  1. https://carbon.nesbot.com/docs/

  2. https://github.com/carbon-language/carbon-lang/blob/trunk/docs/project/faq.md#if-you-can-use-rust-ignore-carbon

  3. ちなみにこのページによると「本来ならaptを使いたいが、DebianのLLVMには不具合があってしょうがなくbrewにしている」とのことです

  4. 講演でのCarbon Explorerのデモを真似ただけです https://youtu.be/omrY53kbVoA?t=2244

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?