การเปิดตัวภาษาโปรแกรม Ruby 2.7.0

หลังจากหนึ่งปีของการพัฒนา การตีพิมพ์ ปล่อย Ruby 2.7.0ซึ่งเป็นภาษาโปรแกรมเชิงวัตถุแบบไดนามิกที่มีประสิทธิภาพสูงในการพัฒนาโปรแกรมและรวมคุณสมบัติที่ดีที่สุดของ Perl, Java, Python, Smalltalk, Eiffel, Ada และ Lisp รหัสโครงการเผยแพร่ภายใต้ใบอนุญาต BSD ("2-clause BSDL") และ "Ruby" ซึ่งอ้างอิงถึงเวอร์ชันล่าสุดของใบอนุญาต GPL และเข้ากันได้กับ GPLv3 โดยสมบูรณ์ Ruby 2.7 เป็นรีลีสหลักลำดับที่ 2 ที่ผลิตโดยเป็นส่วนหนึ่งของกระบวนการพัฒนาที่วางแผนไว้ ซึ่งรวมถึงการเผื่อเวลาหนึ่งปีสำหรับการปรับปรุงฟีเจอร์และการออกแพตช์ 3-XNUMX เดือน

หลัก การปรับปรุง:

  • การทดลอง สนับสนุน การจับคู่รูปแบบ (การจับคู่รูปแบบ) เพื่อวนซ้ำวัตถุที่กำหนดและกำหนดค่าหากมีการจับคู่รูปแบบ

    กรณี [0, [1, 2, 3]] ใน [a, [b, *c]] pa #=> 0
    pb #=> 1
    พีซี #=> [2, 3] จบ

    กรณี {a: 0, b: 1}
    ใน{a:0,x:1}
    : ไม่สามารถเข้าถึงได้
    ใน {a: 0, b: var}
    p var #=> 1
    ปลาย

  • เชลล์ของการคำนวณเชิงโต้ตอบ irb (REPL, Read-Eval-Print-Loop) มีความเป็นไปได้ในการแก้ไขหลายบรรทัด โดยดำเนินการโดยใช้ไลบรารีที่เข้ากันได้กับ readline Relineเขียนด้วยภาษารูบี มีการรวมการสนับสนุน rdoc ซึ่งช่วยให้ดูข้อมูลอ้างอิงเกี่ยวกับคลาส โมดูล และวิธีการที่ระบุใน irb มีการเน้นสีของบรรทัดด้วยรหัสที่แสดงผ่าน Binding#irb และผลลัพธ์ของการตรวจสอบอ็อบเจ็กต์คลาสพื้นฐาน

    การเปิดตัวภาษาโปรแกรม Ruby 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}) #เตือนแล้ว
    def foo(**กิโลวัตต์); จบ; foo({key: 42}) #เตือนแล้ว
    def foo(คีย์: 42); จบ; foo(**{key: 42}) # ตกลง
    def foo(**กิโลวัตต์); จบ; foo(**{key: 42}) # ตกลง

    def foo(h, **กิโลวัตต์); จบ; foo(key: 42) #เตือนแล้วนะ
    def foo(h, คีย์: 42); จบ; foo(คีย์: 42) #เตือนแล้ว
    def foo(h, **กิโลวัตต์); จบ; foo({key: 42}) # ตกลง
    def foo(h, คีย์: 42); จบ; foo({key: 42}) # ตกลง

    def foo(h={}, คีย์: 42); จบ; foo("key" => 43, key: 42) #คำเตือน
    def foo(h={}, คีย์: 42); จบ; foo({"key" => 43, key: 42}) # เตือน
    def foo(h={}, คีย์: 42); จบ; foo({"key" => 43}, key: 42) # ตกลง

    def foo(opt={}); จบ; foo( คีย์: 42 ) # ตกลง

    def foo(h, **ไม่มี); จบ; foo(คีย์: 1) # ArgumentError
    def foo(h, **ไม่มี); จบ; foo(**{key: 1}) # ArgumentError
    def foo(h, **ไม่มี); จบ; foo("str" ​​=> 1) # ArgumentError
    def foo(h, **ไม่มี); จบ; foo({key: 1}) # ตกลง
    def foo(h, **ไม่มี); จบ; foo({"str" ​​=> 1}) # ตกลง

    ชั่วโมง = {}; def foo(*a) จบ; ฟู(**h) # [] h = {}; def foo(a) จบ; foo(**h) # {} และคำเตือน
    ชั่วโมง = {}; def foo(*a) จบ; ฟู(h) # [{}] h = {}; def foo(a) จบ; ฟู(h) # {}

  • โอกาส ใช้ชื่อตัวแปรเริ่มต้นที่เป็นตัวเลขสำหรับพารามิเตอร์บล็อก

    [1, 2, 3].each { ใส่ @1 } # เช่น [1, 2, 3].each { |i| ทำให้ฉัน }

  • การสนับสนุนการทดลองสำหรับช่วงที่ไม่มีค่าเริ่มต้น

    ary[..3] # เหมือนกับ ary[0..3] rel.where(ยอดขาย: ..100)

  • เพิ่มเมธอด Enumerable#tally ซึ่งจะนับจำนวนครั้งที่แต่ละองค์ประกอบเกิดขึ้น

    ["a", "b", "c", "b"].tally
    #=> {"a"=>1, "b"=>2, "c"=>1}

  • อนุญาตให้เรียกใช้เมธอดส่วนตัวด้วยตัวอักษร "self"

    หนี
    ปลาย
    ส่วนตัว :foo
    ตัวเอง.ฟู

  • เพิ่ม Enumerator::Lazy#eager method เพื่อสร้างการแจงนับปกติจากการแจงนับ lazy (Enumerator::Lazy)

    a = %w(ฟู บาร์ บาซ)
    e = a.lazy.map {|x| x.upcase }.แผนที่ {|x| x + "!" }.กระตือรือร้น
    p e.class #=> ตัวแจงนับ
    e.แผนที่ {|x| x + "?" } #=> [“FOO!?”, “BAR!?”, “BAZ!?”]

  • การพัฒนาคอมไพเลอร์ JIT รุ่นทดลองยังคงดำเนินต่อไป ซึ่งสามารถปรับปรุงประสิทธิภาพของแอปพลิเคชันในภาษา Ruby ได้อย่างมีนัยสำคัญ คอมไพเลอร์ JIT ที่เสนอใน Ruby จะเขียนโค้ด 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,
    แร็ค 1.4.15,
    CSV 3.1.2, REXML 3.2.3,
    อาร์เอส 0.2.8,
    เครื่องสแกนสตริง 1.0.3;

  • ไลบรารีย้ายจากการแจกจ่ายฐานไปยังแพ็คเกจอัญมณีภายนอก
    CMath (อัญมณีคณิตศาสตร์),
    Scanf (สแกนอัญมณี),
    เปลือกหอย (อัญมณีเปลือก)
    Synchronizer (อัญมณีซิงค์),
    ThreadsWait (รออัญมณี),
    E2MM (อัญมณี e2mmap)

  • โมดูล stdlib เริ่มต้นเผยแพร่บน rubygems.org:
    เกณฑ์มาตรฐาน
    ซีจี,
    ผู้รับมอบอำนาจ
    รับยาว,
    เน็ตป๊อป,
    smtp สุทธิ,
    เปิด 3,
    พีสโตร์,
    ซิงเกิ้ลตัน โมดูลมอนิเตอร์ไม่ได้ย้ายไปที่ rubygems.org
    ผู้สังเกตการณ์
    หมดเวลา,
    ติดตาม,
    เกลียด,
    yaml ซึ่งมาพร้อมกับ ruby-core เท่านั้น

  • ขณะนี้การสร้าง Ruby ต้องการคอมไพเลอร์ C ที่รองรับมาตรฐาน C99

ที่มา: opennet.ru

เพิ่มความคิดเห็น