بعد ستة أشهر من التطوير، أطلقت أوراكل منصة Java SE 17 (منصة Java، الإصدار القياسي 17)، والتي تستخدم مشروع OpenJDK مفتوح المصدر كتطبيق مرجعي. باستثناء إزالة بعض الميزات القديمة، تحافظ Java SE 17 على التوافق مع الإصدارات السابقة من منصة Java، حيث ستعمل معظم مشاريع Java المكتوبة سابقًا دون تغيير عند تشغيلها على الإصدار الجديد. تتوفر إصدارات جاهزة للتثبيت من Java SE 17 (JDK وJRE وServer JRE) لـ Linux (x86_64، AArch64)، Windows (x86_64) و macOS (x86_64، AArch64). تم تطوير تطبيق Java 17 المرجعي بواسطة مشروع OpenJDK وهو مفتوح المصدر بالكامل بموجب ترخيص GPLv2 مع استثناء GNU ClassPath، مما يسمح بالربط الديناميكي مع المنتجات التجارية.
تم تصنيف Java SE 17 كإصدار دعم طويل الأمد (LTS)، والذي سيستمر في تلقي التحديثات حتى عام 2029. تم إيقاف التحديثات الخاصة بإصدار Java 16 الرئيسي السابق. سيتم دعم فرع LTS السابق لـ Java 11 حتى عام 2026. من المقرر إصدار إصدار LTS التالي في سبتمبر 2024. أذكرك أنه بدءا من إصدار Java 10، تحول المشروع إلى عملية تطوير جديدة، مما يعني دورة أقصر لتشكيل إصدارات جديدة. يتم الآن تطوير الوظائف الجديدة في فرع رئيسي واحد يتم تحديثه باستمرار، والذي يتضمن تغييرات جاهزة ويتم تفرع منه الفروع كل ستة أشهر لتحقيق استقرار الإصدارات الجديدة.
تشمل الميزات الجديدة في Java 17 ما يلي:
- يُقترح تنفيذ تجريبي لمطابقة الأنماط في تعبيرات "التبديل"، والذي يسمح باستخدام قيم غير دقيقة في تسميات "الحالة"، ولكن قوالب مرنة تغطي سلسلة من القيم في وقت واحد، والتي كان من الضروري في السابق استخدام مرهقة سلاسل من عبارات "إذا ... آخر". بالإضافة إلى ذلك، يتمتع "switch" بالقدرة على التعامل مع القيم الخالية. الكائن س = 123 لتر؛ String formatted = Switch (o) { case Integer i -> String.format("int %d", i); حالة طويلة l -> String.format("long %d", l); حالة مزدوجة d -> String.format("double %f", d); الحالة String s -> String.format("String %s", s); الافتراضي -> o.toString(); };
- دعم ثابت للفئات والواجهات المختومة، والتي لا يمكن استخدامها بواسطة الفئات والواجهات الأخرى لوراثة التنفيذ أو توسيعه أو تجاوزه. توفر الفئات المختومة أيضًا طريقة أكثر تصريحًا لتقييد استخدام الفئة الفائقة من معدّلات الوصول، استنادًا إلى القائمة الصريحة للفئات الفرعية المسموح لها بالامتداد. الحزمة com.example.geometry; فئة عامة مختومة يسمح الشكل بـ com.example.polar.Circle، com.example.quad.Rectangle، com.example.quad.simple.Square {…}
- يُقترح معاينة ثانية لـ Vector API، والتي توفر وظائف لحسابات المتجهات التي يتم تنفيذها باستخدام تعليمات المتجهات على معالجات x86_64 و AArch64 وتسمح بتطبيق العمليات في وقت واحد على قيم متعددة (SIMD). على عكس الإمكانات المتوفرة في برنامج التحويل البرمجي HotSpot JIT للتوجيه التلقائي للعمليات العددية، تتيح واجهة برمجة التطبيقات الجديدة التحكم بشكل صريح في التوجيه لمعالجة البيانات المتوازية.
- تمت إضافة معاينة لواجهة برمجة التطبيقات للوظائف الخارجية والذاكرة، والتي تسمح للتطبيقات بالتفاعل مع التعليمات البرمجية والبيانات خارج وقت تشغيل Java. تسمح لك واجهة برمجة التطبيقات الجديدة باستدعاء الوظائف غير التابعة لـ JVM بكفاءة والوصول إلى الذاكرة غير المُدارة بواسطة JVM. على سبيل المثال، يمكنك استدعاء وظائف من مكتبات مشتركة خارجية والوصول إلى بيانات العملية دون استخدام JNI.
- محرك عرض لـ macOSتم تكييف واجهة برمجة تطبيقات Java ثنائية الأبعاد، والتي تُستخدم بدورها في واجهة برمجة تطبيقات Swing، لاستخدام واجهة برمجة تطبيقات الرسومات Metal. بشكل افتراضي، النظام الأساسي macOS لا يزال OpenGL مستخدمًا، ويتطلب تفعيل دعم Metal ضبط المعلمة "-Dsun.java2d.metal=true" وامتلاك الإصدار على الأقل macOS 10.14.x.
- تمت إضافة منفذ للمنصة macOS/AArch64 (أجهزة كمبيوتر أبل المبنية على معالجات أبل M1 الجديدة). من أبرز ميزات هذا الإصدار دعمه لآلية حماية الذاكرة W^X (الكتابة XOR التنفيذ)، التي تمنع إمكانية الكتابة والتنفيذ في صفحات الذاكرة في آنٍ واحد. (لا يمكن تنفيذ التعليمات البرمجية إلا بعد تعطيل إمكانية الكتابة، ولا يمكن الكتابة إلى صفحة ذاكرة إلا بعد تعطيل إمكانية التنفيذ).
- تم الرجوع إلى استخدام دلالات صارمة فقط لتعبيرات الفاصلة العائمة. تم إيقاف دعم الدلالات "الافتراضية"، المتوفرة منذ إصدار Java 1.2، بما في ذلك تبسيط العمل على الأنظمة التي تحتوي على معالجات رياضية قديمة جدًا x87 (بعد ظهور تعليمات SSE2، اختفت الحاجة إلى دلالات إضافية).
- تم تنفيذ أنواع جديدة من الواجهات لمولدات الأرقام العشوائية الزائفة، كما تم تنفيذ خوارزميات إضافية لتوليد أرقام عشوائية أفضل. يتم منح التطبيقات الفرصة لاختيار خوارزمية لتوليد أرقام عشوائية زائفة. تحسين الدعم لتوليد تدفقات كائن عشوائي.
- فرض تغليف صارم لجميع مكونات JDK الداخلية، باستثناء واجهات برمجة التطبيقات الهامة مثل sun.misc.Unsafe. يحظر التغليف الصارم محاولات التعليمات البرمجية للوصول إلى الفئات والأساليب والحقول الداخلية. في السابق، كان من الممكن تعطيل وضع التغليف الصارم باستخدام خيار "--illegal-access=permit"، ولكن تم إهمال هذا الآن. يجب على التطبيقات التي تتطلب الوصول إلى الفئات والأساليب والحقول الداخلية أن تحددها بشكل صريح باستخدام خيار --add-opens أو سمة Add-Opens في ملف البيان.
- أصبح بإمكان التطبيقات الآن تحديد عوامل تصفية لفك تسلسل البيانات، والتي يمكن أن تعتمد على السياق ويتم اختيارها ديناميكيًا بالتزامن مع عمليات فك تسلسل محددة. تُطبق عوامل التصفية التي تحددها على كامل آلة افتراضية (على مستوى JVM)، أي أنها لا تغطي التطبيق نفسه فحسب، بل تغطي أيضًا مكتبات الطرف الثالث المستخدمة في التطبيق.
- أضاف Swing طريقة javax.swing.filechooser.FileSystemView.getSystemIcon لتحميل أيقونات كبيرة لتحسين واجهة المستخدم على شاشات DPI العالية.
- توفر واجهة برمجة تطبيقات java.net.DatagramSocket الدعم للاتصال بمجموعات البث المتعدد دون الحاجة إلى واجهة برمجة تطبيقات java.net.MulticastSocket منفصلة.
- تم تحسين الأداة المساعدة IGV (Ideal Graph Visualizer)، مما يوفر تصورًا تفاعليًا لتمثيل التعليمات البرمجية المتوسطة في برنامج التحويل البرمجي HotSpot VM C2 JIT.
- في JavaDoc، قياسًا على مترجم javac، عند إخراج خطأ، تتم الإشارة الآن إلى رقم السطر الذي به مشكلة في الملف المصدر وموقع الخطأ.
- تمت إضافة خاصية original.encoding، التي تعكس اسم ترميز أحرف النظام (UTF-8، koi8-r، cp1251، وما إلى ذلك).
- تمت إضافة واجهة java.time.InstantSource، مما يسمح بمعالجة الوقت دون الرجوع إلى منطقة زمنية.
- تمت إضافة java.util.HexFormat API للتحويل إلى التمثيل الست عشري والعكس.
- تمت إضافة وضع الثقب الأسود إلى المترجم، مما يؤدي إلى تعطيل عمليات إزالة التعليمات البرمجية الميتة، والتي يمكن استخدامها عند إجراء اختبارات الأداء.
- تمت إضافة خيار "-Xlog:async" إلى وقت التشغيل لتسجيل السجلات في الوضع غير المتزامن.
- عند إنشاء اتصالات آمنة، يتم تمكين TLS 1.3 افتراضيًا (تم استخدام TLS 1.2 سابقًا).
- تم نقل واجهة برمجة تطبيقات Applet القديمة التي تم الإعلان عنها مسبقًا (java.applet.Applet*, javax.swing.JApplet)، والتي كانت تستخدم لتشغيل تطبيقات Java في المتصفح، إلى الفئة المقرر إزالتها (فقدت أهميتها بعد انتهاء الدعم لبرنامج Java الإضافي للمتصفحات).
- تم نقل مدير الأمان، الذي فقد أهميته منذ فترة طويلة ولم تتم المطالبة به بعد انتهاء دعم المكون الإضافي للمتصفح، إلى فئة تلك المقرر إزالتها.
- تمت إزالة آلية تنشيط RMI، التي عفا عليها الزمن، وتم نقلها إلى فئة الخيار في Java 8 ولا يتم استخدامها أبدًا في الممارسة الحديثة.
- مترجم تجريبي يدعم JIT (في الوقت المناسب) للتجميع الديناميكي لتعليمات Java البرمجية لـ HotSpot JVM، بالإضافة إلى وضع التجميع الاستباقي (AOT، المسبق) للفئات في كود الجهاز قبل بدء تشغيل الجهاز الظاهري ، تمت إزالته من SDK. تمت كتابة المترجم بلغة Java واستنادًا إلى عمل مشروع Graal. تجدر الإشارة إلى أن صيانة المترجم تتطلب الكثير من العمل، وهو أمر غير مبرر عندما لا يكون هناك طلب من المطورين.
المصدر: opennet.ru
