14日で作る量子コンピュータの開発環境をVSCode @ Macで実現する時の備忘録メモ

# 記事を書こうと思った背景
近年、量子コンピュータに対する期待が高まっており、巷では量子コンピュータの啓蒙書が多数出版されています。量子コンピュータの魅力を紹介したセミナー等も都内で多数実施されており、筆者も何度か参加したことが有ります。ただ、(筆者の個人的な意見として)話が非常に抽象的？で消化不良となっていました。これには恐らく以下の2つの理由が考えられます。

1. 量子コンピュータの背景に有る量子力学が大変難しい学問である
2. 筆者はコンピュータ＝集積回路で実現したノイマン型というイメージが染み付いているから

この悶々した消化不良感を持っておられる方は意外と多いのではないでしょうか？そんな時に書店で出会ったのがタイトルにも有る「[14日で作る量子コンピュータ](https://amzn.to/32pxPCb)」という書籍です。内容をザッと目を通した感じでは1つ1つの内容を丁寧に解説したかなり親切な専門書という印象です。:relaxed:早速量子コンピュータの理解を目指して実装に取り組もうと思ったのですが、開発環境はVisual Studio @ Winであり、VSCode @ Macは解説されていませんでした。加えてVSCodeで簡単にセットアップ出来ると思って取り掛かったものの、期待は裏切られ散々手こずる結果に。。。:scream:そこで実際にセットアップした内容を備忘録としてまとめておこうと思います。

# 検証環境
* macOS 10.14.6 Mojave
* Visual Studio Code 1.45.1
* g++ version 9.3.0
* GSL(GNU Scientific Library) 2.6

# VSCodeのセットアップ
[VSCodeのインストーラーをダウンロード](https://code.visualstudio.com/)し、インストールします。エクステンションは以下のコマンドで追加しました。

```bash
code --install-extension ms-vscode.cpptools
```

# g++のインストール
[Homebrew](https://brew.sh/index_ja)でインストールします。gccをインストールするとg++も一緒にインストールされます。

```bash
brew install gcc
```

# GSLのインストール
Homebrewでインストールを実施します。

```bash
brew install gsl
```

# サンプルプログラムのビルド及び実行

## コマンドラインでビルド及び実行
書籍の冒頭でライブラリの動作をテストするプログラムのビルド及び実行を行っています。先ず最初に参考までにソースをコマンドラインでg++を用いてビルドする場合のコマンドを示します。ソース名は書籍に従っています。`-Iオプション`で`include Path`を渡し、`-Lオプション`で`library Path`を渡し、`-lオプション`でライブラリ名(gsl)を渡しています。なお、ソースファイルの中身は権利的な問題も有る為、記載しておりません。

```bash
g++ -I/usr/local/include -L/usr/local/lib -lgsl gsl_integral.cpp 
```

正常にビルド完了後、実行ファイルを実行し、以下の様な実行結果になれば成功です。

```bash
$ ./a.out 
【計算結果】
計算結果 = 0.636619772367581
理論値 = 0.636619772367581
計算誤差 = 0
```

## VSCode上でビルド及び実行
### GSL(GNU Scientifice Library)との関連付け設定
ソース実装時及びビルド時にGSLがソースファイルに紐付く様にPath等の設定を行います。`.vscode`ディレクトリをプロジェクトディレクトリ直下に作成します。そして、その`.vscode`ディレクトリ内に`c_cpp_properties.json`を作成します。記載内容は以下の通りです。このファイルには`include Path`を追加します。この設定で、コード補完が出来る様になります。

```json:c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/local/Cellar/gsl/2.6/include"
            ],
            "defines": [],
            "macFrameworkPath": [],
            "compilerPath": "/usr/local/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}
```

続けて`tasks.json`を`.vscode`ディレクトリ内に作成します。これはMakefileの様な働きをします。作成しておくことで`cmd + shift + b`でビルドが実行出来る様になります。

```json:tasks.json
{
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: g++-9 build active file",
            "command": "/usr/local/bin/g++-9",
            "args": [
                "-g",
                "${file}",
                "-I/usr/local/include",
                "-L/usr/local/lib",
                "-lgsl",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.out"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "type": "shell",
            "label": "Run execute file",
            "command": "${fileDirname}/${fileBasenameNoExtension}.out"
        }
    ],
    "version": "2.0.0"
}
```

### サンプルプログラムの実行
`cmd + shift + b`でビルドを実行し、出力された実行ファイルを実行してみます。以下の様な出力となり、コマンドラインでビルドを実施した時と同じ出力になりました。

```bash
$ ./gsl_integral.out 
【計算結果】
計算結果 = 0.636619772367581
理論値 = 0.636619772367581
計算誤差 = 0
```

# 2020/8/27追記 もっと便利にビルド→実行のタスクを実行する方法
上記の`tasks.json`にはソースのビルド→実行ファイルの実行までの一連のタスクを登録しています。これを順番に実行する方法は`option + r`のショートカットキーを用います。すると以下の様なウィンドウが表示されます。ここで実行したいタスクを選択することで実行出来ます。

![run tasks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/a0228a33-e011-5a67-ea0e-c9963169e510.png)

# まとめ
VSCodeで「14日で作る量子コンピュータ」の開発環境を整えました。後は1〜14日の内容を実装しながら楽しむだけとなりました。これで量子コンピュータへの理解が深められそうです。

# Reference
* [14日で作る量子コンピュータ Visual C++ 版 ; 遠藤理平著](https://www.amazon.co.jp/dp/4877834702/)
* [VSCodeのincludeエラーを直したい](https://teratail.com/questions/243670)
* [VS codeのinclude pathの設定をちゃんとする](https://qiita.com/sage-git/items/ffe463c0de05344d721b)
* [Visual Studio CodeでC++のコンパイルと実行を一発で行う](https://qiita.com/inomu/items/09f68c2f4b67352b8412)
* [VSCodeでC/C++開発環境を整えてみる(MSBuild(Visual Studio Express)編)](https://www.off-soft.net/ja/software/develop2/vscode-cpp-develop-msbuild.html)