مقدمه

در دنیای امروزی، کاربران دیگر به یک دستگاه یا سیستم‌عامل خاص محدود نیستند. برخی از افراد از گوشی‌های اندرویدی استفاده می‌کنند، برخی دیگر طرفدار آیفون و سیستم‌عامل iOS هستند، و بسیاری هم برای کارهای روزمره خود به برنامه‌های دسکتاپ و تحت وب وابسته‌اند. این تنوع در دستگاه‌ها و سیستم‌عامل‌ها، یک چالش بزرگ برای برنامه نویسان و توسعه‌دهندگان نرم‌افزار ایجاد کرده است.

در حالت عادی، برای اینکه یک اپلیکیشن روی همه این سیستم‌ها اجرا شود، باید چند نسخه جداگانه برای هرکدام از آن‌ها توسعه داده شود. به عنوان مثال، توسعه‌دهندگان مجبورند یک نسخه را با زبان Swift برای iOS، یک نسخه دیگر را با Java یا Kotlin برای اندروید، و یک نسخه مجزا را برای دسکتاپ یا وب طراحی کنند. این کار نه‌تنها هزینه و زمان توسعه را به شدت افزایش می‌دهد، بلکه نگهداری و به‌روزرسانی این اپلیکیشن‌ها را نیز سخت‌تر می‌کند

اینجاست که فناوری‌های چندسکویی (Cross-Platform) اهمیت پیدا می‌کنند. این فناوری‌ها به توسعه‌دهندگان اجازه می‌دهند یک بار کدنویسی کنند و همان کد را روی چندین سیستم‌عامل اجرا کنند. تاکنون، Flutter (محصول شرکت گوگل) و React Native (محصول شرکت متا یا همان فیسبوک) محبوب‌ترین گزینه‌ها برای توسعه اپلیکیشن‌های چندپلتفرمی بوده‌اند. اما اکنون یک رقیب جدید و قدرتمند وارد میدان شده است.

Compose Multiplatform (CMP) یک فریم‌ورک مدرن است که توسط شرکت JetBrains (شرکت سازنده زبان برنامه‌نویسی Kotlin و محیط توسعه IntelliJ IDEA) توسعه داده شده است. این فریم‌ورک بر پایه Jetpack Compose (ابزار رابط کاربری مدرن اندروید) ساخته شده و به توسعه‌دهندگان این امکان را می‌دهد که با استفاده از زبان Kotlin، یک رابط کاربری یکپارچه برای چندین سیستم‌عامل از جمله اندروید، iOS، دسکتاپ و وب ایجاد کنند. به زبان ساده، Compose Multiplatform این امکان را فراهم می‌کند که یک اپلیکیشن با یک کد مشترک ساخته شود و بدون تغییرات اساسی، روی انواع دستگاه‌ها اجرا شود.

اما Compose Multiplatform چگونه کار می‌کند؟ آیا می‌تواند به بهترین راه‌حل برای توسعه اپلیکیشن‌های چندپلتفرمی تبدیل شود؟ چه مزایا و معایبی نسبت به Flutter و React Native دارد؟ اگر شما هم به دنبال یک روش ساده‌تر و کارآمدتر برای توسعه نرم‌افزارهای چندسکویی هستید، تا انتهای این مقاله همراه ما باشید تا با این فناوری جدید به طور کامل آشنا شوید!

Compose Multiplatform چیست؟

تصور کنید می‌خواهید یک اپلیکیشن کاربردی بسازید؛ مثلاً یک برنامه‌ی مدیریت کارهای روزانه. کاربران شما از دستگاه‌های مختلف استفاده می‌کنند:

  • برخی گوشی اندرویدی دارند،
  • بعضی از کاربران از iPhone استفاده می‌کنند،
  • برخی دیگر ترجیح می‌دهند از وب یا کامپیوتر دسکتاپ به برنامه‌ی شما دسترسی داشته باشند.

اما مشکل اینجاست که در روش‌های سنتی، هر سیستم‌عامل زبان برنامه‌نویسی و فناوری مخصوص خود را دارد:

  • برای اندروید باید از Kotlin یا Java استفاده کنید.
  • برای iOS باید Swift یا Objective-C را یاد بگیرید.
  • برای وب، حداقل نیاز به HTML، CSS و JavaScript دارید.
  • برای دسکتاپ (ویندوز، مک، لینوکس) باید از JavaFX، Swing یا سایر ابزارها استفاده کنید.

