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

زبان برنامه نویسی جدید Kotlin. چرا کاتلین در گوگل اینقدر محبوب است و چه کسی به دو هزار زبان برنامه نویسی نیاز دارد

زبان برنامه نویسی Kotlin که توسط شرکت سنت پترزبورگ JetBrains توسعه یافته است، به زبان رسمی توسعه اندروید تبدیل شده است. این موضوع به طور رسمی در کنفرانس Google I/O اعلام شد. تیم Kotlin توسط آندری برسلاو فارغ التحصیل دانشگاه ITMO رهبری می شود. چرا کاتلین در میان بسیاری از زبان های "جوان" دیگر مورد علاقه غول فناوری اطلاعات است، چگونه و چرا زبان های برنامه نویسی جدید به طور کلی ظاهر می شوند، در نظرات کارشناسان و مجموعه اطلاعات ITMO.NEWS بخوانید.

نحوه توسعه زبان های برنامه نویسی

بر اساس برآوردهای مختلف، در حال حاضر بیش از دو هزار زبان برنامه نویسی مختلف در جهان وجود دارد. به‌روزرسانی‌ها دائماً برای زبان‌های قدیمی منتشر می‌شوند و زبان‌های جدید نیز ظاهر می‌شوند. هنگامی که نحو یک زبان تغییر نمی کند، بلکه پیچیده تر و گسترش می یابد، توسعه دهنده فقط به کمی تمرین برای ادامه نوشتن به زبان مورد علاقه خود نیاز دارد. گاهی اوقات ساختار خود زبان تغییر می کند، و سپس برنامه نویس گاهی اوقات مجبور است دوباره یاد بگیرد و خود را با زبان به روز شده تطبیق دهد. به طور معمول، انتقال به یک ساختار جدید به تدریج و در بخش هایی اتفاق می افتد، یعنی تنها 10-20٪ از کد برنامه شروع به نوشتن با استفاده از زبان جدید می کند.

« برنامه نویسان از زبان های C++ و جاوا کاملاً راضی نبودند، زیرا این زبان ها زبان های کاملاً پیچیده ای هستند و زبان اول دشوارتر از زبان دوم است. بنابراین، زبان Scala ظاهر شد که بسیاری از برنامه نویسان آن را دوست دارند، اما همچنین بسیار پیچیده است. تجربه گسترده JetBrains در ایجاد ابزارهای توسعه برنامه برای زبان های برنامه نویسی مختلف به آن اجازه داد تا در مدت هفت سال زبان Kotlin را ایجاد کند که کاملاً با جاوا سازگار است اما ساده تر و راحت تر از آن است. زبان‌های برنامه‌نویسی دائماً در حال توسعه هستند، هیچ‌کس دیگر وظیفه ساخت یک زبان جهانی را بر عهده خود نمی‌گذارد. با وجود این، هر زبانی در حوزه خاصی که بیشتر مورد استفاده قرار می گیرد مؤثرتر است. هنگامی که زبان ها برای یک حوزه موضوعی خاص توسعه می یابند، حتی یک جهت در ایجاد زبان وجود داردرئیس بخش فناوری برنامه نویسی دانشگاه ITMO اظهار داشت.


امروزه، برخی از شرکت ها حتی رتبه بندی زبان خود را جمع آوری می کنند. به عنوان مثال، شرکت TIOBE که متخصص در ارزیابی کیفیت نرم افزار است، از سال 2001 به طور ماهانه شاخص محبوبیت برخی از زبان ها را محاسبه می کند. لیست تولید شده شامل 50 خط است و برای اینکه یک زبان برنامه نویسی در فهرست قرار گیرد، توسعه دهندگان باید نامه مربوطه را به شرکت بنویسند. این محاسبه بر اساس داده های 25 موتور جستجوی اینترنتی است. تا کنون جاوا با اختلاف زیادی در رتبه بندی قرار دارد و پس از آن C قرار دارد. در عین حال، کامپایلرهای لیست تاکید می کنند که در طول سال گذشته، هر دو زبان برنامه نویسی حدود 6 درصد محبوبیت کمتری داشته اند. در همان زمان، TIOBE نشان می دهد که زبان C تا سال 2002 شماره 1 بود و جاوا در سال 1997 در رتبه چهاردهم قرار داشت، اما پنج سال بعد در جایگاه اول جایگزین زبان C شد.

شما می توانید یک سخنرانی عالی در مورد تاریخچه توسعه زبان ها ارائه دهید: متصدی برنامه های دانشگاهی در Yandex، مدیر مرکز مسابقات دانشجویی در دانشکده علوم کامپیوتر در مدرسه عالی اقتصاد در مورد چگونگی زبان C صحبت می کند. ، پی اچ پی، روبی و جاوا ظاهر شدند. میخائیل گوستوکاشین. مدرس تاکید می کند که برای هر کار باید یک زبان برنامه نویسی متفاوت انتخاب شود. به عنوان مثال، او می گوید که برای صنعت نظامی بهتر است به پاسکال خوب قدیمی بنویسید - زبانی که در سال 1970 متولد شد! چرا؟ چون قابل اعتمادتره برنامه های تجاری را می توان در جاوا نوشت زیرا این زبان نیز کاملاً قابل اعتماد است، اما استفاده از آن بسیار آسان تر است. این کارشناس همچنین تاکید می کند که حفظ علاقه به زبان در بین برنامه نویسان با ایجاد جامعه ای از توسعه دهندگان که به این زبان می نویسند مهم است. اگر زیرساختی پیرامون یک زبان جدید ایجاد شود و مردم برای استفاده از آن جمع شوند، تنها در این صورت است که این زبان محبوب می شود. به هر حال، توسعه دهندگان Kotlin نیز این استراتژی را اتخاذ کردند.

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

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


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

