زبان برنامه نویسی جولیا 1.9 موجود است

انتشار زبان برنامه نویسی Julia 1.9 منتشر شده است که ویژگی هایی مانند عملکرد بالا، پشتیبانی از تایپ پویا و ابزارهای داخلی برای برنامه نویسی موازی را ترکیب می کند. نحو جولیا نزدیک به متلب است و برخی از عناصر را از روبی و لیسپ به عاریت گرفته است. روش دستکاری رشته یادآور پرل است. کد پروژه تحت مجوز MIT توزیع شده است.

ویژگی های کلیدی زبان:

  • عملکرد بالا: یکی از اهداف کلیدی پروژه دستیابی به عملکرد نزدیک به برنامه های C است. کامپایلر جولیا بر اساس کار پروژه LLVM است و کد ماشین بومی کارآمد را برای بسیاری از پلتفرم های هدف تولید می کند.
  • از پارادایم های برنامه نویسی مختلف، از جمله عناصر برنامه نویسی شی گرا و تابعی پشتیبانی می کند. کتابخانه استاندارد، در میان چیزهای دیگر، توابعی را برای I/O ناهمزمان، کنترل فرآیند، ورود به سیستم، پروفایل و مدیریت بسته ارائه می کند.
  • تایپ پویا: زبان نیازی به تعریف صریح انواع برای متغیرها ندارد، مشابه زبان های برنامه نویسی اسکریپت. حالت تعاملی پشتیبانی می شود.
  • توانایی اختیاری برای تعیین صریح انواع.
  • یک نحو ایده آل برای محاسبات عددی، محاسبات علمی، یادگیری ماشین و تجسم داده ها. پشتیبانی از بسیاری از انواع داده های عددی و ابزار برای موازی سازی محاسبات.
  • امکان فراخوانی مستقیم توابع از کتابخانه های C بدون لایه های اضافی.

