ویژگیهای جدید در جاوا 18

 

 

 

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


در بازار کار ایران، جاوا و سی‌شارپ رقبای سرسختی هستند و تقریبا بازار کار به یک اندازه به هر دو تخصص نیاز دارد، اما در خارج از ایران جاوا بیشتر مورد توجه شرکت‌ها قرار دارد. هنگامی‌که نسخه جدیدی از یک زبان برنامه‌نویسی منتشر می‌شود، مهم است درباره تغییرات اعمال‌شده در نسخه جدید اطلاعات کافی داشته باشیم، زیرا برخی قابلیت‌ها حذف می‌شوند، برخی دیگر تغییر می‌کنند و قابلیت‌های جدیدی به آن زبان افزوده می‌شوند. جاوا از این قاعده مستنثا نیست و در سال‌های گذشته قابلیت‌های خوبی همگام با پیشرفت‌های دنیای فناوری در اختیار برنامه‌نویسان قرار داده است. از نسخه 9 به بعد، اوراکل هر 6 ماه یک‌بار ویژگی‌ها و قابلیت‌هایی به جاوا اضافه کرده که همین مسئله دنبال کردن تغییرات جدید را کمی سخت می‌کند. به‌طور مثال، نسخه 17 جاوا اوایل مهرماه 1400 با قابلیت‌های جدید منتشر شد و درست شش ماه بعد نسخه 18 اوایل فروردین‌ماه 1401 منتشر شد و همچون گذشته قابلیت‌های جذابی در اختیار برنامه‌نویسان قرار داد. در نسخه 18 شاهد ویژگی‌ها و تغییرات نسبتا مهمی بودیم که در این مقاله با 9 مورد از آن‌ها آشنا می‌شویم.


در شرایطی‌که جاوا 17 یک نسخه پشتیبانی بلند‌مدت (LTS) است و اوراکل حداقل 8 سال از آن پشتیبانی می‌کند، نسخه 18 جاوا یک نسخه با پشتیبانی کوتاه‌مدت است که اوراکل در یک بازه زمانی کوتاه از آن پشتیبانی می‌کند. توسعه‌دهندگان می‌توانند برای نصب کیت توسعه JDK18 جاوا روی سیستم‌عامل‌های لینوکس، ویندوز و مک به سایت رسمی اوراکل به نشانی https://www.oracle.com/java/technologies/downloads/ مراجعه کنند و نسخه هماهنگ با سیستم‌عامل خود را دانلود و نصب کنند.


1. منسوخ شدن finalization برای حذف در نسخه بعدی جاوا

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

در صفحه رسمی Openjdk در خصوص ویژگی مذکور آمده است: «کارهای اولیه برای حذف Finalization انجام شده است. Finalization در حال حاضر (نسخه 17) به‌طور پیش‌فرض فعال است، اما می‌توان آن‌را غیرفعال کرد تا انجام آزمایش‌های اولیه تسهیل شوند. ویژگی مذکور در نسخه 18 به‌طور پیش‌فرض غیرفعال است و در نسخه بعد حذف خواهد شد. طراحان کتابخانه‌ها و برنامه‌هایی که از finalization  استفاده می‌کنند باید به‌سراغ تکنیک‌های دیگر مدیریت منابع مانند دستورات try-with-resources و نمونه‌های مشابه بروند. پیشنهاد می‌شود یک گزینه خط فرمان برای غیرفعال کردن finalization و منسوخ کردن تمام finalizerها و متدهای finalization در API استاندارد جاوا افزوده شود. هدف از انجام این‌کار کمک به توسعه‌دهندگان برای درک بهتر مخاطرات finalization و آمادگی توسعه‌دهندگان برای حذف نهایی آن است».