« ابزارهای توسعه، از جمله زبان های برنامه نویسی، دائما در حال پیشرفت هستند. تفاوت زبان ها با سایر ابزارها در این است که توسعه آنها از نظر تکاملی بسیار دشوار است. نسخه جدید زبان باید از همه برنامه های موجود پشتیبانی کند. این امکان را برای توسعه زبان های موجود محدود می کند و نیاز به ظهور زبان های جدید را ایجاد می کند. عاملی که موفقیت یک زبان برنامه نویسی جدید را تعیین می کند، اول از همه، راحتی برای توسعه دهندگان است. علاوه بر مختصر و رسا بودن، کاتلین با کد جاوا بسیار سازگار است: می‌توانید از تمام کتابخانه‌های موجود و حتی ترکیب کدها به دو زبان در یک پروژه استفاده کنید، بنابراین هیچ مشکل انتقال خاصی وجود ندارد."، مدیر پروژه Kotlin در JetBrains، فارغ التحصیل از دانشگاه ITMO، اظهار داشت.

چرا گوگل کاتلین را دوست داشت؟

در وب سایت رسمی، توسعه دهندگان اندروید می نویسند که در سال های اخیر "ظهور" Kotlin را مشاهده کرده اند. کارمندان گوگل خجالت نمی کشند که این زبان را تاثیرگذار، مختصر، توانمند و لذت بخش برای کار با آن توصیف کنند. بهره وری را افزایش داده است: کد برنامه در آن به طور متوسط ​​40٪ کوتاهتر از سایر زبان ها است و Kotlin همچنین به شما امکان می دهد از برخی خطاها در کد جلوگیری کنید. یکی از عوامل تعیین کننده برای محبوبیت کاتلین در گوگل، سازگاری آن با جاوا بود که در حال حاضر در توسعه برنامه های کاربردی برای اندروید استفاده می شود.

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

« فقدان ضمانت‌های پشتیبانی زبان از سوی Google، بسیاری از توسعه‌دهندگان را از تغییر به Kotlin منصرف کرد. حتی اگر واقعاً زبان را دوست دارید،یک برنامه نویس همیشه به این خطر فکر می کند که در یک مقطع زمانی این زبان به سادگی کار نمی کند. اکنون این تضمین وجود دارد که کاتلین از کار خود دست نخواهد کشید و ما انتظار داریم که تعداد کاربران زبان به شدت افزایش یابد. طبیعی است که فرض کنیم بسیاری از شرکت‌ها در نهایت به طور کامل به Kotlin روی می‌آورند، اگرچه از نظر فنی هیچ چیز آنها را مجبور به انجام این کار نمی‌کند، این فقط یک اولویت است."- تاکید کرد آندری برسلاو.

او افزود که کاتلین بسیار فعال در حال توسعه است. تیم توسعه در حال حاضر روی سیستم ساخت، سرعت کامپایل، بهبود عملکرد IDE، افزودن ویژگی‌های جدید به جعبه ابزار، از جمله موارد مربوط به ادغام با Android Studio، کار می‌کند. همچنین کار بر روی پروژه های چند پلتفرمی (قابلیت کامپایل کد یکسان برای چندین پلتفرم) در حال انجام است و تعدادی بهبود زبان در مرحله طراحی است.


گوگل همچنین تاکید کرد که آنها از مفهوم زبان Kotlin الهام گرفته اند که بر اساس آن همیشه برای توسعه دهندگان رایگان بوده و خواهد ماند، یعنی یک پروژه متن باز. این بدان معنی است که این زبان به هیچ شرکت خاصی وابسته نیست و کد منبع تحت یک مجوز رایگان توزیع می شود. می توانید محصول را دانلود کنید. برای حمایت از توسعه Kotlin، Google و JetBrains یک مشارکت غیرانتفاعی ایجاد خواهند کرد. همچنین، به عنوان بخشی از "ماموریت" اندروید، بسیار مهم است که نویسندگان Kotlin جامعه ای از افرادی را در اطراف محصول خود ایجاد کنند که به طور حرفه ای در توسعه این زبان درگیر هستند و دوست دارند تجربیات خود را به اشتراک بگذارند. به عنوان مثال، در ماه نوامبر کنفرانس Kotlin در ایالات متحده برگزار می شود و توسعه دهندگان همچنین می توانند اخبار و نکات روزانه را در مورد محصول نرم افزار دریافت کنند و به صورت محلی ملاقات کنند.

