إصدار لغة البرمجة روبي 2.7.0

بعد عام من التطوير نشرت الإفراج عن روبي 2.7.0، لغة برمجة ديناميكية موجهة للكائنات تتميز بالكفاءة العالية في تطوير البرامج وتضم أفضل ميزات Perl و Java و Python و Smalltalk و Eiffel و Ada و Lisp. يتم توزيع رمز المشروع بموجب تراخيص BSD ("BSDL المكونة من فقرتين") و "Ruby" ، والتي تشير إلى أحدث إصدار من ترخيص GPL ومتوافق تمامًا مع GPLv2. Ruby 3 هو الإصدار الرئيسي السابع الذي يتم إنتاجه كجزء من عملية التطوير المخطط لها والتي تتضمن تخصيص عام لتحسينات الميزات وإصدار التصحيح لمدة 2.7-2 أشهر.

رئيسي تحسينات:

  • تجريبي دعم نمط مطابقة (نمط مطابقة) للتكرار على الكائن المحدد وتعيين قيمة إذا كان هناك تطابق في النمط.

    الحالة [0 ، [1 ، 2 ، 3]] في [a، [b، * c]] pa # => 0
    pb # => 1
    pc # => [2، 3] نهاية

    الحالة {أ: 0 ، ب: 1}
    في {أ: 0 ، س: 1}
    : لا يمكن الوصول إليه
    في {أ: 0 ، ب: فار}
    ف فار # => 1
    النهاية

  • غلاف العمليات الحسابية التفاعلية irb (REPL ، Read-Eval-Print-Loop) لديه الآن إمكانية التحرير متعدد الأسطر ، ويتم تنفيذه باستخدام مكتبة متوافقة مع readline تتغذىمكتوب في روبي. تم دمج دعم rdoc ، والذي يسمح بعرض المعلومات المرجعية حول الفئات والوحدات والأساليب المحددة في irb. يتم توفير تمييز ملون للخطوط مع رمز موضح من خلال Binding # irb ونتائج فحص كائنات الفئة الأساسية.

    إصدار لغة البرمجة روبي 2.7.0

  • تمت إضافة أداة تجميع نفايات مضغوطة (Compaction GC) يمكنها إجراء إلغاء تجزئة لمنطقة من الذاكرة ، وحل مشاكل الأداء البطيء وزيادة استهلاك الذاكرة بسبب تجزئة الذاكرة التي تحدث أثناء تشغيل بعض تطبيقات Ruby متعددة الخيوط. لحزم الأشياء على الكومة مقترح 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}) # موافق
    def foo (** kw) ؛ نهاية؛ foo (** {key: 42}) # موافق

    def foo (h، ** kw) ؛ نهاية؛ foo (مفتاح: 42) # تحذير
    def foo (h ، key: 42) ؛ نهاية؛ foo (مفتاح: 42) # تحذير
    def foo (h، ** kw) ؛ نهاية؛ foo ({مفتاح: 42}) # موافق
    def foo (h ، key: 42) ؛ نهاية؛ foo ({مفتاح: 42}) # موافق

    def foo (h = {} ، المفتاح: 42) ؛ نهاية؛ foo ("key" => 43، key: 42) # warned
    def foo (h = {} ، المفتاح: 42) ؛ نهاية؛ foo ({"key" => 43، key: 42}) # تحذير
    def foo (h = {} ، المفتاح: 42) ؛ نهاية؛ foo ({"key" => 43} ، مفتاح: 42) # حسنًا

    def foo (opt = {}) ؛ نهاية؛ foo (مفتاح: 42) # موافق

    def foo (h، ** nil) ؛ نهاية؛ foo (مفتاح: 1) # ArgumentError
    def foo (h، ** nil) ؛ نهاية؛ foo (** {key: 1}) # ArgumentError
    def foo (h، ** nil) ؛ نهاية؛ foo ("str" ​​=> 1) # ArgumentError
    def foo (h، ** nil) ؛ نهاية؛ foo ({مفتاح: 1}) # موافق
    def foo (h، ** nil) ؛ نهاية؛ foo ({"str" ​​=> 1}) # موافق

    ح = {} ؛ def foo (* a) end ؛ foo (** h) # [] h = {} ؛ def foo (أ) النهاية ؛ foo (** h) # {} وتحذير
    ح = {} ؛ def foo (* a) end ؛ foo (h) # [{}] h = {} ؛ def foo (a) end ؛ foo (ح) # {}

  • فرصة باستخدام أسماء المتغيرات المرقمة افتراضيًا لمعلمات الكتلة.

    [1، 2، 3]. كل {puts @ 1} # like [1، 2، 3] .each {| i | يضع أنا}

  • دعم تجريبي للنطاقات التي ليس لها قيمة أولية.

    ary [.. 3] # مثل ary [0..3] rel.where (المبيعات: ..100)

  • تمت إضافة طريقة Enumerable # tally ، والتي تحسب عدد مرات حدوث كل عنصر.

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

  • يُسمح باستدعاء الطريقة الخاصة باستخدام حرفية "ذاتية"

    ديفو
    النهاية
    خاص: foo
    self.foo

  • تمت إضافة العداد :: طريقة Lazy # حريصة لإنشاء تعداد منتظم من التعداد البطيء (Enumerator :: Lazy).

    أ =٪ w (foo bar baz)
    e = a.lazy.map {| x | x.upcase} .map {| x | x + "!" }.مشتاق
    p e.class # => العداد
    خريطة إلكترونية {| x | x + "؟" } # => ["FOO !؟" ، "BAR !؟" ، "BAZ !؟"]

  • استمر تطوير مترجم JIT التجريبي ، والذي يمكن أن يحسن بشكل كبير أداء التطبيقات في لغة روبي. يقوم مترجم JIT المقترح في Ruby أولاً بكتابة كود C على القرص ، وبعد ذلك يقوم باستدعاء مترجم C خارجي لإنشاء تعليمات الجهاز (يتم دعم GCC و Clang و Microsoft VC ++). يطبق الإصدار الجديد طريقة للنشر المضمّن إذا لزم الأمر ، وتطبيق انتقائي لأوضاع التحسين أثناء التجميع ، وزيادة القيمة الافتراضية لـ "--jit-min-calls" من 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) ،
    Scanf (جوهرة المسح الضوئي) ،
    شل (جوهرة قذيفة) ،
    المزامن (مزامنة جوهرة) ،
    خيوط انتظر (مع جوهرة) ،
    E2MM (جوهرة e2mmap).

  • يتم نشر وحدات stdlib الافتراضية على rubygems.org:
    المؤشر،
    CGI
    مندوب
    getoptlong ،
    صافي البوب
    صافي بروتوكول نقل البريد الإلكتروني ،
    open3 ،
    pstore
    مفرد. لم يتم نقل وحدات المراقبة إلى rubygems.org
    مراقب،
    نفذ الوقت،
    المتتبع
    أوري
    yaml ، والتي يتم شحنها فقط مع قلب الياقوت.

  • يتطلب بناء Ruby الآن مترجم C يدعم معيار C99.

المصدر: opennet.ru

إضافة تعليق