یکی دیگر از اهداف کنار گذاشتن ویژگی فوق در نسخه 18 جاوا آماده کردن ابزارهای کاربردی برای کمک به شناسایی میزان وابستگی به finalization است. این ویژگی که در نسخه اول جاوا معرفی شده بود با هدف پیشگیری از بروز مشکل نشت منابع استفاده می‌شد. ویژگی مذکور شامل یک کلاس است که می‌تواند یک finalizer را تعریف کند که بدنه متد داخل آن می‌تواند هر منبعی را آزاد کند. garbage collector می‌تواند finalizer یک شیء غیرقابل‌دسترس را به‌راحتی زمان‌بندی کند تا قبل از این‌که حافظه شیء را اصلاح کند آن‌را فراخوانی کند. با این‌حال، در هنگام استفاده از متد finalize باید به این نکته دقت کنید که عملیاتی مانند فراخوانی قابلیت close در اشیاء انجام می‌شود. در ظاهر این‌گونه به‌نظر می‌رسد که رویکرد فوق یک راهکار موثر برای پیشگیری از بروز مشکل نشتی منابع است، اما نقص‌هایی دارد که از آن جمله باید به تاخیرهای غیرقابل‌پیش‌بینی اشاره کرد. این نقص باعث می‌شود تا فاصله زیادی بین زمانی‌که یک شیء غیرقابل‌دسترس می‌شود تا زمانی که finalizer آن‌را فراخوانی می‌کند به‌وجود آید. این مسئله در برخی از برنامه‌ها و به‌ویژه برنامه‌های حساس‌به‌زمان مشکل جدی است. به همین دلیل است که به توسعه‌دهندگان توصیه شده از تکنیک‌های جایگزین برای جلوگیری از نشت منابع استفاده کنند که از جمله باید به دستورات try-with-resources اشاره کرد.


2. تعریف یک SPI برای میزبان در نسخه 18 جاوا

در نسخه 18 جاوا، یک SPI برای میزبان و تبدیل آدرس اینترنتی (Name Address Resolution) تعریف شده تا Inet.Address بتواند از resolverهایی به‌جز resolver داخلی پلتفرم‌ها استفاده کند. این‌کار با هدف فعال‌سازی بهتر Project Loom برای همزمانی و پشتیبانی بهتر از پارادایم‌های جدید برنامه‌نویسی در جاوا، یکپارچه‌سازی بهتر جاوا با پروتکل‌های جدید شبکه، سفارشی‌سازی و فعال کردن ساده آزمایش‌ها انجام شده است. به این نکته دقت کنید که قرار نیست یک resolver جایگزین برای کیت توسعه جاوا ارائه شود.


3. پیش‌نمایش دوم از قابلیت تطبیق الگو در دستورات switch

با اضافه شدن ویژگی جدید به نسخه 18 جاوا تطبیق الگو برای عبارات و دستورات switch که همراه با آیتم‌های گسترشی مرتبط با الگوهای این زبان هستند ساده‌تر می‌شود؛ رویکردی که باعث بهبود عملیات تطبیقی می‌شود. اولین پیش‌نمایش همراه با نسخه 17 کیت توسعه جاوا معرفی و در اختیار توسعه‌دهندگان قرار گرفت. فرآیند تطبیق الگوی گسترشی که برای دستور switch ارائه شده، به یک دستور اجازه می‌دهد الگوهای مختلف را ارزیابی کند، در حالی‌که هر یک از این الگوها عملکرد مخصوص به خود را خواهند داشت. از این‌رو، محاوره‌های پیچیده مبتنی بر داده‌ها می‌توانند به‌شکل کوتاه و ایمن اجرا شوند. ویژگی مذکور از پروژه Project Amber به جاوا وارد شده که یک پروژه OpenJDK است که بر ویژگی‌های کوچک‌تر جاوا و بهره‌وری متمرکز است. جورج ساب، معاون گروه پلتفرم جاوا در اوراکل، در این ارتباط می‌گوید: «تطبیق الگو برای switch چیزی است که هر برنامه‌نویس جاوا باید در مورد آن اطلاع داشته باشد و از آن استفاده کند». این قابلیت به‌شکل گسترده‌ای از فرآیند تطبیق الگوها در جاوا پشتیبانی خواهد کرد و در آینده به یکی از سبک‌های مهم برنامه‌نویسی در جاوا تبدیل خواهد شد.




4. پیاده‌سازی مجدد core reflection