به هر حال، خود پروژه Android Studio بر اساس محیط توسعه نرم افزار IntelliJ IDEA که توسط JetBrains نیز ساخته شده است، توسعه یافته است. اما با وجود همکاری نزدیک، شرکت سنت پترزبورگ تاکید می کند که هیچ صحبتی از فروش جت برینز به غول فناوری اطلاعات آمریکا نشده است. در عین حال، کلتین تنها برای اندروید طراحی نخواهد شد. هدف این شرکت این است که زبان برنامه نویسی را برای پلتفرم های مختلف توسعه مناسب کند.

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

در مورد پروژه

چندی پیش، JetBrains، شرکتی که محیط های توسعه ایجاد می کند، محصول جدید خود را معرفی کرد - زبان برنامه نویسی Kotlin. موجی از انتقادات متوجه شرکت شد: منتقدان پیشنهاد کردند که شرکت به خود بیاید و به جای توسعه زبان خود، افزونه اسکالا را تکمیل کند. توسعه دهندگان Scala واقعاً فاقد یک محیط توسعه خوب هستند، اما مشکلات توسعه دهندگان پلاگین قابل درک است: Scala، که به لطف محققان سوئیسی متولد شد، بسیاری از مفاهیم و رویکردهای علمی نوآورانه را در خود جای داده است، که ایجاد یک ابزار توسعه خوب را به یک کار بسیار دشوار تبدیل کرده است. . در حال حاضر، بخش زبان های مدرن تایپ ایستا برای JVM کوچک است، بنابراین تصمیم برای ایجاد زبان خود به همراه یک محیط توسعه برای آن بسیار دوراندیش به نظر می رسد. حتی اگر این زبان اصلاً در جامعه جا نیفتد، JetBrains در درجه اول آن را برای نیازهای خود می سازد. هر برنامه نویس جاوا می تواند این نیازها را درک کند: جاوا به عنوان یک زبان بسیار آهسته در حال توسعه است، ویژگی های جدید در زبان ظاهر نمی شود (ما چندین سال است که منتظر توابع درجه اول هستیم)، سازگاری با نسخه های قدیمی این زبان باعث می شود که آن زبان غیرممکن است که بسیاری از چیزهای مفید در آینده نزدیک ظاهر شوند. برای یک شرکت در حال توسعه نرم افزار، زبان برنامه نویسی ابزار اصلی کار است، بنابراین کارایی و سادگی زبان شاخص هایی هستند که نه تنها سهولت توسعه ابزار برای آن بستگی دارد، بلکه هزینه های برنامه نویسی برنامه نویس، یعنی چقدر آسان خواهد بود. این کد را حفظ کنید و آن را درک کنید.

در مورد زبان

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