این یعنی برنامه‌نویسان باید یک اپلیکیشن را چندین بار با زبان‌های مختلف از اول بنویسند که این کار از لحاظ هزینه و زمان به صرفه نیست.

پس JetBrains، همان شرکت سازنده‌ی زبان Kotlin، فریم‌ورکی به نام Compose Multiplatform (CMP) را توسعه داده است که به برنامه‌نویسان اجازه می‌دهد یک بار کدنویسی کنند و برنامه را روی همه‌ی این سیستم‌ها اجرا کنند.
به عبارت ساده‌تر:

  • به جای نوشتن چندین نسخه برای هر سیستم‌عامل، فقط یک بار کد می‌نویسید و روی همه‌ی دستگاه‌ها اجرا می‌شود.
  • دیگر نیازی به یادگیری چندین زبان و فریم‌ورک مختلف ندارید.
  • این کار باعث کاهش هزینه و افزایش سرعت توسعه‌ی اپلیکیشن‌ها می‌شود.

چرا CMP یک نوآوری مهم است؟

Compose Multiplatform بر پایه‌ی Jetpack Compose ساخته شده است. این یعنی از همان روش مدرن طراحی رابط کاربری که گوگل برای اندروید معرفی کرده بود، برای همه‌ی پلتفرم‌ها استفاده می‌کند.

به عنوان مثال فرض کنید می‌خواهید یک اپلیکیشن فروشگاهی بسازید که روی اندروید، iOS و وب کار کند.

در روش‌های سنتی، توسعه‌دهندگان مجبور بودند یک برنامه را سه بار از ابتدا برای اندروید،iOS و وب بنویسند. اما با استفاده ازCompose Multiplatform، این مشکل برطرف شده است. شما فقط یک بار کدنویسی می‌کنید و همان برنامه بدون نیاز به بازنویسی، روی تمام پلتفرم‌ها اجرا می‌شود.فناوری CMP، توسعه‌ی اپلیکیشن‌های چندپلتفرمی را ساده‌تر، سریع‌تر و کم‌هزینه‌تر می‌کند.

اما این تکنولوژی هنوز در حال پیشرفت است و برخی محدودیت‌ها دارد، اما در حال تبدیل شدن به یکی از بهترین روش‌های توسعه‌ی اپلیکیشن‌های چندسکویی است.

Compose Multiplatform چگونه کار می‌کند؟

برای درک نحوه‌ی کار Compose Multiplatform، باید ابتدا بفهمیم که چرا این فناوری به یک معماری چندلایه نیاز دارد. همان‌طور که گفتیم، دستگاه‌های مختلف (مانند گوشی‌های اندرویدی، آیفون، کامپیوترهای دسکتاپ و مرورگرهای وب) هرکدام سیستم‌عامل و ویژگی‌های خاص خود را دارند. CMP با ایجاد یک سیستم منعطف، به برنامه‌نویسان اجازه می‌دهد که بخش‌های مشترک کد را یک‌بار بنویسند و فقط قسمت‌های خاص هر پلتفرم را جداگانه مدیریت کنند.

Compose Multiplatform دو بخش اصلی دارد که باعث می‌شود بتواند هم کد مشترک (Shared Code) و هم کد مخصوص هر پلتفرم (Platform-Specific Code) را مدیریت کند.

کد مشترک (Shared Code)

