۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

کاتلین چیست؟ جایگزین جاوا توضیح داد

Kotlin مزایای بزرگی نسبت به جاوا برای توسعه JVM و اندروید ارائه می دهد و در پروژه های مشابه با جاوا به خوبی بازی می کند.

Kotlin مزایای بزرگی نسبت به جاوا برای توسعه JVM و اندروید ارائه می دهد و در پروژه های مشابه با جاوا به خوبی بازی می کند.

Kotlin یک زبان برنامه نویسی “عملی” با هدف عمومی، رایگان، متن باز و تایپ ایستا است که در ابتدا برای JVM (ماشین مجازی جاوا) و اندروید طراحی شده بود و ویژگی های برنامه نویسی شی گرا و کاربردی را ترکیب می کند. این بر قابلیت همکاری، ایمنی، وضوح و پشتیبانی ابزار متمرکز است. نسخه‌های Kotlin با هدف قرار دادن جاوا اسکریپت ES5.1 و کد بومی (با استفاده از LLVM) برای تعدادی از پردازنده‌ها نیز در حال تولید هستند.

Kotlin در JetBrains، شرکتی که پشت IntelliJ IDEA، در سال ۲۰۱۰ ایجاد شد، و از سال ۲۰۱۲ منبع باز بوده است. پروژه Kotlin در GitHub بیش از ۷۷۰ مشارکت کننده دارد. در حالی که اکثریت تیم در JetBrains کار می کنند، نزدیک به ۱۰۰ مشارکت کننده خارجی در پروژه Kotlin وجود داشته است. JetBrains در بسیاری از محصولات خود از جمله IntelliJ IDEA از Kotlin استفاده می کند.

تبدیل جاوا به کاتلین

Kotlin به عنوان یک زبان جاوا مختصرتر

در نگاه اول، کاتلین نسخه مختصرتر و ساده تر جاوا به نظر می رسد. اسکرین شات بالا را در نظر بگیرید، جایی که من تبدیل کرده ام یک نمونه کد جاوا (در سمت چپ) به طور خودکار به Kotlin. توجه داشته باشید که تکرار بی فکر ذاتی در نمونه سازی متغیرهای جاوا از بین رفته است. اصطلاح جاوا

StringBuilder sb = new StringBuilder();

در کاتلین می شود

val sb = StringBuilder()

می‌توانید ببینید که توابع با کلمه کلیدی fun تعریف می‌شوند و در صورت وجود خطوط جدید، نقطه ویرگول‌ها اختیاری هستند. کلمه کلیدی val یک ویژگی فقط خواندنی یا متغیر محلی را اعلام می کند. به طور مشابه، کلمه کلیدی var یک ویژگی قابل تغییر یا متغیر محلی را اعلام می کند.

با این وجود، Kotlin به شدت تایپ شده است. کلمات کلیدی val و var تنها زمانی قابل استفاده هستند که نوع آن قابل استنباط باشد. در غیر این صورت باید نوع را اعلام کنید. به نظر می رسد استنتاج نوع با هر نسخه از Kotlin بهبود می یابد.

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

از این مثال کاملاً واضح نیست، اما کاتلین الزام جاوا را برای عضویت توابع در کلاس کاهش داده است. در Kotlin، توابع ممکن است در سطح بالایی در یک فایل، به صورت محلی در داخل سایر توابع، به عنوان یک تابع عضو در یک کلاس یا شی و به عنوان یک تابع پسوند اعلان شوند. توابع افزونه توانایی شبیه به C را برای گسترش یک کلاس با عملکردهای جدید بدون نیاز به ارث بردن از کلاس یا استفاده از هر نوع الگوی طراحی مانند Decorator ارائه می‌کنند.

برای طرفداران Groovy، Kotlin سازنده‌ها را پیاده‌سازی می‌کند. در واقع، سازنده های Kotlin را می توان بررسی کرد. Kotlin از ویژگی های تفویض شده پشتیبانی می کند که می توان از آنها برای پیاده سازی ویژگی های تنبل، ویژگی های قابل مشاهده، ویژگی های وتو و ویژگی های نقشه برداری استفاده کرد.

بسیاری از مکانیسم‌های ناهمزمان موجود در زبان‌های دیگر را می‌توان به‌عنوان کتابخانه با استفاده از برنامه‌های Kotlin پیاده‌سازی کرد. این شامل ناهمگام/انتظار از C# و ECMAScript، کانال‌ها و انتخاب از Go، و مولدها/بازده از C# می‌شود. و پایتون.

