Apple Siliconでのプログラミングを完全に理解した

# Apple Siliconでのプログラミングを完全に理解した

## はじめに
こんにちは。「すば」と申します

この記事は[「完全に理解したTalk Advent Calendar 2020」](https://qiita.com/advent-calendar/2020/easyeasy)22日目の投稿記事です。
(23日になったくらいに投稿してますけど、体調悪かったので許してください＞＜)

今回は、新しくApple SiliconのMacbookAirを買ったので、これで開発環境を整えた時の方針の話ををしていきたいと思います

## 一体何が問題？
Apple SiliconではCPUのアーキテクチャが**x86_64**から**Arm64**に変わりました。
細かいことはさておき、プログラムはCPUのアーキテクチャに応じてコンパイルされます。
そのため、**x86_64**用のバイナリは、**Arm64**では動きません。
つまり、今までのバイナリが動かなくなってしまうわけです。

ただし、新しいMacOSには、Apple Siliconで今までの**x86_64**用のバイナリを動かす**Rosetta 2**という機能があります。

では、ここからどのように開発環境を整えればいいかの方針をお話しします。

## 環境
Apple Silicon MacbookAir
英語で使ってます。 

## GUIアプリはとりあえず入れてみよう
GUIアプリに関しては、Arm64とか気にせず入れてみるといいと思います
有名なのは普通に動きます

自分は以下の物を何も考えずに入れて正常に動作しています

* Google Chrome
* Alfred
* Android Studio
* iTerm2
* LastPass
* Discord
* Evernote
* Twitter

`Visual Studio Code`だけは気にして、MacのArm64 Preview版を入れました。

## Rosetta 2で動かす
時には動かないことがあるかと思います。
その時は、**Rosetta 2**を試してみましょう。

やり方は以下の通りです。（項目名が英語になっててわかりづらいかもです。すみません）

1. FinderでApplicationsを開く
2. 動かしたいアプリを右クリックして、`Get Info`をクリック
3. `Open using rosetta`にチェック

これでアプリを実行してみてください

## アプリがApple Siliconに対応しているかを事前に調べる方法
[Is Apple silicon ready?](https://isapplesiliconready.com/)というサービスで調べることができます。

## CLIアプリはarm64で入れるようにしよう
CLIアプリは、**Homebrew**でインストールする方が多いと思われますが、
公式サイト上のインストーラはApple Siliconではまだ動作しません。

動作させるには以下の方法があります

1. Terminalを`Rosetta 2`で動くようにして、公式サイトのインストーラを実行。（この場合、バイナリがx86_64になる）
2. [Alternative Installs](https://docs.brew.sh/Installation#alternative-installs)に従って、インストール（この場合、バイナリがArm64になる）

自分は2にしました。
1だと、将来的にArm64で動くアプリが増えてきた時に、どれがx86_64なのかわからなくなる気がします。
また、Terminalが`Rosetta 2`で動いている場合、どのような動作をするのか予想しづらいというのもあります。

インストール方法は以下の通りです。（Alternative Installs](https://docs.brew.sh/Installation#alternative-installs)も参考にしてください）

```zsh
$ cd /opt
$ sudo mkdir homebrew
# これでうまくいくはずなんだけど、なんか動かなかったから自分は$USERを手動で入力した。
$ sudo chown $USER:admin homebrew
$ curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
```

.zshenvに以下のコードを追記して、PATHに追加します。

```zsh
export PATH=$PATH:/opt/homebrew/bin
```

最後にTerminalで再起動して、PATHを読み込み直すと、Homebrewが使えるようになっています。


## Homebrew以外のパッケージマネージャーも入れてみよう
`Homebrew`だけだと対応していないアプリもあります。
その場合、他のパッケージマネージャーからインストールするといい場合があります

自分が試したパッケージマネージャーには以下のものがあります

* MacPorts([インストール方法](https://www.macports.org/install.php))
* nix-shell([インストール方法](https://nixos.org/manual/nix/stable/#sect-macos-installation))

例えば`Neovim`の場合、`nix-shell`でしかインストールできませんでした。

## プログラミング言語に関して
どれが動くのか正直よくわからないです。
ここからは個人的に調査してみた結果です。

|言語|状況|
|---|---|
|ruby|デフォルトで入ってるから動く|
|python|デフォルトで入ってるから動く|
|nodejs|homebrewでインストールして動く|
|golang|動くらしいんだけど、動作するバイナリのインストール方法がわからない。。。|
|rust|`rustup`の`default toolchain`をbetaにするとインストールできる|
|flutter(dart)|通常インストールで動く|
|java|新しいバージョンだと、動作するArm64バイナリがAzulから配布されているらしい。（よくわからない）|


## どのアーキテクチャでコマンドが動くかの調べ方
ちょっとこのコマンドのバイナリは、どのアーキテクチャ用なのかとか調べたいことがあると思います。
その場合は、`lipo`コマンドを使うといいようです。

以下のコマンドで調べることができます

```zsh
$ lipo -archs <コマンドのフルパス>

# lsのバイナリを調べたいとき

# まずコマンドのフルパスを調べる
$ which ls
# => /bin/ls

# バイナリを調べる
$ lipo -archs /bin/ls
# => x86_64 arm64e
```

## 仮想環境は・・・もうちょっと我慢しよう・・・
昨今、仮想環境は開発ではよく使われているのは周知の通りです。

ただ、Apple Siliconに関しては以下のように環境が整っていない状態にあります。

|名前|状況|
|---|---|
|Parallel Desktop|テクニカルプレビュー|
|Docker for Mac|テクニカルプレビュー|
|VirutualBox|動かない
|VMWare|動かない|
|Android Emulatir|動かない|

まだ仮想環境を十全に使うには時間が必要なようです。


## まとめ
みんなApple Silicon速いぜ！楽しいぜ！買おうぜ！