2015年5月28日木曜日

X-BASIC for iOS v3.00開発完了→発売中

X-BASIC for iOS v3.00の開発を開始しました。

わけあって、しばらくあらゆるプログラム開発から半年ほど離れていたので、リハビリを兼ねています。

今回は以下の予定です。
・64ビット環境対応
・よく使われる処理の内部関数化

メインは64ビット対応で、これが一番大変です。X-BASIC for iOSでは2つの点で引っかかります。

(1)データ読み書きの境界整合
X-BASIC for iOSは中間コードの管理方法がぺけ-BASICと同じで、ワークに対して.b/.w/.l単位での書き込みが混在しています(.bはワード境界整合させている)。ところがARMでは.w/.l単位の書き込みにおいて境界の制約があるのかそのままでは落ちてしまいます。なので、すべての書き込みを.w単位または.b単位に変換して行うように変更しようとしてます。もっといい方法があればいいのですが、思いつきません。
追記:
しかもこれ、シミュレーター上では発生しません。なぜなら、IntelCPUはどの境界からでもどのサイズでも書込みできてしまうからです。ARM CPUの実機でのみ発生するのです。だから、確認が極めて厄介なのです。

2015/06/03追記:
なんか、ARM実機でも落ちなくなってしました。OSレベルでトラップかけて対処されているのかもしれません。iOS6(32ビット)でも落ちないです。ひょっとしてこれはもう考えなくてもいいのかも。

(2)sizeof(long)が8バイトになってしまった
NSIntegerが64ビット環境下では8バイト=64ビットになるのは知ってましたが、まさかただのlongが8バイトに拡張されるとは思いませんでした。X-BASICは長い時間かけて開発した関係でintとlongがごっちゃになっている部分がものすごく多くあります。まあそれは型キャストかければ何とかなりますが、最大の問題はunionや構造体のサイズが変わってしまうことにあります。

X-BASIC for iOSはもともとアセンブラーで書かれていた処理をそのままCに直した部分も多いため、構造体のメンバーアクセスをメンバー名ではなくオフセットやサイズで直アクセスしている部分が多数存在します。このため、longやポインターを含む場合、全て変更が必要です。

また、ファイルのヘッダーを表す構造体は、メンバーサイズを変更してはいけません。X-BASIC for iOSはPIC他、多数のファイルフォーマットをサポートするため、その記述は注意が必要です。

さらに、定数LONG_MAXの値も変わっているため、それを参照している部分も修正が必要でした(これは盲点だった)。

(3)ポインターが8バイトになった
(2)とほとんど同じですが、従来の処理ではvoid *をunsigned longに代入して処理している部分がかなり多くあるので、数値用longとポインター用longに厳密に区別して、前者は4バイトのまま、後者は8バイトに拡張して処理を書き換える必要があります。

最初は(1)だけの問題だと思ってましたが、(2)(3)の方が重大な感じです。数も非常に多いし。果たして対応しきれるどうか。

2015/06/03現在、一応ひと通りの対応コードを書き、 プログラムの動作テスト中です。まだ動かないプログラムが存在するので、変更が抜けている部分がありそうです。それでも最初はあまりの変更の多さに「不可能ではないか」と思っていたので、動き始めたことは、気持ちを維持する上でも極めて大きな意義があります。

速度は、ワークアクセスの負荷が増えるため理屈上少し落ちるはずですが、多くはコンパイル時なので、実行中は分からない程度におさまってくれると思います。 

・サンプルの追加
実用サンプルは1つだけ追加する予定です(テストは多数)。Appleに目をつけられると困るので詳細はまだ書けませんが、 あったらとても便利な機能です。あと、テスト的なものはいくつか追加されます。→結局2つ大物を追加。増えたので、次バージョンでは、内蔵サンプルも削除できるようにするか、リストから外すように出来るようにすると思う。


追伸:
SHARPのX-BASIC v2.0ユーザーリファレンスを公開できんもんでしょうか。なんとか了承が得られるといいのですが。まあ、for iOSでは使えない関数も多いのですが、やはりプロの書いた説明書はわかりやすいので。心当たりの方は教えていただけるとありがたいです(いえ、了解を取り付けていただけると感謝感激雨あられ)。手持ちの書籍版をPDF化したものはあるのですが、それをそのまま公開するとさすがにいかんと思うので。テキストで打ち込み直したらOK?

---------------------------
2015/06/26記述

開発を一応完了したのでV3.00の概要。
・64ビット環境対応;X-BASICのint自体は32ビットのままです
・iPhone6/Plus対応
・よく使われる処理を内部関数化;「X68互換関数」の実装(50以上!)
・他もちょっとだけ関数追加
・バグ取り(多数);関数、インタープリター部、エディター部
・エラーチェック強化
・取説の間違いを修正(文字列比較など)、旧バージョンに対する記述を削除
・SHIFT-JISで記述されたソースファイルを読み込んだときは自動的に強制SHIFT-JISモードになるようになるモードを追加
・サンプルのバグを修正、新関数対応。
・サンプル追加

X68互換関数は、X68とほぼ同じ動作をする関数群です。機種依存する関数は同名でも異なる動作をするものが多数でしたが、これを引数も含めほぼ同じにしています。関数名は違いますが。でも、X68上での動作のフローがわからない関数については推測で実装しているので完全に同じではないです。これはもう仕方ないということで。

思いの外大規模な変更になってしまいました。64ビット対応よりX68互換関数の追加が大きいです。さらに、バグもかなり直しました。よくもこんなに残ってたな、という感じです。サンプルプログラムは全部を再動作検証して全て書き換えました。

あとはアップルの審査が通るのを待つだけです。

お願いです。手元には64ビットの実機がありません。iPhone6や同plusもありません。なので、テストはシミュレーター上でしか行えていません。
インストールされた方で実機上で不具合が出る、という方は詳細な情報とともに、お知らせください。

---------------------------
2015/07/10記述
発売開始されました。
それに伴い、重要なサンプルの説明を公開しました。