Java SE 17-ի թողարկում

Վեց ամիս մշակումից հետո Oracle-ը թողարկեց Java SE 17-ը (Java Platform, Standard Edition 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) համար: OpenJDK նախագծի կողմից մշակված Java 17 հղումների իրականացումը լիովին բաց կոդով է GPLv2 լիցենզիայի ներքո, GNU ClassPath բացառություններով, որոնք թույլ են տալիս դինամիկ կապ հաստատել առևտրային արտադրանքների հետ:

Java SE 17-ը դասակարգվում է որպես երկարաժամկետ աջակցության (LTS) թողարկում, որը կշարունակի թարմացումներ ստանալ մինչև 2029 թվականը: Java 16-ի նախորդ թողարկման թարմացումները դադարեցվել են: Java 11-ի նախորդ LTS մասնաճյուղը կաջակցվի մինչև 2026 թվականը: LTS-ի հաջորդ թողարկումը նախատեսված է 2024 թվականի սեպտեմբերին: Հիշեցնենք, որ Java 10-ի թողարկումից սկսած՝ նախագիծն անցավ զարգացման նոր գործընթացի՝ ենթադրելով ավելի կարճ ցիկլ նոր թողարկումների ձևավորման համար։ Նոր ֆունկցիոնալությունն այժմ մշակվում է մեկ մշտապես թարմացվող գլխավոր մասնաճյուղում, որը ներառում է պատրաստի փոփոխություններ և որից մասնաճյուղերը ճյուղավորվում են յուրաքանչյուր վեց ամիսը մեկ՝ նոր թողարկումները կայունացնելու համար:

