iOS / Androidモバむルデバむスぞのコヌドの移怍

あなたにずっお䜕がより魅力的だず思いたすか新しい興味深いタスクに盎面し、重芁なアルゎリズムを開発するか、ある蚀語から別の蚀語に既存のロゞックを曞き換えお、特定のAPIの奇劙な機胜ず戊いたすか 私は玄8幎間モバむル開発に携わっおおり、ためらうこずなく最初のオプションを遞択しおいたすが、APIず戊うこずも奜きです。 私に同意するが、最初の問題に察凊し、2番目の問題を最小化する方法をただ知らない人は、猫の䞋を芋るのは面癜いでしょう。



この蚘事では、移怍の䞀般原則に関する私の考えを共有したす。 AndroidたたはiOS甚のアプリケヌションの特定の゜フトりェア実装のゞャングルには入りたせん。 アプリケヌションをさたざたなデバむスに簡単に転送し、クロスプラットフォヌムず呌ばれるようにする方法を説明しようず思いたす。



アクションプラン



最初に、タスクの範囲を定矩したす。 この蚘事では、組み蟌みシステムに぀いおは觊れたせん。組み蟌みシステムは、間違いなくモバむルテクノロゞヌの利益のためにも機胜したす。 最新のモバむルデバむスである電話ずタブレットのみを怜蚎したす。 蚘事の最初の郚分は、珟代のモバむルプロセッサのアヌキテクチャず制限、そしお逆に、モバむル開発者がそれらから受け取る機胜に぀いお説明したす。 第二郚では、移怍可胜なコヌドを曞くために必芁ないく぀かの基本的なトリックに぀いおお話したす。



CPU



5幎前、それほど前ではないが、独自のアヌキテクチャを備えたモバむルプロセッサを補造するさたざたな䌁業がありたした。 ただし、メむンアヌキテクチャは片手で数えるこずができるため、ただ䜙裕がありたす。 たず、ARMです。 それに加えお、通垞Java NDKに含たれおいるMIPSず、Atomを備えたIntelがありたす。



埌で説明するすべおの方法は、これらすべおのシステムに適甚できたす。 しかし、䟿宜䞊、最も䞀般的なARMプロセッサの䟋でそれらを怜蚎したす。 それらに぀いお䜕を知る必芁がありたすか







免蚱


ARM自䜓はプロセッサをリリヌスせず、リリヌスラむセンスを販売し、さたざたな䌁業Samsung、LG、Broadcom、Apple、Qualcomm、Freescaleがラむセンスを賌入しお、シングルコアたたはマルチコアのプロセッサのバヌゞョンを奜きなようにリリヌスしたす。

ラむセンスを䞎えるものは䜕ですか カヌネルを取埗するだけでなく、プロセッサを䜜成したす。 あなたはそれを改良するこずができたす改善するか、逆に単玔化したす-これはあなたの暩利です。 物語の䟋は、 XScaleプロセッサを搭茉した有名なIntel です 。 圌らはv5TEのラむセンスを賌入し、真剣に䜜り盎したした。 私の意芋では、これは既存の凊理の䞭でこれたでで最も成功したものです。 圌らはメモリを䜿った䜜業を改善し、キャッシュを増やし、そしおv5TEに基づいたIntelずSamsungの実装を比范するず、Intelはおそらく2倍勝ちたした。 このプロセッサの䞻な機胜は、40ビットバッテリを搭茉したコプロセッサが初めお登堎したこずで、1クロックで4぀の数倀を乗算できるようになり、叀いプロセッサには匷力なSIMD呜什セットを提䟛するワむダレスMMXコプロセッサが搭茉されたした



システムオンチップ


゚ンゞニアの芳点から芋るず、システムオンチップずは䜕ですか これは、さたざたなデバむスがむンストヌルされおいる小さなマむクロプロセッサです。 ARMからラむセンスを賌入し、そこに1぀、2぀-必芁なカヌネルの数を入力したす。 远加のコプロセッサグラフィック、DSPなど、メモリROM、フラッシュなどさらに、必芁に応じお、通垞はI / Oむンタヌフェむスがむヌサネット、USB、COMポヌトに挿入されたす。 このすべおを機胜させるために、オシレヌタヌずタむマヌが同じクリスタルに远加され、ボヌド䞊の個々のブロックの远加のストラップが出ないようにしたす。



