루비

루비 2.7

페도라 32는 루비 2.7 버전을 제공합니다. 루비 2.6에서 이와 같은 주요 최신화된 페도라는 최고의 루비 개발 기반이 됩니다.

루비 2.6 이후의 다음 변경들:

루비 2.7은 여러 새로운 기능과 성능 개선을 이뤘습니다.

성능 개선

  • JIT [실험]

  • 광의 캐쉬 전략이 변경되었고 광 생성은 속도가 빨라집니다.

  • Module#name, true.to_s, false.to_s, 와 `nil.to_s`는 현재 항상 고정된 문자열을 반환합니다. 반환된 문자열은 항상 주어진 대상과 동일합니다. [실험]

  • `Monitor`와 `MonitorMixin`의 성능이 향상되었습니다.

  • `CGI.escapeHTML`의 성능이 향상되었습니다.

  • 1.9 즈음에 있었던 '호출-사이트' 방식 캐쉬가 개선되었습니다: 캐쉬 적중률이 89%에서 94%로 증가되었습니다.

  • 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

    • 원본 버전을 가지고 있지 않은 몇몇 다른 라이브러리 또한 최신화 되었습니다.

  • 다음 라이브러리는 더 이상 번들 gems가 아닙니다. 이들 기능을 사용하려면 일치하는 gems를 설치합니다.

    • CMath (cmath gem)

    • Scanf (scanf gem)

    • Shell (shell gem)

    • Synchronizer (sync gem)

    • ThreadsWait (thwait gem)

    • E2MM (e2mmap gem)

  • `profile.rb`는 표준 라이브러리에서 제거되었습니다.

  • `stdlib`를 기본값 gems으로 조장합니다

    • 다음 기본값 gems은 rubygems.org에서 발표되었습니다

      • 시험평가

      • cgi

      • delegate

      • getoptlong

      • net-pop

      • net-smtp

      • open3

      • pstore

      • singleton

    • 다음 기본값 gem은 루비-코어에서만 조장되지만 rubygems.org에서는 아직 게시되지 않았습니다.

      • monitor

      • observer

      • 제한 시간

      • tracer

      • uri

      • yaml

  • 블럭으로 호출되는 방법에서 블럭이 아닌 Proc.new 과 `proc`는 이제 경고됩니다.

  • 블럭으로 호출되는 방법에서 블럭이 아닌 lambda는 예외를 발생시킵니다.

  • 유니코드 버전과 이모지 버전을 11.0.0에서 12.0.0으로 최신화합니다.

  • U+32FF SQUARE ERA NAME REIWA를 위한 지원을 추가하여 유니코드 버전을 12.1.0으로 최신화합니다.

  • Date.jisx0301, Date#jisx0301, 그리고 `Date.parse`는 새로운 일본 연호를 지원합니다.

  • 컴파일러는 C99 지원이 필요합니다.

상세한 변경

유형 분석 [실험적인]

함수 프로그래밍 언어에서 폭넓게 사용되는 기능인 유형 검색은 실험적인 기능으로 소개되었습니다. 이는 제공된 객체를 순회하고 유형과 일치하는 경우 값을 할당 할 수 있습니다.

"json"이 필요합니다

json = <<END
{
  "name": "Alice",
  "age": 30,
  "children": [{ "name": "Bob", "age": 2 }]
}
END

case JSON.parse(json, symbolize_names: true)
in {name: "Alice", children: [{name: "Bob", age: age}]}
  p age #=> 2
end

REPL 개선

묶음으로 제공되는 대화형 환경(REPL; Read-Eval-Print-Loop)인 irb`는 이제 여러-줄 편집을 지원합니다. 순수한 루비로 구현된 `readline -호환-라이브러리인 `reline`에 의해 구동됩니다. 이는 또한 rdoc 통합을 제공합니다. `irb`에서 당신은 제공된 클래스, 모듈 또는 방법을 위한 참조를 표시 할 수 있습니다.

압축 GC

이와 같은 출시에는 조각난 메모리 공간을 다시 조합 할 수 있는 압축 GC를 소개합니다.

몇 가지 다중-쓰레드된 루비 프로그램은 메모리 조각을 발생 시킬 수 있으며, 메모리 사용량을 증가시키고 속도를 감소시킬 수 있습니다.

GC.compact 방법은 힙을 압축하기 위해 도입되었습니다. 이와 같은 기능은 더 적은 수의 페이지를 사용 될 수 있도록 힙에서 라이브 객체를 압축하고, 그리고 힙은 CoW(기록 중 복사)에 더 친숙 할 수 있습니다.

위치와 키워드 인수의 분리

키워드 인수와 위치 인수의 자동 전환은 더 이상 사용되지 않으며, 전환은 루비 3에서 제거 될 것입니다.

변경
  • 메소드 호출은 마지막 인수에서 해쉬를 전달하고, 키워드를 전달하지 않고, 그리고 호출된 메소드가 키워드를 허용하면 경고가 발생합니다. 해쉬를 키워드로 처리를 계속하려면, 이중 표시 연산자를 추가하여 경고를 피하고 루비 3에서 올바른 행위를 보장합니다.

        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
  • 방법 호출은 핵심용어를 허용하는 방법에 핵심용어를 전달 할 때, 하지만 이는 필수적인 위치 인수를 충분히 전달하지 않으며, 핵심용어는 최종적인 필수 위치 인수로 처리 될 것이고, 그리고 경고가 발생됩니다. 경고를 피하고 루비 3에서 올바른 행위을 보장하려면 핵심용어 대신에 해쉬로서 인수를 전달하세요.

        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
  • 방법이 특정 핵심용어를 허용하지만 핵심용어 표시하지 않고, 해쉬 또는 핵심용어 표시가 심볼과 비-심볼 키를 모두 포함하는 방법에 전달되면, 해쉬가 분할 되는 것이 계속 될 것이고, 그리고 경고가 발생될 것입니다. 당신은 루비 3에서 올바른 행위를 보장하려면 별도의 해쉬를 전달하도록 호출되는 코드를 최신화 해야 합니다.

        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
  • 만약 방법이 핵심용어를 허용하지 않으면, 그리고 핵심용어와 함께 호출되는 경우, 핵심용어는 비-경고를 갖는 위치 해쉬로서 여전히 처리됩니다. 이와 같은 행위는 루비 3에서 동작이 계속됩니다.

        def foo(opt={});  end; foo( key: 42 )   # OK
  • 비-기호는 만약 방법이 임의의 핵심용어를 허용하는 경우 핵심용어 인수 키로 허용됩니다.

        def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
  • `**nil`은 방법이 비-핵심용어를 허용하는 것을 명시적인 표시에서 방법 정의로 허용됩니다. 핵심용어로 이러한 방법의 호출은 `ArgumentError`로 발생합니다.

        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)    # {}

만약 더 이상 사용하지 않는 경고를 비활성화 하려면, 명령-줄 인수 `-W:no-deprecated`를 사용하거나 자신의 코드에 `Warning[:deprecated] = false`를 추가해주세요.

이와 같은 출시에 대한 더 상세한 정보를 위해 업스트림 출시 공표를 참고하세요.

Jekyll 4.0

Jekyll 정적 부분 발생기와 이 플러그인은 버전 4.0.0으로 최신화되었습니다. 이 버전은 버전 3.8과 비교되는 다음 변경을 포함합니다:

  • 상당한 성능 향상

  • 정리와 결점 수정

  • 이전 출시로 호환되지 않는 기타 사소한 변경

Jekyll 4.0.0에 대한 더 많은 정보를 위해, Jekyll 4.0.0 출시됨을 참고하세요.