Core reflection Java.lang.reflect.Method، Constructor و Field  در کنترل‌کننده java.lan.invoke دومرتبه کدنویسی شده‌اند. از این پس کنترل‌کننده‌های متد به‌عنوان یک مکانیزم اساسی در عملیات reflection هزینه مربوط به نگه‌داری و توسعه واسط‌های برنامه‌نویسی کاربردی java.lang.reflect و java.lang.invoke را به میزان زیادی کاهش می‌دهند. به بیان دیگر، دو مکانیسم داخلی برای فراخوانی متدها و سازنده‌ها در اختیار توسعه‌دهندگان قرار می‌گیرد که برای اجرای سریع‌تر دستورات از روش‌های بومی در HotSpot VM برای اولین فراخوانی شیء سازنده یا متد بازتابی استفاده می‌‌کند. برای بهبود عملکرد، پس از فراخوانی‌های متعدد، بایت‌کد برای عملیات بازتابی تولید می‌شود و از کد فوق در فراخوانی‌های بعدی استفاده می‌شود. به همین دلیل است که اضافه شدن ویژگی فوق به نسخه 18 جاوا می‌تواند مزایای زیادی در اختیار توسعه‌دهندگان قرار دهد.


5. اضافه شدن یک وب‌سرور ساده به نسخه 18 جاوا

در نسخه 18 یک وب‌سرور ساده به جاوا افزوده شده که یک ابزار خط فرمان برای راه‌اندازی یک وب‌سرور کوچک در اختیار توسعه‌دهندگان قرار می‌دهد که تنها قادر به نگه‌داری از فایل‌های ایستا است. دقت کنید در این‌جا هیچ عملکرد CGI یا عملکردی مشابه servlet در دسترس نیست. ابزار فوق می‌تواند برای نمونه‌سازی، کدگذاری ad-hoc و آزمایش‌ها، به‌ویژه در محیط‌های آموزشی مفید و کاربردی باشد. هدف از ارائه قابلیت جدید ارائه یک فایل‌سرور HTTP out-of-the-box ایستا است که راه‌اندازی آن ساده است. این فایل‌سرور می‌تواند به توسعه‌دهندگان کمک کند به‌شکل سریع‌تری وظایف خود را انجام دهند و علاوه بر این، کیت توسعه جاوا را در اختیار آن‌ها قرار می‌دهد. همچنین، به این نکته دقت کنید که یک پیاده‌سازی پیش‌فرض از طریق خط فرمان همراه با یک واسط برنامه‌نویسی کوچک در اختیار برنامه‌نویسان قرار دارد که در صورت نیاز می‌توانند از آن استفاده کنند. با استفاده از تکنیک فوق، می‌توانید برنامه‌های خود را به‌راحتی ایجاد و سفارشی‌سازی کنید. لازم به توضیح است که قرار نیست یک سرور با قابلیت‌های فوق‌العاده پیشرفته در اختیار شما قرار گیرد.


6. یک تابع خارجی و یک واسط برنامه‌نویسی کاربردی برای تعامل بهتر با حافظه

در نسخه 18 جاوا یک واسط برنامه‌نویسی کاربردی معرفی شده که از طریق آن برنامه‌های جاوا می‌توانند با داده‌های خارج از زمان اجرای جاوا تعامل داشته باشند. با فراخوانی توابع خارجی (در واقع کد خارج از موتور مجازی جاوا) و با دسترسی ایمن به حافظه خارجی (حافظه‌ای که توسط موتور مجازی جاوا مدیریت نمی‌شود) این واسط برنامه‌نویسی کاربردی به برنامه‌های جاوا اجازه می‌دهد تا کتابخانه‌های محلی را فراخوانی کنند و داده‌های محلی را بدون مشکل JNI (رابط بومی جاوا) پردازش کنند. هدف از افزودن ویژگی فوق این است که JNI را با یک مدل توسعه جاوا بهتر جایگزین کنیم. دقت کنید این واسط برنامه‌نویسی کاربردی در نسخه 17 جاوا نیز در دسترس بود، اما در نسخه 18 جاوا تغییراتی روی آن اعمال شده و برخی مشکلات آن برطرف شده است. با فراخوانی توابع خارجی، کدهایی که خارج از ماشین مجازی جاوا قرار دارند قادر هستند به‌شکل ایمن به حافظه خارجی و حافظه‌ای که توسط ماشین مجازی جاوا مدیریت نمی‌شود دسترسی پیدا کنند.

7. vector API در نسخه 18 زبان برنامه‌نویسی جاوا