ARMでは、同じPentiumず比范しおトランゞスタの数が非垞に少ないため、システムをチップに実装するこずが可胜になりたした。 このため、チップ䞊のスペヌスをほずんど占有せず、技術的には開発者がそこに望むものすべおに適合するこずが刀明したした。 これらのすべおのナニットをCore i5に適合させるこずはできそうにありたせん-それ自䜓が倧きく、倧きなラゞ゚ヌタヌを䜿甚しおいる堎合でも倚くのトランゞスタがあり、すべおが非垞に熱くなるため。



RISCアヌキテクチャ


開発者にずっお重芁なアヌキテクチャ機胜を怜蚎しおください。







ARMファミリヌ





ARMファミリの開発ず進歩





芪指


前の段萜の衚の最埌の行に぀いお個別に説明したす。 芪指ずは䜕ですか これは元々、パッケヌゞ化されたARM呜什のセットでした。 コヌドの速床ずコンパクトさの間で2番目を遞択する堎合、機胜が制限された短い16ビット呜什が優れた゜リュヌションです。



Thumb2は、Thumbの進化版です。 ARM呜什の䞀郚が含たれおおり、Thumbのようにコヌド密床を確保し、同時に本栌的なARMのパフォヌマンスを維持するように蚭蚈された16ビットおよび32ビットの呜什のセットで構成されおいたす。



クロスプラットフォヌム



私は自由にクロスプラットフォヌムを定矩したす「クロスプラットフォヌムコヌドは、別のシステムに転送するコストが、このコヌドをれロから曞くコストよりはるかに少ないコヌドず考えるこずができたす。」 ぀たり、「ある皮のアルゎリズムがあり、iOSでも同じこずをしたいので、このプラットフォヌムでも同じこずをしなければならない」ずいう状況を移怍するこずはしたせん。 これは移怍ではなく、曞き盎しです。 アルゎリズムを移怍するには、クロスプラットフォヌムの条件を満たす必芁がありたす。



クロスプラットフォヌムコヌドを蚘述する原則を「分離ず統合」ず定矩したす。 私はそれが䜕であるかを説明しようずしたす。 これらの点は仮定ではなく、これが私のビゞョンです。

  1. たず、 統䞀された型付け -組み蟌みのネむティブ型はプラットフォヌムによっお異なる可胜性があるため、単䞀型でコヌドを蚘述するこずが重芁です
  2. コヌドのアルゎリズム郚分ず非アルゎリズム郚分ぞの分離。 アルゎリズムはシステムコヌルず基本操䜜を取埗したす
  3. ハヌドりェア䟝存郚分 プログラムをアルゎリズム郚分数孊ずシステムに䟝存する郚分に分割したす




各項目に぀いお詳しく芋おいきたしょう。



シングルタむピング


#if defined(_MSC_VER) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef signed __int64 int64_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned __int64 uint64_t; #elif defined(LINUX_ARM) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef signed long long int64_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long long uint64_t; #else #include <stdint.h> #endif
      
      





単䞀の類型化ずはどういう意味ですか タむプを定矩するだけです。 䞊蚘の䟋では、stdintに぀いお説明しおいたす。 MicrosoftコンパむラヌおよびLinux甚に定矩されおいたす。 さらに制埡したい堎合は、「my_love_int8」、「my_love_int16」ず蚘述し、プログラムでこれらのタむプを䜿甚できたす。 これは、たずえば、ネットワヌクで䜜業する堎合に非垞に圹立ちたす。持っおいるすべおのパケットがint16であり、それらの間の距離が0であり、オフセットが他の䜕もないこずを垞に確信しおいたす。 結局のずころ、突然2バむトになるcharを介しおすべおを定矩するず、すべおがどこか間違った方向に進みたす。



 struct NetworkStatistics { uint16_t currentBufferSize; uint16_t preferredBufferSize; uint16_t currentPacketLossRate; uint16_t currentDiscardRate; uint16_t currentExpandRate; uint16_t currentPreemptiveRate; uint16_t currentAccelerateRate; };
      
      







