Julia Proqramlaşdırma Dili 1.8 Buraxılışı

Julia 1.8 proqramlaşdırma dilinin buraxılışı mövcuddur, o, yüksək performans, dinamik yazma dəstəyi və paralel proqramlaşdırma üçün quraşdırılmış alətlər kimi keyfiyyətləri özündə birləşdirir. Julia sintaksisi Ruby və Lisp-dən bəzi elementləri götürərək MATLAB-a yaxındır. Simli manipulyasiya üsulu Perl-i xatırladır. Layihə kodu MIT lisenziyası altında paylanır.

Dilin əsas xüsusiyyətləri:

  • Yüksək performans: layihənin əsas məqsədlərindən biri C proqramlarına yaxın performansa nail olmaqdır. Julia kompilyatoru LLVM layihəsinə əsaslanır və bir çox hədəf platformalar üçün səmərəli yerli maşın kodu yaradır;
  • Obyekt yönümlü və funksional proqramlaşdırma elementləri daxil olmaqla müxtəlif proqramlaşdırma paradiqmalarına dəstək. Standart kitabxana digər şeylər arasında asinxron I/O, prosesin idarə edilməsi, giriş, profilləşdirmə və paketin idarə edilməsi funksiyalarını təmin edir;
  • Dinamik yazım: Dil skript proqramlaşdırma dilləri ilə analoji olaraq dəyişənlər üçün növlərin açıq tərifini tələb etmir. İnteraktiv rejimi dəstəkləyir;
  • Növləri açıq şəkildə təyin etmək imkanı;
  • Ədədi hesablamalar, elmi hesablamalar, maşın öyrənmə sistemləri və məlumatların vizuallaşdırılması üçün əla sintaksis. Hesablamaları paralelləşdirmək üçün bir çox rəqəmsal məlumat növləri və alətləri üçün dəstək.
  • Əlavə təbəqələr olmadan birbaşa C kitabxanalarından funksiyaları çağırmaq imkanı.

