انتشار زبان برنامه نویسی Julia 1.8

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

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

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

تغییرات عمده در Julia 1.8:

  • ویژگی های زبان جدید
    • فیلدهای یک ساختار قابل تغییر اکنون می توانند به عنوان ثابت یادداشت شوند تا از تغییر آنها جلوگیری شود و امکان بهینه سازی فراهم شود.
    • حاشیه نویسی نوع را می توان به متغیرهای سراسری اضافه کرد.
    • آرایه های خالی n بعدی را می توان با استفاده از چند نقطه ویرگول در داخل براکت های مربع ایجاد کرد، برای مثال "[;;;]" یک آرایه 0x0x0 ایجاد می کند.
    • بلوک‌های Try اکنون می‌توانند به صورت اختیاری یک بلوک else داشته باشند، که در صورت عدم وجود خطا، بلافاصله پس از بدنه اصلی اجرا می‌شود.
    • @inline و @noinline را می توان در داخل یک تابع قرار داد و به شما امکان می دهد یک تابع ناشناس را حاشیه نویسی کنید.
    • @inline و @noinline اکنون می‌توانند روی یک تابع در یک سایت تماس یا بلوک اعمال شوند تا فراخوانی‌های تابع مربوطه را مجبور به گنجاندن (یا شامل نشدن) کنند.
    • ∀، ∃ و ∄ به عنوان کاراکترهای شناسه مجاز هستند.
    • پشتیبانی از مشخصات یونیکد 14.0.0 اضافه شده است.
    • متد Module(:name, false, false) را می توان برای ایجاد ماژولی استفاده کرد که شامل نام نیست، Base یا Core را وارد نمی کند و حاوی ارجاع به خود نیست.
  • تغییرات در زبان
    • اشیاء Task تازه ایجاد شده (@spawn، @async، و غیره) اکنون دارای world_age برای متدهایی از Task والد هستند که امکان اجرای بهینه را فراهم می کند. گزینه فعال سازی قبلی با استفاده از روش Base.invokelatest در دسترس است.
    • دستورالعمل‌های قالب‌بندی دو جهته نامتعادل یونیکد اکنون در رشته‌ها و نظرات برای جلوگیری از تزریق ممنوع هستند.
    • Base.ifelse در حال حاضر به عنوان یک تابع عمومی به جای یک داخلی تعریف می شود و به بسته ها اجازه می دهد تا تعریف آن را گسترش دهند.
    • هر انتساب به یک متغیر سراسری اکنون ابتدا از طریق یک فراخوانی برای تبدیل (Any, x) یا تبدیل (T, x) انجام می‌شود، اگر متغیر جهانی از نوع T است. قبل از استفاده از متغیرهای جهانی، مطمئن شوید که تبدیل ثابت (Any) ، x) === x همیشه درست است، در غیر این صورت ممکن است منجر به رفتار غیرمنتظره شود.
    • توابع داخلی در حال حاضر شبیه توابع عمومی هستند و با استفاده از روش ها می توان آنها را به صورت برنامه نویسی شمارش کرد.
  • بهبودهای کامپایلر/ زمان اجرا
    • زمان بوت تقریباً 25٪ کاهش یافت.
    • کامپایلر مبتنی بر LLVM از کتابخانه زمان اجرا به یک کتابخانه جدید به نام libjulia-codegen جدا شده است. به طور پیش فرض بارگذاری شده است، بنابراین در طول استفاده عادی نباید تغییری ایجاد شود. در استقرارهایی که نیازی به کامپایلر ندارند (مثلاً تصاویر سیستمی که در آنها تمام کدهای لازم از قبل کامپایل شده است)، این کتابخانه (و وابستگی LLVM آن) به سادگی می تواند حذف شود.
    • استنتاج نوع شرطی اکنون با ارسال یک آرگومان به یک متد امکان پذیر است. به عنوان مثال، برای Base.ifelse(isa(x، Int)، x، 0) ::Int را برمی‌گرداند حتی اگر نوع x ناشناخته باشد.
    • SROA (Scalar Replacement of Aggregates) بهبود یافته است: تماس‌های getfield را با فیلدهای جهانی دائمی حذف می‌کند، ساختارهای قابل تغییر با فیلدهای اولیه را حذف می‌کند، عملکرد و مدیریت تماس‌های getfield تودرتو را بهبود می‌بخشد.
    • نوع استنتاج اثرات مختلف را ردیابی می کند - عوارض جانبی و عدم رها کردن. انتشار ثابت در نظر گرفته شده است، که به طور قابل توجهی عملکرد زمان کامپایل را بهبود می بخشد. برای مثال، در برخی موارد، فراخوانی‌هایی به توابعی که نمی‌توانند درون خطی قرار گیرند، اما بر نتیجه تأثیری ندارند، در زمان اجرا حذف می‌شوند. با استفاده از ماکرو Base.@assume_effects می توان قوانین افکت ها را به صورت دستی بازنویسی کرد.
    • پیش‌کامپایل (با دستورالعمل‌های پیش‌کامپایل صریح یا حجم‌های کاری مشخص) اکنون کدهای تعریف‌شده بیشتری را ذخیره می‌کند، که منجر به اجرای سریع‌تر در بار اول می‌شود. هر ترکیب جدید متد/نوع مورد نیاز بسته شما، صرف نظر از اینکه آن متدها کجا تعریف شده اند، اکنون می توانند در فایل پیش کامپایل کش ذخیره شوند، اگر با متدی متعلق به بسته شما فراخوانی شوند.
  • تغییرات در گزینه های خط فرمان
    • رفتار پیش‌فرض برای نظارت بر اعلان‌های inbounds@ اکنون گزینه خودکار در "--check-bounds=yes|no|auto" است.
    • گزینه جدید "-strip-metadata" برای حذف رشته های اسناد، اطلاعات مکان منبع و نام متغیرهای محلی هنگام ایجاد یک تصویر سیستم.
    • گزینه جدید "--strip-ir" به کامپایلر اجازه می دهد تا نمایش کد منبع میانی را هنگام ساختن تصویر سیستم حذف کند. تصویر حاصل فقط در صورتی کار می کند که از "--compile=all" استفاده شود یا تمام کدهای مورد نیاز از قبل کامپایل شده باشند.
    • اگر کاراکتر "-" به جای نام فایل مشخص شده باشد، کد اجرایی از جریان ورودی استاندارد خوانده می شود.
  • تغییرات پشتیبانی چند رشته ای
    • Threads.@threads به‌طور پیش‌فرض از گزینه زمان‌بندی جدید :dynamic استفاده می‌کند، که با حالت قبلی متفاوت است زیرا تکرارها به‌جای اختصاص دادن به هر رشته، به‌صورت پویا در سراسر رشته‌های کارگر موجود برنامه‌ریزی می‌شوند. این حالت به توزیع بهتر حلقه های تو در تو با @spawn و @threads اجازه می دهد.
  • توابع جدید کتابخانه
    • everysplit(str) برای اجرای split(str) چندین بار.
    • allequal(itr) برای آزمایش اینکه آیا همه عناصر در یک تکرار کننده برابر هستند یا خیر.
    • از هاردلینک (src, dst) می توان برای ایجاد لینک های سخت استفاده کرد.
    • setcpuaffinity (cmd، cpus) برای تنظیم وابستگی هسته پردازنده به فرآیندهای راه اندازی شده.
    • diskstat(path=pwd()) برای دریافت آمار دیسک.
    • ماکرو جدید @showtime برای نمایش خط مورد ارزیابی و گزارش زمان @.
    • ماکرو LazyString و lazy"str" ​​برای پشتیبانی از ساخت تنبل پیام های خطا در مسیرهای خطا اضافه شده اند.
    • رفع مشکل همزمانی در Dict و سایر اشیاء مشتق شده مانند keys(::Dict)، مقادیر(::Dict) و Set. روش‌های تکرار اکنون می‌توانند در فرهنگ لغت یا مجموعه فراخوانی شوند، تا زمانی که هیچ تماسی وجود نداشته باشد که دیکشنری یا مجموعه را تغییر دهد.
    • @time و @timev اکنون یک توضیح اختیاری دارند که به شما امکان می‌دهد برای مثال منبع گزارش‌های زمانی را حاشیه‌نویسی کنید. @time "Evaluating foo" foo().
    • محدوده تنها آرگومان کلمه کلیدی خود را توقف یا طول می‌گیرد.
    • precision و setprecision اکنون پایه را به عنوان یک کلمه کلیدی می پذیرند
    • اشیاء سوکت TCP اکنون یک روش نوشتن نزدیک ارائه می کنند و از حالت نیمه باز پشتیبانی می کنند.
    • extrema اکنون آرگومان init را می پذیرد.
    • Iterators.countfrom اکنون هر نوع که متد + را تعریف می کند را می پذیرد.
    • @time now درصد زمان صرف شده برای کامپایل مجدد متدها با انواع تغییر یافته را اختصاص می دهد.
  • تغییرات استاندارد کتابخانه
    • کلیدهای دارای ارزش اکنون هیچ چیز از محیط در addenv حذف نمی شود.
    • Iterators.reverse (و در نتیجه آخرین) هر خط را پشتیبانی می کند.
    • تابع طول برای محدوده هایی از انواع خاص دیگر سرریز اعداد صحیح را بررسی نمی کند. یک تابع جدید، checked_length، در دسترس است؛ این تابع منطق کنترل انتقال بیت را شامل می شود. در صورت لزوم، از SaferIntegers.jl برای ساخت نوع محدوده استفاده کنید.
    • تکرار کننده Iterators.Reverse در صورت امکان، معکوس هر شاخص را پیاده سازی می کند.
  • مدیر بسته
    • نشانگرهای ⌃ و ⌅ جدید در کنار بسته‌هایی که در وضعیت «pkg>» هستند که نسخه‌های جدید برای آن‌ها موجود است. ⌅ نشان می دهد که نسخه های جدید قابل نصب نیستند.
    • جدید قدیمی:: آرگومان Bool به Pkg.status (-- قدیمی یا -o در حالت REPL) برای نمایش اطلاعات بسته‌های نسخه‌های قبلی.
    • آرگومان جدید compat::Bool به Pkg.status (--compat یا -c در حالت REPL) برای نمایش هر ورودی [compat] در Project.toml.
    • حالت جدید "pkg>compat" (و Pkg.compat) برای تنظیم ورودی های سازگاری پروژه. یک ویرایشگر تعاملی را از طریق "pkg>compat" یا کنترل رکورد مستقیم از طریق "pkg>Foo 0.4,0.5،0.4,0.5" ارائه می دهد، که می تواند رکوردهای فعلی را از طریق تکمیل برگه بارگیری کند. یعنی "pkg> compat Fo" به طور خودکار به "pkg> Foo XNUMX،XNUMX" به‌روزرسانی می‌شود تا یک ورودی موجود قابل ویرایش باشد.
    • Pkg اکنون فقط در صورتی تلاش می‌کند که بسته‌ها را از سرور بسته دانلود کند که سرور در حال نظارت بر رجیستری حاوی بسته باشد.
    • وقتی Project.toml با Manifest.toml همگام نباشد، Pkg.instantiate اکنون اخطاری صادر می کند. این کار را بر اساس هش رکوردهای deps و compat پروژه انجام می دهد (دیگر فیلدها نادیده گرفته می شوند) در مانیفست هنگام حل آن، به طوری که هر تغییری در Deps یا رکوردهای Compat Project.toml می تواند بدون حل مجدد شناسایی شود.
    • اگر "pkg>add" نتواند بسته ای را با نام داده شده پیدا کند، اکنون بسته هایی با نام های مشابه را پیشنهاد می کند که می توان آنها را اضافه کرد.
    • نسخه julia ذخیره شده در مانیفست دیگر شامل شماره ساخت نیست، به این معنی که master اکنون به عنوان 1.9.0-DEV نوشته می شود.
    • لغو آزمایش "pkg>" اکنون به طور مداوم شناسایی می شود و به درستی به REPL بازگردانده می شود.
  • InteractiveUtils
    • ماکروی جدید @time_imports برای گزارش زمان صرف شده برای وارد کردن بسته‌ها و وابستگی‌های آنها، برجسته کردن زمان کامپایل و کامپایل مجدد به عنوان درصدی از واردات.
  • جبر خطی
    • زیر ماژول BLAS اکنون از توابع سطح 2 BLAS spr!
    • کتابخانه استاندارد LinearAlgebra.jl اکنون کاملاً مستقل از SparseArrays.jl است، هم از نظر کد منبع و هم از منظر آزمایش واحد. در نتیجه، آرایه های پراکنده دیگر (به طور ضمنی) با روش هایی از LinearAlgebra اعمال شده بر روی اشیاء Base یا LinearAlgebra بازگردانده نمی شوند. به ویژه، این منجر به تغییرات شکستن زیر می شود:
      • الحاقات با استفاده از ماتریس‌های «پراکنده» ویژه (مثلاً مورب) اکنون ماتریس‌های متراکم را برمی‌گردانند. در نتیجه، فیلدهای D1 و D2 اشیاء SVD که توسط فراخوانی getproperty ایجاد می‌شوند، اکنون ماتریس‌های متراکمی هستند.
      • متد similar(::SpecialSparseMatrix, ::Type, ::Dims) یک ماتریس تهی متراکم را برمی گرداند. در نتیجه، محصولات ماتریس‌های سه‌ضلعی دو، سه، و متقارن با یکدیگر منجر به تولید یک ماتریس متراکم می‌شوند. علاوه بر این، ساخت ماتریس‌های مشابه با سه آرگومان از ماتریس‌های «sparse» ویژه از ماتریس‌های (غیر استاتیک) اکنون به دلیل «zero(::Type{Matrix{T}}) ناموفق است.
  • Printf
    • %s و %c اکنون از آرگومان textwidth برای قالب بندی عرض استفاده می کنند.
  • مشخصات
    • پروفایل بار CPU اکنون ابرداده ها از جمله رشته ها و وظایف را ثبت می کند. Profile.print () دارای یک آرگومان groupby جدید است که به شما امکان می‌دهد تا رشته‌ها، وظایف یا subthreads/tasks، tasks/threads و آرگومان‌های رشته‌ها و وظایف را برای فیلتر کردن گروه‌بندی کنید. علاوه بر این، بسته به اینکه آیا نخ در هر نمونه بیکار است یا نه، درصد استفاده اکنون به صورت کلی یا در هر نخ گزارش می شود. Profile.fetch() به طور پیش فرض شامل ابرداده جدید است. برای سازگاری با مصرف‌کنندگان خارجی داده‌های پروفایل، می‌توان آن را با عبور include_meta=false حذف کرد.
    • ماژول جدید Profile.Allocs به شما امکان می دهد تخصیص حافظه را نمایه کنید. ردیابی پشته ای از نوع و اندازه هر تخصیص حافظه ثبت می شود و آرگومان sample_rate اجازه می دهد تا تعداد قابل تنظیمی از تخصیص ها نادیده گرفته شود و سربار عملکرد را کاهش دهد.
    • نمایه سازی CPU با مدت زمان ثابت اکنون می تواند توسط کاربر در حالی که وظایف در حال اجرا هستند بدون بارگیری نمایه اول اجرا شود و گزارش در حین اجرا نمایش داده می شود. در MacOS و FreeBSD، ctrl-t را فشار دهید یا با SIGINFO تماس بگیرید. برای پلتفرم های دیگر، SIGUSR1 را فعال کنید. % kill -USR1 $julia_pid. این در ویندوز موجود نیست.
  • پاسخ
    • RadioMenu اکنون از میانبرهای صفحه کلید اضافی برای انتخاب مستقیم گزینه ها پشتیبانی می کند.
    • دنباله "?(x، y" و به دنبال آن فشار دادن TAB، تمام روش هایی را که می توان با آرگومان های x، y، ... فراخوانی کرد، نمایش می دهد. y "جستجو را به "MyModule" محدود می کند. فشار دادن TAB مستلزم آن است که حداقل یک آرگومان از نوع خاص تر از Any باشد. یا از SHIFT-TAB به جای TAB برای اجازه دادن به هر روش سازگار استفاده کنید.
    • متغیر جهانی err جدید به شما امکان می دهد آخرین استثنا را دریافت کنید، مشابه رفتار ans با آخرین پاسخ. وارد کردن err اطلاعات استثنا را دوباره چاپ می کند.
  • SparseArrays
    • کد SparseArrays را از مخزن جولیا به مخزن خارجی SparseArrays.jl منتقل کرد.
    • توابع الحاق جدید sparse_hcat، sparse_vcat و sparse_hvcat یک نوع SparseMatrixCSC را بدون توجه به انواع آرگومان های ورودی برمی گرداند. این امر برای یکسان سازی مکانیسم چسباندن ماتریس ها پس از جداسازی کد LinearAlgebra.jl و SparseArrays.jl ضروری شد.
  • ورود به سیستم
    • سطوح ثبت استاندارد زیر MinLevel، Debug، Info، Warn، Error و AboveMaxLevel اکنون از کتابخانه استاندارد Logging صادر می شوند.
  • یونیکد
    • تابع isequal_normalized برای بررسی معادل یونیکد بدون ساخت رشته های نرمال شده به طور صریح اضافه شد.
    • تابع Unicode.normalize اکنون کلمه کلیدی charttransform را می پذیرد، که می تواند برای ارائه نگاشت کاراکترهای سفارشی مورد استفاده قرار گیرد، و تابع Unicode.julia_chartransform نیز برای بازتولید نگاشت مورد استفاده زمانی که تجزیه کننده جولیا شناسه ها را عادی می کند، ارائه می شود.
  • تست
    • '@test_throws "some message" triggers_error()" اکنون می تواند برای آزمایش اینکه آیا متن خطای نمایش داده شده حاوی خطای "some message" صرف نظر از نوع استثنا خاص است یا خیر، استفاده شود. عبارات منظم، لیست رشته ها و توابع تطبیق نیز پشتیبانی می شوند.
    • @testset foo() اکنون می تواند برای ایجاد یک مجموعه تست از یک تابع مشخص استفاده شود. نام مورد آزمایشی نام تابعی است که فراخوانی می شود. تابع فراخوانی شده ممکن است حاوی @test و سایر تعاریف @testset باشد، از جمله برای تماس با توابع دیگر، در حالی که همه نتایج آزمون میانی را ضبط می کند.
    • TestLogger و LogRecord اکنون از کتابخانه تست استاندارد صادر می شوند.
  • توزیع شده
    • SSHManager اکنون از thread های کارگر با یک wrapper csh/tcsh از طریق متد addprocs() و پارامتر shell=:csh پشتیبانی می کند.
  • تغییرات دیگر
    • از GC.enable_logging(true) می توان برای ثبت هر عملیات جمع آوری زباله با زمان و مقدار حافظه جمع آوری شده استفاده کرد.

منبع: opennet.ru

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