کاتلین(Kotlin) یاد بگیریم! (قسمت ۱)

خوب هفته پیش و در قسمت ۰ کاتلین راجع به یسری موضوعات صحبت کردیم. اگرچه ضروری نیست و به همین دلیل اسم اون قسمت را ۰ گذاشتیم؛ توصیه میکنم بخونید اون قسمت را چون یک حرفهایی زدیم که نه به لحاظ فنی ولی از این نظر که بدونید داریم چیکار میکنیم و هدفمون چیه مهمه :) و اما دوباره کاتلین

توی قست قبل گفتیم که کاتلین را میشه در ۴ حوزه استفاده کرد و این خودش یک موضوع هیجان انگیز در مورد این زبانه و خیلی مختصر این چهار تا حوزه را گفتیم. اما حالا میخوایم یکم عمیقتر بدونیم توی هر کدام از این حوزه ها چه خبر هست:

کاتلین و توسعه سمت سرور (Server-side Development)

این زبان به دلیل تطابق کاملش با تکنولوژی‌های جاوا و منحنی نرم! یادگیریش آن را به یک زبان مناسب برای برنامه‌نویسی سمت سرور تبدیل می‌کنه. این زبان مشخصه‌های زیر را برای خودش اعلام میکنه

  • گویایی: ویژگی‌های جدید به کار رفته در این زبان - مثل پشتیبانی اون از type-safe builders و delegated properties - این امکان را به این زبان میده که کلاس‌های abstract قدرتمند و با قابلیت استفاده ساده ایجاد بکنه.*
  • مقیاس‌پذیری: پشتیبانی این زبان از coroutine ها* این اجازه را به ما میده که برنامه‌هایی بسازیم که قابلیت کار با تعداد بسیار بسیار بسیار! زیادی کاربر را داشته باشه بدون اینکه سخت‌افزار عجیب غریبی بخوایم براش ایجاد کنیم.
  • تعامل‌پذیری: همخوانی این زبان با تمامی فریم‌ورک‌های جاوا(یی) این امکان را میده که در عین حال که توی همون فضایی که تا حالا کار کردید کار بکنید بتونید از مزایای یک زبان مدرن‌تر - منظورش کاتلین هست :) - استفاده کنید.
  • مهاجرت‌پذیری: میتونیم کدهای جدیدمون را توی این زبان بنویسیم درحالی که کدهای قدیمی به زبان و در اکوسیستم جاوا هستن.
  • ابزار: علاوه بر پشتیبانی خوب محیط برنامه‌نویسی (IDE) کاتلین این زبان در ابزارهایی مثل Intellij IDEA برای فریم‌ورک‌هایی مثل Spring پلاگین هم داره.
  • منحنی آموزش: اینجا گفته که یادگرفتن کاتلین برای توسعه‌دهنده‌های جاوا خیلی آسونه و یک پلاگین تبدیل کد هم دارن و یکسری هم آموزش که سریع راهشون میندازه. اما اگر توسعه دهنده جاوا هم نیستین من بهتون قول میدم یاد میگیریم.**

فریمورک‌های توسعه سمت سرور که با کاتلین کار میکنن هم Spring از نسخه ۵، Vert.x، Ktor، kotlinx.html و ابزارهای بسیار بیشتری برای اتصال به دیتابیس های رابطه‌ای(RDBMS) و NoSQL ها.

ذکر این نکته لازمه که اگر برنامه‌ای با کاتلین برای وب و سمت سرور نوشتین بدونین که هر سروری که برنامه‌های تحت وب جاوایی را ساپورت میکنن تنها گزینه‌های قابل استفاده شما هستن. درحال حاضر Corda و سیستم کاربری JetBrain سیستم‌هایی هستند که ۱۰۰ درصد با کاتلین پیاده‌سازی شدند.

کاتلین و جاوا اسکریپت

