Julia 1.8 dasturlash tilining chiqarilishi

Julia 1.8 dasturlash tilining chiqarilishi mavjud bo'lib, u yuqori unumdorlik, dinamik yozishni qo'llab-quvvatlash va parallel dasturlash uchun o'rnatilgan vositalar kabi fazilatlarni birlashtiradi. Julia sintaksisi MATLAB ga yaqin bo'lib, Ruby va Lisp dan ba'zi elementlarni oladi. String manipulyatsiyasi usuli Perlni eslatadi. Loyiha kodi MIT litsenziyasi ostida tarqatiladi.

Tilning asosiy xususiyatlari:

  • Yuqori samaradorlik: loyihaning asosiy maqsadlaridan biri C dasturlariga yaqin ishlashga erishishdir. Julia kompilyatori LLVM loyihasiga asoslangan va ko'plab maqsadli platformalar uchun samarali mahalliy mashina kodini yaratadi;
  • Turli xil dasturlash paradigmalarini, shu jumladan ob'ektga yo'naltirilgan va funktsional dasturlash elementlarini qo'llab-quvvatlash. Standart kutubxona boshqa narsalar qatorida asinxron kiritish-chiqarish, jarayonni boshqarish, jurnalga yozish, profil yaratish va paketlarni boshqarish funksiyalarini taqdim etadi;
  • Dinamik yozish: til skript dasturlash tillariga o'xshab, o'zgaruvchilar turlarini aniq belgilashni talab qilmaydi. Interaktiv rejimni qo'llab-quvvatlaydi;
  • Turlarni aniq belgilashning ixtiyoriy qobiliyati;
  • Raqamli hisoblar, ilmiy hisoblar, mashinalarni o'rganish tizimlari va ma'lumotlarni vizualizatsiya qilish uchun juda yaxshi sintaksis. Ko'p sonli ma'lumotlar turlarini va hisoblarni parallellashtirish vositalarini qo'llab-quvvatlash.
  • Qo'shimcha qatlamlarsiz C kutubxonalaridan funktsiyalarni to'g'ridan-to'g'ri chaqirish imkoniyati.