Java 17-ի նոր հնարավորությունները ներառում են.

  • Առաջարկվում է «անջատիչ» արտահայտություններում օրինաչափությունների համապատասխանության փորձարարական իրականացում, որը թույլ է տալիս օգտագործել ոչ թե ճշգրիտ արժեքներ «case» պիտակներում, այլ ճկուն կաղապարներ, որոնք ընդգրկում են միանգամից մի շարք արժեքներ, որոնց համար նախկինում անհրաժեշտ էր օգտագործել ծանր «եթե... ուրիշ» արտահայտությունների շղթաներ: Բացի այդ, «անջատիչը» հնարավորություն ունի կարգավորել NULL արժեքները: Օբյեկտ o = 123L; String formatted = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); լռելյայն -> o.toString(); };
  • Կնքված դասերի և միջերեսների կայունացված աջակցություն, որոնք չեն կարող օգտագործվել այլ դասերի և ինտերֆեյսների կողմից՝ ժառանգելու, ընդլայնելու կամ իրականացումը անտեսելու համար: Կնքված դասերը նաև ապահովում են գերդասերի օգտագործումը սահմանափակելու ավելի դեկլարատիվ եղանակ, քան մուտքի մոդիֆիկատորները՝ հիմնվելով ընդլայնման համար թույլատրված ենթադասերի հստակ ցուցակագրման վրա: փաթեթ com.example.geometry; հանրային կնքված դասի Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
  • Առաջարկվում է Vector API-ի երկրորդ նախադիտումը, որն ապահովում է վեկտորային հաշվարկների գործառույթներ, որոնք կատարվում են x86_64 և AArch64 պրոցեսորների վրա վեկտորային հրահանգների միջոցով և թույլ են տալիս միաժամանակ կիրառվել բազմաթիվ արժեքների վրա (SIMD): Ի տարբերություն HotSpot JIT կոմպիլյատորում տրված հնարավորությունների՝ սկալյար գործողությունների ավտոմատ վեկտորացման համար, նոր API-ն հնարավորություն է տալիս բացահայտորեն վերահսկել վեկտորացումը տվյալների զուգահեռ մշակման համար:
  • Ավելացվել է օտար գործառույթների և հիշողության API-ի նախադիտում, որը թույլ է տալիս հավելվածներին փոխազդել կոդի և տվյալների հետ Java-ի գործարկման ժամանակից դուրս: Նոր API-ն թույլ է տալիս արդյունավետ կերպով զանգահարել ոչ JVM գործառույթներ և մուտք գործել ոչ JVM-ի կողմից կառավարվող հիշողություն: Օրինակ՝ կարող եք ֆունկցիաներ կանչել արտաքին ընդհանուր գրադարաններից և մուտք գործել գործընթացի տվյալներ՝ առանց JNI-ի օգտագործման:
  • MacOS-ի մատուցման շարժիչը, որն ապահովում է Java 2D API-ն, որն իր հերթին ապահովում է Swing API-ն, հարմարեցվել է մետաղական գրաֆիկական API-ն օգտագործելու համար: macOS պլատֆորմը շարունակում է օգտագործել OpenGL-ը լռելյայնորեն, և Metal-ի աջակցությունը միացնելու համար անհրաժեշտ է սահմանել «-Dsun.java2d.metal=true» և առնվազն գործարկել macOS 10.14.x:
  • Ավելացվել է պորտ macOS/AArch64 պլատֆորմի համար (Apple համակարգիչներ՝ հիմնված նոր Apple M1 չիպերի վրա): Պորտի հատուկ առանձնահատկությունը W^X (Write XOR Execute) հիշողության պաշտպանության մեխանիզմի աջակցությունն է, որի դեպքում հիշողության էջերը չեն կարող միաժամանակ մուտք գործել գրելու և կատարման համար: (Կոդը կարող է կատարվել միայն գրելու անջատումից հետո, իսկ հիշողության էջին գրելը հնարավոր է միայն այն բանից հետո, երբ կատարումն անջատված է):
  • Վերադարձվել է լողացող կետի արտահայտությունների համար միայն խիստ fp իմաստաբանության օգտագործմանը: Java 1.2-ի թողարկումից ի վեր հասանելի «կանխադրված» իմաստաբանության աջակցությունը դադարեցվել է, ներառյալ շատ հին x87 մաթեմատիկական կոպրոցեսորներով համակարգերի վրա աշխատելու պարզեցումները (SSE2 հրահանգների հայտնվելուց հետո լրացուցիչ իմաստաբանության անհրաժեշտությունը վերացավ):
  • Իրականացվել են կեղծ պատահական թվերի գեներատորների միջերեսների նոր տեսակներ, և պատահական թվերի ավելի լավ ստեղծման համար ներդրվել են լրացուցիչ ալգորիթմներ: Հավելվածներին հնարավորություն է տրվում ընտրել կեղծ պատահական թվեր ստեղծելու ալգորիթմ։ Բարելավված աջակցություն պատահական օբյեկտների հոսքեր ստեղծելու համար:
  • Բոլոր JDK-ի ներքին տարրերի խիստ ներփակում, բացառությամբ կարևոր API-ների, ինչպիսիք են sun.misc.Unsafe: Խիստ ինկապսուլյացիան արգելափակում է կոդից ներքին դասեր, մեթոդներ և դաշտեր մուտք գործելու փորձերը: Նախկինում խիստ ներփակման ռեժիմը կարող էր անջատվել՝ օգտագործելով «--ilegal-access=permit» տարբերակը, սակայն այն այժմ հնացած է: Հավելվածները, որոնք պահանջում են մուտք դեպի ներքին դասեր, մեթոդներ և դաշտեր, պետք է բացահայտորեն սահմանեն դրանք՝ օգտագործելով --add-opens տարբերակը կամ Add-Opens հատկանիշը մանիֆեստի ֆայլում:
  • Հավելվածներին տրվում է տվյալների ապասերիալացման զտիչներ սահմանելու հնարավորություն, որոնք կարող են լինել համատեքստի նկատմամբ զգայուն և դինամիկ կերպով ընտրված՝ հիմնվելով հատուկ ապասերիալացման գործողությունների վրա: Նշված ֆիլտրերը կիրառելի են ամբողջ վիրտուալ մեքենայի համար (JVM-լայն), այսինքն. ծածկել ոչ միայն բուն հավելվածը, այլև հավելվածում օգտագործվող երրորդ կողմի գրադարանները:
  • Swing-ն ավելացրել է javax.swing.filechooser.FileSystemView.getSystemIcon մեթոդը՝ մեծ պատկերակները բեռնելու համար՝ բարձր DPI էկրանների միջերեսը բարելավելու համար:
  • java.net.DatagramSocket API-ն ապահովում է Multicast խմբերին միանալու աջակցություն՝ առանց առանձին java.net.MulticastSocket API-ի անհրաժեշտության:
  • Բարելավվել է IGV (Ideal Graph Visualizer) ծրագիրը՝ ապահովելով միջանկյալ կոդերի ներկայացման ինտերակտիվ պատկերացում HotSpot VM C2 JIT կոմպիլյատորում:
  • JavaDoc-ում, javac կոմպիլյատորի անալոգիայով, երբ սխալ է դուրս գալիս, այժմ նշվում է աղբյուրի ֆայլի խնդրահարույց տողի թիվը և սխալի գտնվելու վայրը։
  • Ավելացվել է native.encoding հատկությունը՝ արտացոլելով համակարգի նիշերի կոդավորման անվանումը (UTF-8, koi8-r, cp1251 և այլն):
  • Ավելացվել է java.time.InstantSource ինտերֆեյսը, որը թույլ է տալիս ժամանակի մանիպուլյացիա անել՝ առանց ժամային գոտու հղումների:
  • Ավելացվեց java.util.HexFormat API՝ տասնվեցական ներկայացուցչության փոխարկելու համար և հակառակը:
  • Կոմպիլյատորին ավելացվել է սեւ խոռոչի ռեժիմ, որն անջատում է մեռած կոդերի վերացման գործողությունները, որոնք կարող են օգտագործվել կատարողականի թեստեր անցկացնելիս:
  • Runtime-ին ավելացվել է «-Xlog:async» տարբերակը՝ ասինխրոն ռեժիմում տեղեկամատյանները գրանցելու համար:
  • Անվտանգ կապեր հաստատելիս TLS 1.3-ը լռելյայն միացված է (նախկինում օգտագործվում էր TLS 1.2):
  • Նախկինում հայտարարված հնացած Applet API-ն (java.applet.Applet*, javax.swing.JApplet), որն օգտագործվում էր զննարկիչում Java հավելվածները գործարկելու համար, տեղափոխվել է հեռացման համար նախատեսված դասակարգված (կորցրեց համապատասխանությունը աջակցության ավարտից հետո): բրաուզերների համար Java հավելվածի համար):
  • Անվտանգության կառավարիչը, որը վաղուց կորցրել է իր արդիականությունը և բրաուզերի հավելումների աջակցության ավարտից հետո պարզվել է, որ չպահանջված է, տեղափոխվել է հեռացման պլանավորվածների կատեգորիա:
  • RMI ակտիվացման մեխանիզմը հանվել է, որը հնացած է, դասակարգվել է Java 8-ի տարբերակի կատեգորիային և ժամանակակից պրակտիկայում գրեթե երբեք չի օգտագործվում:
  • Փորձարարական կոմպիլյատոր, որն աջակցում է JIT-ին (ճիշտ ժամանակին)՝ HotSpot JVM-ի համար Java կոդի դինամիկ կոմպիլյացիայի համար, ինչպես նաև վիրտուալ մեքենան սկսելուց առաջ դասերի ակնկալվող կոմպիլյացիայի եղանակը (AOT, ժամանակից շուտ) մեքենայի կոդի մեջ։ , հեռացվել է SDK-ից: Կազմողը գրվել է Java-ով և հիմնված է Graal նախագծի աշխատանքի վրա: Նշվում է, որ կոմպիլյատորների սպասարկումը մեծ աշխատանք է պահանջում, ինչը արդարացված չէ, երբ ծրագրավորողների կողմից պահանջարկ չկա։

Source: opennet.ru

Добавить комментарий