یک موضوع جالب در مورد کاتلین اینه که میشه کدش را به جاوااسکریپت «تبدیل» یا «transpile» یا «تبدیل کد به کد» یا «خواندن کد در یک زبان و تبدیل آن به همان کد در زبان دیگر»؛ کرد. در حال حاضر این کد به ECMAScript 5.1 - یک استاندارد برنامه‌نویسی در زبان جاوااسکریپت - تبدیل میشه ولی در برنامه تیم توسعه کاتلین هست که ECMAScript 2015 را هم پیاده‌سازی کنه.

تنها نکته - یا شاید بشه گفت نقطه ضعف - در این تبدیل از کاتلین به جاوااسکریپت اینه که هیچ کد مربوط به JVM و JDK و یا هر کتابخانه یا فریم‌ورک جاوایی استفاده شده در کد تبدیل نخواهد شد. به عبارت دیگر هر کدی که کاتلین نباشه در این تبدیل جایی نخواهد داشت.

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

هدف کامپایلر کاتلین در این تبدیل چهار تا موضوع هست:

  • خروجی با سایز بهینه
  • خروجی جاوااسکریپتی خوانا(Readable)
  • تطابق با سیستم‌های ماژولار موجود
  • کارایی یکسان با کد اصلی تا بالاترین حد ممکن

اما یک خبر خوب در مورد این داستان اینه که کاتلین میتونه با کتابخانه‌ها و فریم‌ورک‌های جاوااسکریپتی مثل React و jQuery همزیستی کنه! و همچنین کدهای نوشته شده در TypeScript هم قابل تبدیل به کدهای کاتلین با استفاده از ابزاری به نام ts2kt هست. و همچنین میتونید به این‌ها هم یک نگاهی بندازین: React bindings و React Kotlin App و در نهایت اینجا

کاتلین و Native Apps

تکنولوژی Kotlin/Native یک تکنولوژی هست که این امکان را میده که برنامه‌های نوشته بشه که بدون نیاز به هر ماشین مجازی «VM» اجرا بشه. این تکنولوژی با این هدف طراحی شده که بشه برای ابزارهایی که استفاده از ماشین مجازی در اون‌ها جایی نداره - مثل ابزارهای iOS اپل یا سیستم‌های توکار(embeded) - استفاده کرد. یا مثلا زمانی که یک توسعه‌دهنده میخواد نرم‌افزاری بنویسه که بدون هیچ وابستگی در زمان اجرا استفاده بشه.

برای این منظور این تکنولوژی از تمام قابلیت‌های C و در سیستم عامل مکینتاش و iOS از تمام قابلیت‌های Objective/C پشتیبانی میکنه.

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

  • سیستم عامل ویندوز (x86_64 در حال حاضر)
  • سیستم عامل لینوکس(x86_64, arm32, MIPS, MIPS little indian)
  • سیستم عامل مکینتاش (x86_64)
  • سیستم عامل iOS اپل (arm32 و arm64) - اپل را نمینوشتم به هم میریخت :)
  • اندرویید (arm32 و arm64)
  • وب‌اسمبلی (WebAssembly wasm32)

کاتلین و توسعه اندرویید (Android Development)

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

  • تطابق‌پذیری: کاتلین با JDK 6 تطابق کامل داشته و در نتیجه برنامه‌های ساخته شده با این زبان روی دستگاه‌های اندروییدی قدیمی‌تر بدون هیچ مشکلی اجرا می‌شود. ابزارهای کاتلین روی اندرویید استادیو به‌طور کامل پشتیبانی می‌شود و با سیستم ساخت اندرویید تطابق دارد.
  • کارایی: به لطف استفاده از ساختار بایت‌کد(byte code) مشابه با جاوا برنامه‌های نوشته شده با کاتلین با سرعت یکسان با برنامه‌های نوشته شده با جاوا اجرا می‌شوند. همچنین پشتیبانی کاتلین از توابع درونی(inline functions)، کدهایی که از lambdas استفاده میکنند سریع‌تر از کد مشابه در جاوا اجرا می‌شود.
  • تعامل‌پذیری: همانطور که تا الان کامل روشن شده برامون کاتلین و جاوا در یک تعامل ۱۰۰ درصدی با هم قرار دارند و درنتیجه این امکان وجود داره که از تمام کتابخانه‌های اندروییدی در کاتلین استفاده کرد که این شامل پردازش انوتیشن‌ها - Annotation Processing - هم هست.
  • ردپای کم: زبان کاتلین کتابخانه زمان اجرای بسیار جمع و جور و کوچکی داره که با استفاده از ProGurad‌ - یک بهینه ساز اپن سورس برای بایت کدهای جاوا - میشه کمترش هم کرد. در یک اپ واقعی زبان کاتلین فقط چند صد متد و کمتر از ۱۰۰ کیلوبایت به سایز کل برنامه اضافه میکنه.
  • زمان کامپایل: با پشتیبانی از کامپایل افزایشی و علیرغم اینکه یک سربار زمانی برای تولید یک فایل تمیز داره ولی با این وجود کامپایل‌های افزایشی معمولا به سرعت یا سریعتر از کامپایل جاوا است.
  • منحنی یادگیری: همون حرف‌هایی را زده که توی بخش توسعه سرور گفته بودن را دوباره گفتن. کپی پیست کردن :)

