4D-jp 4D Japan Technical Support Team

Rosettaとゼロ除算


Mac版の4D v19は,Universal 2バイナリ形式で提供されており,x86_64とApple Silicon(ARMアーキテクチャ)のどちらでもインタープリター版のストラクチャをネイティブアプリとして実行することができます。

4DのコンパイラーはIntel(AMDアーキテクチャ)のコードを生成するように設計されていますが,MacにXcodeがインストールされていれば,メソッドのソースコードを clang コンパイラーに生成させることにより,Apple Siliconターゲットのアプリケーションをビルドすることもできます。

clang コンパイラーを利用してApple Siliconターゲットのコンパイルが実行できるのは,プロジェクトモードだけです。バイナリモード,つまり .4DB というファイル拡張子を持つストラクチャファイルをXcodeでコンパイルすることはできません。

互換性のために残されているバイナリモードでアプリケーションを開発している場合,データベースをプロジェクトモードの変換するか,IntelターゲットのアプリケーションをビルドしてRosetta 2で4Dを起動するか,コンパイルせずにインタープリターモードでアプリケーションを運用するか,よく検討した上で決定することになります。一旦,変換したストラクチャをバイナリモードに戻すことはできません。

初期の4Dはコンパイルすることにより大幅な速度の向上が望めましたが,現在ではインタープリターモードでも快適に動作しますので,さほどパフォーマンスに差はないと考えられています。

4DはRosetta 2でサポートされていない特殊な実行ファイルではありませんが,AppleはRosetta 2トランスコーダーの詳細を公開していないため,RosettaモードでIntelやApple SiliconネイティブのMacと違う振る舞いをする可能性がないとは言えません。問題があるとすれば,浮動小数点演算など,CPUに対する直接的な命令の実行でしょう。たとえば,4Dで0による整数除算(%演算子)を実行した場合,通常はエラーが返されませんが,Rosettaコンパイルモードではエラーが返されます。0による除算は正しい結果が定義されていないので,Rosettaの実装による違いであり,4Dの不具合ではありません。なお,コンパイルの対象となる演算子を記述せず,同等の演算をするMod関数を実行すれば,インタープリターモードと同じ振る舞いになります。これは仕様です。


関連記事

リンク