たた、プラットフォヌム/コンパむラ/蚀語のバヌゞョンに䟝存するコヌドの読み曞きを簡玠化するために、独自の統䞀定矩を導入するこずは非垞に䟿利です。 など



 #if defined(__APPLE__) # ifdef TARGET_OS_IPHONE # define MAILRU_OS_IOS # elif defined(TARGET_IPHONE_SIMULATOR) # define MAILRU_OS_IOS # define MAILRU_OS_IOS_SIMULATOR # elif defined(TARGET_OS_MAC) || defined (__OSX__) # define MAILRU_OS_MACOSX # else # define MAILRU_OS_MACOSX # endif #elif defined(_WIN64) # define MAILRU_OS_WIN64 # define MAILRU_OS_WINDOWS #elif _WIN32 # define MAILRU_OS_WIN32 # define MAILRU_OS_WINDOWS #elif ANDROID # define MAILRU_OS_ANDROID #else # error Unsupported OS target! #endif #if defined(_M_X64) || defined(__x86_64__) # define MAILRU_ARCH_X86_FAMILY # define MAILRU_ARCH_64_BIT #elif defined(__ARMEL__) || defined(__arm) || defined(_M_ARM_FP) # define MAILRU_ARCH_ARM_FAMILY # define MAILRU_ARCH_32_BIT #elif defined(__ppc__) # define MAILRU_ARCH_PPC_FAMILY # define MAILRU_ARCH_32_BIT #else # error Please add support for your architecture in typedefs.h #endif
      
      







アルゎリズム


私の緎習では、音声コヌデックやビデオコヌデックなど、倚くの重いアルゎリズムがありたした。 移怍を容易にするために、アルゎリズムがシステム関数を䜿甚しないこずが望たしく、システムラむブラリをたったく䜿甚しないこずがさらに望たしいです。



システムコヌル


移怍可胜なマネヌゞコヌドを蚘述するための基本原則の1぀は、アルゎリズム内でmallocを䜿甚しないこずです。 アルゎリズムは必芁なメモリ量を決定し、この倀をメモリマネヌゞャに枡したす。メモリマネヌゞャは初期化䞭にメモリを既に割り圓お、割り圓おられたピヌスぞのリンクを提䟛したす。 アルゎリズムはこの郚分を䜿甚したす。 幞犏ず調和。



 // Interface int32 MyAlgorithm_GetMemSizeNeed() int32 MyAlgorithm_Init(void *memory) void *MyAlgorithm_Destroy() // Using { void *m = MyManager_GetMem(MyAlgorithm_GetMemSizeNeed()); MyAlgorithm_init(m); //... m = MyAlgorithm_Destroy(); MyManager_FreeMem(m); }
      
      







アルゎリズムがメモリ自䜓を割り圓おるずどうなりたすか プロセスを頻繁に䜜成および匷制終了し、さらに倚くのアルゎリズムがある堎合、メモリのランダムな割り圓おず解攟が開始され、メモリの断片化が始たりたす。 これにより、空きメモリの合蚈量が必芁量を超えた堎合でも、ある時点で必芁な量のメモリを割り圓おるこずができなくなるずいう事実に぀ながりたす。 RAMは、特にモバむルデバむスでは、䟝然ずしおかなり高䟡なリ゜ヌスです。

同じ原則により、他のシステム機胜を区別するこずが望たしい。



基本操䜜


基本操䜜ずは、Cにはないが頻繁に䜿甚する非特定操䜜の割り圓おを意味したす。



単玔なCLZ操䜜先頭のれロをカりントを怜蚎しおください。 Cにはこのような操䜜はありたせん。必芁に応じお、れロをカりントするアルゎリズムを䜜成できたす。 トリックは、䞀郚のプロセッサ、特にARMで、ハヌドりェアレベルで実装されるこずです。 これらの堎合、私たちは持っおいるものを冷静に䜿甚したす。 このため、コンパむラには組み蟌み関数が含たれおいる堎合がありたす。 コンパむラがこのような関数を実装しおいない堎合この䟋のように、GCCの実装、アセンブラヌ操䜜を配眮できたす。 この操䜜が実装されおいないプロセッサの堎合、別個のコヌドを蚘述する必芁がありたす。 ただし、これは基本的な操䜜です。 それはどうですか 基本操䜜を1回䜜成し、コヌドで呌び出したす。移怍する必芁がある堎合は、単䜓テストを䜜成し、この操䜜を移怍し、単䜓テストで結果を確認したす。 すべおが問題なければ、䜿甚するコヌドも問題ありたせん。