vector API را نباید از ویژگی‌های شاخص نسخه 18 جاوا برشمرد، زیرا قبل از این در JDK 16 و JDK 17 آن‌را مشاهده کرده‌ایم. ویژگی مذکور برای انجام محاسبات برداری ارائه شده و در زمان اجرا به دستورالعمل‌های برداری که پردازنده مرکزی از آن‌ها پشتیبانی می‌کند کامپایل می‌شود تا عملکرد برنامه‌ها بهبود پیدا کند. ویژگی فوق عملیات برداری را به‌شکل موازی انجام می‌دهد. در این حالت یک سیکل بیشتر از پردازنده مرکزی استفاده می‌شود، اما در مقابل عملکرد کلی برنامه بهبود پیدا کند. vector API راه‌حلی برای نوشتن الگوریتم‌های پیچیده در جاوا با استفاده از HotSpot auto-vectorizer و یک مدل کاربری است تا عملیات بردارسازی به‌شکل قابل‌پیش‌بینی‌تری انجام شود. در نسخه جدید JDK از پلتفرم ARM Scalar Vector Extension نیز پشتیبانی می‌شود تا بتوان از ویژگی‌های سخت‌افزاری پردازنده به‌شکل بهتری استفاده کرد تا عملیات بردارسازی بهبود پیدا کند.


8. تعیین UTF-8 به عنوان سیستم کدگذاری پیش‌فرض و استاندارد واسط‌های برنامه‌نویسی کاربردی

UTF-8 یک استاندارد کدگذاری کاراکترها در دنیای ارتباطات است که امروزه به‌عنوان مجموعه کاراکترهای استاندارد وب شناخته می‌شود. charset مکانیزم کدگذاری تمامی کاراکتر‌های وب است. با توجه به تغییر اعمال‌شده در نسخه 18 جاوا واسط‌های برنامه‌نویسی کاربردی این زبان که بر مبنای charset پیش‌فرض کار می‌کردند، در تمام پیاده‌سازی‌ها، سیستم‌عامل‌ها، پیکربندی‌ها و غیره بدون مشکل کار می‌کنند. البته دقت کنید که قرار نیست شاهد عرضه استاندارد جدید یا واسط‌های برنامه‌نویسی کاربردی خاص JDK باشیم. در شرایط عادی، برنامه‌های کاربردی که توسعه داده‌اید بدون مشکل کار خواهند کرد و سیستم کدگذاری پیش‌فرض مشکلی در عملکرد آن‌ها به‌وجود نمی‌آورد. علاوه بر این، تیم توسعه‌دهنده بر این باور هستند که قابلیت جدید روی عملکرد برنامه‌های کاربردی نوشته‌شده با جاوا در سیستم‌عامل مک، برخی از توزیع‌های لینوکس و برنامه‌های سمت سرور که از UTF-8 پشتیبانی می‌کنند تاثیر منفی نخواهد گذاشت. این قابلیت بیشتر برای کمک به کاربران سیستم‌عامل‌های ویندوزی در مناطق آسیایی و محیط‌های سروری است که در مناطق آسیایی مستقر هستند.

9. قطعه کدها در مستندات واسط‌های برنامه‌نویسی کاربردی

این ویژگی مهم و جذاب در نسخه 18 جاوا شامل یک تگ @snippet برای JavaDoc’s Standard Doclet است که برای ساده کردن درج نمونه مثال‌هایی در ارتباط با واسط‌های برنامه‌نویسی جاوا در مستندات استفاده می‌شود. از کاربردهای این قابلیت باید به تسهیل اعتبارسنجی کد منبع با فراهم کردن دسترسی واسط برنامه‌نویسی به این قطعه کدها اشاره کرد. از دیگر کاربردهای قابلیت جدید باید به فعال‌سازی قابلیت سبک‌دهی مدرن مانند هایلایت کردن ترکیب نحوی، اتصال خودکار نام‌ها به تعاریف، پشتیبانی بهتر محیط توسعه یکپارچه برای ایجاد و ویرایش snippetها و غیره اشاره کرد. ویژگی فوق را باید از مهم‌ترین ویژگی‌های نسخه 18 زبان برنامه‌نویسی جاوا دانست که توسعه‌دهندگان می‌توانند از آن برای ساده‌سازی داکیومنت‌نویسی پروژه‌ها استفاده کنند.

 

برگرفته از مجله شبکه