Julia 1.8 dagi asosiy o'zgarishlar:

  • Yangi til xususiyatlari
    • O'zgaruvchan strukturaning maydonlari endi ularni o'zgartirishning oldini olish va optimallashtirishga imkon berish uchun konstantalar sifatida izohlanishi mumkin.
    • Global o'zgaruvchilarga turdagi izohlar qo'shilishi mumkin.
    • Bo'sh n o'lchovli massivlar kvadrat qavslar ichidagi bir nechta nuqta-vergul yordamida yaratilishi mumkin, masalan, "[;;;]" 0x0x0 massivini yaratadi.
    • Sinab ko'ring bloklari endi ixtiyoriy ravishda else blokiga ega bo'lishi mumkin, agar hech qanday xato bo'lmasa, u asosiy qismdan keyin darhol bajariladi.
    • @inline va @noinline funksiya tanasi ichiga joylashtirilishi mumkin, bu sizga anonim funksiyaga izoh qoldirish imkonini beradi.
    • @inline va @noinline endi qo'ng'iroq saytida yoki blokidagi funktsiyaga tegishli funksiya chaqiruvlarini kiritishga (yoki qo'shilmaydi) majburlash uchun qo'llanilishi mumkin.
    • ∀, ∃ va ∄ identifikator belgilar sifatida ruxsat etiladi.
    • Unicode 14.0.0 spetsifikatsiyasi uchun qo'shimcha qo'llab-quvvatlash.
    • Module(:name, false, false) usulidan nomlar boʻlmagan, Base yoki Core import qilinmaydigan va oʻziga havola boʻlmagan modul yaratish uchun foydalanish mumkin.
  • Tildagi o'zgarishlar
    • Yangi yaratilgan Vazifa ob'ektlari (@spawn, @async va boshqalar) endi yaratilganda asosiy vazifaning usullari uchun world_age ga ega bo'lib, optimallashtirilgan bajarilishini ta'minlaydi. Oldingi faollashtirish opsiyasi Base.invokelatest usuli yordamida mavjud.
    • Unicode balanssiz ikki tomonlama formatlash direktivalari endi in'ektsiyalarni oldini olish uchun satrlar va sharhlarda taqiqlangan.
    • Base.ifelse endi o'rnatilgan emas, balki umumiy funksiya sifatida belgilanadi, bu paketlarga uning ta'rifini kengaytirish imkonini beradi.
    • Global oʻzgaruvchiga berilgan har bir tayinlash, agar global oʻzgaruvchi T turi deb eʼlon qilingan boʻlsa, konvertatsiya qilish (Any, x) yoki aylantirish (T, x) chaqiruvidan oʻtadi. Global oʻzgaruvchilardan foydalanishdan oldin, oʻzgarmas konvertatsiya (Any) ga ishonch hosil qiling. , x) === x har doim to'g'ri, aks holda bu kutilmagan xatti-harakatlarga olib kelishi mumkin.
    • O'rnatilgan funksiyalar endi umumiy funktsiyalarga o'xshaydi va ularni usullar yordamida dasturiy jihatdan sanab o'tish mumkin.
  • Kompilyator/ish vaqti yaxshilanishi
    • Yuklash vaqti taxminan 25% ga qisqardi.
    • LLVM-ga asoslangan kompilyator ish vaqti kutubxonasidan libjulia-codegen nomli yangi kutubxonaga ajratilgan. U sukut bo'yicha yuklanadi, shuning uchun oddiy foydalanish paytida hech qanday o'zgarishlar bo'lmasligi kerak. Kompilyatorga muhtoj bo'lmagan joylashtirishlarda (masalan, barcha kerakli kodlar oldindan kompilyatsiya qilingan tizim tasvirlari) bu kutubxonani (va uning LLVMga bog'liqligini) shunchaki o'tkazib yuborish mumkin.
    • Shartli turdagi xulosa chiqarish endi argumentni usulga o'tkazish orqali mumkin. Masalan, Base.ifelse(isa(x, Int) uchun x, 0) ::Int ni qaytaradi, hatto x ning turi noma'lum bo'lsa ham.
    • SROA (Aggregatlarning skalar almashinuvi) yaxshilandi: doimiy global maydonlar bilan getfield qo'ng'iroqlarini yo'q qiladi, ishga tushirilmagan maydonlar bilan o'zgaruvchan tuzilmalarni yo'q qiladi, ichki getfield qo'ng'iroqlarining ishlashi va ishlashini yaxshilaydi.
    • Turi xulosasi turli effektlarni kuzatib boradi - yon ta'sirlar va tushmaslik. Doimiy tarqalish hisobga olinadi, bu kompilyatsiya vaqtini sezilarli darajada yaxshilaydi. Ba'zi hollarda, masalan, kiritilishi mumkin bo'lmagan, ammo natijaga ta'sir qilmaydigan funktsiyalarga qo'ng'iroqlar ish vaqtida o'chiriladi. Effektlar uchun qoidalar Base.@assume_effects makrosidan foydalanib, qo'lda qayta yozilishi mumkin.
    • Oldindan kompilyatsiya (aniq kompilyatsiya direktivalari yoki belgilangan ish yuklari bilan) endi ko'proq turdagi aniqlangan kodni saqlaydi, bu esa birinchi marta tezroq bajarilishiga olib keladi. Paketingizga kerak bo'lgan har qanday yangi usul/turdagi kombinatsiyalar, bu usullar qayerda aniqlanganidan qat'i nazar, agar ular paketingizga tegishli usul bilan chaqirilgan bo'lsa, endi oldindan kompilyatsiya faylida keshlanishi mumkin.
  • Buyruqlar qatori parametrlari o'zgaradi
    • @inbounds deklaratsiyalarini kuzatish uchun standart xatti-harakat endi "--check-bounds=yes|no|auto" ichidagi avtomatik parametrdir.
    • Tizim tasvirini yaratishda docstrings, manba joylashuvi ma'lumotlari va mahalliy o'zgaruvchilar nomlarini olib tashlash uchun yangi "--strip-metadata" opsiyasi.
    • Yangi "--strip-ir" opsiyasi kompilyatorga tizim tasvirini yaratishda oraliq manba kodi tasvirini olib tashlash imkonini beradi. Olingan rasm faqat "--compile=all" ishlatilsa yoki barcha kerakli kod oldindan kompilyatsiya qilingan bo'lsa ishlaydi.
    • Agar fayl nomi o'rniga "-" belgisi ko'rsatilgan bo'lsa, unda bajariladigan kod standart kirish oqimidan o'qiladi.
  • Multithreading qo'llab-quvvatlash o'zgarishlar
    • Threads.@threads sukut bo'yicha yangi rejalashtirish opsiyasidan foydalanadi :dynamic, bu avvalgi rejimdan farq qiladi, chunki iteratsiyalar har bir mavzuga tayinlanmasdan, mavjud ishchi ish zarrachalari bo'ylab dinamik tarzda rejalashtiriladi. Ushbu rejim @spawn va @threads bilan ichki o'rnatilgan halqalarni yaxshiroq taqsimlash imkonini beradi.
  • Yangi kutubxona funktsiyalari
    • split(str) ni bir necha marta bajarish uchun everysplit(str).
    • iteratordagi barcha elementlar teng yoki yo'qligini tekshirish uchun allequal(itr).
    • qattiq havolalar yaratish uchun hardlink(src, dst) dan foydalanish mumkin.
    • setcpuaffinity(cmd, cpus) protsessor yadrosining ishga tushirilgan jarayonlarga yaqinligini o'rnatish uchun.
    • Disk statistikasini olish uchun diskstat(path=pwd()).
    • Baholanayotgan qatorni ham, @vaqt hisobotini ham ko'rsatish uchun yangi @showtime makros.
    • Xato yo'llarida xato xabarlarini dangasa tuzishni qo'llab-quvvatlash uchun LazyString va lazy "str" ​​makrosi qo'shildi.
    • Dict va kalitlar(::Dict), qiymatlar(::Dict) va Set kabi boshqa olingan ob'ektlardagi parallellik muammosi tuzatildi. Endi lug'at yoki to'plamni o'zgartiruvchi qo'ng'iroqlar bo'lmasa, iteratsiya usullarini chaqirish mumkin.
    • @time va @timev endi ixtiyoriy tavsifga ega bo'lib, masalan, vaqt hisobotlari manbasiga izoh qo'shish imkonini beradi. @time "foo baholanmoqda" foo().
    • diapazon o'zining yagona kalit so'z argumenti sifatida to'xtash yoki uzunlikni oladi.
    • precision va setprecision endi bazani kalit so'z sifatida qabul qiladi
    • TCP soket ob'ektlari endi yopish yozish usulini taqdim etadi va yarim ochiq rejimdan foydalanishni qo'llab-quvvatlaydi.
    • extrema endi init argumentini qabul qiladi.
    • Iterators.countfrom endi + usulini belgilaydigan har qanday turni qabul qiladi.
    • @time endi o'zgartirilgan turlar bilan usullarni qayta kompilyatsiya qilish uchun sarflangan% vaqtni ajratadi.
  • Standart kutubxona o'zgarishlari
    • Qiymati bo'lgan kalitlar Endi addenv ichidagi muhitdan hech narsa olib tashlanmaydi.
    • Iterators.reverse (va shuning uchun oxirgi) har bir qatorni qo'llab-quvvatlaydi.
    • Muayyan turdagi diapazonlar uchun uzunlik funksiyasi endi butun sonlar to‘lib ketishini tekshirmaydi. Checked_length nomli yangi funksiya mavjud; unda bit uzatishni boshqarish mantiqi mavjud. Agar kerak bo'lsa, diapazon turini yaratish uchun SaferIntegers.jl dan foydalaning.
    • Iterators.Reverse iteratori iloji bo'lsa, har bir indeksni o'zgartirishni amalga oshiradi.
  • Paket menejeri
    • Yangi versiyalari mavjud boʻlgan “pkg>” holatidagi paketlar yonidagi yangi ⌃ va ⌅ koʻrsatkichlari. ⌅ yangi versiyalarni o'rnatib bo'lmasligini bildiradi.
    • Oldingi versiyalardagi paketlar haqidagi ma'lumotlarni ko'rsatish uchun Pkg.status (--eskirgan yoki REPL rejimida -o) ga yangi eskirgan::Bool argumenti.
    • Project.toml da har qanday [mos] yozuvlarni ko'rsatish uchun Pkg.status (REPL rejimida --compat yoki -c) uchun yangi compat::Bool argumenti.
    • Loyiha muvofiqligi yozuvlarini sozlash uchun yangi "pkg>compat" (va Pkg.compat) rejimi. "pkg>compat" orqali interaktiv muharrirni yoki "pkg>Foo 0.4,0.5" orqali to'g'ridan-to'g'ri yozuvlarni boshqarishni ta'minlaydi, bu yorliqlarni to'ldirish orqali joriy yozuvlarni yuklashi mumkin. Ya'ni, mavjud yozuvni tahrirlash uchun "pkg> compat Fo" avtomatik ravishda "pkg> Foo 0.4,0.5" ga yangilanadi.
    • Pkg endi faqat server paketni o'z ichiga olgan registrni kuzatayotgan bo'lsa, paketlarni serverdan yuklab olishga harakat qiladi.
    • Pkg.instantiate endi Project.toml Manifest.toml bilan sinxronlanmaganida ogohlantirish beradi. U buni hal qilishda manifestdagi loyiha maʼlumotlar bazasi va mos yozuvlar xeshiga (boshqa maydonlar eʼtiborga olinmaydi) asoslanib amalga oshiradi, shunda Project.toml deps yoki mos yozuvlardagi har qanday oʻzgarishlar qayta hal qilinmasdan aniqlanishi mumkin.
    • Agar "pkg>add" ko'rsatilgan nomli paketni topa olmasa, u endi qo'shilishi mumkin bo'lgan o'xshash nomli paketlarni taklif qiladi.
    • Manifestda saqlangan julia versiyasi endi qurilish raqamini o'z ichiga olmaydi, ya'ni master endi 1.9.0-DEV sifatida yoziladi.
    • "pkg>" testini bekor qilish endi aniqroq aniqlanadi va REPLga to'g'ri qaytariladi.
  • InteractiveUtils
    • Yangi @time_imports makros paketlarni import qilish va ularning bog'liqliklarini import qilish uchun sarflangan vaqtni hisobot qilish uchun kompilyatsiya va qayta kompilyatsiya vaqtini importning foizi sifatida ta'kidlaydi.
  • Chiziqli algebra
    • BLAS submodul endi 2-darajali BLAS spr! funksiyalarini qo‘llab-quvvatlaydi.
    • LinearAlgebra.jl standart kutubxonasi endi SparseArrays.jl dan butunlay mustaqil, ham manba kodi, ham birlik testi nuqtai nazaridan. Natijada, Base yoki LinearAlgebra ob'ektlariga qo'llaniladigan LinearAlgebra usullari bilan siyrak massivlar endi (so'zsiz) qaytarilmaydi. Xususan, bu quyidagi keskin o'zgarishlarga olib keladi:
      • Maxsus "siyrak" matritsalar (masalan, diagonal) yordamida birlashmalar endi zich matritsalarni qaytaradi; Natijada, getproperty chaqiruvlari orqali yaratilgan SVD obyektlarining D1 va D2 maydonlari endi zich matritsalardir.
      • O'xshash(::SpecialSparseMatrix, ::Type, ::Dims) usuli zich null matritsani qaytaradi. Natijada, ikki, uch va simmetrik tridiagonal matritsalarning bir-biri bilan hosilalari zich matritsaning hosil bo'lishiga olib keladi. Bundan tashqari, (statik bo'lmagan) matritsalardan maxsus "siyrak" matritsalardan uchta argument bilan o'xshash matritsalarni qurish endi "nol(::Type{Matrix{T}})" tufayli muvaffaqiyatsiz tugadi.
  • Printf
    • %s va %c endi kenglikni formatlash uchun matn kengligi argumentidan foydalanadi.
  • Profil
    • Protsessor yukini profillash endi metadata, shu jumladan mavzular va vazifalarni yozib oladi. Profile.print() yangi groupby argumentiga ega bo'lib, u sizga filtrlashni ta'minlash uchun mavzularni, vazifalarni yoki pastki mavzularni/topshiriqlarni, vazifalarni/mavzularni va mavzular va vazifalar argumentlarini guruhlash imkonini beradi. Bundan tashqari, foydalanish foizi endi har bir namunada ipning bo'sh yoki bo'lmasligiga qarab umumiy yoki har bir ip sifatida xabar qilinadi. Profile.fetch() sukut bo'yicha yangi metama'lumotlarni o'z ichiga oladi. Profil ma'lumotlarining tashqi iste'molchilari bilan orqaga qarab muvofiqligi uchun, include_meta=false ni o'tkazish orqali uni chiqarib tashlash mumkin.
    • Yangi Profile.Allocs moduli xotira taqsimotlarini profillash imkonini beradi. Har bir xotira taqsimotining turi va hajmining stek izi qayd etiladi va sample_rate argumenti sozlanishi mumkin bo'lgan sonli ajratishni o'tkazib yuborishga imkon beradi, bu esa unumdorlikni kamaytiradi.
    • Ruxsat etilgan davomiylik protsessor profilini endi foydalanuvchi vazifalarni bajarayotganda, profilni avval yuklamasdan ishga tushirishi mumkin va hisobot ishlayotgan vaqtda ko'rsatiladi. MacOS va FreeBSD-da ctrl-t tugmasini bosing yoki SIGINFO-ga qo'ng'iroq qiling. Boshqa platformalar uchun SIGUSR1 ni faollashtiring, ya'ni. % o'ldirish -USR1 $julia_pid. Bu Windows tizimida mavjud emas.
  • REPL
    • RadioMenu endi variantlarni to'g'ridan-to'g'ri tanlash uchun qo'shimcha klaviatura yorliqlarini qo'llab-quvvatlaydi.
    • “?(x, y” ketma-ketligi va TAB tugmasini bosish x, y, ... argumentlari bilan chaqirilishi mumkin bo'lgan barcha usullarni ko'rsatadi. (Bosh joy yordam rejimiga kirishga to'sqinlik qiladi.) "MyModule.?(x, y " qidiruvni "MyModule" bilan cheklaydi. TAB tugmasini bosish kamida bitta argument Har qandayidan aniqroq turdagi bo'lishini talab qiladi. Yoki har qanday mos usullarga ruxsat berish uchun TAB o'rniga SHIFT-TAB tugmasidan foydalaning.
    • Yangi global o'zgaruvchi err sizga oxirgi javob bilan ans xatti-harakatiga o'xshash oxirgi istisnoni olish imkonini beradi. Xatoni kiritish istisno ma'lumotlarini qayta chop etadi.
  • SparseArrays
    • SparseArrays kodini Julia omboridan tashqi SparseArrays.jl omboriga ko'chirdi.
    • Yangi biriktiruvchi funksiyalar sparse_hcat, sparse_vcat va sparse_hvcat kiritish argumentlarining turlaridan qat'iy nazar SparseMatrixCSC turini qaytaradi. Bu LinearAlgebra.jl va SparseArrays.jl kodlarini ajratgandan so'ng matritsalarni yopishtirish mexanizmini birlashtirish uchun zarur bo'ldi.
  • Ro'yxatga olish
    • BelowMinLevel, Debug, Info, Warn, Error va AboveMaxLevel standart logging darajalari endi standart Logging kutubxonasidan eksport qilinadi.
  • Unicode
    • Oddiylashtirilgan satrlarni aniq tuzmasdan Unicode ekvivalentligini tekshirish uchun isequal_normalized funksiyasi qo'shildi.
    • Unicode.normalize funksiyasi endi charttransform kalit so'zini qabul qiladi, undan maxsus belgilar xaritalarini taqdim etish uchun foydalanish mumkin va Unicode.julia_chartransform funksiyasi Julia tahlilchisi identifikatorlarni normallashtirganda foydalaniladigan xaritani takrorlash uchun ham taqdim etiladi.
  • sinov
    • '@test_throws "ba'zi xabar" triggers_error()' endi maxsus istisno turidan qat'i nazar, ko'rsatilgan xato matnida "ba'zi xabar" xatosi mavjudligini tekshirish uchun ishlatilishi mumkin. Oddiy iboralar, qatorlar ro'yxati va mos keladigan funktsiyalar ham qo'llab-quvvatlanadi.
    • @testset foo() endi berilgan funksiyadan test majmuasini yaratish uchun ishlatilishi mumkin. Sinov ishi nomi chaqirilayotgan funksiyaning nomidir. Chaqiriladigan funksiya barcha oraliq test natijalarini yozib olishda @test va boshqa @testset taʼriflarini oʻz ichiga olishi mumkin, shu jumladan boshqa funksiyalarga qoʻngʻiroqlar uchun.
    • TestLogger va LogRecord endi standart Test kutubxonasidan eksport qilinadi.
  • Tarqatilgan
    • SSHManager endi addprocs() usuli va shell=:csh parametri orqali csh/tcsh wrapper bilan ishchi iplarni qo'llab-quvvatlaydi.
  • Boshqa o'zgarishlar
    • GC.enable_logging(true) har bir axlat yig'ish operatsiyasini yig'ilgan vaqt va xotira miqdori bilan qayd qilish uchun ishlatilishi mumkin.

Manba: opennet.ru

a Izoh qo'shish