ภาษาโปรแกรม Julia 1.9 พร้อมใช้งาน

การเปิดตัวของภาษาโปรแกรม Julia 1.9 ได้รับการเผยแพร่แล้ว โดยรวมคุณสมบัติต่างๆ เช่น ประสิทธิภาพสูง รองรับการพิมพ์แบบไดนามิก และเครื่องมือในตัวสำหรับการเขียนโปรแกรมแบบขนาน ไวยากรณ์ของ Julia ใกล้เคียงกับ MATLAB โดยมีองค์ประกอบบางอย่างที่ยืมมาจาก Ruby และ Lisp วิธีการจัดการสตริงนั้นชวนให้นึกถึง Perl รหัสโครงการแจกจ่ายภายใต้ใบอนุญาต MIT

คุณสมบัติที่สำคัญของภาษา:

  • ประสิทธิภาพสูง: หนึ่งในเป้าหมายหลักของโครงการคือการบรรลุประสิทธิภาพที่ใกล้เคียงกับโปรแกรม C คอมไพเลอร์ Julia อิงตามโครงการ LLVM และสร้างรหัสเครื่องเนทีฟที่มีประสิทธิภาพสำหรับแพลตฟอร์มเป้าหมายจำนวนมาก
  • รองรับกระบวนทัศน์การเขียนโปรแกรมที่หลากหลาย รวมถึงองค์ประกอบของการเขียนโปรแกรมเชิงวัตถุและการทำงาน ไลบรารีมาตรฐานจัดเตรียมฟังก์ชันสำหรับ I/O แบบอะซิงโครนัส การจัดการกระบวนการ การบันทึก การทำโปรไฟล์ และการจัดการแพ็คเกจ เหนือสิ่งอื่นใด
  • การพิมพ์แบบไดนามิก: ภาษาไม่ต้องการคำจำกัดความที่ชัดเจนของประเภทสำหรับตัวแปร โดยเปรียบเทียบกับภาษาโปรแกรมสคริปต์ รองรับโหมดโต้ตอบ
  • ความสามารถเพิ่มเติมในการระบุประเภทอย่างชัดเจน
  • ไวยากรณ์ที่ยอดเยี่ยมสำหรับการคำนวณตัวเลข การคำนวณทางวิทยาศาสตร์ ระบบแมชชีนเลิร์นนิง และการสร้างภาพข้อมูล รองรับประเภทข้อมูลตัวเลขและเครื่องมือสำหรับการคำนวณแบบขนาน
  • ความสามารถในการเรียกใช้ฟังก์ชันโดยตรงจากไลบรารี C โดยไม่ต้องเพิ่มเลเยอร์เพิ่มเติม