Fun foo(text:String) ( println(text.toLowerCase()) // NPE؟ خیر! ) val str:String? = پوچ // رشته؟ -- نوع nullable foo(str) //<- компилятор не пропустит такой вызов -- // тип str должен быть String, чтобы // передать его в foo

با وجود این واقعیت که این رویکرد می تواند برنامه نویس را از تعدادی از مشکلات مرتبط با NPE نجات دهد، برای یک برنامه نویس جاوا در ابتدا غیر ضروری به نظر می رسد - شما باید بررسی ها یا تبدیل های غیر ضروری را انجام دهید. اما پس از مدتی برنامه نویسی در کاتلین و بازگشت به جاوا، احساس می کنید که این اطلاعات در مورد نوع آن کم است و به استفاده از حاشیه نویسی های Nullable/NotNull فکر می کنید. مربوط به این مسائل مربوط به سازگاری عقب مانده با جاوا است - این اطلاعات در بایت کد جاوا نیست، اما تا آنجا که من می دانم، این مشکل هنوز در حال حل شدن است و در حال حاضر همه انواعی که از جاوا می آیند، پوچ هستند.

به هر حال، در مورد سازگاری به عقب: کاتلین در بایت کد JVM کامپایل شده است (سازندگان زبان تلاش زیادی برای حفظ سازگاری صرف می کنند) که به آن اجازه می دهد در همان پروژه با جاوا استفاده شود و امکان استفاده متقابل از جاوا وجود دارد. و کلاس های کاتلین آستانه معرفی کاتلین در یک پروژه جاوای بزرگ موجود را ایجاد می کند. در این راستا، توانایی استفاده از چند پیشرفت جاوا با ایجاد یک پروژه به طور کامل در کاتلین حائز اهمیت است. به عنوان مثال، ساختن یک پروژه کوچک بر اساس Spring-webmvc برای من تقریباً آسان بود.

بیایید به قطعه کنترلر نگاه کنیم:

Path(array("/notes/")) class controller NotesController ( Autowired val notesService: NotesService? = null path(array("all")) fun all() = render("notes/notes") (addObject(" یادداشت ها، notesService!!.all) ) //... )

ویژگی های استفاده از حاشیه نویسی در Kotlin قابل مشاهده است: در برخی مکان ها به اندازه جاوا به نظر نمی رسد (این مورد در موارد خاص، به عنوان مثال، آرایه ای از یک عنصر صدق می کند)، اما حاشیه نویسی ها را می توان به عنوان کلمات کلیدی "خانگی" استفاده کرد. به صورت خودکار یا کنترلر (اگر نوع مستعار را هنگام وارد کردن مشخص کنید)، و از نظر قابلیت، حاشیه نویسی به کلاس های واقعی نزدیک تر است.

لازم به ذکر است که اسپرینگ نتوانست کلاس های Kotlin را برای مدیریت تراکنش ها بپیچد - امیدوارم در آینده این امکان وجود داشته باشد.

این زبان از توابع درجه یک پشتیبانی می کند. این بدان معنی است که یک تابع نوعی است که در زبان تعبیه شده است که یک نحو خاص برای آن وجود دارد. توابع را می توان به صورت محلی ایجاد کرد، به عنوان پارامتر به سایر توابع ارسال کرد و ارجاع به آنها را ذخیره کرد:

سرگرمی doSomething(thing:()->Unit) ( // اعلان پارامتری از نوع تابع // ()->واحد چیزی را قبول نمی کند و // چیز مهمی را برمی گرداند() // call ) doSomething() ( // و در اینجا ما تابعی از نوع // ()->Unit ایجاد می کنیم و آن را به تابع doShomething می دهیم // اگر تابع آخرین پارامتر باشد، می توانید // آن را به خارج از براکت تماس منتقل کنید println("Hello world "))

اگر به این افزونه توابعی را اضافه کنیم که به ما امکان می دهد یک کلاس از قبل موجود را با استفاده از روشی گسترش دهیم که کپسوله سازی کلاس را نقض نمی کند، اما می توان به عنوان متدهای این کلاس به آن دسترسی داشت، مکانیزم نسبتاً قدرتمندی برای گسترش به دست خواهیم آورد. کتابخانه های استاندارد جاوا که از نظر راحتی بسیار ضعیف هستند. طبق سنت، اجازه دهید قابلیت فیلتر کردن لیستی که از قبل در کتابخانه استاندارد وجود دارد را اضافه کنیم:

سرگرم کننده فهرست کنید .filter(condition:(T)->Boolean):List ( نتیجه val = لیست () for(item in this) ( if(condition(item)) result.add(item) ) return result ) val someList = list(1, 2, 3, 4).filter ( it > 2 ) // someList= =

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

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

// ایجاد کلاس‌های bean تبدیل به // لاکون می‌شود، فیلدها را می‌توان اعلان کرد // مستقیماً در کلاس اعلان سازنده TimeLord(val name:String) // کلاس ممکن است اصلاً بدنه نداشته باشد کلاس TARDIS(val مالک:TimeLord) fun main (args: آرایه ) ( val doktor = TimeLord("Doctor") val tardis = TARDIS(پزشک) println(tardis.owner.name) )

در چند خط توانستیم دو کلاس را اعلان کنیم، دو آبجکت بسازیم و نام صاحب TARDIS را چاپ کنیم! می توانید متوجه شوید که کلاس با پارامترهای تنها سازنده ممکن آن که اعلان خصوصیات آن نیز می باشد اعلان می شود. بسیار کوتاه، اما آموزنده. مطمئناً کسانی وجود خواهند داشت که عدم امکان اعلام بیش از یک سازنده را محکوم می کنند، اما به نظر من این عمل گرایی خاص خود را دارد - به هر حال، چندین سازنده در جاوا یا به شما اجازه می دهند پارامترهای پیش فرض را اعلام کنید، که Kotlin در زبان پشتیبانی می کند. سطح، یا تبدیل یک نوع به دیگری، که این کلاس با آن کار خواهد کرد، و این را می توان با خیال راحت به روش کارخانه واگذار کرد. به اعلان "متغیرها" و فیلدها توجه کنید. کاتلین ما را مجبور به انتخاب می کند: val یا var. جایی که val یک مرجع نهایی غیرقابل تغییر را اعلام می کند و var یک متغیر را اعلام می کند که به جلوگیری از استفاده گسترده از مراجع قابل تغییر کمک می کند.

مثال

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

این همان چیزی است که من دوست دارم استفاده از آن به نظر برسد:

اصلی سرگرم کننده (args: Array ) ( // ایجاد یک درخت کوچک val tree= tree("ریشه") ( node("1-1") ( node("2-1") node("2-2") ) node("1-2" " ) ( node("2-3") ) ) // آن را پیمایش کنید و مقادیر را در کنسول tree.traverse چاپ کنید ( println(it) ))

حالا بیایید سعی کنیم این را پیاده سازی کنیم. بیایید یک کلاس گره درختی ایجاد کنیم:

/** * @param value node data */ class Node (val value:T) ( // node children private val children:List > = arrayList() /** * روشی که یک فرزند را ایجاد و به یک گره اضافه می کند * مقدار @param مقدار گره جدید * @param تابع init برای مقداردهی اولیه گره جدید، اختیاری * پارامتر */ گره سرگرم کننده (مقدار: T، init: Node .()->واحد = ()):گره (val node = گره (value) node.init() children.add(node) return node ) /** * این روش به صورت بازگشتی تمام گره های فرزند را که از خود گره * شروع می شود، عبور می دهد، هر گره از یک handler * @param handler تابع handler برای مقدار هر گره */ تراورس سرگرم کننده(handler:(T)->Unit) ( handler(value) children.forEach ( child -> child.traverse(handler) ) )

حالا بیایید یک تابع برای ایجاد بالای درخت اضافه کنیم:

/** * یک گره درختی با مقدار مقدار ایجاد می کند و * فرزندان آن را با متد init مقداردهی اولیه می کند. */ سرگرم کننده درخت (مقدار:T، شروع: گره .()->واحد): گره ( val node = Node(value) // فراخوانی متد init ارسال شده در پارامتر // روی شی گره node.init() گره برگشتی)

در دو جای کد از ساختاری مانند Node.()->Unit استفاده شده است، معنی آن این است که یک نوع تابع به عنوان ورودی انتظار می رود که به عنوان متد یک شی از نوع Node اجرا می شود. از بدنه این تابع به متدهای دیگر این شیء مانند متد Node.node() دسترسی وجود دارد که به شما امکان می دهد مقداردهی اولیه درخت را مشابه آنچه در مثال توضیح داده شده انجام دهید.

به جای نتیجه گیری

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

اگر به این زبان علاقه دارید، تمام اطلاعات مربوط به زبان را می توانید در وب سایت رسمی پروژه پیدا کنید، منابع آنها را می توانید در github پیدا کنید، و هر گونه خطای یافت شده را می توانید در ردیاب Issue پست کنید. هنوز مشکلات زیادی وجود دارد، اما توسعه دهندگان زبان فعالانه با آنها مبارزه می کنند. اکنون تیم در حال کار بر روی نسخه نه چندان پایدار Milestone 3 است، پس از تثبیت، تا آنجا که من می دانم، برنامه ریزی شده است که از این زبان در شرکت JetBrains استفاده کند، پس از آن اولین نسخه از قبل برنامه ریزی شده است.

برچسب ها: اضافه کردن برچسب

در سال 2010، گروهی از توسعه دهندگان از شعبه روسی JetBrains تصمیم گرفتند زبانی را توسعه دهند که راحت تر و ایمن تر از جاوا باشد، اما نه به پیچیدگی Scala. نام این زبان به افتخار جزیره کوتلین واقع در خلیج فنلاند (به قیاس با جاوا که به نام جزیره نیز نامگذاری شده است) داده شده است.

اگر به مروری مدرن از امیدوارکننده ترین زبان های برنامه نویسی نگاه کنید، مطمئناً Kotlin را در آنجا خواهید یافت. ماهیت این زبان چیست، چرا همه آن را بسیار دوست دارند، چه چشم اندازی دارد - بعداً در مورد آن بیشتر می شود.

نحو

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

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

با این حال، ما همچنان یک کد کوچک باقی می‌گذاریم:

سرگرم کننده اصلی (args: آرایه ) {
val scope = "جهان"
println ("سلام، $scope!")
}

یک ورودی بسیار ساده که باید برای هر کسی که حداقل یک سال برنامه نویسی را در مدرسه یا دانشگاه خوانده باشد قابل درک باشد.

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

مزایای

به طور کلی، تمام مزایای نسبت به جاوا قبلا ذکر شده است، بنابراین ما فقط آنها را در یک مکان جمع آوری می کنیم:

    حجم کد. استفاده نکردن از کدهای قدیمی غیرضروری، روند توسعه را سرعت می بخشد و خوانایی را افزایش می دهد.

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

    سازگاری در جاوا این هم از نظر یادگیری زبان جدید و هم از نظر انتقال تدریجی محصولات نرم افزاری شما از جاوا به کاتلین راحت است. به عنوان مثال، این دقیقاً همان چیزی است که در مورد برنامه Basecamp رخ داد.

ایرادات

به عنوان زبانی که بر اساس جاوا توسعه یافته است، کاتلین در مقایسه با دو نقطه ضعف آشکار دارد: سرعت و تفصیل. در مورد اول، همه چیز واضح است: کار بر روی JVM دشوار است که جاوا را از نظر عملکرد شکست دهید. مشکل دوم برای چنین زبان جوانی کمی دور از ذهن است، زیرا کمی بیش از یک سال است که در گردش رسمی بوده است. بله، در اینجا ابزارها و کتابخانه های کمتری نسبت به جاوا وجود دارد. اما، اولا، این هنوز حیاتی نیست، و ثانیاً، در دنیای جاوا، کمیت همیشه به کیفیت تبدیل نشده است.

کاتلین، در حال حاضر، با وظایف اصلی خود کنار می آید و سازگاری کامل با جاوا به ما کمک می کند تا چشمان ما را بر روی این شکاف ها ببندیم.

چشم انداز

علیرغم این واقعیت که توسعه Kotlin در سال 2010 آغاز شد، اولین نسخه رسمی تنها در فوریه 2016 منتشر شد. از آن زمان، تقاضا برای این زبان به سرعت در حال رشد است، در رتبه TIOBE در طی یک سال به TOP-50 رسید. و ماه گذشته در کنفرانس Google I /O پشتیبانی رسمی از Kotlin در سیستم توسعه برنامه اندروید را اعلام کرد.

با توجه به محبوبیت بالای IntelliJ IDEA در بین توسعه دهندگان و تمرکز استراتژیک این شرکت بر روی Kotlin، می توان با اطمینان گفت که تا 3-4 سال دیگر شاهد آن در بین رقبای تمام عیار جاوا و سوئیفت در زمینه توسعه موبایل خواهیم بود. علاوه بر این، اگر سازندگان زبان از محصول خود ناامید نشوند، کاتلین مطمئناً افق های دیگر را به طور جدی به تصویر می کشد: وب، هوش مصنوعی، اینترنت اشیا، داده های بزرگ، برنامه های دسکتاپ.

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

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

در مورد پروژه

چندی پیش، JetBrains، شرکتی که محیط های توسعه ایجاد می کند، محصول جدید خود را معرفی کرد - زبان برنامه نویسی Kotlin. موجی از انتقادات متوجه شرکت شد: منتقدان پیشنهاد کردند که شرکت به خود بیاید و به جای توسعه زبان خود، افزونه اسکالا را تکمیل کند. توسعه دهندگان Scala واقعاً فاقد یک محیط توسعه خوب هستند، اما مشکلات توسعه دهندگان پلاگین قابل درک است: Scala، که به لطف محققان سوئیسی متولد شد، بسیاری از مفاهیم و رویکردهای علمی نوآورانه را در خود جای داده است، که ایجاد یک ابزار توسعه خوب را به یک کار بسیار دشوار تبدیل کرده است. . در حال حاضر، بخش زبان های مدرن تایپ ایستا برای JVM کوچک است، بنابراین تصمیم برای ایجاد زبان خود به همراه یک محیط توسعه برای آن بسیار دوراندیش به نظر می رسد. حتی اگر این زبان اصلاً در جامعه جا نیفتد، JetBrains در درجه اول آن را برای نیازهای خود می سازد. هر برنامه نویس جاوا می تواند این نیازها را درک کند: جاوا به عنوان یک زبان بسیار آهسته در حال توسعه است، ویژگی های جدید در زبان ظاهر نمی شود (ما چندین سال است که منتظر توابع درجه اول هستیم)، سازگاری با نسخه های قدیمی این زبان باعث می شود که آن زبان غیرممکن است که بسیاری از چیزهای مفید در آینده نزدیک ظاهر شوند. برای یک شرکت در حال توسعه نرم افزار، زبان برنامه نویسی ابزار اصلی کار است، بنابراین کارایی و سادگی زبان شاخص هایی هستند که نه تنها سهولت توسعه ابزار برای آن بستگی دارد، بلکه هزینه های برنامه نویسی برنامه نویس، یعنی چقدر آسان خواهد بود. این کد را حفظ کنید و آن را درک کنید.

در مورد زبان

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

Fun foo(text:String) ( println(text.toLowerCase()) // NPE؟ خیر! ) val str:String? = پوچ // رشته؟ -- نوع nullable foo(str) //<- компилятор не пропустит такой вызов -- // тип str должен быть String, чтобы // передать его в foo

با وجود این واقعیت که این رویکرد می تواند برنامه نویس را از تعدادی از مشکلات مرتبط با NPE نجات دهد، برای یک برنامه نویس جاوا در ابتدا غیر ضروری به نظر می رسد - شما باید بررسی ها یا تبدیل های غیر ضروری را انجام دهید. اما پس از مدتی برنامه نویسی در کاتلین و بازگشت به جاوا، احساس می کنید که این اطلاعات در مورد نوع آن کم است و به استفاده از حاشیه نویسی های Nullable/NotNull فکر می کنید. مربوط به این مسائل مربوط به سازگاری عقب مانده با جاوا است - این اطلاعات در بایت کد جاوا نیست، اما تا آنجا که من می دانم، این مشکل هنوز در حال حل شدن است و در حال حاضر همه انواعی که از جاوا می آیند، پوچ هستند.

به هر حال، در مورد سازگاری به عقب: کاتلین در بایت کد JVM کامپایل شده است (سازندگان زبان تلاش زیادی برای حفظ سازگاری صرف می کنند) که به آن اجازه می دهد در همان پروژه با جاوا استفاده شود و امکان استفاده متقابل از جاوا وجود دارد. و کلاس های کاتلین آستانه معرفی کاتلین در یک پروژه جاوای بزرگ موجود را ایجاد می کند. در این راستا، توانایی استفاده از چند پیشرفت جاوا با ایجاد یک پروژه به طور کامل در کاتلین حائز اهمیت است. به عنوان مثال، ساختن یک پروژه کوچک بر اساس Spring-webmvc برای من تقریباً آسان بود.

بیایید به قطعه کنترلر نگاه کنیم:

Path(array("/notes/")) class controller NotesController ( Autowired val notesService: NotesService? = null path(array("all")) fun all() = render("notes/notes") (addObject(" یادداشت ها، notesService!!.all) ) //... )

ویژگی های استفاده از حاشیه نویسی در Kotlin قابل مشاهده است: در برخی مکان ها به اندازه جاوا به نظر نمی رسد (این مورد در موارد خاص، به عنوان مثال، آرایه ای از یک عنصر صدق می کند)، اما حاشیه نویسی ها را می توان به عنوان کلمات کلیدی "خانگی" استفاده کرد. به صورت خودکار یا کنترلر (اگر نوع مستعار را هنگام وارد کردن مشخص کنید)، و از نظر قابلیت، حاشیه نویسی به کلاس های واقعی نزدیک تر است.

لازم به ذکر است که اسپرینگ نتوانست کلاس های Kotlin را برای مدیریت تراکنش ها بپیچد - امیدوارم در آینده این امکان وجود داشته باشد.

این زبان از توابع درجه یک پشتیبانی می کند. این بدان معنی است که یک تابع نوعی است که در زبان تعبیه شده است که یک نحو خاص برای آن وجود دارد. توابع را می توان به صورت محلی ایجاد کرد، به عنوان پارامتر به سایر توابع ارسال کرد و ارجاع به آنها را ذخیره کرد:

سرگرمی doSomething(thing:()->Unit) ( // اعلان پارامتری از نوع تابع // ()->واحد چیزی را قبول نمی کند و // چیز مهمی را برمی گرداند() // call ) doSomething() ( // و در اینجا ما تابعی از نوع // ()->Unit ایجاد می کنیم و آن را به تابع doShomething می دهیم // اگر تابع آخرین پارامتر باشد، می توانید // آن را به خارج از براکت تماس منتقل کنید println("Hello world "))

اگر به این افزونه توابعی را اضافه کنیم که به ما امکان می دهد یک کلاس از قبل موجود را با استفاده از روشی گسترش دهیم که کپسوله سازی کلاس را نقض نمی کند، اما می توان به عنوان متدهای این کلاس به آن دسترسی داشت، مکانیزم نسبتاً قدرتمندی برای گسترش به دست خواهیم آورد. کتابخانه های استاندارد جاوا که از نظر راحتی بسیار ضعیف هستند. طبق سنت، اجازه دهید قابلیت فیلتر کردن لیستی که از قبل در کتابخانه استاندارد وجود دارد را اضافه کنیم:

سرگرم کننده فهرست کنید .filter(condition:(T)->Boolean):List ( نتیجه val = لیست () for(item in this) ( if(condition(item)) result.add(item) ) return result ) val someList = list(1, 2, 3, 4).filter ( it > 2 ) // someList= =

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

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

// ایجاد کلاس‌های bean تبدیل به // لاکون می‌شود، فیلدها را می‌توان اعلان کرد // مستقیماً در کلاس اعلان سازنده TimeLord(val name:String) // کلاس ممکن است اصلاً بدنه نداشته باشد کلاس TARDIS(val مالک:TimeLord) fun main (args: آرایه ) ( val doktor = TimeLord("Doctor") val tardis = TARDIS(پزشک) println(tardis.owner.name) )

در چند خط توانستیم دو کلاس را اعلان کنیم، دو آبجکت بسازیم و نام صاحب TARDIS را چاپ کنیم! می توانید متوجه شوید که کلاس با پارامترهای تنها سازنده ممکن آن که اعلان خصوصیات آن نیز می باشد اعلان می شود. بسیار کوتاه، اما آموزنده. مطمئناً کسانی وجود خواهند داشت که عدم امکان اعلام بیش از یک سازنده را محکوم می کنند، اما به نظر من این عمل گرایی خاص خود را دارد - به هر حال، چندین سازنده در جاوا یا به شما اجازه می دهند پارامترهای پیش فرض را اعلام کنید، که Kotlin در زبان پشتیبانی می کند. سطح، یا تبدیل یک نوع به دیگری، که این کلاس با آن کار خواهد کرد، و این را می توان با خیال راحت به روش کارخانه واگذار کرد. به اعلان "متغیرها" و فیلدها توجه کنید. کاتلین ما را مجبور به انتخاب می کند: val یا var. جایی که val یک مرجع نهایی غیرقابل تغییر را اعلام می کند و var یک متغیر را اعلام می کند که به جلوگیری از استفاده گسترده از مراجع قابل تغییر کمک می کند.

مثال

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

این همان چیزی است که من دوست دارم استفاده از آن به نظر برسد:

اصلی سرگرم کننده (args: Array ) ( // ایجاد یک درخت کوچک val tree= tree("ریشه") ( node("1-1") ( node("2-1") node("2-2") ) node("1-2" " ) ( node("2-3") ) ) // آن را پیمایش کنید و مقادیر را در کنسول tree.traverse چاپ کنید ( println(it) ))

حالا بیایید سعی کنیم این را پیاده سازی کنیم. بیایید یک کلاس گره درختی ایجاد کنیم:

/** * @param value node data */ class Node (val value:T) ( // node children private val children:List > = arrayList() /** * روشی که یک فرزند را ایجاد و به یک گره اضافه می کند * مقدار @param مقدار گره جدید * @param تابع init برای مقداردهی اولیه گره جدید، اختیاری * پارامتر */ گره سرگرم کننده (مقدار: T، init: Node .()->واحد = ()):گره (val node = گره (value) node.init() children.add(node) return node ) /** * این روش به صورت بازگشتی تمام گره های فرزند را که از خود گره * شروع می شود، عبور می دهد، هر گره از یک handler * @param handler تابع handler برای مقدار هر گره */ تراورس سرگرم کننده(handler:(T)->Unit) ( handler(value) children.forEach ( child -> child.traverse(handler) ) )

حالا بیایید یک تابع برای ایجاد بالای درخت اضافه کنیم:

/** * یک گره درختی با مقدار مقدار ایجاد می کند و * فرزندان آن را با متد init مقداردهی اولیه می کند. */ سرگرم کننده درخت (مقدار:T، شروع: گره .()->واحد): گره ( val node = Node(value) // فراخوانی متد init ارسال شده در پارامتر // روی شی گره node.init() گره برگشتی)

در دو جای کد از ساختاری مانند Node.()->Unit استفاده شده است، معنی آن این است که یک نوع تابع به عنوان ورودی انتظار می رود که به عنوان متد یک شی از نوع Node اجرا می شود. از بدنه این تابع به متدهای دیگر این شیء مانند متد Node.node() دسترسی وجود دارد که به شما امکان می دهد مقداردهی اولیه درخت را مشابه آنچه در مثال توضیح داده شده انجام دهید.

به جای نتیجه گیری

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

اگر به این زبان علاقه دارید، تمام اطلاعات مربوط به زبان را می توانید در وب سایت رسمی پروژه پیدا کنید، منابع آنها را می توانید در github پیدا کنید، و هر گونه خطای یافت شده را می توانید در ردیاب Issue پست کنید. هنوز مشکلات زیادی وجود دارد، اما توسعه دهندگان زبان فعالانه با آنها مبارزه می کنند. اکنون تیم در حال کار بر روی نسخه نه چندان پایدار Milestone 3 است، پس از تثبیت، تا آنجا که من می دانم، برنامه ریزی شده است که از این زبان در شرکت JetBrains استفاده کند، پس از آن اولین نسخه از قبل برنامه ریزی شده است.

برچسب ها:

  • کاتلین
  • جاوا
  • جت مغزها
افزودن برچسب

اصلی سرگرم کننده (args: Array ) ( اعداد val = arrayListOf(15، -5، 11، -39) val nonNegativeNumbers = numbers.filter ( it >= 0 ) println(nonNegativeNumbers) ) // خروجی: 15، 11

توابع مرتبه بالاتر توابعی هستند که توابع دیگر را به عنوان آرگومان می گیرند و توابع برمی گرداند. به مثال زیر توجه کنید:

Fun alphaNum(func: () -> واحد) ()

در آن func نام آرگومان است و () -> Unit نوع تابع است. ما می گوییم که func تابعی خواهد بود که هیچ آرگومان نمی گیرد و چیزی برمی گرداند.

عبارات لامبدا یا توابع ناشناس، توابعی هستند که اعلان نمی شوند، بلکه به عنوان عبارت ارسال می شوند. در اینجا یک مثال است:

جمع ارزش: (Int، ​​Int) -> Int = ( x, y -> x + y )

ما یک مجموع متغیر را اعلام می کنیم که دو عدد را می گیرد، آنها را جمع می کند و مجموع کاهش یافته را به یک عدد صحیح برمی گرداند. یک جمع ساده (2،2) برای فراخوانی آن کافی است.

مقایسه سرعت بین جاوا و کاتلین

اولین ساخت کد Kotlin تقریباً 15 تا 20 درصد بیشتر از همان فرآیند در جاوا طول می کشد. با این حال، ساخت افزایشی کاتلین حتی کمی سریعتر از جاوا است. بنابراین، زبان ها در سرعت کامپایل تقریباً برابر هستند.

آینده کاتلین

کاتلین تکامل بعدی جاوا است که کاملاً با آن سازگار است. این آن را به ابزاری عالی برای برنامه های موبایل و سازمانی تبدیل می کند. و از آنجایی که Kotlin اکنون زبان رسمی اندروید است، هیچ ترسی وجود ندارد که یادگیری آن شما را بدون شغل رها کند.

مجموعه ای از مقالات به شما در یادگیری این زبان کمک می کند و روند ایجاد یک برنامه کاربردی تلفن همراه ساده Keddit - مشتری برای منبع محبوب Reddit را شرح می دهد. برای راحتی شما تمام قطعات آن را در لیست زیر قرار داده ایم.

شما به کتابخانه های زیر نیاز دارید:

  • Retrofit 2.0;
  • RxJava;
  • پیکاسو؛
  • RecyclerView;
  • پسوندهای کاتلین برای اندروید؛
  • خنجر 2.

همه منابع در GitHub در دسترس هستند. این سریال از قسمت های زیر تشکیل شده است.

بهترین مقالات در این زمینه