Жулиа програмчлалын хэл 1.8 хувилбар

Julia 1.8 програмчлалын хэлийг гаргах боломжтой бөгөөд энэ нь өндөр гүйцэтгэл, динамик бичих дэмжлэг, зэрэгцээ програмчлалын суурилуулсан хэрэгслүүд зэрэг чанаруудыг хослуулсан. Жулиагийн синтакс нь MATLAB-тай ойролцоо бөгөөд Ruby болон Lisp-ээс зарим элементүүдийг зээлдэг. Мөр засах арга нь Perl-ийг санагдуулдаг. Төслийн кодыг MIT лицензийн дагуу түгээдэг.

Хэлний үндсэн шинж чанарууд:

  • Өндөр гүйцэтгэл: Төслийн гол зорилгын нэг нь C хөтөлбөртэй ойролцоо гүйцэтгэлд хүрэх явдал юм. Жулиа хөрвүүлэгч нь LLVM төслийн ажил дээр үндэслэсэн бөгөөд олон зорилтот платформуудад үр ашигтай эх машины кодыг үүсгэдэг;
  • Төрөл бүрийн програмчлалын парадигмуудыг, түүний дотор объект хандалтат болон функциональ програмчлалын элементүүдийг дэмждэг. Стандарт номын сан нь бусад зүйлсийн дотор асинхрон I/O, процессын хяналт, бүртгэл, профайл, багцын менежментийн функцуудыг хангадаг;
  • Динамик бичих: хэл нь скрипт програмчлалын хэлтэй адил хувьсагчийн төрлүүдийн тодорхой тодорхойлолтыг шаарддаггүй. Интерактив горимыг дэмждэг;
  • Төрөлүүдийг тодорхой зааж өгөх нэмэлт боломж;
  • Тоон тооцоолол, шинжлэх ухааны тооцоолол, машин сургалт, өгөгдлийг дүрслэн харуулахад тохиромжтой синтакс. Тооцооллыг параллель болгох олон тооны өгөгдлийн төрөл, хэрэгслийг дэмжих.
  • Нэмэлт давхаргагүйгээр С номын сангаас функцуудыг шууд дуудах чадвар.