برنامه نویسی کاربردی در Kotlin

اجازه دادن به توابع سطح بالا تنها آغاز داستان برنامه نویسی کاربردی برای Kotlin است. این زبان همچنین از توابع مرتبه بالاتر، توابع ناشناس، لامبدا، توابع درون خطی، بسته شدن، بازگشت دم و ژنریک. به عبارت دیگر، کاتلین تمام ویژگی ها و مزایای یک زبان کاربردی را دارد. برای مثال، اصطلاحات Kotlin کاربردی زیر را در نظر بگیرید.

گوگل از پروژه های منبع باز برای هوش مصنوعی رونمایی می کند

فیلتر کردن لیست در Kotlin

val positives = list.filter { x -> x > 0 }

برای یک عبارت حتی کوتاه‌تر، از it زمانی استفاده کنید که فقط یک پارامتر در تابع لامبدا وجود دارد:

val positives = list.filter { it > 0 }

پیمایش نقشه/لیست جفت ها در کاتلین

for ((k, v) in map) { println(“$k -> $v”) }

k و v را می‌توان هر چیزی نامید.

استفاده از محدوده ها در Kotlin

for (i in ۱..۱۰۰) { ... }  // closed range: includes 100
for (i in ۱ until 100) { ... } // half-open range: does not include 100
for (x in ۲..۱۰ step 2) { ... }
for (x in ۱۰ downTo 1) { ... }
if (x in ۱..۱۰) { ... }

مثال‌های بالا کلمه کلیدی for و همچنین استفاده از محدوده‌ها را نشان می‌دهند.

اگرچه کاتلین یک زبان برنامه نویسی کاربردی تمام عیار است، اما بیشتر ماهیت شی گرا جاوا را به عنوان یک سبک برنامه نویسی جایگزین حفظ می کند، که هنگام تبدیل کد جاوا موجود بسیار مفید است. کاتلین دارای کلاس‌ها با سازنده‌ها، همراه با کلاس‌های داخلی تودرتو، داخلی و ناشناس است. دارای اینترفیس مانند جاوا ۸ است. Kotlin نیست < کلمه کلیدی code>جدید. برای ایجاد یک نمونه کلاس، سازنده را درست مانند یک تابع معمولی فراخوانی کنید. ما آن را در تصویر بالا دیدیم.

Kotlin دارای ارث واحدی از یک سوپرکلاس نام‌گذاری شده است و همه کلاس‌های Kotlin دارای یک سوپرکلاس پیش‌فرض Any هستند که نه مشابه کلاس پایه جاوا java است. .lang.Object. هر فقط شامل سه تابع عضو از پیش تعریف شده است: equals()، hashCode() و toString().< /p>

کلاس‌های Kotlin باید با کلمه کلیدی open علامت‌گذاری شوند تا به کلاس‌های دیگر اجازه داده شود از آنها ارث ببرند. کلاس‌های جاوا به نوعی برعکس هستند، زیرا مگر قابل ارث بردن هستند، مگر اینکه با کلمه کلیدی final علامت‌گذاری شوند. برای لغو یک متد سوپرکلاس، خود متد باید open و متد زیر کلاس باید override علامت گذاری شود. همه اینها بخشی از فلسفه کاتلین است که به جای اتکا به پیش فرض ها، همه چیز را صریح می کند. در این مورد خاص، من می‌توانم ببینم که روش کاتلین برای علامت‌گذاری صریح اعضای کلاس پایه به‌عنوان باز برای وراثت و اعضای کلاس مشتق‌شده به‌عنوان نادیده گرفته شده، از چندین نوع خطای رایج جاوا جلوگیری می‌کند.

ویژگی های ایمنی در Kotlin

صحبت از اجتناب از خطاهای رایج، Kotlin برای از بین بردن خطر ارجاعات اشاره گر تهی و ساده سازی مدیریت مقادیر تهی طراحی شده است. این کار را با غیرقانونی کردن null برای انواع استاندارد، اضافه کردن انواع nullable و پیاده‌سازی نمادهای میانبر برای رسیدگی به تست‌های null انجام می‌دهد.

به عنوان مثال، یک متغیر معمولی از نوع String نمی‌تواند null را نگه دارد:

var a: String = "abc" 
a = null // compilation error

اگر باید به null ها اجازه دهید، به عنوان مثال برای نگهداری نتایج پرس و جوی SQL، می توانید یک نوع nullable را با اضافه کردن یک علامت سوال به نوع، به عنوان مثال، اعلام کنید. رشته؟.