این قسمت شامل بخش‌هایی از برنامه است که در تمام پلتفرم‌ها یکسان هستند. به عبارت ساده‌تر، شما یک‌بار این بخش را می‌نویسید و روی همه‌ی سیستم‌ها اجرا می‌شود. این قسمت شامل موارد زیر می‌شود:

  • رابط کاربری (UI)

    شامل تمام عناصر بصری و تعاملی برنامه است که کاربران با آن‌ها سر و کار دارند. این بخش شامل دکمه‌ها، فرم‌های ورود اطلاعات، لیست‌ها، تصاویر، منوها و سایر المان‌های گرافیکی است که تجربه کاربری (UX) را شکل می‌دهند. رابط کاربری نه‌تنها ظاهر برنامه را تعیین می‌کند، بلکه نحوه تعامل کاربران با برنامه را نیز مشخص می‌کند؛ برای مثال، کلیک روی یک دکمه چه عملی را اجرا کند یا نحوه نمایش داده‌ها در صفحه چگونه باشد. در Compose Multiplatform، این عناصر به‌صورت مشترک نوشته می‌شوند و روی تمام پلتفرم‌ها بدون نیاز به طراحی مجدد اجرا می‌شوند.

  • منطق برنامه (Business Logic)

    شامل تمام فرآیندهای پردازش اطلاعات، مدیریت داده‌ها و ارتباطات داخلی برنامه است. این بخش تعیین می‌کند که برنامه چگونه داده‌های ورودی را دریافت کند، پردازش‌های لازم را روی آن‌ها انجام دهد و خروجی مناسب را تولید کند. همچنین، مدیریت ارتباطات بین بخش‌های مختلف برنامه، تعامل با پایگاه داده، انجام محاسبات و درخواست‌های شبکه (API Calls) نیز در این بخش قرار می‌گیرد.

  • مدیریت وضعیت (State Management)

    فرآیندی است که در آن داده‌های پویا و وضعیت برنامه در طول اجرا کنترل و به‌روزرسانی می‌شوند. به زبان ساده، مدیریت وضعیت تضمین می‌کند که اطلاعات موجود در برنامه همواره صحیح و همگام باشند. برای مثال، اگر کاربر در حال پر کردن یک فرم است، مدیریت وضعیت مشخص می‌کند که اطلاعات واردشده حتی پس از تغییر صفحه یا چرخش صفحه‌نمایش حفظ شوند. همچنین، در اپلیکیشن‌هایی که نیاز به به‌روزرسانی لحظه‌ای داده‌ها دارند (مانند پیام‌رسان‌ها یا اپلیکیشن‌های مالی)، سیستم مدیریت وضعیت بررسی می‌کند که داده‌های جدید به‌درستی نمایش داده شوند. در Compose Multiplatform، مدیریت وضعیت به‌صورت یکپارچه در کد مشترک اجرا می‌شود تا این قابلیت بدون تغییرات اضافی در تمام پلتفرم‌ها قابل‌استفاده باشد.

فرض کنید شما یک اپلیکیشن یادداشت‌برداری طراحی می‌کنید که قرار است روی گوشی‌های اندرویدی، آیفون، کامپیوترهای شخصی و مرورگرهای وب اجرا شود. در این برنامه، صفحه‌ی اصلی شامل لیستی از یادداشت‌های کاربر است که در همه‌ی پلتفرم‌ها ظاهر و عملکرد مشابهی دارد. بنابراین، این بخش را می‌توان به‌عنوان کد مشترک نوشت تا بدون نیاز به تغییر، روی تمام دستگاه‌ها اجرا شود. یعنی نیازی نیست که برای اندروید یک نسخه با Kotlin، برای iOS با Swift، و برای وب با HTML و JavaScript بنویسید. در عوض، Compose Multiplatform به شما این امکان را می‌دهد که یک‌بار این صفحه را طراحی کنید و بدون نیاز به تغییر، آن را روی همه‌ی سیستم‌ها اجرا کنید.

کد مخصوص هر پلتفرم (Platform-Specific Code)

برخی قابلیت‌های یک برنامه ممکن است در تمام پلتفرم‌ها یکسان نباشند و نیاز به کد مخصوص هر پلتفرم داشته باشند. این موارد معمولاً شامل ویژگی‌هایی هستند که به سخت‌افزار یا امکانات اختصاصی سیستم‌عامل وابسته‌اند. برای مثال:

  • دسترسی به حسگرهای گوشی (مثلاً دوربین، GPS، حسگر اثرانگشت)
  • تعامل با پایگاه داده‌های داخلی سیستم (مثلاً دسترسی به فایل‌های محلی در اندروید یا iOS)
  • اتصال به ویژگی‌های خاص هر سیستم‌عامل (مثلاً نوتیفیکیشن‌های اختصاصی در آیفون)

برخی ویژگی‌ها مانند تعامل با سخت‌افزار، به دلیل تفاوت در نحوه‌ی پیاده‌سازی در هر سیستم‌عامل، نمی‌توانند از یک کد مشترک استفاده کنند. به‌عنوان مثال، نحوه‌ی ارسال نوتیفیکیشن در اندروید با iOS متفاوت است؛ در اندروید، این کار از طریق Firebase Cloud Messaging (FCM) انجام می‌شود، درحالی‌که در iOS از APNs (Apple Push Notification Service) استفاده می‌شود. به همین دلیل، برای این قابلیت‌ها، توسعه‌دهندگان باید کدی مخصوص هر پلتفرم بنویسند.

