|
| 1 | +--- |
| 2 | +layout: news_post |
| 3 | +title: "Ruby 3.2.0 Preview 1 릴리스" |
| 4 | +author: "naruse" |
| 5 | +translator: "shia" |
| 6 | +date: 2022-04-03 00:00:00 +0000 |
| 7 | +lang: ko |
| 8 | +--- |
| 9 | + |
| 10 | +{% assign release = site.data.releases | where: "version", "3.2.0-preview1" | first %} |
| 11 | + |
| 12 | +Ruby {{ release.version }} 릴리스를 알리게 되어 기쁩니다. Ruby 3.2는 많은 기능과 성능 향상을 포함하고 있습니다. |
| 13 | + |
| 14 | + |
| 15 | +## WASI 기반 웹어셈블리 지원 |
| 16 | + |
| 17 | +WASI에 기반해 웹어셈블리를 지원하는 첫 이식판입니다. 이를 통해 CRuby 바이너리는 웹 브라우저, 서버리스 엣지 환경, 그 이외의 웹어셈블리/WASI를 사용가능한 환경에서 동작할 수 있습니다. 현재 이 이식판은 스레드 API이외의 기본적인 테스트와 부트스트랩 테스트 스위트를 통과합니다. |
| 18 | + |
| 19 | + |
| 20 | + |
| 21 | +### 배경 |
| 22 | + |
| 23 | +[웹어셈블리 (WASM)](https://webassembly.org/)는 본래 웹 브라우저에서 프로그램을 안전하고 빠르게 실행하기 위해서 만들어졌습니다. 하지만 그 목적 중 하나인 프로그램을 다양한 환경에서 안전하고 효율적으로 실행하는 것은 웹 뿐만이 아니라 일반적인 애플리케이션도 바라던 것입니다. |
| 24 | + |
| 25 | +[WASI (The WebAssembly System Interface)](https://wasi.dev/)는 이러한 용도를 위해 설계되었습니다. 이러한 애플리케이션은 운영체제와 통신해야합니다만, 웹어셈블리는 시스템 인터페이스를 가지지 않는 가상 머신 위에서 동작합니다. WASI는 이 인터페이스를 표준화합니다. |
| 26 | + |
| 27 | +Ruby의 웹어셈블리/WASI 지원은 이러한 프로젝트들을 활용하기 위함입니다. 이를 통해 Ruby 개발자들이 기대받는 플랫폼에서 움직이는 애플리케이션을 작성할 수 있습니다. |
| 28 | + |
| 29 | +### 사용 예시 |
| 30 | + |
| 31 | +이는 개발자가 웹어셈블리 환경에서 CRuby를 활용할 수 있도록 돕습니다. 하나의 예로, [TryRuby playground](https://try.ruby-lang.org/playground/)의 CRuby 지원이 있습니다. 이제 CRuby를 웹 브라우저 상에서 직접 사용해볼 수 있습니다. |
| 32 | + |
| 33 | +### 기술적인 부분 |
| 34 | + |
| 35 | +현재 WASI와 웹어셈블리 자체에는 Fiber, 예외 처리, GC를 구현하기 위한 일부 기능이 부족합니다. 이는 여전히 개발중이라는 점도 있지만, 보안때문이기도 합니다. 그래서 CRuby는 유저랜드에서의 실행을 제어하기 위한 바이너리 변환 기술인 Asyncify를 사용해 그 차이를 매꿉니다. |
| 36 | + |
| 37 | +나아가서 Ruby 애플리케이션을 간단하게 단일 .wasm 파일로 패키징할 수 있도록 [WASI 상에 VFS](https://github.com/kateinoigakukun/wasi-vfs/wiki/Getting-Started-with-CRuby)를 구현했습니다. 이는 Ruby 애플리케이션의 배포를 쉽게 해줄 것입니다. |
| 38 | + |
| 39 | + |
| 40 | +### 관련 링크 |
| 41 | + |
| 42 | +* [Add WASI based WebAssembly support #5407](https://github.com/ruby/ruby/pull/5407) |
| 43 | +* [An Update on WebAssembly/WASI Support in Ruby](https://itnext.io/final-report-webassembly-wasi-support-in-ruby-4aface7d90c9) |
| 44 | + |
| 45 | +## 정규표현식 타임아웃 |
| 46 | + |
| 47 | +정규표현식 일치 처리에 타임아웃 기능을 도입했습니다. |
| 48 | + |
| 49 | +```ruby |
| 50 | +Regexp.timeout = 1.0 |
| 51 | + |
| 52 | +/^a*b?a*$/ =~ "a" * 50000 + "x" |
| 53 | +#=> 1초 후에 Regexp::TimeoutError |
| 54 | +``` |
| 55 | + |
| 56 | +정규표현식 일치는 기대와는 다르게 시간이 오래 걸리는 경우가 있습니다. 신뢰할 수 없는 입력에 대해서 비효율적일 가능성이 있는 정규표현식을 일치검사하고 있다면, 공격자는 이를 이용해 효율적으로 서비스 거부 공격(이를 정규표현식 DoS, 또는 ReDoS라고 불립니다)이 가능합니다. |
| 57 | + |
| 58 | +Ruby 애플리케이션의 요구사항에 맞는 `Regexp.timeout`을 설정해 DoS에 대한 위험을 예방하거나 상당히 완화할 수 있습니다. 애플리케이션에 직접 설정해보세요. 피드백도 환영합니다. |
| 59 | + |
| 60 | +`Regexp.timeout`은 전역 설정임에 주의하세요. 일부의 툭수한 정규표현식에 대해서만 다른 타임아웃 설정을 사용하고 싶다면, `Regexp.new` 의 `timeout` 키워드를 사용할 수 있습니다. |
| 61 | + |
| 62 | +```ruby |
| 63 | +Regexp.timeout = 1.0 |
| 64 | + |
| 65 | +# 이 정규표현식은 타임아웃 설정이 없습니다. |
| 66 | +long_time_re = Regexp.new("^a*b?a*$", timeout: nil) |
| 67 | + |
| 68 | +long_time_re =~ "a" * 50000 + "x" # 타임아웃이 발생하지 않습니다. |
| 69 | +``` |
| 70 | + |
| 71 | +기능 제안 티켓: https://bugs.ruby-lang.org/issues/17837 |
| 72 | + |
| 73 | + |
| 74 | +## 그 이외의 주목할 만한 새 기능 |
| 75 | + |
| 76 | +### 서드파티 소스코드를 더이상 내장하지 않음 |
| 77 | + |
| 78 | +* `libyaml`이나 `libffi`와 같은 서드파티의 소스코드를 내장하지 않기로 결정했습니다. |
| 79 | + |
| 80 | + * psych 에 포함되어 있던 libyaml의 소스 코드는 삭제되었습니다. Ubuntu/Debian 환경이라면 직접 `libyaml-dev`를 설치해야합니다. 이 패키지의 이름은 각 환경마다 다를 수 있습니다. |
| 81 | + |
| 82 | + * `fiddle`에 포함되어 있던 libffi는 preview2에서 삭제될 예정입니다. |
| 83 | + |
| 84 | +### 언어 |
| 85 | + |
| 86 | +* 검색 패턴은 이제 정식 기능입니다. |
| 87 | + |
| 88 | + |
| 89 | +## 성능 향상 |
| 90 | + |
| 91 | + |
| 92 | + |
| 93 | +## 그 이외의 3.1 이후로 주목할 만한 변경 |
| 94 | + |
| 95 | +* Hash |
| 96 | + * Hash#shift는 이제 해시가 비어있다면 |
| 97 | + 기본 값이나 기본 프록을 호출한 결과값을 반환하는 대신 |
| 98 | + 언제나 nil을 반환합니다. [[Bug #16908]] |
| 99 | + |
| 100 | +* MatchData |
| 101 | + * MatchData#byteoffset이 추가되었습니다. [[Feature #13110]] |
| 102 | + |
| 103 | +* Module |
| 104 | + * Module.used_refinements가 추가되었습니다. [[Feature #14332]] |
| 105 | + * Module#refinements가 추가되었습니다. [[Feature #12737]] |
| 106 | + * Module#const_added가 추가되었습니다. [[Feature #17881]] |
| 107 | + |
| 108 | +* Proc |
| 109 | + * Proc#dup은 서브클래스의 인스턴스를 반환합니다. [[Bug #17545]] |
| 110 | + * Proc#parameters는 이제 람다 키워드를 받습니다. [[Feature #15357]] |
| 111 | + |
| 112 | +* Refinement |
| 113 | + * Refinement#refined_class가 추가되었습니다. [[Feature #12737]] |
| 114 | + |
| 115 | +* Set |
| 116 | + * Set은 이제 `require "set"`할 필요 없이 사용 가능한 내장 클래스입니다. [[Feature #16989]] |
| 117 | + 현재는 `Set` 정수를 사용하거나 `Enumerable#to_set`을 호출하면 자동으로 로딩됩니다. |
| 118 | + |
| 119 | +* String |
| 120 | + * String#byteindex와 String#byterindex가 추가되었습니다. [[Feature #13110]] |
| 121 | + * 유니코드 버전이 14.0.0, 에모지 버전이 14.0으로 갱신되었습니다. [[Feature #18037]] |
| 122 | + (이는 정규표현식에도 적용됩니다) |
| 123 | + * String#bytesplice가 추가되었습니다. [[Feature #18598]] |
| 124 | + |
| 125 | +* Struct |
| 126 | + * `keyword_init: true` 없이 `Struct.new`에 키워드 인수를 넘겨 |
| 127 | + Struct 클래스를 초기화할 수 있습니다. [[Feature #16806]] |
| 128 | + |
| 129 | + |
| 130 | +### 표준 라이브러리 갱신 |
| 131 | + |
| 132 | +* 다음 기본 젬이 갱신되었습니다. |
| 133 | + |
| 134 | + * TBD |
| 135 | + |
| 136 | +* 다음 내장 젬이 갱신되었습니다. |
| 137 | + |
| 138 | + * TBD |
| 139 | + |
| 140 | +* 다음 기본 gem은 이제 내장 gem이 됩니다. 사용하려면 번들러 환경에서 `Gemfile`에 다음 라이브러리들을 추가해야 합니다. |
| 141 | + |
| 142 | + * TBD |
| 143 | + |
| 144 | +더 자세한 내용은 [NEWS](https://github.com/ruby/ruby/blob/{{ release.tag }}/NEWS.md)나 |
| 145 | +[커밋 로그](https://github.com/ruby/ruby/compare/v3_1_0...{{ release.tag }})를 |
| 146 | +확인해주세요. |
| 147 | + |
| 148 | +이러한 변경사항에 따라, Ruby 3.1.0 이후로 [파일 {{ release.stats.files_changed }}개 수정, {{ release.stats.insertions }}줄 추가(+), {{ release.stats.deletions }}줄 삭제(-)](https://github.com/ruby/ruby/compare/v3_1_0...{{ release.tag }}#file_bucket)가 |
| 149 | +이루어졌습니다! |
| 150 | + |
| 151 | +## Download |
| 152 | + |
| 153 | +* <{{ release.url.gz }}> |
| 154 | + |
| 155 | + SIZE: {{ release.size.gz }} |
| 156 | + SHA1: {{ release.sha1.gz }} |
| 157 | + SHA256: {{ release.sha256.gz }} |
| 158 | + SHA512: {{ release.sha512.gz }} |
| 159 | + |
| 160 | +* <{{ release.url.xz }}> |
| 161 | + |
| 162 | + SIZE: {{ release.size.xz }} |
| 163 | + SHA1: {{ release.sha1.xz }} |
| 164 | + SHA256: {{ release.sha256.xz }} |
| 165 | + SHA512: {{ release.sha512.xz }} |
| 166 | + |
| 167 | +* <{{ release.url.zip }}> |
| 168 | + |
| 169 | + SIZE: {{ release.size.zip }} |
| 170 | + SHA1: {{ release.sha1.zip }} |
| 171 | + SHA256: {{ release.sha256.zip }} |
| 172 | + SHA512: {{ release.sha512.zip }} |
| 173 | + |
| 174 | +## Ruby는 |
| 175 | + |
| 176 | +Ruby는 1993년에 Matz(마츠모토 유키히로) 씨가 처음 개발했고, |
| 177 | +현재는 오픈 소스로서 개발되고 있습니다. 여러 플랫폼에서 동작하며, |
| 178 | +특히 웹 개발에서 전 세계적으로 이용되고 있습니다. |
0 commit comments