Жулиа 1.8 дахь томоохон өөрчлөлтүүд:

  • Шинэ хэлний онцлог
    • Өөрчлөгдөж болох бүтцийн талбаруудыг одоо өөрчлөхөөс сэргийлж, оновчтой болгохын тулд тогтмол гэж тэмдэглэж болно.
    • Глобал хувьсагчдад төрлийн тэмдэглэгээг нэмж болно.
    • Хоосон n хэмжээст массивыг дөрвөлжин хаалт дотор олон цэгтэй таслал ашиглан үүсгэж болно, жишээлбэл "[;;;]" нь 0x0x0 массив үүсгэдэг.
    • Try блокууд нь одоо өөр блоктой байх боломжтой бөгөөд хэрэв алдаа гаргаагүй бол үндсэн хэсгийн дараа шууд хийгдэнэ.
    • @inline болон @noinline-г функцийн бие дотор байрлуулж, нэргүй функцийг тэмдэглэх боломжийг олгоно.
    • @inline болон @noinline-г одоо дуудлагын сайт эсвэл блок дахь функцэд хэрэглэж, холбогдох функцийн дуудлагуудыг оруулах (эсвэл оруулахгүй) боломжтой болсон.
    • ∀, ∃ болон ∄-г таних тэмдэгт болгон ашиглахыг зөвшөөрнө.
    • Юникод 14.0.0-ын тодорхойлолтод дэмжлэг нэмсэн.
    • Module(:name, false, false) аргыг ашиглан нэр агуулаагүй, Base эсвэл Core-г импортолдоггүй, өөрт нь лавлагаа агуулаагүй модулийг үүсгэж болно.
  • Хэлний өөрчлөлт
    • Шинээр үүсгэгдсэн Task объектууд (@spawn, @async, гэх мэт) нь үүсгэсэн үед эх Даалгаврын аргуудын хувьд world_age-тэй болж, оновчтой гүйцэтгэлийг хийх боломжтой болсон. Өмнөх идэвхжүүлэх сонголтыг Base.invokelatest аргыг ашиглан ашиглах боломжтой.
    • Юникод тэнцвэргүй хоёр чиглэлтэй форматлах зааврыг одоо тарилга хийхээс зайлсхийхийн тулд мөр болон тайлбарт хориглосон.
    • Base.ifelse нь одоо бүтээгдхүүнээс илүү ерөнхий функц гэж тодорхойлогддог бөгөөд багцуудад түүний тодорхойлолтыг өргөтгөх боломжийг олгодог.
    • Глобал хувьсагчийн хуваарилалт бүр эхлээд хэрэв глобал хувьсагчийг T төрлийн гэж зарласан бол хөрвүүлэх(Any, x) эсвэл хөрвүүлэх(T, x) дуудлагыг дамжуулдаг. Глобал хувьсагчийг ашиглахын өмнө хувиршгүй хувиргах(Any) байгаа эсэхийг шалгаарай. , x) === x нь үргэлж үнэн байдаг, эс тэгвээс энэ нь гэнэтийн үйлдэлд хүргэж болзошгүй.
    • Суурилуулсан функцууд нь одоо ерөнхий функцтэй төстэй болсон бөгөөд аргуудыг ашиглан программчлан тоолж болно.
  • Хөрвүүлэгч/ажиллах цагийн сайжруулалт
    • Ачаалах хугацаа ойролцоогоор 25% буурсан.
    • LLVM дээр суурилсан хөрвүүлэгч нь ажиллах цагийн номын сангаас libjulia-codegen хэмээх шинэ номын сан болгон тусгаарлагдсан. Энэ нь анхдагчаар ачаалагдсан тул ердийн ашиглалтын явцад ямар ч өөрчлөлт гарах ёсгүй. Хөрвүүлэгч шаардлагагүй байршуулалтуудад (жишээлбэл, шаардлагатай бүх кодыг урьдчилан хөрвүүлсэн системийн зургууд) энэ номын санг (мөн түүний LLVM хамаарал) зүгээр л орхигдуулж болно.
    • Аргументыг аргад дамжуулснаар болзолт төрлийн дүгнэлт хийх боломжтой болсон. Жишээлбэл, Base.ifelse(isa(x, Int), x, 0) нь x-ийн төрөл тодорхойгүй байсан ч ::Int-ийг буцаана.
    • SROA (Aggregates Scalar Replacement) сайжирсан: байнгын глобал талбарууд бүхий getfield дуудлагыг арилгадаг, эхлээгүй талбарууд бүхий хувирдаг бүтцийг арилгаж, гүйцэтгэл болон үүрлэсэн getfield дуудлагуудын зохицуулалтыг сайжруулдаг.
    • Төрөл бүрийн дүгнэлт нь гаж нөлөө болон уналтгүй янз бүрийн үр нөлөөг хянадаг. Тогтмол тархалтыг харгалзан үздэг бөгөөд энэ нь хөрвүүлэх хугацааны гүйцэтгэлийг ихээхэн сайжруулдаг. Зарим тохиолдолд, жишээлбэл, дотор оруулах боломжгүй боловч үр дүнд нөлөөлөхгүй функцүүдийн дуудлагууд ажиллах үед устгагдах болно. Эффектийн дүрмийг Base.@assume_effects макро ашиглан гараар дарж бичиж болно.
    • Урьдчилсан эмхэтгэл (урьдчилан эмхэтгэлийн тодорхой зааварчилгаа эсвэл заасан ажлын ачаалалтай) нь одоо илүү олон төрлөөр тодорхойлсон кодыг хэмнэж, эхний удаа хурдан гүйцэтгэхэд хүргэдэг. Таны багцад шаардлагатай аливаа шинэ арга/төрлийн хослолууд, эдгээр аргуудыг хаана тодорхойлсоноос үл хамааран, хэрэв тэдгээр нь таны багцад хамаарах аргаар дуудагдсан бол урьдчилан эмхэтгэлийн файлд хадгалагдах боломжтой.
  • Тушаалын мөрийн сонголтуудын өөрчлөлт
    • @inbounds мэдэгдлийг хянах үндсэн горим нь одоо "--check-bounds=yes|no|auto"-н автомат сонголт юм.
    • Системийн дүрс үүсгэх үед баримт бичгийн мөр, байршлын эх сурвалжийн мэдээлэл, локал хувьсагчийн нэрийг устгах шинэ "--strip-metadata" сонголт.
    • "--strip-ir" шинэ сонголт нь хөрвүүлэгчид системийн дүрсийг бүтээх үед завсрын эх кодын дүрслэлийг арилгах боломжийг олгоно. Үүссэн зураг нь зөвхөн "--compile=all" ашигласан эсвэл шаардлагатай бүх кодыг урьдчилан эмхэтгэсэн тохиолдолд л ажиллах болно.
    • Хэрэв файлын нэрний оронд "-" тэмдэгтийг зааж өгсөн бол гүйцэтгэх кодыг стандарт оролтын урсгалаас уншина.
  • Multithreading дэмжлэгийн өөрчлөлтүүд
    • Threads.@threads нь өгөгдмөлөөр шинэ хуваарийн сонголт :dynamic ашигладаг бөгөөд энэ нь өмнөх горимоос давталтуудыг урсгал бүрт оноохоос илүүтэйгээр боломжтой ажилчны хэлхээнүүдийн хооронд динамикаар хуваарьснаараа ялгаатай. Энэ горим нь @spawn болон @threads бүхий үүрлэсэн гогцоог илүү сайн хуваарилах боломжийг олгодог.
  • Номын сангийн шинэ функцууд
    • split(str)-г олон удаа гүйцэтгэхийн тулд everysplit(str).
    • allequal(itr) нь давталт дахь бүх элементүүд тэнцүү эсэхийг шалгах.
    • hardlink (src, dst) нь хатуу холбоос үүсгэхэд ашиглагдаж болно.
    • setcpuaffinity(cmd, cpus) нь процессорын цөмийг эхлүүлсэн процессуудтай харьцах харьцааг тохируулах.
    • diskstat(зам=pwd())-г ашиглан дискний статистикийг авна уу.
    • Үнэлгээ хийгдэж буй мөр болон @цаг хугацааны тайланг хоёуланг нь харуулах шинэ @showtime макро.
    • Алдааны зам дахь алдааны мэдэгдлийн залхуу бүтцийг дэмжихийн тулд LazyString болон lazy"str" ​​макро нэмсэн.
    • Dict болон keys(::Dict), values(::Dict) болон Set зэрэг бусад үүсмэл объектуудын зэрэгцэх асуудлыг зассан. Толь бичиг эсвэл багцыг өөрчлөх дуудлага байхгүй тохиолдолд давталтын аргыг одоо толь бичиг эсвэл багц дээр дуудаж болно.
    • @time болон @timev нь нэмэлт тайлбартай болсон бөгөөд жишээлбэл, цагийн тайлангийн эх сурвалжийг тэмдэглэх боломжийг танд олгоно. @time "Үнэлэх foo" foo().
    • муж нь зогсолт эсвэл уртыг цорын ганц түлхүүр үгийн аргумент болгон авдаг.
    • precision болон setprecision одоо үндсэн үгийг түлхүүр үг болгон хүлээн авдаг
    • TCP залгуур объектууд одоо хаах аргыг өгч, хагас нээлттэй горимыг ашиглахыг дэмждэг.
    • extrema одоо init аргументыг хүлээн зөвшөөрч байна.
    • Iterators.countfrom одоо + аргыг тодорхойлсон ямар ч төрлийг хүлээн зөвшөөрдөг.
    • @цаг одоо өөрчилсөн төрлүүдтэй аргуудыг дахин хөрвүүлэхэд зарцуулсан цагийн % -ийг хуваарилдаг.
  • Стандарт номын сангийн өөрчлөлтүүд
    • Үнэтэй түлхүүрүүд Addenv доторх орчноос юу ч хасагдаагүй.
    • Iterators.reverse (мөн хамгийн сүүлд) мөр бүрийг дэмждэг.
    • Тодорхой төрлийн мужид зориулсан уртын функц нь бүхэл тоо хэтэрч байгаа эсэхийг шалгахаа больсон. Checked_length гэсэн шинэ функц байгаа бөгөөд энэ нь бит дамжуулалтын хяналтын логикийг агуулдаг. Шаардлагатай бол SaferIntegers.jl ашиглан мужийн төрлийг бий болгоно.
    • Iterators.Reverse давталт нь боломжтой бол индекс бүрийг буцаах үйлдлийг хэрэгжүүлдэг.
  • Багц менежер
    • Шинэ хувилбарууд байгаа "pkg>" төлөвт байгаа багцуудын хажууд шинэ ⌃ болон ⌅ үзүүлэлтүүд. ⌅ нь шинэ хувилбаруудыг суулгах боломжгүйг харуулж байна.
    • Өмнөх хувилбаруудын багцуудын талаарх мэдээллийг харуулахын тулд Pkg.status (--хуучирсан эсвэл REPL горимд -o) руу шинэ хуучирсан:: Bool аргумент.
    • Шинэ compat::Project.toml-д ямар нэгэн [compat] оруулгуудыг харуулахын тулд Pkg.status (REPL горимд --compat эсвэл -c) руу аргумент оруулна уу.
    • Төслийн нийцтэй байдлын оруулгуудыг тохируулах шинэ "pkg>compat" (болон Pkg.compat) горим. "pkg>compat"-аар дамжуулан интерактив засварлагч эсвэл "pkg>Foo 0.4,0.5"-аар дамжуулан шууд бичлэгийн хяналтыг хангадаг бөгөөд энэ нь таб бөглөх замаар одоогийн бичлэгүүдийг ачаалах боломжтой. Өөрөөр хэлбэл, "pkg> compat Fo" нь автоматаар "pkg> Foo 0.4,0.5" болж шинэчлэгдэж, одоо байгаа оруулгыг засах боломжтой.
    • Pkg одоо сервер нь багцыг агуулсан бүртгэлийг хянаж байгаа тохиолдолд л багц серверээс багц татаж авахыг оролддог.
    • Project.toml нь Manifest.toml-тэй синк хийгээгүй үед Pkg.instantiate одоо анхааруулга өгөх болно. Энэ нь үүнийг шийдвэрлэх үед манифест дахь төслийн deps болон compat бичлэгийн хэш (бусад талбарыг үл тоомсорлодог) дээр үндэслэн хийдэг бөгөөд ингэснээр Project.toml deps эсвэл compat бичлэгт гарсан аливаа өөрчлөлтийг дахин шийдвэрлэхгүйгээр илрүүлэх боломжтой.
    • Хэрэв "pkg>add" нь өгөгдсөн нэртэй багцыг олж чадахгүй бол одоо нэмж болох ижил нэртэй багцуудыг санал болгоно.
    • Манифестэд хадгалагдсан julia-н хувилбар нь бүтээх дугаарыг оруулахаа больсон тул мастерийг 1.9.0-DEV гэж бичих болно.
    • "pkg>" туршилтын цуцлалтыг одоо илүү тогтмол илрүүлж, REPL-д зөв буцаах болно.
  • InteractiveUtils
    • Багцуудыг импортлоход зарцуулсан хугацаа болон тэдгээрийн хамаарлыг тайлагнах шинэ @time_imports макро, эмхэтгэх, дахин эмхэтгэх хугацааг импортын хувиар онцлон тэмдэглэв.
  • Шугаман алгебр
    • BLAS дэд модуль нь одоо 2-р түвшний BLAS spr! функцуудыг дэмждэг.
    • LinearAlgebra.jl стандарт номын сан нь SparseArrays.jl-ээс бүрэн хараат бус болсон бөгөөд эх код болон нэгжийн тестийн үүднээс авч үзвэл. Үүний үр дүнд LinearAlgebra-аас Base эсвэл LinearAlgebra объектуудад хэрэглэсэн аргуудаар сийрэг массивуудыг (далд байдлаар) буцаахаа больсон. Ялангуяа энэ нь дараахь эвдэрсэн өөрчлөлтүүдэд хүргэдэг.
      • Тусгай "сийрэг" матрицуудыг (жишээ нь диагональ) ашиглан холбох нь нягт матрицуудыг буцаадаг; Үүний үр дүнд getproperty дуудлагаар үүсгэсэн SVD объектуудын D1 ба D2 талбарууд нягт матрицууд болсон.
      • Үүнтэй төстэй(::SpecialSparseMatrix, ::Type, ::Dims) арга нь нягт null матрицыг буцаана. Үүний үр дүнд хоёр, гурав, тэгш хэмтэй гурвалжин матрицын бүтээгдэхүүнүүд нь нягт матриц үүсэхэд хүргэдэг. Нэмж дурдахад, (статик бус) матрицаас тусгай "сийрэг" матрицуудаас гурван аргумент бүхий ижил төстэй матрицуудыг байгуулах нь "тэг(::Төрөл{Матриц{T}})"-ын улмаас амжилтгүй болсон.
  • Printf
    • %s ба %c одоо өргөнийг форматлахдаа textwidth аргументыг ашигладаг.
  • Хувийн
    • CPU-ийн ачааллын профайл нь одоо хэлхээ, даалгавар зэрэг мета өгөгдлийг бүртгэдэг. Profile.print() нь шинэ groupby аргументтай болсон бөгөөд энэ нь танд хэлхээ, даалгавар эсвэл дэд хэлхээ/даалгавар, даалгавар/телед, урсгал болон даалгаврын аргументуудыг бүлэглэх боломжийг олгодог. Нэмж дурдахад, ашиглалтын хувь хэмжээг одоо түүвэр тус бүр дэх утас идэвхгүй байгаа эсэхээс хамаарч нийт эсвэл нэг хэлхээ болгон мэдээлдэг. Profile.fetch() нь анхдагчаар шинэ мета өгөгдлийг агуулдаг. Профайл үүсгэх өгөгдлийг гадны хэрэглэгчидтэй буцааж нийцүүлэхийн тулд include_meta=false гэж оруулснаар үүнийг хасч болно.
    • Шинэ Profile.Allocs модуль нь санах ойн хуваарилалтыг профайллах боломжийг танд олгоно. Санах ойн хуваарилалт бүрийн төрөл, хэмжээний стекийн ул мөр бүртгэгдэх бөгөөд sample_rate аргумент нь тохируулж болох тооны хуваарилалтыг алгасах боломжийг олгож, гүйцэтгэлийн нэмэгдлийг бууруулдаг.
    • Тогтмол хугацаатай CPU-ийн профайлыг одоо профайлыг ачаалахгүйгээр даалгаврууд ажиллаж байх үед хэрэглэгч ажиллуулж болох бөгөөд ажиллаж байх үед тайлан гарч ирэх болно. MacOS болон FreeBSD дээр ctrl-t товчийг дарж эсвэл SIGINFO руу залгана уу. Бусад платформуудын хувьд SIGUSR1-г идэвхжүүлнэ үү, i.e. % алах -USR1 $julia_pid. Үүнийг Windows дээр ашиглах боломжгүй.
  • Хариулах
    • RadioMenu одоо сонголтуудыг шууд сонгох нэмэлт гарын товчлолыг дэмждэг.
    • "?(x, y" дараалсан TAB товчийг дарах дараалал нь x, y, ... аргументуудаар дуудаж болох бүх аргуудыг харуулдаг. (Удирдах зай нь тусламжийн горимд орохоос сэргийлнэ.) "MyModule.?(x, y " нь хайлтыг "MyModule"-ээр хязгаарладаг. TAB-г дарснаар ядаж нэг аргумент нь Any-ээс илүү тодорхой төрлийн байх шаардлагатай. Эсвэл TAB-ын оронд SHIFT-TAB-г ашиглан тохирох аргуудыг зөвшөөрнө үү.
    • Шинэ глобал хувьсагч err нь хамгийн сүүлийн хариулттай ans-ийн зан үйлтэй адил хамгийн сүүлийн үеийн үл хамаарах зүйлийг авах боломжийг танд олгоно. Алдаа оруулах нь онцгой байдлын мэдээллийг дахин хэвлэнэ.
  • SparseArrays
    • Julia агуулахаас SparseArrays кодыг гадаад SparseArrays.jl репозитор руу шилжүүлсэн.
    • Sparse_hcat, sparse_vcat, sparse_hvcat шинэ холбох функцууд нь оролтын аргументуудын төрлөөс үл хамааран SparseMatrixCSC төрлийг буцаана. Энэ нь LinearAlgebra.jl болон SparseArrays.jl кодыг салгасны дараа матрицыг наах механизмыг нэгтгэхэд шаардлагатай болсон.
  • Бүртгэл
    • ДоодMinLevel, Debug, Info, Warn, Error болон AboveMaxLevel зэрэг стандарт бүртгэлийн түвшингүүд стандарт бүртгэлийн сангаас экспортлогдсон.
  • Юникод
    • Нормчилсан мөрүүдийг тодорхой үүсгэхгүйгээр Юникод тэнцэх эсэхийг шалгах isqual_normalized функцийг нэмсэн.
    • Unicode.normalize функц нь одоо charttransform түлхүүр үгийг хүлээн зөвшөөрч байгаа бөгөөд үүнийг захиалгат тэмдэгтийн зураглалд ашиглаж болох ба Юлиа задлагч тодорхойлогчийг хэвийн болгох үед ашигласан зураглалыг хуулбарлахад мөн Unicode.julia_chartransform функцээр хангагдсан.
  • туршилтын
    • '@test_throws "зарим мессеж" triggers_error()'-г одоо харуулсан алдааны текст нь онцгой тохиолдлын төрлөөс үл хамааран "зарим мессеж" алдаа агуулсан эсэхийг шалгахад ашиглаж болно. Тогтмол илэрхийлэл, мөрийн жагсаалт, тохирох функцийг бас дэмждэг.
    • @testset foo()-г одоо өгөгдсөн функцээс тестийн багц үүсгэхэд ашиглаж болно. Туршилтын нэр нь дуудаж буй функцийн нэр юм. Дуудагдсан функц нь бүх завсрын туршилтын үр дүнг бүртгэхийн зэрэгцээ бусад функц руу залгах @test болон бусад @testset тодорхойлолтуудыг агуулж болно.
    • TestLogger болон LogRecord нь одоо стандарт тестийн сангаас экспортлогдож байна.
  • Тараасан
    • SSHManager одоо addprocs() арга болон shell=:csh параметрээр csh/tcsh боодолтой ажилчны хэлхээг дэмждэг.
  • Бусад өөрчлөлтүүд
    • GC.enable_logging(true) нь хог цуглуулах үйлдэл бүрийг цуглуулсан санах ойн хугацаа болон хэмжээгээр бүртгэхэд ашиглаж болно.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх