コンピュータとプログラム
プログラミングはコンピュータに対して行います。ご存知のとおり皆さんが使っているスマホもCPUとメモリを積んだコンピュータです。
このCPUやメモリの役割を理解している人と知らずにプログラミングをする人とには大きな差があります。そこで簡単にコンピュータの仕組みを考えてみましょう。
CPUは考えて処理をする人間で言うところの脳。メモリは処理するデータを記憶するところです。
メモリ内部にはキーボードなど入出力を管理するI/O(インプット/アウトプット)やプログラムそのものやデータを格納するプログラムエリアがあります。
デバイスはCPUにつながれたI/Oのアドレスを書き込むことで制御していきます。
プログラム領域にはCPUが実行する命令が書かれています。CPUはプログラムを実行する番地を保持しており、その番地のシンプルな四則演算や比較命令を順番に実行していきます。
さて、この知識がプログラミングのどんなときに有効となるのでしょうか
よくあるのが値があるはずのアドレスを見に行ったら命令が存在しなかったり、あるデータの値を読みにいったのにアドレスが存在しなかったなどです。
単純なコンピュータだからこそ、そのルールをプログラミングによって破ってしまうとどこにも行けずとまってしまいます。
サンプルプログラムにわざと間違ったコードを入れてみましょう。
13行目を見てみましょう
var test: String!
varは変更できる変数という意味です。Stirngは文字列ですよという意味です。
testという変数を可変文字列型で宣言します。
Stringの横の!というマークはswiftでオプショナル型と呼ばれ、nilという変数が空の状態を許可できます。オプショナル型についてはまた後ほど解説致しますが、ここでtestには何も入れてないので、空の状態のままです。
プログラムを実行するとThread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valueというエラーがでてプログラムが停止します。
空の状態でString型の先頭3文字を取り出すメソッドを実行しました。
test.prefix(3)
prefixはString型の機能なのですが空のtestという変数から使おうとしたので、コンピュータが制御不能となったわけです。
0x1065ca900番地の命令pushq %rbpを実行しようとしたけども存在していないので実行できなかったわけですね。
このようにコンピュータは単純に与えられた動作をしているにすぎないのですが、人間には局所を見ただけでは何が間違っていたのか理解するのが難しいのです。そこでコンピュータの仕組みや性格を知っておくことで、このエラーが出るのがどんなときで、何をするとエラーがでるのか推測をすることができ不具合解決に役立つわけです。
あわせてiPhoneのアーキテクチャの設定についてみてみましょう
アーキテクチャ設定
人にもそれぞれあるようにiPhoneも進化していきますので、iPhoneの脳にあたるCPUも進化しています。進化した脳の命令はより高性能になるため、お互いが言葉を理解できなくなっていきます。
そこはAppleが互換性をもたせてはいますが、時には動かないことも出てきます。
どのアーキテクチャを使うか考えるときがでてくるかもしれません。
このブログ記載時に設定するであろうアーキテクチャはarmv7,armv7s,arm64などです。
最初は全てに対応すれば問題はありません。
ただアプリの容量が大きくなってきたときにアーキテクチャを減らすことでサイズダウンすることが出来ます。
またシュミレータは全く別のアーキテクチャということを知っておくことも大切です。つまりシュミレータで動作しても実機では動作しないといったことが起こるわけです。(最近はあまりなくなりました)
アーキテクチャ | bit | デバイス例 |
armv7 | 32bit | iPhone4s / iPad第三世代(2012〜) |
armv7s | 32bit | iPhone5c / iPad第四世代(2012〜) |
armv64 | 64bit | iPhone6,iPhone7,iPhone8,iPhone X / iPad air, mini, pro |
i386 | 32bit | シュミレータ |
x86_64 | 64bit | シュミレータ |