|
| 1 | +--- |
| 2 | +layout: news_post |
| 3 | +title: "루비 3.0.0 Preview 1 릴리스" |
| 4 | +author: "naruse" |
| 5 | +translator: "shia" |
| 6 | +date: 2020-09-25 00:00:00 +0000 |
| 7 | +lang: ko |
| 8 | +--- |
| 9 | + |
| 10 | +루비 3.0.0-preview1 릴리스를 알리게 되어 기쁩니다. |
| 11 | + |
| 12 | +이는 많은 새 기능과 성능 향상을 포함하고 있습니다. |
| 13 | + |
| 14 | +## RBS |
| 15 | + |
| 16 | +RBS는 루비 프로그램의 타입을 기술하기 위한 언어입니다. |
| 17 | +RBS를 지원하기 위한 타입 프로파일러와 다른 도구들을 포함하는 타입 검사기는 RBS 정의를 통해 루비 프로그램을 더 잘 이해합니다. |
| 18 | + |
| 19 | +클래스나 모듈에 정의된 메서드, 인스턴스 변수와 타입, 상속이나 믹스인 관계에 대한 정의를 작성할 수 있습니다. |
| 20 | +RBS의 목표는 루비 프로그램에서 흔히 보이는 패턴을 지원하는 것과 유니언 타입, 메서드 오버로딩, 제네릭을 포함하는 고급 타입을 지원하는 것입니다. 또한 _인터페이스 타입_을 이용해 덕타이핑을 지원합니다. |
| 21 | + |
| 22 | +루비 3.0은 RBS로 작성된 타입 정의를 해석하고 처리하는 `rbs` 젬을 포함합니다. |
| 23 | + |
| 24 | +다음은 RBS의 작은 예시입니다. |
| 25 | + |
| 26 | +{% highlight rbs %} |
| 27 | +module ChatApp |
| 28 | + VERSION: String |
| 29 | + |
| 30 | + class Channel |
| 31 | + attr_reader name: String |
| 32 | + attr_reader messages: Array[Message] |
| 33 | + attr_reader users: Array[User | Bot] # `|`는 유니언 타입을 의미합니다. 여기에서는 `User` 또는 `Bot`이라는 의미입니다. |
| 34 | + |
| 35 | + def initialize: (String) -> void |
| 36 | + |
| 37 | + def post: (String, from: User | Bot) -> Message # 메서드 오버로딩이 지원됩니다. |
| 38 | + | (File, from: User | Bot) -> Message |
| 39 | + end |
| 40 | +end |
| 41 | +{% endhighlight %} |
| 42 | + |
| 43 | +더 자세한 내용은 [rbs 젬의 README](https://github.com/ruby/rbs)를 확인하세요. |
| 44 | + |
| 45 | +## Ractor (실험적) |
| 46 | + |
| 47 | +Ractor는 스레드 안전에 대한 걱정이 없는 병렬 실행을 제공하기 위해 설계된 액터 모델과 비슷한 동시 실행 추상화 모델입니다. |
| 48 | + |
| 49 | +여러 개의 ractor를 만들고 병렬로 실행할 수 있습니다. Ractor는 일반 객체를 공유할 수 없기 때문에 스레드 안전한 병렬 프로그램을 만들 수 있습니다. |
| 50 | +ractor 간의 통신은 메시지 넘기기를 통해서 지원됩니다. |
| 51 | + |
| 52 | +객체 공유를 제한하기 위해, Ractor는 루비 문법에 여러 제한을 추가했습니다(여러 개의 ractor를 사용하지 않는다면 차이는 없습니다). |
| 53 | + |
| 54 | +명세와 구현은 아직 완성되지 않았으므로 앞으로 변경될 수 있습니다. 그러므로 이 기능은 실험적으로 제공되며 Ractor가 생성되면 실험적 기능을 사용하고 있다는 경고를 표시합니다. |
| 55 | + |
| 56 | +다음은 `prime?`을 2개의 ractor를 통해 계산하는 프로그램입니다. 이는 2개 이상의 코어를 사용하는 경우, 순차적으로 실행하는 프로그램보다 약 2배 빠릅니다. |
| 57 | + |
| 58 | +{% highlight ruby %} |
| 59 | +require 'prime' |
| 60 | + |
| 61 | +# r1, r2에 보낸 정수들로 'n.prime?'을 병렬 실행 |
| 62 | +r1, r2 = *(1..2).map do |
| 63 | + Ractor.new do |
| 64 | + n = Ractor.recv |
| 65 | + n.prime? |
| 66 | + end |
| 67 | +end |
| 68 | + |
| 69 | +# 매개 변수를 송신 |
| 70 | +r1.send 2**61 - 1 |
| 71 | +r2.send 2**61 + 15 |
| 72 | + |
| 73 | +# r1, r2의 실행 결과 대기 |
| 74 | +p r1.take #=> true |
| 75 | +p r2.take #=> true |
| 76 | +{% endhighlight %} |
| 77 | + |
| 78 | +더 자세한 내용은 [doc/ractor.md](https://github.com/ruby/ruby/blob/master/doc/ractor.md)를 확인하세요. |
| 79 | + |
| 80 | +## 스케줄러 (실험적) |
| 81 | + |
| 82 | +블로킹 명령에 끼어들 수 있는 `Thread#scheduler`가 도입됩니다. |
| 83 | +이는 기존에 존재하는 코드를 변경하지 않고 가벼운 동시성을 지원할 수 있게 합니다. |
| 84 | + |
| 85 | +현재 지원되는 클래스와 메서드는 다음과 같습니다. |
| 86 | + |
| 87 | +- `Mutex#lock`, `Mutex#unlock`, `Mutex#sleep` |
| 88 | +- `ConditionVariable#wait` |
| 89 | +- `Queue#pop`, `SizedQueue#push` |
| 90 | +- `Thread#join` |
| 91 | +- `Kernel#sleep` |
| 92 | +- `IO#wait`, `IO#read`, `IO#write`와 관련 메서드(예: `#wait_readable`, `#gets`, `#puts` 등). |
| 93 | +- `IO#select`는 *지원되지 않습니다*. |
| 94 | + |
| 95 | +현재 동시성을 위한 기점은 `Fiber.schedule{...}`입니다만, 이는 루비 3의 릴리스 때 변경될 가능성이 있습니다. |
| 96 | + |
| 97 | +현재 [`Async::Scheduler`](https://github.com/socketry/async/pull/56)의 테스트 스케줄러가 이용 가능합니다. |
| 98 | +자세한 내용은 [`doc/scheduler.md`](https://github.com/ruby/ruby/blob/master/doc/scheduler.md)를 확인하세요. [Feature #16786] |
| 99 | + |
| 100 | +**주의**: 이 기능은 매우 실험적입니다. 이름과 기능 모두 다음 프리뷰 릴리스에서 변경될 수 있습니다. |
| 101 | + |
| 102 | +## 그 이외의 주목할 만한 기능 |
| 103 | + |
| 104 | +* 오른쪽으로 값을 할당하는 명령이 추가됩니다. |
| 105 | + {% highlight ruby %} |
| 106 | + fib(10) => x |
| 107 | + p x #=> 55 |
| 108 | + {% endhighlight %} |
| 109 | + |
| 110 | +* `end` 없는 메서드 정의가 추가됩니다. |
| 111 | + {% highlight ruby %} |
| 112 | + def square(x) = x * x |
| 113 | + {% endhighlight %} |
| 114 | + |
| 115 | +* 검색 패턴이 추가됩니다. |
| 116 | + {% highlight ruby %} |
| 117 | + case ["a", 1, "b", "c", 2, "d", "e", "f", 3] |
| 118 | + in [*pre, String => x, String => y, *post] |
| 119 | + p pre #=> ["a", 1] |
| 120 | + p x #=> "b" |
| 121 | + p y #=> "c" |
| 122 | + p post #=> [2, "d", "e", "f", 3] |
| 123 | + end |
| 124 | + {% endhighlight %} |
| 125 | + |
| 126 | +* `Hash#except`가 내장됩니다. |
| 127 | + {% highlight ruby %} |
| 128 | + h = { a: 1, b: 2, c: 3 } |
| 129 | + p h.except(:a) #=> {:b=>2, :c=>3} |
| 130 | + {% endhighlight %} |
| 131 | + |
| 132 | +* 메모리 뷰가 실험적인 기능으로 추가됩니다. |
| 133 | + |
| 134 | + * 이는 숫자 배열이나 비트맵 이미지와 같은 메모리 공간을 확장 라이브러리 간에 교환하기 위한 새로운 C-API 집합입니다. 확장 라이브러리는 모양, 요소의 형식 등으로 구성된 메모리 공간의 메타 정보를 공유할 수 있습니다. 이러한 메타 정보를 사용하여 확장 라이브러리는 다차원 배열을 적절하게 공유할 수 있습니다. 이 기능은 파이썬의 버퍼 프로토콜을 참고하여 설계되었습니다. |
| 135 | + |
| 136 | +## 성능 향상 |
| 137 | + |
| 138 | +* MJIT에 많은 개선이 추가되었습니다. 자세한 내용은 [NEWS](https://github.com/ruby/ruby/blob/v3_0_0_preview1/NEWS.md)를 확인하세요. |
| 139 | + |
| 140 | +## 그 이외의 2.7 이후로 주목할 만한 변경 |
| 141 | + |
| 142 | +* 키워드 인자가 다른 인자들로부터 분리됩니다. |
| 143 | + * 원칙적으로 루비 2.7에서 경고를 출력하는 코드는 동작하지 않습니다. 자세한 내용은 [문서](https://www.ruby-lang.org/ko/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/)를 확인하세요. |
| 144 | + * 한편, 인자를 전달할 때 앞쪽 인자를 사용할 수 있습니다. |
| 145 | + {% highlight ruby %} |
| 146 | + def method_missing(meth, ...) |
| 147 | + send(:"do_#{ meth }", ...) |
| 148 | + end |
| 149 | + {% endhighlight %} |
| 150 | + |
| 151 | +* `$SAFE` 기능이 완전히 제거됩니다. 이 값은 이제 일반 전역 변수입니다. |
| 152 | + |
| 153 | +* 루비 2.5에서 백트레이스의 순서가 역순이 되었습니다만, 이를 취소합니다. 이제 백트레이스는 루비 2.4와 동일하게 동작합니다. 예외가 발생한 곳의 에러 메시지와 줄 번호가 가장 먼저 출력되며, 이를 호출한 곳의 정보가 그 뒤에 출력됩니다. |
| 154 | + |
| 155 | +* 표준 라이브러리를 업데이트했습니다. |
| 156 | + * RubyGems 3.2.0.rc.1 |
| 157 | + * Bundler 2.2.0.rc.1 |
| 158 | + * IRB 1.2.6 |
| 159 | + * Reline 0.1.5 |
| 160 | + |
| 161 | +* 다음 라이브러리들은 이제 기본으로 포함되지 않습니다. |
| 162 | + 각 기능이 필요한 경우에는 해당하는 젬을 설치해주세요. |
| 163 | + * net-telnet |
| 164 | + * xmlrpc |
| 165 | + |
| 166 | +* 기본 젬이 내장 젬으로 승격됩니다. |
| 167 | + * rexml |
| 168 | + * rss |
| 169 | + |
| 170 | +* 표준 라이브러리가 기본 젬으로 승격됩니다. 다음 기본 젬들이 rubygems.org에서 배포 중입니다. |
| 171 | + * abbrev |
| 172 | + * base64 |
| 173 | + * English |
| 174 | + * erb |
| 175 | + * find |
| 176 | + * io-nonblock |
| 177 | + * io-wait |
| 178 | + * net-ftp |
| 179 | + * net-http |
| 180 | + * net-imap |
| 181 | + * net-protocol |
| 182 | + * nkf |
| 183 | + * open-uri |
| 184 | + * optparse |
| 185 | + * resolv |
| 186 | + * resolv-replace |
| 187 | + * rinda |
| 188 | + * securerandom |
| 189 | + * set |
| 190 | + * shellwords |
| 191 | + * tempfile |
| 192 | + * time |
| 193 | + * tmpdir |
| 194 | + * tsort |
| 195 | + * weakref |
| 196 | + |
| 197 | +더 자세한 내용은 [NEWS](https://github.com/ruby/ruby/blob/v3_0_0_preview1/NEWS.md)나 |
| 198 | +[커밋 로그](https://github.com/ruby/ruby/compare/v2_7_0...v3_0_0_preview1)를 확인해주세요. |
| 199 | + |
| 200 | +{% assign release = site.data.releases | where: "version", "3.0.0-preview1" | first %} |
| 201 | + |
| 202 | +이러한 변경사항에 따라, 루비 2.7.0 이후로 [파일 {{ release.stats.files_changed }}개 수정, {{ release.stats.insertions }}줄 추가(+), {{ release.stats.deletions }}줄 삭제](https://github.com/ruby/ruby/compare/v2_7_0...v3_0_0_preview1)가 이루어졌습니다! |
| 203 | + |
| 204 | +루비 3.0.0-preview1을 사용해보시고, 피드백을 보내주세요! |
| 205 | + |
| 206 | +## 다운로드 |
| 207 | + |
| 208 | +* <{{ release.url.bz2 }}> |
| 209 | + |
| 210 | + SIZE: {{ release.size.bz2 }} |
| 211 | + SHA1: {{ release.sha1.bz2 }} |
| 212 | + SHA256: {{ release.sha256.bz2 }} |
| 213 | + SHA512: {{ release.sha512.bz2 }} |
| 214 | + |
| 215 | +* <{{ release.url.gz }}> |
| 216 | + |
| 217 | + SIZE: {{ release.size.gz }} |
| 218 | + SHA1: {{ release.sha1.gz }} |
| 219 | + SHA256: {{ release.sha256.gz }} |
| 220 | + SHA512: {{ release.sha512.gz }} |
| 221 | + |
| 222 | +* <{{ release.url.xz }}> |
| 223 | + |
| 224 | + SIZE: {{ release.size.xz }} |
| 225 | + SHA1: {{ release.sha1.xz }} |
| 226 | + SHA256: {{ release.sha256.xz }} |
| 227 | + SHA512: {{ release.sha512.xz }} |
| 228 | + |
| 229 | +* <{{ release.url.zip }}> |
| 230 | + |
| 231 | + SIZE: {{ release.size.zip }} |
| 232 | + SHA1: {{ release.sha1.zip }} |
| 233 | + SHA256: {{ release.sha256.zip }} |
| 234 | + SHA512: {{ release.sha512.zip }} |
| 235 | + |
| 236 | +## 3.0.0-preview2 예고 |
| 237 | + |
| 238 | +정적 타입 분석 기능을 위한 ["타입 프로파일러"](https://github.com/mame/ruby-type-profiler)를 포함할 예정입니다. 계속 지켜봐주세요! |
| 239 | + |
| 240 | +## 루비는 |
| 241 | + |
| 242 | +루비는 1993년에 Matz(마츠모토 유키히로)가 처음 개발했고, 현재는 오픈 소스로서 개발되고 있습니다. 이는 여러 플랫폼에서 동작하며, 특히 웹 개발에서 전 세계적으로 이용되고 있습니다. |
0 commit comments