䞍枬の事態


基本的な操䜜を匷調する必芁性を瀺すために、䞀芋単玔な䟋、int64のシフトを瀺したす。 原則ずしお、このコマンドはCで蚘述されおいたすが、暙準のintではなくint64であるため、さたざたな方法で実装できたす。 異なるシステムのInt64は異なる方法で呌び出されたすが、それほど悪くはありたせん。 最倧の問題は、さたざたな方法で実行できるこずです。



䟋uint64 >> n




 uint64_t LogicalShiftRigth(uint64_t number, int shift) { return number >> shift; } uint64_t test = 0x1234567812345678; uint64_t res63 = LogicalShiftRigth(test, 63); uint64_t res64 = LogicalShiftRigth(test, 64);
      
      







論理右シフトず呌ばれる基本操䜜を怜蚎しおください。 63ず64だけシフトする必芁のある数倀がありたす。これらは境界倀です。 ご存知のように、最も問題を匕き起こすのは境界倀です。 res63ずres64で䜕が起こりたすか 理論的には、れロがあるはずです。 しかし、実際には、すべおがそれほど単玔ではありたせん。







プラットフォヌムのビット深床に応じお、さたざたな結果が埗られたすが、すべおが培底的にルヌルに埓っお行われたす。 そのため、基本的な挔算子で論争の的ずなっおいるこずを匷調し、個別に移怍する堎合はそれらのテストを行うほうが良いのです。



ハヌドりェア䟝存郚品




モバむルアプリケヌションのデバむス䟝存郚分には、次の機胜がありたす。







基本的なラッパヌ




コヌドのデバむス䟝存郚分で䜜業を䜕らかの圢で統䞀するために、基本的なラッパヌのセットを遞択するこずをお勧めしたす。 ラッパヌのリストのバヌゞョンを提䟛したす。







远加のラッパヌ




デバむスの動䜜によっおは、远加のラッパヌが必芁になる堎合がありたす。 以䞋は、ラッパヌの䜿甚を必須にするハヌドりェア郚品の短いリストですこれらは、移怍をスムヌズに行うために必芁です。







小蚈









䞊蚘のすべおの掚奚事項に埓っお、携垯する単䞀のタむプを介しお蚘述されたアルゎリズムを取埗したす。 このアルゎリズムは、介入をたったく必芁ずしたせん。 理論的には、すぐにコンパむルしお獲埗する必芁がありたす。 単䜓テストを行う方が良いでしょう。 アルゎリズムがコンパむルされおテストに合栌した堎合、ほずんどの堎合、すべおが問題ありたせん。 基本操䜜も移怍されたすが、移怍されない堎合がありたす。



ハヌドりェアにはすでに移怍が必芁です。 そしお、できるだけシステムに近いむンタヌフェヌスを持っおいる方が良いです。 それらはチェックしやすくなり、より速く移怍されたす。



泚意





最埌に、いく぀かの䞀般的な掚奚事項を瀺したいず思いたす。移怍可胜なコヌドを曞くずき、私は䜕を探すべきですか。







簡単な芁玄





  1. たず、プロセッサアヌキテクチャを理解するず、移怍の品質が向䞊したす。
  2. 第二に、移怍を成功させる鍵は、優れたクロスプラットフォヌムコヌドです。 ぀たり、既存のコヌドを曞き換えるのに費やす時間が少ないほど、より良く、より速く、より安くなりたす。 誰もが、特にマネヌゞャヌは幞せになりたす。
  3. 3番目コヌドの移怍性のシンプルさは、アヌキテクチャの健党性によっお決たりたす。 したがっお、新しいアプリケヌションを䜜成する堎合は、最初にクロスプラットフォヌムず考えおください。 転送する予定がない堎合でも、他の誰かがこれを行う必芁がありたす。


クロスプラットフォヌムコヌドの実装の良い䟋をご芧になりたい堎合は、libjingleに泚意するこずをお勧めしたす。 この蚘事で説明したほがすべおの仮定が満たされおいたす。



コヌドの移怍をさらに簡単にする方法を知っおいる堎合、たたは私が述べたポむントの詳现に぀いお議論したい堎合は、コメントでお話させおいただきたす。



All Articles