var b: String? ="abc"
b = null // ok

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

برای جلوگیری از دستور زبان پرمخاطب که معمولاً برای آزمایش پوچ مورد نیاز است، کاتلین یک تماس ایمن را معرفی می‌کند که ؟ نوشته شده است. برای مثال، اگر b nullb?.length  b.length را برمی‌گرداند. >، و در غیر این صورت null. نوع این عبارت Int? است.

به عبارت دیگر، b?.length میانبری برای if (b != null) b.length else null است. این نحو به خوبی زنجیره‌بندی می‌کند، و بسیاری از منطق prolix را حذف می‌کند، به‌ویژه زمانی که یک شی از یک سری کوئری‌های پایگاه‌داده پر شده است، که ممکن است هر یک از آنها با شکست مواجه شود. به عنوان مثال، bob?.department?.head?.name نام رئیس بخش باب را برمی گرداند اگر باب، بخش و رئیس بخش همه غیر تهی باشند.

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

استفاده کنید.

val listWithNulls: List<String?> = listOf("A", null) 
for (item in listWithNulls) {
      item?.let { println(it) } // prints A and ignores null }

اغلب می خواهید یک مقدار معتبر اما ویژه را از یک عبارت nullable برگردانید، معمولاً به این ترتیب که بتوانید آن را در یک نوع غیر قابل تهی ذخیره کنید. یک نحو مخصوص برای این وجود دارد به نام عملگر الویس (من بچه که نیستی) که ?: نوشته شده است.

val l = b?.length ?: -1

معادل

است

val l: Int = if (b != null) b.length else -۱

در همین راستا، کاتلین استثناهای علامت‌گذاری شده جاوا را حذف می‌کند، که شرایط قابل پرتابی هستند که باید شناسایی شوند. به عنوان مثال، امضای JDK

Appendable append(CharSequence csq) throws IOException;

از شما می خواهد که هر بار که با روش append تماس می گیرید، IOException را بگیرید:

try {
  log.append(message)
}
catch (IOException e) {
  // Do something with the exception
}

طراحان جاوا فکر می کردند که این ایده خوبی است، و این یک برد خالص برای برنامه های اسباب بازی بود، تا زمانی که برنامه نویسان چیزی معقول را در بند catch پیاده سازی کنند. با این حال، اغلب در برنامه های جاوا بزرگ، کدی را مشاهده می کنید که در آن عبارت اجباری catch حاوی چیزی جز یک نظر نیست: //todo: handle this. این به هیچ‌کس کمک نمی‌کند، و استثناهای بررسی شده برای برنامه‌های بزرگ ضرر خالص هستند.

کوروتین های کاتلین

کوروتین‌ها در Kotlin اساسا رشته‌های سبک وزنی هستند. آنها را با راه اندازی سازنده کوروتین در زمینه برخی از CoroutineScope شروع می کنید. یکی از مفیدترین حوزه‌های روتین runBlocking{} است که در محدوده بلوک کد آن اعمال می‌شود.

import kotlinx.coroutines.*

fun main() = runBlocking { // this: CoroutineScope
    launch { // launch a new coroutine in the scope of runBlocking
        delay(1000L) // non-blocking delay for 1 second
        println("World!")
    }
    println("Hello,")
}

این کد خروجی زیر را با یک ثانیه تاخیر بین خطوط تولید می کند:

Hello,
World!

Kotlin برای Android

تا می ۲۰۱۷، تنها زبان‌های برنامه‌نویسی رسمی که برای Android پشتیبانی می‌شد جاوا و C++ بودند. Google پشتیبانی رسمی از Kotlin را در Android در Google I/O 2017 اعلام کرد و با Android شروع شد Studio 3.0 Kotlin در مجموعه ابزار توسعه Android تعبیه شده است. Kotlin را می توان با یک افزونه به نسخه های قبلی Android Studio اضافه کرد.

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

Pinterest اولین پوستر برنامه‌های Android بود که در اوایل نوامبر ۲۰۱۶ در Kotlin نوشته شده بود و به طور برجسته در Google I/O 2017 به عنوان بخشی از اعلامیه Kotlin ذکر شد. علاوه بر این، تیم Kotlin دوست دارد از برنامه‌های Evernote، Trello، Gradle، Corda، Spring و Coursera برای Android استناد کند.

کاتلین در مقابل جاوا

این سؤال که آیا باید Kotlin یا Java را برای توسعه جدید انتخاب کرد، از زمان اعلام Google I/O بسیار در انجمن Android مطرح شده است، اگرچه مردم قبلاً این سؤال را در فوریه ۲۰۱۶ و هنگام عرضه Kotlin 1.0 مطرح کرده بودند. پاسخ کوتاه این است که کد Kotlin ایمن‌تر و مختصرتر از کد جاوا است و فایل‌های Kotlin و Java می‌توانند در برنامه‌های اندرویدی همزیستی داشته باشند، بنابراین Kotlin نه تنها برای برنامه‌های جدید، بلکه برای گسترش برنامه‌های جاوا موجود نیز مفید است.

تنها استدلال قانع کننده ای که برای انتخاب جاوا به جای Kotlin دیده ام، مربوط به افراد تازه کار توسعه کامل اندروید است. برای آنها، ممکن است مانعی برای غلبه بر وجود داشته باشد، زیرا از نظر تاریخی، بیشتر اسناد و نمونه های اندروید در جاوا هستند. از طرف دیگر، تبدیل جاوا به کاتلین در اندروید استودیو یک موضوع ساده برای چسباندن کد جاوا در یک فایل کاتلین است. در سال ۲۰۲۲، شش سال پس از Kotlin 1.0، مطمئن نیستم که این سند یا مانع نمونه هنوز به شکل قابل توجهی وجود داشته باشد.

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

کاتلین در مقابل اسکالا

این سوال که آیا Kotlin یا Scala را انتخاب کنید اغلب در انجمن Android مطرح نمی شود. اگر به GitHub (از اکتبر ۲۰۲۲) نگاه کنید و مخزن‌های Android را جستجو کنید ، حدود ۵۰۰۰۰ مورد از جاوا، ۲۴۰۰۰ مورد استفاده از Kotlin و (ahem) ۷۳ را خواهید یافت که از جاوا استفاده می کنند. اسکالا. بله، امکان نوشتن برنامه های Android در Scala وجود دارد، اما < a href="https://makingthematrix.wordpress.com/2021/03/17/scala-on-android/" rel="nofollow">توسعه دهندگان کمی مزاحم هستند.

در محیط‌های دیگر، وضعیت متفاوت است. به عنوان مثال، Apache Spark بیشتر در Scala نوشته شده است، و برنامه های کاربردی داده های بزرگ برای Spark اغلب در Scala نوشته می شوند.

از بسیاری جهات، هر دو Scala و Kotlin ادغام برنامه نویسی شی گرا، همانطور که در جاوا مثال می زند، با برنامه نویسی تابعی را نشان می دهند. این دو زبان مفاهیم و نشانه‌های زیادی را به اشتراک می‌گذارند، مانند اعلان‌های غیرقابل تغییر با استفاده از val و اعلان‌های قابل تغییر با استفاده از var، اما در مورد سایر زبان‌ها کمی متفاوت هستند، مانند محل قرار دادن فلش هنگام اعلان. یک تابع لامبدا، و اینکه آیا از یک فلش منفرد یا یک فلش دوتایی استفاده شود. کلاس داده کاتلین به Scala کلاس مورد نگاشت می‌شود.

Kotlin متغیرهای nullable را به روشی مشابه Groovy، C# و F# تعریف می کند. اکثر مردم آن را به سرعت دریافت می کنند. از سوی دیگر، Scala متغیرهای پوچ را با استفاده از موناد Option تعریف می‌کند، که می‌تواند آنقدر ممنوع باشد که به نظر می‌رسد برخی از نویسندگان فکر می‌کنند که Scala ایمنی پوچ ندارد.

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

قابلیت همکاری Kotlin با جاوا

در این مرحله ممکن است تعجب کنید که کاتلین چگونه نتایج تماس‌های قابلیت همکاری جاوا را مدیریت می‌کند، با توجه به تفاوت‌های موجود در مدیریت null و استثناهای بررسی شده. کاتلین بی‌صدا و با اطمینان چیزی را استنباط می‌کند که «نوع پلتفرم» نامیده می‌شود که دقیقاً مانند یک نوع جاوا عمل می‌کند، به این معنی که پوچ‌پذیر است اما می‌تواند استثناهای اشاره گر تهی ایجاد کند. کاتلین همچنین ممکن است در زمان کامپایل یک ادعا را به کد تزریق کند تا از ایجاد یک استثنای اشاره گر تهی واقعی جلوگیری کند. هیچ علامت زبان صریحی برای نوع پلتفرم وجود ندارد، اما در صورتی که کاتلین مجبور باشد نوع پلتفرم را گزارش کند، مثلاً در یک پیام خطا، ! را به نوع اضافه می کند.