Julia 1.8-də əsas dəyişikliklər:

  • Yeni dil xüsusiyyətləri
    • Dəyişən strukturun sahələri indi onların dəyişdirilməsinin qarşısını almaq və optimallaşdırmağa imkan vermək üçün sabitlər kimi qeyd edilə bilər.
    • Tip annotasiyaları qlobal dəyişənlərə əlavə edilə bilər.
    • Boş n ölçülü massivlər kvadrat mötərizədə çoxlu nöqtəli vergüllərdən istifadə etməklə yaradıla bilər, məsələn, "[;;;]" 0x0x0 massivi yaradır.
    • Sınaq blokları indi isteğe bağlı olaraq başqa bloka malik ola bilər, hansı ki, heç bir səhv atılmadıqda, əsas hissədən dərhal sonra yerinə yetirilir.
    • @inline və @noinline funksiya gövdəsinin içərisinə yerləşdirilə bilər ki, bu da sizə anonim funksiyaya şərh əlavə etməyə imkan verir.
    • @inline və @noinline indi müvafiq funksiya çağırışlarının daxil edilməsinə (və ya daxil edilməməsinə) məcbur etmək üçün zəng saytında və ya blokda funksiyaya tətbiq oluna bilər.
    • ∀, ∃ və ∄ identifikator simvolları kimi icazə verilir.
    • Unicode 14.0.0 spesifikasiyası üçün əlavə dəstək.
    • Module(:name, false, false) metodu adları olmayan, Base və ya Core idxal etməyən və özünə istinadı olmayan modul yaratmaq üçün istifadə edilə bilər.
  • Dil dəyişiklikləri
    • Yeni yaradılmış Tapşırıq obyektləri (@spawn, @async və s.) yaradılmış zaman ana Tapşırığın metodları üçün dünya_yaşına malikdir və optimallaşdırılmış icraya imkan verir. Əvvəlki aktivləşdirmə seçimi Base.invokelatest metodundan istifadə etməklə mümkündür.
    • Unicode balanssız iki istiqamətli formatlaşdırma direktivləri indi inyeksiyaların qarşısını almaq üçün sətirlərdə və şərhlərdə qadağandır.
    • İndi Base.ifelse paketlərə onun tərifini genişləndirməyə imkan verən daxili funksiya deyil, ümumi funksiya kimi müəyyən edilir.
    • Qlobal dəyişənə verilən hər bir tapşırıq indi ilk olaraq çevirmə(Hər hansı, x) və ya çevirmə(T, x) çağırışından keçir, əgər qlobal dəyişən T tipli olduğu elan edilibsə. Qlobal dəyişənlərdən istifadə etməzdən əvvəl invariant çevirmənin(Hər hansı) olduğundan əmin olun. , x) === x həmişə doğrudur, əks halda gözlənilməz davranışa səbəb ola bilər.
    • Quraşdırılmış funksiyalar indi ümumi funksiyalara bənzəyir və metodlardan istifadə edərək proqramlı olaraq sadalana bilər.
  • Kompilyator/Runtime Təkmilləşdirmələri
    • Yükləmə vaxtı təxminən 25% azaldı.
    • LLVM əsaslı kompilyator iş vaxtı kitabxanasından yeni kitabxanaya, libjulia-codegen-ə ayrıldı. O, standart olaraq yüklənir, ona görə də normal istifadə zamanı heç bir dəyişiklik olmamalıdır. Kompilyatora ehtiyacı olmayan yerləşdirmələrdə (məsələn, bütün lazımi kodun əvvəlcədən tərtib edildiyi sistem şəkilləri) bu kitabxana (və onun LLVM asılılığı) sadəcə olaraq buraxıla bilər.
    • Şərti tipli nəticə artıq bir arqumenti metoda ötürməklə mümkündür. Məsələn, Base.ifelse(isa(x, Int) üçün x, 0) ::Int-i qaytarır, hətta x-in növü bilinmir.
    • SROA (Aqreqatların Skalar Dəyişdirilməsi) təkmilləşdirilmişdir: davamlı qlobal sahələrlə getfield zənglərini aradan qaldırır, işə salınmamış sahələrlə dəyişən strukturları aradan qaldırır, daxili getfield zənglərinin performansını və işlənməsini yaxşılaşdırır.
    • Növün nəticəsi müxtəlif effektləri izləyir - yan təsirlər və düşmə. Daimi yayılma nəzərə alınır ki, bu da kompilyasiya vaxtı performansını əhəmiyyətli dərəcədə yaxşılaşdırır. Bəzi hallarda, məsələn, daxil edilə bilməyən, lakin nəticəyə təsir etməyən funksiyalara edilən zənglər icra zamanı ləğv ediləcək. Effekt qaydaları Base.@assume_effects makrosundan istifadə etməklə əl ilə yazıla bilər.
    • Əvvəlcədən tərtibetmə (açıq ilkin tərtib direktivləri və ya müəyyən iş yükləri ilə) indi daha çox tip müəyyən edilmiş kodu saxlayır və nəticədə ilk dəfə daha sürətli icra edilir. Paketinizə lazım olan hər hansı yeni metod/tip kombinasiyaları, bu metodların harada təyin olunduğundan asılı olmayaraq, indi paketinizə aid metodla çağırılırsa, əvvəlcədən kompilyasiya faylında yaddaşda saxlanıla bilər.
  • Komanda xətti parametrləri dəyişir
    • @inbounds bəyannamələrinin monitorinqi üçün standart davranış indi "--check-bounds=yes|no|auto"-da avtomatik seçimdir.
    • Sistem şəklini yaratarkən sənəd sətirlərini, mənbə yeri məlumatını və yerli dəyişən adlarını silmək üçün yeni "--strip-metadata" seçimi.
    • Yeni seçim "--strip-ir" sistem şəklini qurarkən kompilyatora aralıq mənbə kodu təqdimatını çıxarmağa imkan verir. Yaranan şəkil yalnız "--compile=all" istifadə edildikdə və ya bütün tələb olunan kod əvvəlcədən tərtib edildikdə işləyəcək.
    • Əgər fayl adı əvəzinə "-" işarəsi göstərilibsə, o zaman icra olunan kod standart giriş axınından oxunur.
  • Multithreading dəstəyi dəyişiklikləri
    • Threads.@threads defolt olaraq yeni planlaşdırma seçimindən istifadə edir :dinamik, bu əvvəlki rejimdən fərqli olaraq təkrarlamalar hər bir başlığa təyin edilməkdənsə, mövcud işçi mövzuları üzrə dinamik şəkildə planlaşdırılacaqdır. Bu rejim @spawn və @threads ilə iç-içə döngələrin daha yaxşı paylanmasına imkan verir.
  • Yeni kitabxana funksiyaları
    • split(str) funksiyasını bir neçə dəfə yerinə yetirmək üçün everysplit(str).
    • iteratordakı bütün elementlərin bərabər olub olmadığını yoxlamaq üçün allequal(itr).
    • hardlink(src, dst) sərt keçidlər yaratmaq üçün istifadə edilə bilər.
    • setcpuaffinity(cmd, cpus) prosessor nüvəsinin işə salınmış proseslərə yaxınlığını təyin etmək üçün.
    • disk statistikasını əldə etmək üçün diskstat(path=pwd()).
    • Həm qiymətləndirilən xətti, həm də @time hesabatını göstərmək üçün yeni @showtime makrosu.
    • Səhv yollarında səhv mesajlarının tənbəl qurulmasını dəstəkləmək üçün LazyString və lazy"str" ​​makro əlavə edilmişdir.
    • Dict və açarlar(::Dict), dəyərlər(::Dict) və Set kimi digər törəmə obyektlərdə paralellik problemi həll edildi. Lüğəti və ya dəsti dəyişdirən zənglər olmadığı müddətcə, iterasiya üsulları indi lüğətdə və ya dəstdə çağırıla bilər.
    • @time və @timev indi, məsələn, vaxt hesabatlarının mənbəyini qeyd etməyə imkan verən əlavə təsvirə malikdir. @time "Foo Qiymətləndirilir" foo().
    • diapazon yeganə açar söz arqumenti kimi ya stop, ya da uzunluq alır.
    • precision və setprecision indi bazanı açar söz kimi qəbul edir
    • TCP soket obyektləri indi bir bağlama metodu təqdim edir və yarı açıq rejimin istifadəsini dəstəkləyir.
    • extrema indi init arqumentini qəbul edir.
    • Iterators.countfrom indi + metodunu təyin edən istənilən növü qəbul edir.
    • @time indi dəyişdirilmiş növlərlə metodların yenidən tərtib edilməsinə sərf olunan vaxtın faizini ayırır.
  • Standart Kitabxana Dəyişiklikləri
    • Dəyəri olan açarlar İndi əlavədəki mühitdən heç nə silinməyib.
    • Iterators.reverse (və buna görə də sonuncu) hər sətri dəstəkləyir.
    • Müəyyən növ diapazonlar üçün uzunluq funksiyası artıq tam ədədlərin çoxalmasını yoxlayır. Checked_length adlı yeni funksiya mövcuddur. Lazım gələrsə, diapazon tipini qurmaq üçün SaferIntegers.jl-dən istifadə edin.
    • Iterators.Reverse iteratoru mümkün olduqda hər bir indeksin dəyişdirilməsini həyata keçirir.
  • Paket Meneceri
    • Yeni versiyaların mövcud olduğu “pkg>” statusunda paketlərin yanında yeni ⌃ və ⌅ göstəricilər. ⌅ göstərir ki, yeni versiyalar quraşdırıla bilməz.
    • Əvvəlki versiyalardakı paketlər haqqında məlumatı göstərmək üçün Pkg.status (- köhnəlmiş və ya REPL rejimində -o) üçün yeni köhnəlmiş::Bool arqumenti.
    • Project.toml-da hər hansı [uyğun] girişləri göstərmək üçün Pkg.status (--compat və ya -c REPL rejimində) üçün yeni compat::Bool arqumenti.
    • Layihə uyğunluğu qeydlərini təyin etmək üçün yeni "pkg>compat" (və Pkg.compat) rejimi. "pkg>compat" vasitəsilə interaktiv redaktor və ya "pkg>Foo 0.4,0.5" vasitəsilə birbaşa qeyd nəzarəti təmin edir, bu da cari qeydləri tab tamamlama vasitəsilə yükləyə bilər. Yəni "pkg> compat Fo ", mövcud girişin redaktə edilməsinə icazə vermək üçün avtomatik olaraq "pkg>Foo 0.4,0.5" olaraq yenilənir.
    • Pkg indi yalnız server paketi ehtiva edən reyestrə nəzarət edirsə, paket serverindən paketləri endirməyə cəhd edir.
    • Project.toml Manifest.toml ilə sinxronlaşmadıqda Pkg.instantiate indi xəbərdarlıq edəcək. O, bunu həll edərkən manifestdə layihənin deps və uyğun qeydlərinin (digər sahələr nəzərə alınmır) hash əsasında edir ki, Project.toml deps və ya uyğun qeydlərdə hər hansı dəyişiklik yenidən həll edilmədən aşkarlana bilsin.
    • Əgər "pkg>add" verilmiş ada malik paketi tapa bilmirsə, indi əlavə edilə bilən oxşar adları olan paketləri təklif edəcək.
    • Manifestdə saxlanılan julia versiyası artıq quruluş nömrəsini ehtiva etmir, yəni master indi 1.9.0-DEV kimi yazılacaq.
    • Testin dayandırılması "pkg>" indi daha ardıcıl aşkarlanacaq və düzgün şəkildə REPL-ə qaytarılacaq.
  • InteractiveUtils
    • Paketlərin və onların asılılıqlarının idxalına sərf olunan vaxtı hesabat vermək üçün yeni @time_imports makrosu, idxalın faizi kimi tərtib və yenidən tərtib vaxtını vurğulayır.
  • Xətti cəbr
    • BLAS submodulu indi səviyyə-2 BLAS spr funksiyalarını dəstəkləyir.
    • LinearAlgebra.jl standart kitabxanası indi həm mənbə kodu, həm də vahid testi baxımından SparseArrays.jl-dən tamamilə müstəqildir. Nəticə olaraq, Base və ya LinearCəbr obyektlərinə tətbiq olunan LinearAlgebra-dan metodlarla seyrək massivlər artıq (dolaylı olaraq) qaytarılmır. Xüsusilə, bu, aşağıdakı pozucu dəyişikliklərə səbəb olur:
      • Xüsusi "seyrək" matrislərdən (məsələn, diaqonal) istifadə edən birləşmələr indi sıx matrisləri qaytarır; Nəticədə getproperty çağırışları ilə yaradılmış SVD obyektlərinin D1 və D2 sahələri indi sıx matrislərdir.
      • Oxşar(::SpecialSparseMatrix, ::Type, ::Dims) metodu sıx null matrisi qaytarır. Nəticədə, iki, üç və simmetrik tridiaqonal matrislərin bir-biri ilə hasilləri sıx bir matrisin yaranmasına səbəb olur. Əlavə olaraq, (qeyri-statik) matrislərdən xüsusi "seyrək" matrislərdən üç arqumentlə oxşar matrislərin qurulması indi "sıfır(::Tip{Matrix{T}})" səbəbindən uğursuz olur.
  • Printf
    • %s və %c indi eni formatlaşdırmaq üçün mətn genişliyi arqumentindən istifadə edir.
  • Profil
    • CPU yük profili indi mövzular və tapşırıqlar daxil olmaqla metadata qeyd edir. Profile.print() filtrləmə təmin etmək üçün mövzuları, tapşırıqları və ya alt başlıqları/tapşırıqları, tapşırıqları/ipləri və mövzuları və tapşırıqlar arqumentlərini qruplaşdırmağa imkan verən yeni groupby arqumentinə malikdir. Bundan əlavə, istifadə faizi indi hər bir nümunədə ipin boş olub-olmamasından asılı olaraq ya ümumi, ya da hər ip kimi bildirilir. Profile.fetch() defolt olaraq yeni metadata daxildir. Profil məlumatlarının xarici istehlakçıları ilə geriyə doğru uyğunluq üçün, include_meta=false keçidi ilə onu istisna etmək olar.
    • Yeni Profile.Allocs modulu yaddaş ayırmalarını profilləməyə imkan verir. Hər bir yaddaş ayrılmasının növü və ölçüsünün yığın izi qeydə alınır və sample_rate arqumenti konfiqurasiya edilə bilən sayda ayırmaları atlamağa imkan verir və performans yükünü azaldır.
    • Sabit müddətə CPU profilinin yaradılması indi profili ilk yükləmədən tapşırıqlar işləyərkən istifadəçi tərəfindən işlədilə bilər və hesabat işləyərkən göstəriləcək. MacOS və FreeBSD-də ctrl-t düyməsini basın və ya SIGINFO-ya zəng edin. Digər platformalar üçün SIGUSR1-i aktivləşdirin, yəni. % öldürmək -USR1 $julia_pid. Bu Windows-da mövcud deyil.
  • ÇIXARIŞ
    • RadioMenu indi seçimlərin birbaşa seçilməsi üçün əlavə klaviatura qısa yollarını dəstəkləyir.
    • "?(x, y" ardıcıllığı və TAB düyməsinə basmaqla x, y, ... arqumentləri ilə çağırıla bilən bütün üsullar göstərilir. (Aparıcı boşluq yardım rejiminə daxil olmağınıza mane olur.) "MyModule.?(x, y " axtarışı "MyModule" ilə məhdudlaşdırır. TAB düyməsini basmaq ən azı bir arqumentin Hər hansı bir növündən daha spesifik olmasını tələb edir. Və ya hər hansı uyğun metodlara icazə vermək üçün TAB əvəzinə SHIFT-TAB istifadə edin.
    • Yeni qlobal dəyişən err, son cavabla ans davranışına bənzər ən son istisnanı əldə etməyə imkan verir. Səhv daxil olmaqla, istisna məlumatı yenidən çap olunur.
  • SparseArrays
    • SparseArrays kodunu Julia deposundan xarici SparseArrays.jl deposuna köçürün.
    • Yeni birləşmə funksiyaları sparse_hcat, sparse_vcat və sparse_hvcat giriş arqumentlərinin növlərindən asılı olmayaraq SparseMatrixCSC növünü qaytarır. Bu, LinearAlgebra.jl və SparseArrays.jl kodunu ayırdıqdan sonra matrislərin yapışdırılması mexanizmini birləşdirmək üçün zəruri oldu.
  • Logging
    • BelowMinLevel, Debug, Info, Warn, Error və AboveMaxLevel standart giriş səviyyələri indi standart Logging kitabxanasından ixrac edilir.
  • Unicode
    • Normallaşdırılmış sətirləri açıq şəkildə qurmadan Unicode ekvivalentini yoxlamaq üçün isequal_normalized funksiyası əlavə edildi.
    • Unicode.normalize funksiyası indi charttransform açar sözünü qəbul edir ki, bu da fərdi simvol xəritələrini təmin etmək üçün istifadə edilə bilər və Julia analizatoru identifikatorları normallaşdıran zaman istifadə olunan xəritələşdirməni təkrar etmək üçün Unicode.julia_chartransform funksiyası da təmin edilir.
  • Sınaq
    • '@test_throws "bəzi mesaj" triggers_error()' indi xüsusi istisna növündən asılı olmayaraq göstərilən xəta mətnində "bəzi mesaj" xətasının olub-olmadığını yoxlamaq üçün istifadə edilə bilər. Daimi ifadələr, sətir siyahıları və uyğun funksiyalar da dəstəklənir.
    • @testset foo() indi verilmiş funksiyadan test dəsti yaratmaq üçün istifadə edilə bilər. Test işinin adı çağırılan funksiyanın adıdır. Çağırılan funksiya bütün aralıq test nəticələrini qeyd edərkən @test və digər @testset təriflərini ehtiva edə bilər, o cümlədən digər funksiyalara edilən zənglər üçün.
    • TestLogger və LogRecord indi standart Test kitabxanasından ixrac olunur.
  • Distributed
    • SSHManager indi addprocs() metodu və shell=:csh parametri vasitəsilə csh/tcsh sarğı ilə işçi iplərini dəstəkləyir.
  • Digər dəyişikliklər
    • GC.enable_logging(true) hər bir zibil toplama əməliyyatını toplanmış yaddaşın vaxtı və miqdarı ilə qeyd etmək üçün istifadə edilə bilər.

Mənbə: opennet.ru

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