การเปลี่ยนแปลงที่สำคัญใน Julia 1.9:

  • คุณสมบัติภาษาใหม่
    • อนุญาตให้กำหนดในโมดูลอื่นโดยใช้ "setproperty!(::Module, ::Symbol, x)"
    • อนุญาตให้มีการมอบหมายหลายรายการที่ไม่ได้อยู่ในตำแหน่งสุดท้าย ตัวอย่างเช่น สตริง "a, b..., c = 1, 2, 3, 4" จะถูกประมวลผลเป็น "a = 1; ข…, = 2, 3; ค = 4". สิ่งนี้จัดการผ่าน Base.split_rest
    • ตัวอักษรเดี่ยวตอนนี้สนับสนุนไวยากรณ์เดียวกันกับตัวอักษรสตริง เหล่านั้น. ไวยากรณ์สามารถแสดงลำดับ UTF-8 ที่ไม่ถูกต้องตามที่ประเภท Char อนุญาต
    • เพิ่มการรองรับข้อกำหนด Unicode 15
    • การรวมทูเพิลที่ซ้อนกันและทูเพิลที่มีชื่อของอักขระสามารถใช้เป็นพารามิเตอร์ประเภทได้แล้ว
    • ฟังก์ชันในตัวใหม่ "getglobal(::Module, ::Symbol[, order])" และ "setglobal!(::Module, ::Symbol, x[, order])" สำหรับการอ่านและเขียนตัวแปรส่วนกลางโดยเฉพาะ ตอนนี้ควรใช้เมธอด getglobal มากกว่าเมธอด getfield สำหรับการเข้าถึงตัวแปรโกลบอล
  • การเปลี่ยนแปลงของภาษา
    • ขณะนี้มาโคร "@invoke" ที่แนะนำในเวอร์ชัน 1.7 ได้ถูกส่งออกและพร้อมใช้งานแล้ว นอกจากนี้ ตอนนี้ใช้เมธอด "Core.Typeof(x)" แทน "ใดๆ" ในกรณีที่คำอธิบายประกอบประเภทถูกละไว้สำหรับอาร์กิวเมนต์ "x" สิ่งนี้จำเป็นเพื่อให้ประเภทที่ส่งผ่านเป็นอาร์กิวเมนต์ได้รับการประมวลผลอย่างถูกต้อง
    • เปิดใช้งานการส่งออกของฟังก์ชัน "invokelatest" และมาโคร "@invokelatest" ที่นำมาใช้ในเวอร์ชัน 1.7
  • การปรับปรุงคอมไพเลอร์/รันไทม์
    • ลดเวลาในการดำเนินการครั้งแรกลงอย่างมาก (TTFX - เวลาในการดำเนินการครั้งแรก) การคอมไพล์ล่วงหน้าของแพ็คเกจจะบันทึกโค้ดเนทีฟใน "pkgimage" ซึ่งหมายความว่าโค้ดที่สร้างระหว่างการคอมไพล์ล่วงหน้าจะไม่จำเป็นต้องคอมไพล์ใหม่หลังจากโหลดแพ็คเกจแล้ว การใช้โหมด pkgimages สามารถปิดได้ด้วยตัวเลือก "--pkgimages=no"
    • ปัญหาที่ทราบเกี่ยวกับความซับซ้อนของสมการกำลังสองของการอนุมานประเภทได้รับการแก้ไขแล้ว และโดยทั่วไปการอนุมานจะใช้หน่วยความจำน้อยลง edge case บางตัวที่มีฟังก์ชั่น long ที่สร้างขึ้นโดยอัตโนมัติ (เช่น ModelingToolkit.jl ที่มีสมการอนุพันธ์ย่อยและโมเดลเชิงสาเหตุขนาดใหญ่) คอมไพล์เร็วกว่ามาก
    • ขณะนี้การเรียกที่มีอาร์กิวเมนต์แบบไม่เจาะจงประเภทสามารถแยกแบบยูเนี่ยนที่ปรับให้เหมาะสมสำหรับการแก้ไขแบบฉีดหรือแบบคงที่ แม้ว่าจะมีผู้สมัครจัดส่งหลายประเภทที่แตกต่างกันก็ตาม สิ่งนี้สามารถปรับปรุงประสิทธิภาพการทำงานในบางสถานการณ์ที่ประเภทวัตถุไม่ได้รับการแก้ไขแบบคงที่อย่างสมบูรณ์ โดยการแก้ไขไซต์การเรียก "@nospecialize-d" แบบคงที่และหลีกเลี่ยงการคอมไพล์ใหม่
    • การใช้มาโคร @pure ทั้งหมดในโมดูล Base ถูกแทนที่ด้วย Base.@assume_effects
    • การเรียกใช้ invoke(f, invokesig, args...) ด้วยประเภทที่เฉพาะเจาะจงน้อยกว่าที่ใช้ตามปกติสำหรับ f(args...) จะไม่ทำให้แพ็กเกจคอมไพล์ใหม่อีกต่อไป
  • การเปลี่ยนแปลงพารามิเตอร์บรรทัดคำสั่ง
    • บน Linux และ Windows ขณะนี้ตัวเลือก "--threads=auto" จะพยายามกำหนดจำนวนโปรเซสเซอร์ที่มีอยู่ตามความเกี่ยวข้องของ CPU ซึ่งเป็นมาสก์ที่โดยทั่วไปจะตั้งค่าในสภาพแวดล้อม HPC และคลาวด์
    • ตัวเลือก "--math-mode=fast" ถูกปิดใช้งาน แทนที่จะแนะนำให้ใช้มาโคร "@fastmath" ซึ่งมีความหมายที่ชัดเจน
    • ขณะนี้พารามิเตอร์ "--threads" มีรูปแบบเป็น "auto | N[,auto|M]" โดยที่ M ระบุจำนวนเธรดแบบโต้ตอบที่จะสร้าง (ปัจจุบัน auto หมายถึง 1)
    • เพิ่มตัวเลือก "--heap-size-hint= ” ซึ่งกำหนดเกณฑ์หลังจากที่การรวบรวมขยะที่ใช้งานอยู่เริ่มต้นขึ้น สามารถระบุขนาดเป็นไบต์ กิโลไบต์ (1000 KB) เมกะไบต์ (300 MB) หรือกิกะไบต์ (1,5 GB)
  • การเปลี่ยนแปลงแบบมัลติเธรด
    • "Threads.@spawn" ขณะนี้มีตัวเลือกอาร์กิวเมนต์แรกที่มีค่า ":default" หรือ ":interactive" งานแบบโต้ตอบต้องการเวลาแฝงในการตอบสนองต่ำ และได้รับการออกแบบมาให้สั้นหรือดำเนินการบ่อยครั้ง งานแบบโต้ตอบจะทำงานบนเธรดแบบโต้ตอบ หากมีการระบุไว้เมื่อเริ่มต้น Julia
    • เธรดที่เปิดนอกรันไทม์ของ Julia (เช่น จาก C หรือ Java) สามารถเรียกใช้โค้ด Julia โดยใช้ "jl_adopt_thread" สิ่งนี้จะเกิดขึ้นโดยอัตโนมัติเมื่อคุณป้อนรหัส Julia ผ่าน "cfunction" หรือจุดเข้า "@ccallable" ด้วยเหตุนี้ จำนวนเธรดจึงสามารถเปลี่ยนแปลงได้ในขณะรันไทม์
  • ฟังก์ชั่นห้องสมุดใหม่
    • ฟังก์ชัน "Iterators.flatmap" ใหม่
    • ใหม่ "pkgversion(m::Module)" เพื่อรับเวอร์ชันของแพ็คเกจที่โหลดโมดูลที่กำหนด ซึ่งคล้ายกับ "pkgdir(m::Module)"
    • ฟังก์ชัน "stack(x)" ใหม่ที่ทำให้ "reduce(hcat, x::Vector{<:Vector})" เป็นแบบทั่วไปในทุกมิติและอนุญาตให้มีตัววนซ้ำของตัววนซ้ำ เมธอด "stack(f, x)" สรุป "mapreduce(f, hcat, x)" และมีประสิทธิภาพมากขึ้น
    • มาโครใหม่สำหรับการแยกวิเคราะห์หน่วยความจำที่จัดสรร "@allocations" ซึ่งคล้ายกับ "@allocated" ยกเว้นว่าจะส่งคืนจำนวนของการจัดสรรหน่วยความจำ ไม่ใช่ขนาดรวมของหน่วยความจำที่จัดสรร
  • คุณสมบัติใหม่ของห้องสมุด
    • ขณะนี้ "RoundFromZero" ใช้ได้กับประเภทอื่นที่ไม่ใช่ "BigFloat"
    • "Dict" สามารถลดขนาดด้วยตนเองได้ด้วย "sizehint!"
    • "@time" แยกระบุเปอร์เซ็นต์ของเวลาที่ใช้ในการคอมไพล์เมธอดที่ไม่ถูกต้องอีกครั้ง
  • การเปลี่ยนแปลงในไลบรารีมาตรฐาน
    • แก้ไขปัญหาการทำงานพร้อมกันในวิธีการวนซ้ำสำหรับ Dict และอ็อบเจกต์ที่ได้รับมาอื่นๆ เช่น คีย์(::Dict), ค่า(::Dict) และ Set วิธีการวนซ้ำเหล่านี้สามารถเรียกใช้บน Dict หรือตั้งค่าแบบขนานบนเธรดได้ไม่จำกัดจำนวน ตราบเท่าที่ไม่มีการดำเนินการใด ๆ ที่แก้ไขพจนานุกรมหรือชุด
    • การลบล้างฟังก์ชันเพรดิเคต "!f" จะส่งกลับฟังก์ชันผสม "(!) ∘ f" แทนฟังก์ชันนิรนาม
    • ขณะนี้ฟังก์ชันการแบ่งส่วนมิติทำงานได้ในหลายมิติ: "eachslice", "eachrow" และ "eachcol" ส่งคืนอ็อบเจ็กต์ "Slices" ที่อนุญาตให้จัดส่งเพื่อให้วิธีการที่มีประสิทธิภาพมากขึ้น
    • เพิ่มมาโคร "@kwdef" ให้กับ API สาธารณะ
    • แก้ไขปัญหาเกี่ยวกับลำดับการดำเนินการใน "fld1"
    • ตอนนี้การเรียงลำดับจะคงที่ตามเวลาเสมอ (QuickSort ที่ออกแบบใหม่)
    • "Base.splat" ถูกส่งออกแล้ว ค่าที่ส่งคืนเป็นประเภท "Base.Splat" แทนที่จะเป็นฟังก์ชันที่ไม่ระบุชื่อ ซึ่งช่วยให้อนุมานได้อย่างสวยงาม
  • ผู้จัดการแพคเกจ
    • "ส่วนขยายแพ็คเกจ": รองรับการโหลดข้อมูลโค้ดจากแพ็คเกจอื่นที่โหลดในเซสชัน Julia แอปพลิเคชันคล้ายกับแพ็คเกจ "Requires.jl" แต่รองรับการคอมไพล์ล่วงหน้าและการกำหนดค่าที่รองรับ
  • ห้องสมุดพีชคณิตเชิงเส้น
    • เนื่องจากความเสี่ยงของความสับสนกับการหารแบบองค์ประกอบ วิธีการ "a / b" และ "b \ a" ที่มีสเกลาร์ "a" และเวกเตอร์ "b" ถูกลบออก ซึ่งเทียบเท่ากับ "a * pinv(b)"
    • ตอนนี้การโทร BLAS และ LAPACK ใช้ "libblastrampoline (LBT)" OpenBLAS ให้มาตามค่าเริ่มต้น แต่ไม่รองรับการสร้างอิมเมจระบบด้วยไลบรารี BLAS/LAPACK อื่น ขอแนะนำให้ใช้กลไก LBT เพื่อแทนที่ BLAS/LAPACK ด้วยไลบรารีชุดอื่นที่มีอยู่
    • "lu" รองรับกลยุทธ์การหมุนเมทริกซ์ "RowNonZero()" ใหม่ ซึ่งเลือกองค์ประกอบการหมุนที่ไม่ใช่ศูนย์ตัวแรกเพื่อใช้กับประเภทเลขคณิตใหม่และเพื่อวัตถุประสงค์ทางการศึกษา
    • "ทำให้เป็นมาตรฐาน(x, p=2)" ตอนนี้รองรับปริภูมิเวกเตอร์ที่ทำให้เป็นมาตรฐาน "x" รวมทั้งสเกลาร์
    • จำนวนเธรดเริ่มต้นของ BLAS เท่ากับจำนวนเธรด CPU บนสถาปัตยกรรม ARM และครึ่งหนึ่งของจำนวนเธรด CPU บนสถาปัตยกรรมอื่น
  • Printf: แก้ไขข้อความแสดงข้อผิดพลาดสำหรับสตริงที่มีรูปแบบไม่ถูกต้องเพื่อให้สามารถอ่านได้ดีขึ้น
  • โปรไฟล์: ฟังก์ชัน "Profile.take_heap_snapshot(file)" ใหม่ที่จับภาพไฟล์ในรูปแบบ ".heapsnapshot" ที่ใช้ JSON ซึ่งรองรับโดย Chrome
  • สุ่ม: ตอนนี้ randn และ randexp ใช้งานได้กับประเภท AbstractFloat ใด ๆ ที่กำหนดแรนด์
  • ตัวแทน
    • การกดคีย์ผสม "Alt-e" จะเป็นการเปิดอินพุตปัจจุบันในตัวแก้ไข เนื้อหา (หากมีการเปลี่ยนแปลง) จะถูกดำเนินการเมื่อตัวแก้ไขออก
    • บริบทของโมดูลปัจจุบันที่ใช้งานอยู่ใน REPL สามารถเปลี่ยนแปลงได้ (โดยค่าเริ่มต้นคือ Main) โดยใช้ฟังก์ชัน "REPL.activate(::Module)" หรือโดยการป้อนโมดูลใน REPL แล้วกดปุ่ม "Alt-m" การผสมผสาน.
    • โหมด "พรอมต์ตัวเลข" ซึ่งพิมพ์ตัวเลขสำหรับแต่ละอินพุตและเอาต์พุต และจัดเก็บผลลัพธ์ที่ประเมินไว้ใน Out สามารถเปิดใช้งานได้ด้วย "REPL.numbered_prompt!()"
    • การเติมแท็บให้สมบูรณ์จะแสดงอาร์กิวเมนต์ของคำหลักที่มีอยู่
  • SuiteSparse: ย้ายรหัสสำหรับตัวแก้ "SuiteSparse" เป็น "SparseArrays.jl" ตอนนี้โปรแกรมแก้ปัญหาถูกส่งออกอีกครั้งโดย "SuiteSparse.jl"
  • อาร์เรย์ที่กระจัดกระจาย
    • ขณะนี้ตัวแก้ปัญหา SuiteSparse พร้อมใช้งานในรูปแบบโมดูลย่อยของ SparseArrays
    • โหมดการป้องกันสตรีม UMFPACK และ CHOLMOD ได้รับการปรับปรุงโดยการกำจัดตัวแปรส่วนกลางและใช้การล็อก มัลติเธรด "ldiv!" ขณะนี้วัตถุ UMFPACK สามารถดำเนินการได้อย่างปลอดภัย
    • ฟังก์ชันการทดลอง "SparseArrays.allowscalar(::Bool)" ช่วยให้คุณสามารถปิดใช้งานหรือเปิดใช้งานการจัดทำดัชนีสเกลาร์ของอาร์เรย์แบบกระจาย ฟังก์ชันนี้ออกแบบมาเพื่อตรวจหาการสร้างดัชนีสเกลาร์แบบสุ่มของอ็อบเจ็กต์ "SparseMatrixCSC" ซึ่งเป็นสาเหตุทั่วไปของปัญหาด้านประสิทธิภาพ
  • โหมดเฟลโอเวอร์ใหม่สำหรับชุดทดสอบที่จะยุติการทดสอบก่อนกำหนดในกรณีที่เกิดความล้มเหลวหรือข้อผิดพลาด ตั้งค่าผ่าน "@testset kwarg failfast=true" หรือ "export JULIA_TEST_FAILFAST=true" นี่อาจจำเป็นในการเปิดใช้ CI เพื่อรับข้อความแสดงข้อผิดพลาดล่วงหน้า
  • วันที่: สตริงว่างจะไม่แยกวิเคราะห์อย่างไม่ถูกต้องเป็นค่า "วันที่เวลา", "วันที่" หรือ "เวลา" ที่ถูกต้องอีกต่อไป และแทนที่จะส่งข้อผิดพลาด "ArgumentError" ในตัวสร้างและการแยกวิเคราะห์ ในขณะที่ "tryparse" จะไม่ส่งคืนอะไรเลย
  • แพคเกจกระจาย
    • การกำหนดค่าแพ็คเกจ (โปรเจ็กต์ที่ใช้งานอยู่, "LOAD_PATH", "DEPOT_PATH") ได้รับการเผยแพร่เมื่อมีการเพิ่มกระบวนการของผู้ปฏิบัติงานในพื้นที่ (เช่น ด้วย "addprocs(N::Int)" หรือด้วยแฟล็กบรรทัดคำสั่ง "-procs=N")
    • ขณะนี้ "addprocs" สำหรับกระบวนการของผู้ปฏิบัติงานในพื้นที่ใช้อาร์กิวเมนต์ชื่อ "env" เพื่อส่งตัวแปรสภาพแวดล้อมไปยังกระบวนการของผู้ปฏิบัติงาน
  • Unicode: "graphemes(s, m:n)" ส่งกลับสตริงย่อยจากกราฟ mth ถึง nth ใน "s"
  • แพคเกจ DelimitedFiles ถูกลบออกจากไลบรารีระบบและขณะนี้มีการแจกจ่ายเป็นแพคเกจแยกต่างหากที่ต้องติดตั้งอย่างชัดเจนจึงจะใช้งานได้
  • การพึ่งพาภายนอก
    • Linux จะตรวจหาเวอร์ชันของไลบรารีระบบ libstdc++ โดยอัตโนมัติและโหลดเวอร์ชันนั้นหากเป็นเวอร์ชันที่ใหม่กว่า พฤติกรรมเก่าของการโหลด libstdc++ ในตัวโดยไม่คำนึงถึงเวอร์ชันของระบบสามารถกู้คืนได้โดยการตั้งค่าตัวแปรสภาพแวดล้อม "JULIA_PROBE_LIBSTDCXX=0"
    • ลบ "RPATH" ออกจากไบนารีของจูเลีย ซึ่งสามารถแบ่งไลบรารีบน Linux ที่ไม่สามารถกำหนดตัวแปร "RUNPATH" ได้
    • การปรับปรุงเครื่องมือ: ขณะนี้ เอาต์พุตของ "MethodError" และเมธอด (เช่น จาก "เมธอด (my_func)") ได้รับการจัดรูปแบบและกำหนดสีตามวิธีเอาต์พุตของเมธอดในสแต็กเทรซ

    ที่มา: opennet.ru

เพิ่มความคิดเห็น