برای مثال: فرض کنید اپلیکیشن یادداشت‌برداری شما نیاز دارد که به دوربین گوشی دسترسی داشته باشد تا تصاویر را به یادداشت‌ها اضافه کند. چون نحوه‌ی کار با دوربین در اندروید و iOS متفاوت است، این بخش از کد باید برای هر سیستم‌عامل جداگانه نوشته شود.

مراحل اجرای یک برنامه در Compose Multiplatform

وقتی یک برنامه با CMP ساخته می‌شود، فرآیند اجرای آن به این صورت است:

برنامه‌نویس یک کد مشترک برای طراحی UI می‌نویسد.

این کد شامل تمام دکمه‌ها، متن‌ها، لیست‌ها و سایر المان‌های گرافیکی است .همچنین، بخش‌های منطقی مانند ذخیره‌سازی داده‌ها و پردازش اطلاعات را نیز شامل می‌شود.

کامپایلر Compose این کد را برای هر پلتفرم ترجمه می‌کند.

یعنی برنامه به‌صورت خودکار برای اندروید، iOS، دسکتاپ و وب قابل اجرا می‌شود. درصورتی‌که بخش‌هایی از برنامه نیاز به کد مخصوص هر سیستم‌عامل داشته باشد، این قسمت‌ها جداگانه مدیریت می‌شوند.

اپلیکیشن روی همه‌ی پلتفرم‌ها اجرا می‌شود.

توسعه‌دهنده نیازی به بازنویسی کد برای هر سیستم ندارد، بلکه همان کد روی تمام دستگاه‌ها اجرا می‌شود!

برای درک بهتر موضوع فرض کنید یک اپلیکیشن سفارش غذا طراحی کرده‌اید که باید روی اندروید، iOS و وب اجرا شود. حالا ببینیم این اپلیکیشن چطور با Compose Multiplatform ساخته می‌شود.

کد مشترک (Shared Code)

  • رابط کاربری (UI)

    صفحه‌ی اصلی، دکمه‌های برقراری تماس، لیست مخاطبین

  • مدیریت وضعیت (State Management)

    وضعیت آنلاین/آفلاین بودن کاربر

  • منطق برنامه (Business Logic)

    پردازش درخواست‌های تماس، ارسال و دریافت پیامکد

کد مخصوص هر پلتفرم (Platform-Specific Code)

برخی قابلیت‌ها باید به‌صورت اختصاصی برای هر سیستم‌عامل پیاده‌سازی شوند، زیرا روش‌های پیاده‌سازی آن‌ها در هر پلتفرم متفاوت است:

  • در iOS: استفاده از FaceTime API برای برقراری تماس‌های تصویری (چون FaceTime یک قابلیت اختصاصی iOS است و در سایر پلتفرم‌ها وجود ندارد.)
  • در اندروید: استفاده از WebRTC برای مدیریت تماس‌های تصویری، چون FaceTime در اندروید در دسترس نیست.
  • در دسکتاپ: دسترسی به دوربین و میکروفون سیستم از طریق WebRTC یا API های مخصوص macOS و Windows

سپس CMP کد را برای هر سیستم‌عامل کامپایل کرده و اجرا می‌کند.

در نهایت، با استفاده از Compose Multiplatform، می‌توان یک برنامه‌ی واحد ایجاد کرد که بدون نیاز به بازنویسی، روی تمام دستگاه‌ها و سیستم‌عامل‌ها اجرا شود. این رویکرد نه‌تنها فرآیند توسعه را سریع‌تر می‌کند، بلکه هزینه‌ها را نیز به میزان قابل‌توجهی کاهش می‌دهد.

مقایسه CMP با Flutter و React Native

در دنیای توسعه‌ی چندپلتفرمی، سه فناوری مهم در حال رقابت با یکدیگر هستند: Compose Multiplatform، Flutter و React Native هر کدام از این فریم‌ورک‌ها ویژگی‌های خاص خود را دارند و برای استفاده در شرایط مختلف مناسب هستند. در این بخش، به مقایسه‌ی Compose Multiplatform با دو رقیب اصلی آن، Flutter و React Native می‌پردازیم.

زبان برنامه‌نویسی

Flutter از زبان Dart استفاده می‌کند که توسط گوگل توسعه داده شده است. React Native بر پایه‌ی JavaScript و TypeScript کار می‌کند که برای توسعه‌دهندگان وب و فرانت‌اند مناسب است. در مقابل، Compose Multiplatform از Kotlin بهره می‌برد که یک زبان مدرن و بهینه برای توسعه‌ی چندپلتفرمی محسوب می‌شود.