اما برنامه‌های باحالی هم تا حالا با کاتلین توسعه داده شده که از میان آن‌ها میشه به Pinterest، ‌Basecamp و KeepSafe اشاره کرد. که دو تای آخری ۱۰۰ درصد با کد کاتلین پیاده‌سازی شدند.

ابزارهای باحالی هم تولید کردن مثل Kotlin Android Extension - که اگر قبلا با اندرویید کد زده باشید - از دست ()findViewById راحتتون میکنه. یک ابزار فوق‌العاده دیگه‌ای که با این زبان ارایه شده Anko هست که یسری پوشش(wrapper) کاربرپسند ارایه میکنه برای استفاده از APIهای اندرویید و همینطور DSL که اجازه میده قالب xml فایل‌ها با کد کاتلین پیاده‌سازی بشه.

خوب حالا چیکار کنیم:

  • اول از همه Android Studio 3 را از اینجا دانلود کنید. یک راهنمای نصب داره که لازمه بخونیدش و مرحله به مرحله پیش برید باهاش. من ترجیحم به اینه که هرچی را متوه نمیشین جستجو بکنین. این باعث میشه که اگر قبلا برنامه‌نویسی نکردید با کلی مفهوم جدید آشنا بشید.
  • آماده بشید برای هفته آینده که کلی تصویر خواهیم داشت و کلی کد و میریم توی پایه کد نویسی و syntax و غیره. طبیعتا چون هدف من آموزشه تا اونجایی که به ذهنم برسه چیزی را بدیهی فرض نمیکنم و توضیح میدم ولی لازمه که شما هم حسابی بخونید لینک‌هایی که میدم.

تا هفته بعد :)

* اگر جاهایی که این علامت را دیدین متوجه نشدین اصلا نگران نشید. من معادل فارسی براشون توی ذهنم نبود و نمیخواستم اینجا بازشون کنم. به موقع وقتی به سرفصل هرکدوم برسیم با مثال و تمرین کاملا روشن میشه برامون چی هستن! اگرم فهمیدن که عالی :)

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


بروزرسانی ۱۷-۰۲-۹۷: یک ایده به ذهنم رسید که البته هنوز کامل بررسیش نکردم که بخوام قولش را بدم ولی به نظرم رسید توی فاصله‌ای که این درس‌ها را میذاریم بد نیست که یکسری مطالب کوتاه از حاشیه این زبان بگم. تلاشم را میکنم اما قول روتین بودنش را نمیدم :) ایندفعه هم داشتم دنبال یک تصویر برای «نوع‌های پایه» یا همون «Basic Types» که بحث قسمت ۱ هست میگشتم که یک مطلب خیلی مرتبط به صحبت‌های قبلمون دیدم در سایت slideshare.net. پیشنهاد میکنم ۸ تا اسلاید اولش را ببینین. و بعد اسلاید ۱۴ را. یک مقایسه خیلی جالبی داره با Java و Scala که بنظرم خوندنیه! اسلاید ۶۸ این نمایش خبر از Functional Programming در کاتلین میده که البته این روش برنامه نویسی خیلی این روزها مورد توجهه!