تغییرات عمده در جولیا 1.9:

  • ویژگی های زبان جدید
    • با استفاده از "setproperty!(::Module, ::Symbol, x)" اجازه دهید تکالیف در ماژول دیگری انجام شود.
    • تکالیف متعددی که در موقعیت نهایی نیستند مجاز هستند. به عنوان مثال، رشته "a, b..., c = 1, 2, 3, 4" به صورت "a = 1" پردازش می شود. b…, = 2, 3; c = 4" این کار از طریق Base.split_rest انجام می شود.
    • حروف تک کاراکتری اکنون از همان نحوی که لفظ رشته ای پشتیبانی می کند، پشتیبانی می کند. آن ها نحو می تواند نشان دهنده توالی های UTF-8 نامعتبر باشد، همانطور که نوع Char مجاز است.
    • پشتیبانی از مشخصات یونیکد 15 اضافه شده است.
    • ترکیب های تودرتو از تاپل ها و تاپل های کاراکتر نامگذاری شده اکنون می توانند به عنوان پارامترهای نوع استفاده شوند.
    • توابع داخلی جدید "getglobal(::Module, ::Symbol[, order])" و "setglobal!(::Module, ::Symbol, x[, order])" برای خواندن و نوشتن منحصراً برای متغیرهای سراسری. اکنون روش getglobal باید بر روش getfield برای دسترسی به متغیرهای سراسری ترجیح داده شود.
  • تغییرات در زبان
    • ماکرو "@invoke" معرفی شده در نسخه 1.7 اکنون صادر شده و برای استفاده در دسترس است. علاوه بر این، اکنون از روش "Core.Typeof(x)" به جای "Any" در مواردی که حاشیه نویسی نوع برای آرگومان "x" حذف شده است، استفاده می کند. این برای اطمینان از پردازش صحیح انواع ارسال شده به عنوان آرگومان ضروری است.
    • فعال کردن صادرات تابع "invokelatest" و ماکرو "@invokelatest" که در نسخه 1.7 معرفی شده است.
  • بهبودهای کامپایلر/ زمان اجرا
    • کاهش قابل توجهی زمان تا اولین اجرا (TTFX - Time to first execution). پیش کامپایل کردن یک بسته اکنون کد بومی را در "pkgimage" ذخیره می کند، به این معنی که کد تولید شده توسط فرآیند پیش کامپایل پس از بارگیری بسته نیازی به کامپایل مجدد نخواهد داشت. استفاده از حالت pkgimages را می توان با استفاده از گزینه "--pkgimages=no" غیرفعال کرد.
    • مسئله پیچیدگی درجه دوم شناخته شده استنتاج نوع رفع شده است و استنتاج به طور کلی از حافظه کمتری استفاده می کند. برخی از موارد لبه با توابع طولانی تولید شده به طور خودکار (مانند ModelingToolkit.jl با معادلات دیفرانسیل جزئی و مدل های علی بزرگ) بسیار سریعتر کامپایل می شوند.
    • تماس‌های با آرگومان‌های بدون انواع مشخص اکنون می‌توانند برای تزریق یا وضوح استاتیک بهینه‌سازی شوند، حتی اگر چندین نامزد از نوع مختلف برای ارسال وجود داشته باشد. این می‌تواند عملکرد را در موقعیت‌های خاصی که انواع شی به‌طور کامل حل نشده‌اند، با حل استاتیکی سایت‌های تماس «@nospecialize-d» و اجتناب از کامپایل مجدد، بهبود بخشد.
    • همه استفاده‌های ماکرو @pure در ماژول Base با Base.@assume_effects جایگزین شده‌اند.
    • فراخوانی‌های فراخوانی (f، invokesig، args...) با انواع کمتر نسبت به f(args...) دیگر باعث کامپایل مجدد بسته نمی‌شوند.
  • تغییرات در گزینه های خط فرمان
    • در لینوکس و ویندوز، گزینه «--threads=auto» اکنون تلاش می‌کند تا تعداد پردازنده‌های موجود را بر اساس تمایل CPU، یک ماسک که معمولاً در محیط‌های HPC و ابری تنظیم می‌شود، تعیین کند.
    • پارامتر "--math-mode=fast" غیرفعال است، به جای آن توصیه می شود از ماکرو "@fastmath" استفاده کنید که معنایی کاملاً مشخص دارد.
    • گزینه "--threads" اکنون در قالب "auto | N[,auto|M]"، که در آن M تعداد رشته های تعاملی برای ایجاد را نشان می دهد (در حال حاضر خودکار به معنای 1 است).
    • گزینه "-heap-size-hint=" اضافه شد "، که آستانه ای را تعیین می کند که پس از آن جمع آوری زباله فعال شروع می شود. اندازه را می توان بر حسب بایت، کیلوبایت (1000 کیلوبایت)، مگابایت (300 مگابایت) یا گیگابایت (1,5 گیگابایت) مشخص کرد.
  • تغییرات در multithreading
    • "Threads.@spawn" اکنون یک آرگومان اول اختیاری با مقدار ":default" یا ":interactive" دارد. یک کار تعاملی به تأخیر پاسخ کم نیاز دارد و طوری طراحی شده است که کوتاه باشد یا به طور مکرر انجام شود. کارهای تعاملی در صورتی که هنگام شروع Julia مشخص شده باشند، روی رشته های تعاملی اجرا می شوند.
    • رشته هایی که خارج از زمان اجرا جولیا اجرا می شوند (مانند C یا جاوا) اکنون می توانند کد جولیا را با استفاده از "jl_adopt_thread" فراخوانی کنند. این به طور خودکار هنگام وارد کردن کد جولیا از طریق "cfunction" یا نقطه ورود "@ccallable" اتفاق می افتد. در نتیجه، تعداد نخ ها اکنون می تواند در طول اجرا تغییر کند.
  • توابع جدید کتابخانه
    • تابع جدید "Iterators.flatmap".
    • تابع جدید "pkgversion(m::Module)" برای دریافت نسخه بسته ای که یک ماژول معین را بارگیری کرده است، شبیه به "pkgdir(m::Module)".
    • تابع جدید "stack(x)" که "reduce(hcat, x::Vector{<:Vector})" را به هر بعد تعمیم می دهد و به هر تکرار کننده ای از تکرار کننده ها اجازه می دهد. روش "stack(f, x)" "mapreduce(f, hcat, x)" را تعمیم می دهد و کارآمدتر است.
    • ماکرو جدید برای تجزیه و تحلیل حافظه تخصیص‌یافته «@allocated»، شبیه به «@allocated»، با این تفاوت که تعداد تخصیص‌های حافظه را به جای اندازه کل حافظه تخصیص داده شده برمی‌گرداند.
  • ویژگی های جدید کتابخانه
    • "RoundFromZero" اکنون برای انواع دیگری غیر از "BigFloat" کار می کند.
    • اکنون می توان "Dict" را با استفاده از "sizehint!" به صورت دستی کاهش داد.
    • اکنون "@time" به طور جداگانه درصد زمان صرف شده برای کامپایل مجدد متدهای نامعتبر را مشخص می کند.
  • تغییرات در کتابخانه استاندارد
    • رفع مشکل همزمانی در روش‌های تکرار برای Dict و سایر اشیاء مشتق شده مانند keys(::Dict)، مقادیر(::Dict) و Set. این روش‌های تکرار را می‌توان به‌صورت موازی در یک Dict یا Set برای تعداد نامحدودی از رشته‌ها فراخوانی کرد، تا زمانی که هیچ عملی وجود نداشته باشد که دیکشنری یا مجموعه را تغییر دهد.
    • نفی تابع محمول "!f" اکنون به جای یک تابع ناشناس، یک تابع ترکیبی "(!) ∘ f" را برمی گرداند.
    • توابع برش ابعاد اکنون در چندین بعد کار می کنند: "eachslice"، "eachrow" و "eachcol" یک شی "Slices" را برمی گرداند که امکان ارسال را برای ارائه روش های کارآمدتر فراهم می کند.
    • ماکرو "@kwdef" را به API عمومی اضافه کرد.
    • مشکلی با ترتیب عملیات در "fld1" برطرف شد.
    • مرتب سازی در حال حاضر همیشه در زمان پایدار است (QuickSort دوباره طراحی شده است).
    • "Base.splat" اکنون صادر می شود. مقدار بازگشتی یک نوع "Base.Splat" است نه یک تابع ناشناس، که به آن اجازه می دهد به خوبی خروجی شود.
  • مدیر بسته
    • "افزونه های بسته": پشتیبانی از بارگیری یک قطعه کد از بسته های دیگر بارگیری شده در جلسه جولیا. این برنامه مشابه بسته "Requires.jl" است، اما سازگاری با پیش کامپایل و تنظیمات پشتیبانی می شود.
  • کتابخانه جبر خطی
    • به دلیل خطر اشتباه با تقسیم عنصر، روش های "a/b" و "b\a" با اسکالر "a" و بردار "b" که معادل "a * pinv(b)" بودند حذف شدند.
    • تماس با BLAS و LAPACK اکنون از "libblastrampoline (LBT)" استفاده می کند. OpenBLAS به طور پیش فرض ارائه شده است، اما ساختن تصویر سیستم با کتابخانه های BLAS/LAPACK دیگر پشتیبانی نمی شود. در عوض، استفاده از مکانیسم LBT برای جایگزینی BLAS/LAPACK با مجموعه دیگری از کتابخانه های موجود توصیه می شود.
    • "lu" از یک استراتژی چرخش ماتریس جدید، "RowNonZero()" پشتیبانی می کند، که اولین عنصر چرخش غیر صفر را برای استفاده با انواع حسابی جدید و برای اهداف آموزشی انتخاب می کند.
    • "normalize(x, p=2)" اکنون از هر فضای برداری نرمال شده "x" از جمله اسکالرها پشتیبانی می کند.
    • تعداد پیش‌فرض رشته‌های BLAS اکنون با تعداد رشته‌های CPU در معماری‌های ARM و نصف تعداد رشته‌های CPU در معماری‌های دیگر برابر است.
  • Printf: پیام‌های خطای مجدد برای رشته‌هایی که فرمت‌بندی نشده‌اند برای خوانایی بهتر.
  • نمایه: تابع جدید "Profile.take_heap_snapshot(file)"، که فایلی را در قالب ".heapsnapshot" مبتنی بر JSON می نویسد که در Chrome پشتیبانی می شود.
  • Random: randn و randexp اکنون برای هر نوع AbstractFloat که rand را تعریف می کند کار می کنند.
  • پاسخ
    • اکنون با فشار دادن کلید ترکیبی "Alt-e" ورودی فعلی در ویرایشگر باز می شود. محتوا (در صورت اصلاح) با خروج از ویرایشگر اجرا خواهد شد.
    • زمینه فعلی ماژول فعال در REPL را می توان با استفاده از تابع "REPL.activate(::Module)" یا با وارد کردن ماژول در REPL و فشار دادن کلید ترکیبی "Alt-m" تغییر داد (به طور پیش فرض اصلی).
    • حالت "numbered prompt" که اعداد را برای هر ورودی و خروجی چاپ می کند و نتایج به دست آمده را در Out ذخیره می کند، می تواند با استفاده از "REPL.numbered_prompt!()" فعال شود.
    • تکمیل برگه آرگومان های کلیدواژه موجود را نمایش می دهد.
  • SuiteSparse: کد برای حل کننده "SuiteSparse" به "SparseArrays.jl" منتقل شد. حل کننده ها اکنون توسط "SuiteSparse.jl" دوباره صادر می شوند.
  • SparseArrays
    • حل کننده های "SuiteSparse" اکنون به عنوان زیر ماژول های "SparseArrays" در دسترس هستند.
    • حالت های حفاظت از نخ UMFPACK و CHOLMOD با حذف متغیرهای سراسری و استفاده از قفل بهبود یافته است. "ldiv!" چند رشته ای اشیاء UMFPACK اکنون می توانند با خیال راحت اجرا شوند.
    • تابع آزمایشی "SparseArrays.allowscalar(::Bool)" به شما امکان می دهد فهرست بندی اسکالر آرایه های پراکنده را غیرفعال یا فعال کنید. این تابع برای شناسایی فهرست بندی اسکالر تصادفی اشیاء "SparseMatrixCSC" طراحی شده است که منبع رایج مشکلات عملکرد است.
  • حالت Failsafe جدید برای مجموعه‌های آزمایشی که در صورت بروز خطا یا خطا، اجرای آزمایشی را زودتر خاتمه می‌دهد. از طریق "@testset kwarg failfast=true" یا "export JULIA_TEST_FAILFAST=true" تنظیم کنید. این گاهی اوقات در اجرای CI برای دریافت زودهنگام پیام های خطا ضروری است.
  • تاریخ‌ها: رشته‌های خالی دیگر به‌عنوان مقادیر معتبر «DateTime»، «Dates» یا «Times» به اشتباه تجزیه نمی‌شوند و به جای آن یک «ArgumentError» در سازنده‌ها و تجزیه پرتاب می‌کنند، در حالی که «tryparse» چیزی برمی‌گرداند.
  • بسته توزیع شده
    • پیکربندی بسته (پروژه فعال، "LOAD_PATH"، "DEPOT_PATH") اکنون هنگام افزودن فرآیندهای کارگر محلی (به عنوان مثال با استفاده از "addprocs(N::Int)" یا با استفاده از پرچم خط فرمان "--procs=N" منتشر می شود.
    • "addprocs" برای فرآیندهای کارگر محلی اکنون یک آرگومان به نام "env" را برای ارسال متغیرهای محیطی به فرآیندهای کارگر می پذیرد.
  • یونیکد: "graphemes(s, m:n)" زیر رشته را از نمودار mth به nام در "s" برمی گرداند.
  • بسته DelimitedFiles از کتابخانه های سیستم حذف شده است و اکنون به عنوان یک بسته جداگانه توزیع می شود که برای استفاده باید صریحاً نصب شود.
  • وابستگی های خارجی
    • در لینوکس، نسخه کتابخانه سیستم libstdc++ به طور خودکار شناسایی می شود و اگر جدیدتر باشد، بارگذاری می شود. رفتار بارگیری داخلی libstdc++ قدیمی، صرف نظر از نسخه سیستم، با تنظیم متغیر محیطی "JULIA_PROBE_LIBSTDCXX=0" قابل بازیابی است.
    • "RPATH" از باینری جولیا حذف شد، که می تواند کتابخانه هایی را در لینوکس که قادر به تعریف متغیر "RUNPATH" نیستند، خراب کند.
    • بهبود ابزار: خروجی "MethodError" و متدها (به عنوان مثال از "methods(my_func)") اکنون مطابق با اصل خروجی متدها در یک ردیابی پشته قالب بندی و رنگ بندی شده است.

    منبع: opennet.ru

اضافه کردن نظر