انتشار زبان برنامه نویسی Ruby 2.7.0

پس از یک سال توسعه منتشر شد رهایی روبی 2.7.0یک زبان برنامه نویسی شی گرا پویا که در توسعه برنامه بسیار کارآمد است و بهترین ویژگی های Perl، Java، Python، Smalltalk، Eiffel، Ada و Lisp را در خود جای داده است. کد پروژه تحت مجوزهای BSD ("2-clause BSDL") و "Ruby" توزیع شده است که به آخرین نسخه مجوز GPL اشاره دارد و کاملاً با GPLv3 سازگار است. Ruby 2.7 هفتمین نسخه اصلی است که به عنوان بخشی از یک فرآیند توسعه برنامه ریزی شده تولید می شود که شامل اختصاص یک سال برای بهبود ویژگی ها و انتشار پچ 2 تا 3 ماهه است.

اصلی پیشرفت ها:

  • تجربی پشتیبانی تطبیق الگو (تطبیق الگو) برای تکرار روی شی داده شده و اختصاص یک مقدار در صورت وجود مطابقت الگو.

    مورد [0، [1، 2، 3]] در [a، [b، *c]] pa #=> 0
    pb #=> 1
    pc #=> [2، 3] پایان

    مورد {a: 0، b: 1}
    در{a:0,x:1}
    :غیر قابل دسترسی
    در {a: 0، b: var}
    p var #=> 1
    پایان

  • پوسته محاسبات تعاملی irb (REPL، Read-Eval-Print-Loop) اکنون امکان ویرایش چند خطی را دارد که با استفاده از یک کتابخانه سازگار با Readline پیاده سازی شده است. دوبارهنوشته شده با روبی پشتیبانی از rdoc یکپارچه شده است که امکان مشاهده اطلاعات مرجع در کلاس‌ها، ماژول‌ها و روش‌های مشخص شده را در irb فراهم می‌کند. هایلایت رنگی خطوط با کد نشان داده شده از طریق Binding#irb و نتایج بازرسی اشیاء کلاس پایه ارائه شده است.

    انتشار زبان برنامه نویسی Ruby 2.7.0

  • یک جمع‌کننده زباله جمع‌وجور (Compaction GC) اضافه شده است که می‌تواند یک ناحیه از حافظه را یکپارچه کند، مشکلات عملکرد کند و افزایش مصرف حافظه را به دلیل تکه تکه شدن حافظه که در طول عملکرد برخی از برنامه‌های روبی چند رشته‌ای رخ می‌دهد، حل کند. برای بسته بندی اشیاء روی پشته پیشنهادی روش GC.compact برای کاهش تعداد صفحات حافظه استفاده شده و بهینه سازی پشته برای عملیات
    CoW (کپی روی نوشتن).

  • انجام شد آماده شدن برای جداسازی آرگومان ها بر اساس موقعیت در لیست ("def foo(a,b,c)") و کلمات کلیدی ("def foo(key: val)"). تبدیل خودکار آرگومان بر اساس کلمات کلیدی و موقعیت منسوخ شده است و در شاخه Ruby 3.0 پشتیبانی نخواهد شد. به طور خاص، استفاده از آخرین آرگومان به عنوان پارامترهای کلمه کلیدی، ارسال آرگومان های مبتنی بر کلمه کلیدی به عنوان آخرین پارامتر هش، و تقسیم آخرین آرگومان به پارامترهای موقعیتی و کلید واژه منسوخ شده است.

    def foo (کلید: 42); پایان؛ foo({key: 42}) # warned
    def foo(**kw); پایان؛ foo({key: 42}) #warned
    def foo (کلید: 42); پایان؛ foo(**{key: 42}) # OK
    def foo(**kw); پایان؛ foo(**{key: 42}) # OK

    def foo(h, **kw); پایان؛ foo(key: 42) #هشدار داد
    def foo(h، کلید: 42); پایان؛ foo(key: 42) #هشدار داد
    def foo(h, **kw); پایان؛ foo({key: 42}) # باشه
    def foo(h، کلید: 42); پایان؛ foo({key: 42}) # باشه

    def foo(h={}، کلید: 42); پایان؛ foo("key" => 43, key: 42) #warned
    def foo(h={}، کلید: 42); پایان؛ foo({"key" => 43, key: 42}) # warned
    def foo(h={}، کلید: 42); پایان؛ foo({"key" => 43}, key: 42) # OK

    def foo(opt={}); پایان؛ foo( کلید: 42 ) # باشه

    def foo(h, **nil); پایان؛ foo(key: 1) # ArgumentError
    def foo(h, **nil); پایان؛ foo(**{key: 1}) # ArgumentError
    def foo(h, **nil); پایان؛ foo("str"‎ => 1) # ArgumentError
    def foo(h, **nil); پایان؛ foo({key: 1}) # باشه
    def foo(h, **nil); پایان؛ foo({"str"‎‎ => 1}) # خوب

    h = {}; def foo(*a) end; foo(**h) # [] h = {}; def foo(a) end; foo(**h) # {} و هشدار
    h = {}; def foo(*a) end; foo(h) # [{}] h = {}; def foo(a) end; foo(h) # {}

  • فرصت با استفاده از نام های متغیر پیش فرض شماره گذاری شده برای پارامترهای بلوک.

    [1، 2، 3].each { قرار می دهد @1 } # مانند [1، 2، 3]. هر { |i| من را قرار می دهد }

  • پشتیبانی آزمایشی برای محدوده های بدون مقدار اولیه.

    ary[..3] # مشابه ary[0..3] rel.where(فروش: ..100)

  • متد Enumerable#tally اضافه شد که تعداد دفعات رخ دادن هر عنصر را محاسبه می کند.

    ["الف"، "ب"، "ج"، "ب"].tally
    #=> {"a"=>1، "b"=>2، "c"=>1}

  • فراخوانی روش خصوصی با کلمه "self" مجاز است

    deffoo
    پایان
    خصوصی :foo
    خود.فو

  • روش Enumerator::Lazy#eager برای تولید شمارش منظم از شمارش تنبل (Enumerator::Lazy) اضافه شد.

    a = %w(foo bar baz)
    e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.مشتاق
    p e.class #=> Enumerator
    نقشه الکترونیکی {|x| x + "؟" } #=> ["FOO!"، "BAR!؟"، "BAZ!؟"]

  • توسعه یک کامپایلر آزمایشی JIT ادامه یافته است که می تواند به طور قابل توجهی عملکرد برنامه ها را در زبان Ruby بهبود بخشد. کامپایلر JIT پیشنهاد شده در روبی ابتدا کد C را روی دیسک می نویسد، پس از آن یک کامپایلر خارجی C را برای تولید دستورالعمل های ماشین فراخوانی می کند (GCC، Clang و Microsoft VC ++ پشتیبانی می شوند). نسخه جدید روشی را برای استقرار درون خطی در صورت لزوم پیاده سازی می کند، استفاده انتخابی از حالت های بهینه سازی در طول کامپایل، مقدار پیش فرض "--jit-min-call" از 5 به 10000 افزایش می یابد و "--jit-max-cache" از 1000 تا 100
  • بهبود عملکرد CGI.escapeHTML، Monitor و MonitorMixin.
  • Module#name، true.to_s، false.to_s و nil.to_s اطمینان حاصل می کنند که رشته ای برای شی مشخص شده بدون تغییر است.
  • اندازه فایل های باینری تولید شده توسط روش RubyVM::InstructionSequence#to_binary کاهش یافته است.
  • نسخه های به روز شده اجزای داخلی، از جمله
    Bundler 2.1.2، RubyGems 3.1.2،
    Racc 1.4.15،
    CSV 3.1.2، REXML 3.2.3،
    RSS 0.2.8،
    اسکنر رشته 1.0.3;

  • کتابخانه ها از توزیع پایه به بسته های گوهر خارجی منتقل شدند
    CMath (گوهر cmath)،
    اسکنف (سنگ اسکنف)،
    پوسته (جواهر صدفی)،
    همگام ساز (سنگ همگام سازی)،
    ThreadsWait (thwait gem),
    E2MM (گوهر e2mmap).

  • ماژول های پیش فرض stdlib در rubygems.org منتشر می شوند:
    معیار،
    cgi،
    نماینده،
    طولانی شدن،
    پاپ خالص،
    net smtp،
    open3,
    pstore،
    تک تن ماژول های مانیتور به rubygems.org منتقل نشده اند
    مشاهده کننده،
    تایم اوت،
    ردیاب،
    اوری،
    yaml که فقط با هسته یاقوتی ارسال می شوند.

  • ساخت روبی اکنون به یک کامپایلر C نیاز دارد که از استاندارد C99 پشتیبانی کند.

منبع: opennet.ru

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