Выпуск мовы праграмавання 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 месяцы карэкціруючых выпускаў.

Асноўныя паляпшэння:

  • Эксперыментальная падтрымка супастаўленняў з узорам (Супастаўленне ўзору), якія дазваляюць перабраць зададзены аб'ект і прызначыць значэнне, калі маецца супадзенне з узорам.

    case [0, [1, 2, 3]] in [a, [b, *c]] pa #=> 0
    pb #=> 1
    pc #=> [2, 3] end

    case {a: 0, b: 1}
    in {a: 0, x: 1}
    :unreachable
    in {a: 0, b: var}
    p var #=> 1
    канец

  • У абалонцы інтэрактыўных вылічэнняў irb (REPL, Read-Eval-Print-Loop) з'явілася магчымасць шматрадковага рэдагавання, рэалізаваная пры дапамозе readline-сумяшчальнай бібліятэкі перабудоўваць, напісанай на мове Ruby. Інтэграваная падтрымка rdoc, якая дазваляе праглядаць у irb даведачную інфармацыю па зададзеным класам, модулям і метадам. Забяспечана каляровае падсвятленне радкоў з кодам, якія паказваюцца праз Binding#irb і вынікаў інспектавання аб'ектаў базавых класаў.

    Выпуск мовы праграмавання Ruby 2.7.0

  • Дададзены ўшчыльняльны зборшчык смецця (Compaction GC), які можа выконваць дэфрагментацыю вобласці памяці, вырашаючы праблемы паніжэння прадукцыйнасці і падвышэнні спажывання памяці з-за фрагментацыі памяці, якая ўзнікае падчас прац некаторых шматструменных Ruby-прыкладанняў. Для пакавання аб'ектаў у кучы прапанаваны метад GC.compact, які дазваляе зменшыць лік выкарыстоўваных старонак памяці і аптымізаваць кучу для аперацый
    CoW (copy-on-write).

  • Праведзена падрыхтоўка да падзелу аргументаў, вызначаных на аснове пазіцыі ў спісе ("def foo(a, b, c)") і ключавых слоў ("def foo(key: val)"). Аўтаматычнае пераўтварэнне аргументаў на аснове ключавых слоў і пазіцыі абвешчана састарэлым і не будзе падтрымлівацца ў галінцы Ruby 3.0. У прыватнасці, абвешчана састарэлым выкарыстанне апошняга аргумента як параметраў ключавога слова, перадача аргументаў на аснове ключавых слоў як апошняга параметра хеша і падзел апошняга аргумента на пазіцыйныя і ключавыя параметры.

    def foo(key: 42); end; foo({key: 42}) # warned
    def foo(**kw); end; foo({key: 42}) # warned
    def foo(key: 42); end; foo(**{key: 42}) # OK
    def foo(**kw); end; foo(**{key: 42}) # OK

    def foo(h, **kw); end; foo(key: 42) # warned
    def foo(h, key: 42); end; foo(key: 42) # warned
    def foo(h, **kw); end; foo({key: 42}) # OK
    def foo(h, key: 42); end; foo({key: 42}) # OK

    def foo(h={}, key: 42); end; foo(«key» => 43, key: 42) # warned
    def foo(h={}, key: 42); end; foo({«key» => 43, key: 42}) # warned
    def foo(h={}, key: 42); end; foo({«key» => 43}, key: 42) # OK

    def foo(opt={}); end; foo( key: 42 ) # OK

    def foo(h, **nil); end; foo(key: 1) # ArgumentError
    def foo(h, **nil); end; foo(**{key: 1}) # ArgumentError
    def foo(h, **nil); end; foo(«str» => 1) # ArgumentError
    def foo(h, **nil); end; foo({key: 1}) # OK
    def foo(h, **nil); end; foo({«str» => 1}) # OK

    h = {}; def foo(*a) a end; foo(**h) # [] h = {}; def foo(a) a end; foo(**h) # {} and warning
    h = {}; def foo(*a) a end; foo(h) # [{}] h = {}; def foo(a) a end; foo(h) # {}

  • Магчымасць выкарыстання нумараваных імёнаў зменных па змаўчанні для параметраў блока.

    [1, 2, 3].each { puts @1 } # як аналаг [1, 2, 3].each { |i| puts i }

  • Эксперыментальная падтрымка дыяпазонаў без пачатковага значэння.

    ary[..3] # аналагічна ary[0..3] rel.where(sales: ..100)

  • Дададзены метад Enumerable#tally, які падлічвае колькі разоў сустракаецца кожны элемент.

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

  • Дазволены выклік прыватнага метаду з літаралам "self"

    def foo
    канец
    private :foo
    self.foo

  • Дададзены метад Enumerator::Lazy#eager для генерацыі звычайнага пералічэння з «гультаяватага» (Enumerator::Lazy) пералічэнні.

    a = % w (foo bar baz)
    e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
    p e.class #=> Enumerator
    p e.map {|x| x + "?" } #=> [«FOO!?», «BAR!?», «BAZ!?»]

  • Працягнута развіццё эксперыментальнага JIT-кампілятара, які дазваляе адчувальна падняць прадукцыйнасць прыкладанняў на мове Ruby. Прапанаваны ў Ruby JIT-кампілятар спачатку запісвае на дыск код на мове Сі, пасля чаго выклікае вонкавы Сі-кампілятар для генерацыі машынных інструкцый (падтрымліваецца выклік GCC, Clang і Microsoft VC++). У новай версіі рэалізаваны метад для inline-разгортвання пры неабходнасці, забяспечана выбарачнае ўжыванне рэжымаў аптымізацыі пры кампіляцыі, значэнне па змаўчанні "-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,
    StringScanner 1.0.3;

  • З базавай пастаўкі ў вонкавыя gem-пакеты вынесены бібліятэкі
    CMath (cmath gem),
    Scanf (scanf gem),
    Shell (shell gem),
    Synchronizer (sync gem),
    ThreadsWait (thwait gem),
    E2MM (e2mmap gem).

  • На rubygems.org апублікаваныя модулі stdlib, якія пастаўляюцца па змаўчанні:
    арыенцір,
    cgi,
    delegate,
    getoptlong,
    net-pop,
    net-smtp,
    open3,
    pstore,
    singleton. Не перанесены ў rubygems.org модулі monitor
    observer,
    timeout,
    tracer,
    uri,
    yaml, якія пастаўляюцца толькі ў ruby-core.

  • Для зборкі Ruby зараз патрабуецца Сі-кампілятар, які падтрымлівае стандарт C99.

Крыніца: opennet.ru

Дадаць каментар