روش طراحی رابط کاربری

Flutter از فریم‌ورک Flutter UI برای طراحی رابط کاربری استفاده می‌کند که کاملاً مستقل از عناصر بومی سیستم‌عامل است. React Native از عناصر بومی (Native Components) برای نمایش UI استفاده می‌کند. در حالی که Compose Multiplatform بر پایه‌ی Jetpack Compose ساخته شده و برای توسعه‌ی UI در پلتفرم‌های مختلف طراحی شده است.

پشتیبانی از پلتفرم‌های مختلف

Flutter به‌طور گسترده از اندروید، iOS، وب، دسکتاپ (ویندوز، مک و لینوکس) و حتی دستگاه‌های Embedded پشتیبانی می‌کند. React Native بیشتر برای اندروید و iOS طراحی شده است، اما با ابزارهای اضافه می‌توان آن را برای وب و دسکتاپ نیز گسترش داد. Compose Multiplatform از اندروید، iOS، دسکتاپ و وب پشتیبانی می‌کند، اما در حال حاضر تمرکز اصلی آن روی اندروید و دسکتاپ است.

عملکرد و کارایی

Flutter به دلیل داشتن موتور گرافیکی مستقل (Skia) عملکرد بسیار بالایی دارد و در برخی موارد حتی از برنامه‌های بومی سریع‌تر عمل می‌کند. React Native به دلیل وابستگی به JavaScript و ارتباط مداوم بین JavaScript و بومی (Native Bridge) ممکن است در برخی موارد کندتر از Flutter باشد. Compose Multiplatform عملکرد بسیار خوبی دارد، اما هنوز به‌اندازه‌ی Flutter بهینه نشده است.

جامعه‌ی توسعه‌دهندگان و منابع آموزشی

یکی از مهم‌ترین عواملی که در انتخاب یک فریم‌ورک چندپلتفرمی تأثیر دارد، میزان پشتیبانی جامعه‌ی توسعه‌دهندگان و در دسترس بودن منابع آموزشی است.

Flutter به دلیل اینکه توسط گوگل توسعه داده شده، دارای یک جامعه‌ی بسیار بزرگ از توسعه‌دهندگان است. مستندات رسمی گسترده، دوره‌های آموزشی، انجمن‌های تخصصی، و پشتیبانی قوی از سوی شرکت‌ها و برنامه‌نویسان باعث شده که Flutter به یکی از محبوب‌ترین گزینه‌های توسعه‌ی چندپلتفرمی تبدیل شود.

React Native نیز به دلیل وابستگی به JavaScript و استفاده‌ی گسترده‌ی آن در پروژه‌های تحت وب، جامعه‌ی بسیار فعالی دارد. توسعه‌دهندگانی که قبلاً با ReactJS کار کرده‌اند، به‌راحتی می‌توانند وارد دنیای React Native شوند و از منابع آموزشی متعددی که در اینترنت موجود است، بهره ببرند.

اما Compose Multiplatform هنوز در مراحل اولیه‌ی پذیرش قرار دارد و جامعه‌ی آن نسبت به دو رقیب خود کوچک‌تر است. اگرچه پشتیبانی رسمی از سوی JetBrains و جامعه‌ی کاربران Kotlin به گسترش آن کمک کرده، اما منابع آموزشی و مستندات هنوز به‌اندازه‌ی Flutter و React Native گسترده نیست. بااین‌حال، به دلیل محبوبیت فزاینده‌ی Kotlin و گسترش استفاده از Jetpack Compose در اندروید، انتظار می‌رود که در آینده نزدیک، جامعه‌ی این فناوری رشد قابل‌توجهی داشته باشد و مستندات بیشتری برای آن در دسترس قرار گیرد.

آینده Compose Multiplatform

Compose Multiplatform با پشتیبانی از زبان Kotlin و استفاده از معماری مدرن، به‌سرعت در حال پیشرفت است. با توجه به اینکه JetBrains به‌طور مداوم در حال بهبود و گسترش این فریم‌ورک است، انتظار می‌رود که در آینده‌ی نزدیک، قابلیت‌های بیشتری به آن اضافه شود و به گزینه‌ای محبوب‌تر برای توسعه‌ی چندپلتفرمی تبدیل شود. در صورتی که اکوسیستم آن گسترش یابد و چالش‌های فعلی برطرف شوند، Compose Multiplatform می‌تواند به یکی از استانداردهای اصلی در توسعه‌ی نرم‌افزارهای چندسکویی تبدیل شود.