Compare commits

...

4 commits

11 changed files with 744 additions and 132 deletions

View file

@ -18,10 +18,13 @@ phf_shared = "0.11.1"
unicode-normalization = "0.1.22" unicode-normalization = "0.1.22"
[dev-dependencies] [dev-dependencies]
criterion = "0.4.0"
rstest = { version = "0.15.0", default-features = false } rstest = { version = "0.15.0", default-features = false }
[[bench]]
name = "kakasi_benchmark"
harness = false
[profile.release] [profile.release]
# These settings optimize for size
codegen-units = 1 codegen-units = 1
opt-level = 'z'
lto = true lto = true

View file

@ -0,0 +1,20 @@
use criterion::{black_box, criterion_group, criterion_main, Criterion};
const RUST_ARTICLE: &str = include_str!("../tests/rust_article.txt");
fn benchmark(c: &mut Criterion) {
c.bench_function("short", |b| b.iter(|| {
convert("安定版となるRust 1.0がリリースされた[84]。1.0版の後、安定版およびベータ版が6週間おきに定期リリースされている[85]。")
}));
c.bench_function("rust_article", |b| b.iter(|| {
convert(RUST_ARTICLE)
}));
}
fn convert(text: &str) {
kakasi::convert(black_box(text));
}
criterion_group!{benches, benchmark}
criterion_main!(benches);

View file

@ -2336,7 +2336,6 @@
にちかん 日間 にちかん 日間
にった 新田 にった 新田
にっちゅう 日中 にっちゅう 日中
にっぽん 日本
にっぽんいち 日本一 にっぽんいち 日本一
にっぽんでんき 日本電気 にっぽんでんき 日本電気
にっぽんぶどうかん 日本武道館 にっぽんぶどうかん 日本武道館

View file

@ -131,8 +131,15 @@ struct Readings(HashMap<String, String>);
impl Encodable for KanjiString { impl Encodable for KanjiString {
fn encode(&self) -> Vec<u8> { fn encode(&self) -> Vec<u8> {
self.0 self.0
.encode_utf16() .chars()
.flat_map(|c16| [((c16 & 0xff00) >> 8) as u8, (c16 & 0xff) as u8]) .map(|c| {
let c = c as u32;
if c > 0xffff {
panic!("character `{}` > 0xffff", { c });
}
[((c & 0xff00) >> 8) as u8, (c & 0xff) as u8]
})
.flatten()
.collect() .collect()
} }
} }

Binary file not shown.

View file

@ -1,34 +1,52 @@
//! # Kakasi
//!
//! `kakasi` is a Rust library to transliterate *hiragana*, *katakana* and *kanji* (Japanese text) into *rōmaji* (Latin/Roman alphabet).
//!
//! It was ported from the [pykakasi](https://codeberg.org/miurahr/pykakasi) library which itself is a port of the original
//! [kakasi](http://kakasi.namazu.org/) library written in C.
#![warn(missing_docs, clippy::todo)]
mod hepburn_dict; mod hepburn_dict;
mod phfbin; mod phfbin;
mod syn_dict; mod syn_dict;
mod types; mod types;
mod util; mod util;
pub use types::KakasiResult; pub use types::{IsJapanese, KakasiResult};
use unicode_normalization::UnicodeNormalization; use unicode_normalization::UnicodeNormalization;
use phfbin::PhfMap; use phfbin::PhfMap;
use types::{CharType, KanjiString, Readings}; use types::{CharType, KanjiString, Readings};
/// Convert the given Japanese text to hiragana/romaji
///
/// ```
/// let res = kakasi::convert("Hello 日本!");
/// assert_eq!(res.hiragana, "Hello にほん!");
/// assert_eq!(res.romaji, "Hello nihon !");
/// ```
pub fn convert(text: &str) -> KakasiResult { pub fn convert(text: &str) -> KakasiResult {
let dict = PhfMap::new(util::KANJI_DICT); let dict = PhfMap::new(util::KANJI_DICT);
let text = normalize(&text); let text = normalize(text);
let mut char_indices = text.char_indices().peekable(); let mut char_indices = text.char_indices().peekable();
let mut kana_buf = String::new(); let mut kana_buf = String::new();
// Type of the character last added to kana_buf
let mut prev_buf_type = CharType::Whitespace; let mut prev_buf_type = CharType::Whitespace;
// Type of the character last added to the result
let mut prev_acc_type = CharType::Whitespace; let mut prev_acc_type = CharType::Whitespace;
// Capitalization flags // Capitalization flags
// 0: capitalize next word, 1: capitalize first sentence, 2: first sentence capitalized // 0: capitalize next word, 1: capitalize first sentence, 2: first sentence capitalized
let mut cap = (false, false, false); let mut cap = (false, false, false);
let mut res = KakasiResult::default(); let mut res = KakasiResult::new(text.len());
let conv_kana_buf = |kana_buf: &mut String, let conv_kana_buf = |kana_buf: &mut String,
res: &mut KakasiResult, res: &mut KakasiResult,
prev_type: &mut CharType, prev_acc_type: &mut CharType,
cap: &mut (bool, bool, bool)| { cap: &mut (bool, bool, bool)| {
if !kana_buf.is_empty() { if !kana_buf.is_empty() {
let hira = convert_katakana(kana_buf); let hira = convert_katakana(kana_buf);
@ -46,12 +64,13 @@ pub fn convert(text: &str) -> KakasiResult {
util::ensure_trailing_space( util::ensure_trailing_space(
&mut res.romaji, &mut res.romaji,
*prev_type != CharType::LeadingPunct && *prev_type != CharType::JoiningPunct, *prev_acc_type != CharType::LeadingPunct
&& *prev_acc_type != CharType::JoiningPunct,
); );
res.romaji.push_str(&rom); res.romaji.push_str(&rom);
kana_buf.clear(); kana_buf.clear();
*prev_type = CharType::Hiragana; *prev_acc_type = CharType::Hiragana;
} }
}; };
@ -80,9 +99,8 @@ pub fn convert(text: &str) -> KakasiResult {
} }
} else { } else {
// Unknown kanji // Unknown kanji
// TODO: FOR TESTING res.hiragana.push(c);
res.hiragana.push_str("[?]"); res.romaji.push(c);
res.romaji.push_str("[?]");
} }
prev_acc_type = CharType::Kanji; prev_acc_type = CharType::Kanji;
} else if c.is_whitespace() { } else if c.is_whitespace() {
@ -105,9 +123,13 @@ pub fn convert(text: &str) -> KakasiResult {
_ => CharType::Katakana, _ => CharType::Katakana,
}; };
} else { } else {
// The rest. Latin characters, other scripts, numbers, special characters
conv_kana_buf(&mut kana_buf, &mut res, &mut prev_acc_type, &mut cap); conv_kana_buf(&mut kana_buf, &mut res, &mut prev_acc_type, &mut cap);
res.hiragana.push(c); res.hiragana.push(c);
// Determine the character type (required for correct spacing and capitalization).
// Japanese punctuation can be looked up in the dictionary, otherwise assume CharType::Other.
// Special case: dots and commas used as decimal seperators
let (c_rom, char_type) = util::PCT_DICT.get(&c).copied().unwrap_or_else(|| { let (c_rom, char_type) = util::PCT_DICT.get(&c).copied().unwrap_or_else(|| {
( (
c, c,
@ -146,6 +168,10 @@ pub fn convert(text: &str) -> KakasiResult {
res.romaji.push(c_rom); res.romaji.push(c_rom);
} }
// If the current character is a full stop (no decimal point),
// the next word should be capitalized.
// Keep the capitalization flag set if the following character is leading or joining
// punctuation. Example: `Sentence1. "Nice", sentence 2.`
cap.0 = c_rom == '.' && char_type != CharType::Numeric cap.0 = c_rom == '.' && char_type != CharType::Numeric
|| cap.0 && matches!(char_type, CharType::LeadingPunct | CharType::JoiningPunct); || cap.0 && matches!(char_type, CharType::LeadingPunct | CharType::JoiningPunct);
cap.1 |= cap.0; cap.1 |= cap.0;
@ -158,13 +184,41 @@ pub fn convert(text: &str) -> KakasiResult {
res res
} }
/// Check if the input text is Japanese
///
/// Note that (especially very short) japanese texts are not always
/// distinguishable from Chinese, because these languages use the same
/// characters.
///
/// Thus if only CJK ideographs are found, the function returns
/// [`IsJapanese::Maybe`].
///
/// ```
/// # use kakasi::IsJapanese;
/// assert_eq!(kakasi::is_japanese("Abc"), IsJapanese::False);
/// assert_eq!(kakasi::is_japanese("日本"), IsJapanese::Maybe);
/// assert_eq!(kakasi::is_japanese("ラスト"), IsJapanese::True);
/// ```
pub fn is_japanese(text: &str) -> IsJapanese {
let mut maybe = false;
for c in text.chars() {
if util::is_char_in_range(c, util::HIRAGANA) || util::is_char_in_range(c, util::KATAKANA) {
return IsJapanese::True;
}
maybe |= util::is_char_in_range(c, util::KANJI);
}
match maybe {
true => IsJapanese::Maybe,
false => IsJapanese::False,
}
}
/// Convert the katakana from the input string to hiragana
fn convert_katakana(text: &str) -> String { fn convert_katakana(text: &str) -> String {
let mut buf = String::new(); let mut buf = String::with_capacity(text.len());
text.chars().for_each(|c| { text.chars().for_each(|c| {
match c as u32 { match c as u32 {
0x30a1..=0x30f6 => { 0x30a1..=0x30f6 => buf.push(char::from_u32(c as u32 - (0x30a1 - 0x3041)).unwrap()),
char::from_u32(c as u32 - (0x30a1 - 0x3041)).map(|c| buf.push(c));
}
0x30f7 => buf.push_str("ゔぁ"), 0x30f7 => buf.push_str("ゔぁ"),
0x30f8 => buf.push_str("ゔぃ"), 0x30f8 => buf.push_str("ゔぃ"),
0x30f9 => buf.push_str("ゔぇ"), 0x30f9 => buf.push_str("ゔぇ"),
@ -175,8 +229,9 @@ fn convert_katakana(text: &str) -> String {
buf buf
} }
/// Convert the hiragana from the input string to latin characters
fn hiragana_to_romaji(text: &str) -> String { fn hiragana_to_romaji(text: &str) -> String {
let mut buf = String::new(); let mut buf = String::with_capacity(text.len());
let mut chars = text.char_indices().peekable(); let mut chars = text.char_indices().peekable();
let mut kc_match = None; let mut kc_match = None;
@ -327,11 +382,11 @@ fn normalize(text: &str) -> String {
} }
// Replace withe the character imcount positions before // Replace withe the character imcount positions before
let mut chars_rev = text[0..i].chars().rev(); text[0..i]
for _ in 1..imcount { .chars()
chars_rev.next(); .rev()
} .nth(imcount - 1)
chars_rev.next().map(|prev| (i, c.len_utf8(), prev)) .map(|prev| (i, c.len_utf8(), prev))
} else { } else {
imcount = 0; imcount = 0;
syn_dict::SYN_DICT syn_dict::SYN_DICT
@ -425,96 +480,4 @@ mod tests {
assert_eq!(res, expect); assert_eq!(res, expect);
assert_eq!(n, expect_n); assert_eq!(n, expect_n);
} }
#[rstest]
#[case("", "", "")]
#[case("構成", "こうせい", "kousei")]
#[case("好き", "すき", "suki")]
#[case("大きい", "おおきい", "ookii")]
#[case("かんたん", "かんたん", "kantan")]
#[case("にゃ", "にゃ", "nya")]
#[case("っき", "っき", "kki")]
#[case("っふぁ", "っふぁ", "ffa")]
#[case("キャ", "きゃ", "kya")]
#[case("キュ", "きゅ", "kyu")]
#[case("キョ", "きょ", "kyo")]
#[case("", "", ".")]
#[case(
"漢字とひらがな交じり文",
"かんじとひらがなまじりぶん",
"kanji tohiragana majiri bun"
)]
#[case(
"Alphabet 123 and 漢字",
"Alphabet 123 and かんじ",
"Alphabet 123 and kanji"
)]
#[case("日経新聞", "にっけいしんぶん", "nikkei shinbun")]
#[case("日本国民は、", "にほんこくみんは、", "nihonkokumin ha,")]
#[case(
"私がこの子を助けなきゃいけないってことだよね",
"わたしがこのこをたすけなきゃいけないってことだよね",
"watashi gakono ko wo tasuke nakyaikenaittekotodayone"
)]
#[case("やったー", "やったー", "yattaa")]
#[case("でっでー", "でっでー", "deddee")]
#[case("てんさーふろー", "てんさーふろー", "tensaafuroo")]
#[case("オレンジ色", "おれんじいろ", "orenji iro")]
#[case("檸檬は、レモン色", "れもんは、れもんいろ", "remon ha, remon iro")]
#[case("血液1μL", "けつえき1μL", "ketsueki 1μL")]
#[case("「和風」", "「わふう」", "\"wafuu\"")]
#[case("て「わ", "て「わ", "te \"wa")]
#[case("号・雅", "ごう・まさ", "gou masa")]
#[case("ビーバーが", "びーばーが", "biibaa ga")]
#[case("ブッシュッー", "ぶっしゅっー", "busshutsuu")]
#[case("ユーベルヹーク大", "ゆーべるゔぇーくだい", "yuuberuveeku dai")]
#[case("ヸーヂャニー品", "ゔぃーぢゃにーひん", "viijanii hin")]
#[case("アヷーリヤ品", "あゔぁーりやひん", "avaariya hin")]
#[case(
"安藤 和風(あんどう はるかぜ、慶応2年1月12日1866年2月26日 - 昭和11年1936年12月26日は、日本のジャーナリスト、マスメディア経営者、俳人、郷土史研究家。通名および俳号は「和風」をそのまま音読みして「わふう」。秋田県の地方紙「秋田魁新報」の事業拡大に貢献し、秋田魁新報社三大柱石の一人と称された。「魁の安藤か、安藤の魁か」と言われるほど、新聞記者としての名声を全国にとどろかせた[4]。",
"あんどう わふう(あんどう はるかぜ、けいおう2ねん1がつ12にち1866ねん2がつ26にち - しょうわ11ねん1936ねん12がつ26にちは、にっぽんのじゃーなりすと、ますめでぃあけいえいしゃ、はいじん、きょうどしけんきゅうか。とおりめいおよびはいごうは「わふう」をそのままおんよみして「わふう」。あきたけんのちほうし「あきたかいしんぽう」のじぎょうかくだいにこうけんし、あきたかいしんぽうしゃさんだいちゅうせきのひとりとしょうされた。「かいのあんどうか、あんどうのかいか」といわれるほど、しんぶんきしゃとしてのめいせいをぜんこくにとどろかせた[4]。",
"Andou wafuu (andou harukaze, keiou 2 nen 1 gatsu 12 nichi (1866 nen 2 gatsu 26 nichi) - shouwa 11 nen (1936 nen) 12 gatsu 26 nichi) ha, nippon no jaanarisuto, masumedia keieisha, haijin, kyoudoshi kenkyuuka. Toori mei oyobi hai gou ha \"wafuu\" wosonomama onyomi shite \"wafuu\". Akitaken no chihoushi \"akita kai shinpou\" no jigyou kakudai ni kouken shi, akita kai shinpou sha sandai chuuseki no hitori to shousa reta. \"Kai no andou ka, andou no kai ka\" to iwa reruhodo, shinbunkisha toshiteno meisei wo zenkoku nitodorokaseta [4].",
)]
#[case(
"『ザ・トラベルナース』",
"『ざ・とらべるなーす』",
"\"za toraberunaasu\""
)]
#[case(
"緑黄色社会『ミチヲユケ』Official Video -「ファーストペンギン!」主題歌",
"みどりきいろしゃかい『みちをゆけ』Official Video -「ふぁーすとぺんぎん!」しゅだいか",
"midori kiiro shakai \"michiwoyuke\" Official Video - \"faasutopengin!\" shudaika"
)]
#[case(
"MONKEY MAJIK - Running In The Dark【Lyric Video】日本語字幕付",
"MONKEY MAJIK - Running In The Dark【Lyric Video】にほんごじまくつき",
"MONKEY MAJIK - Running In The Dark [Lyric Video] (nihongo jimaku tsuki)"
)]
#[case(
"取締役第二制作技術部々長",
"とりしまりやくだいにせいさくぎじゅつぶぶちょう",
"torishimariyaku daini seisaku gijutsubu buchou"
)]
#[case(
"最初の安定版である1.0版がリリ",
"さいしょのあんていはんである1.0はんがりり",
"saisho no antei han dearu 1.0 han ga riri"
)]
#[case("にゃ$にゃ", "にゃ$にゃ", "nya $ nya")]
#[case(
"安定版となるRust 1.0がリリースされた[84]。1.0版の後、安定版およびベータ版が6週間おきに定期リリースされている[85]。",
"あんていはんとなるRust 1.0がりりーすされた[84]。1.0はんののち、あんていはんおよびべーたはんが6しゅうかんおきにていきりりーすされている[85]。",
"Antei han tonaru Rust 1.0 ga ririisu sareta [84]. 1.0 han no nochi, antei han oyobi beeta han ga 6 shuukan okini teiki ririisu sareteiru [85]."
)]
#[case(
"prelude文にTryIntoやTryFrom",
"preludeぶんにTryIntoやTryFrom",
"prelude bun ni TryInto ya TryFrom"
)]
#[case("要所々々", "ようしょようしょ", "yousho yousho")]
fn romanize(#[case] text: &str, #[case] hiragana: &str, #[case] romaji: &str) {
let res = convert(text);
assert_eq!(res.hiragana, hiragana);
assert_eq!(res.romaji, romaji);
}
} }

View file

@ -15,33 +15,88 @@ pub struct ReadingsIter {
i: usize, i: usize,
} }
/// Reading from the kanji dictionary
#[derive(Debug)] #[derive(Debug)]
pub enum Reading { pub enum Reading {
Simple { hira: String }, /// Default reading
Tail { hira: String, ch: u8 }, Simple {
Context { hira: String, ctx: String }, hira: String,
},
///
Tail {
hira: String,
ch: u8,
},
// Reading that has to be preceded by a given context
Context {
hira: String,
ctx: String,
},
} }
/// Character type
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CharType { pub enum CharType {
Kanji, /// Hiragana (Japanese syllabic characters)
Katakana,
Hiragana, Hiragana,
/// Katakana (Japanese syllabic characters)
Katakana,
/// Kanji (Japanese ideographic characters)
Kanji,
/// Whitespace characters (spaces, newlines, etc.)
Whitespace, Whitespace,
Other, /// Japanese punctuation that is led by a space (e.g. `A #B`, `A (B`)
LeadingPunct, LeadingPunct,
/// Japanese punctuation that is followed by a space (e.g. `A: B`, `A) B`)
TrailingPunct, TrailingPunct,
/// Japanese punctuation the is not seperated by spaces (e.g `A~B`, `A_B`)
JoiningPunct, JoiningPunct,
/// Numbers as well as dots and commas used as decimal seperators
Numeric, Numeric,
/// The rest: chars and punctuation for other scripts
Other,
} }
#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] /// Romanization result
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive] #[non_exhaustive]
pub struct KakasiResult { pub struct KakasiResult {
/// Japanese text with kanji/katakana converted to hiragana
pub hiragana: String, pub hiragana: String,
/// Romanized Japanese text
pub romaji: String, pub romaji: String,
} }
/// IsJapanese result
///
/// **Info:** can be converted to boolean, which is equivalent to
/// `x != IsJapanese::False`
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum IsJapanese {
/// No Japanese characters found
False,
/// Only CJK ideographs found. These may be Japansese kanji
/// but they could also belong to a Chinese text.
Maybe,
/// Japanese kana found
True,
}
impl KakasiResult {
pub(crate) fn new(cap: usize) -> Self {
Self {
hiragana: String::with_capacity(cap),
romaji: String::with_capacity(cap),
}
}
}
impl From<IsJapanese> for bool {
fn from(x: IsJapanese) -> Self {
x != IsJapanese::False
}
}
impl<'a> KanjiString<'a> { impl<'a> KanjiString<'a> {
pub fn new(s: &'a str) -> Self { pub fn new(s: &'a str) -> Self {
Self(Cow::Borrowed(s)) Self(Cow::Borrowed(s))
@ -50,15 +105,10 @@ impl<'a> KanjiString<'a> {
impl Decodable for KanjiString<'_> { impl Decodable for KanjiString<'_> {
fn decode(data: &'static [u8]) -> Self { fn decode(data: &'static [u8]) -> Self {
// TODO: make more efficient without 2 copies
KanjiString(Cow::Owned( KanjiString(Cow::Owned(
String::from_utf16( data.chunks_exact(2)
&data .map(|c| unsafe { char::from_u32_unchecked(((c[0] as u32) << 8) | c[1] as u32) })
.chunks_exact(2) .collect(),
.map(|c| ((c[0] as u16) << 8) | c[1] as u16)
.collect::<Vec<_>>(),
)
.unwrap(),
)) ))
} }
} }

157
tests/rust_article.txt Normal file
View file

@ -0,0 +1,157 @@
Rustラストは、性能、メモリ安全性、安全な並行性を目指して設計されたマルチパラダイムのプログラミング言語である。C言語、C++に代わるシステムプログラミング言語を目指しており[2]、構文的にはC++に似ているが[3]、「ボローチェッカー」(borrow checker) で参照の有効性を検証することによってメモリ安全性を保証できる。Rustはガベージコレクションなしでのメモリ安全性を達成しており、必要な場面で参照カウントを使うこともできる[4][5] 。
Rustプロジェクトはオープンソースのコミュニティベース開発で進行しており[6]、言語仕様(検討段階含む)、ソースコード、ドキュメントはオープンソースライセンスで公開されている[7]。2006年の開発初期は、Mozillaの従業員のグレイドン・ホアレGraydon Hoare[8]の個人プロジェクトだったが、2009年にMozillaが開発に関わり始めてMozilla Researchの公式プロジェクトとなった[9][10]。2015年に1.0版がリリースされるまでにいくつもの破壊的な仕様変更があったが、1.0版以降は基本的には後方互換を保って6週間間隔で定期的にリリースされている。
Rustはマルチパラダイムプログラミング言語であり、手続き型プログラミング、オブジェクト指向プログラミング、関数型プログラミングなどの実装手法をサポートしている。基本的な制御構文はC言語に似ているが、その多くが式expressionであるという点においてはML言語に似ている。コンパイル基盤にMIRとLLVMを用いており[11]、実行時速度性能はC言語と同等程度である[12]。強力な型システムとリソース管理の仕組みにより、メモリ安全性が保証されている。
Rustは20162022年の間Stack Overflow Developer Surveyで「最も愛されているプログラミング言語」で一位を獲得し続けている[13]。一方で、Rustは学習難易度が高い言語とも考えられており[14]、2017年ロードマップでは学習曲線の改善を目的として挙げていた[15]。
Rustという名前はさび菌に因んで付けられた[16]。この命名の後、当時の開発チームメンバーの多くが自転車を愛好していたことから、自転車のチェーンリングの錆つきを元にしたデザインのロゴが考案された[17]。当然、チェーンリングの錆がさび菌によって生じるわけがなく、「設計者のグレイドン・ホアレが生物学オタクであることから酸化鉄の「錆」ではなく「さび菌」なのだ」と、参考文献16の末尾に記されている。
開発体系
Rustはオープンソースのコミュニティベースで開発が進められている。プロジェクトの主管はRust Project DevelopersRust開発チームである[18]。2018年現在、言語発明者のグレイドン・ホアレはプロジェクトチームから外れている。プロジェクトの全てのソースコードはGitHubで一般に公開されており[19]、コミュニティメンバーの協力により改良が進められる。プロジェクトの大部分のコミットはコミュニティメンバーによるものである[20]。
Mozillaの理念[21]を守り、Rust言語は社会に開かれており、言語やツールに対する仕様の提案はRFCの形で取りまとめられ[22]、関連するチケットで仕様詳細について利用者から感想や提言を受けている[23][24]。
言語やコアライブラリを開発するRust開発チームはServoウェブブラウザ用レイアウトエンジンやRustコンパイラの実装経験を通して言語を改良している。例えば、C言語とRustを連携させるコードを自動生成するbindgenは元々は外部開発者が開発していたが[25]、Mozilla Servo開発チームがServoの開発で利用するためにC++とRustを連携させるコードも自動生成できるよう改良を重ね、現在はServo開発チームと密に連携しているRust開発チームに主管を移行して[26]Servoの開発と共に改良が続けられている[27]。
設計と特徴
パラダイム
言語実装手法においてのプログラミングパラダイムは特定の実装手法に限定されない非純粋なマルチパラダイムプログラミング言語である。文法の表面的な記述は手続き型プログラミング、ブロックコードのまとまりの意味論は関数型プログラミング、型システムを用いたオブジェクト構造はオブジェクト指向プログラミングのパラダイム特性を持つ。特定のプログラミングパラダイムのみを使用してソースコードを記述することはなく、要所々々の必要な所で必要なパラダイムを使用してソースコードを記述することになる。
ソースコードをターゲットプラットフォームに最適化したオブジェクトファイルにコンパイルするコンパイル言語のパラダイム特性を持つ。多くのスクリプト言語が持つインタプリタ機能や、SwiftやGoが提供するようなREPL機能のパラダイム特性は持たない。
その他のパラダイムとして、関数の入出力パラメータにジェネリック型を指定するジェネリックプログラミング、非同期機能を実現する並行計算のパラダイム特性を持つ。
基礎文法
Rustの基礎的な文法はC言語やC++に似て、波括弧で囲まれたブロックコード{ ... }、if, else, whileなどの制御フローキーワードを持つ。 全てのC言語やC++のキーワードが実装されているわけではなく、一方で幾つかのRustの制御命令パターンマッチのためのmatchはそれらの言語を習得したプログラマにとっては馴染みが少ないものも存在する。Rustの命令文は、表面的なC言語やC++との文法の類似性にもかかわらず、意味論的にはML系言語の命令式に近く、関数本体のほぼ全ての部分は制御フロー演算子でさえ「文statement」ではなく「式expression」である[28]。例えば普通のif式もC言語で言う所の条件演算子であり、if式の結果として返り値を返す。
ブロックコード内の命令文のセパレータにはセミコロン(;を用いるが、C言語のそれと異なりRustのセミコロンは直前の命令文がブロックコードで括られる式の途中式であることを宣言するためのものである。セミコロンを末尾に置かない命令文はブロックコードの最終的な評価式として扱われ、その式の結果がブロックコードの外へ戻り値として返される[29]。これは関数定義であれば、結果を返す箇所にはセミコロンをつけない。結果が不要ならばセミコロンによって明示的に捨てるのである。そして結果を返さないならば、それは文と呼ばれる。
変数
変数はletキーワードで定義され、不変イミュータブルである[30]。変数への再代入はコンパイルエラーとなる[31]。
可変変数を扱いたい場合、変数宣言時にmutキーワードを利用して可変であることを明示しなければならない[32]。この機能は例えば巨大構造体のコピーを避けながら一部を変更するために有効活用できる。
またRustはシャドーイング同名変数の複数回定義に対応している[33]。シャドーイングにより一時的な変数の変更や変数型の変更が可能になる[34]。
変数とは別にconstキーワードで定義される定数を持つ。定数は常に等しい値を持つmutやシャドーイングに対応していない
型とポリモーフィズム
この言語の型システムではHaskell言語に倣い「型クラス」を用いることができる。これはアドホックな多相性を容易にするものであり、可変型宣言により実現されるものである。高カインド多相性[35]など、Haskell言語にある他の特徴はサポートされていない。
型システム
Rust言語が備える型システムは、impl実装、traitトレイト、struct構造体およびenum列挙型を基本として構成される。implが他の言語におけるクラスに近い役割を果たし、継承とポリモーフィズムはtraitによって提供される。traitにはメソッドを定義することができ、traitで宣言されたメソッドはimplによってstructへミックスインされる。structにはフィールドが定義可能で、traitとimplはそれ自身にはフィールドは定義できない。enumには複数種類の型のカテゴリ変数が定義可能で、数値型、文字列型、オブジェクト型などの複数の状態を選択的に持ちうる。菱形継承問題を回避するためにtraitのみが継承が可能である。
変数の型を決定する型システムは静的型付けかつ強い型付けである。静的型付けと動的型付けの区分においての型付けは、コンパイル時に全ての変数に対して型を決定する静的型付けを基本としているが、トレイトをポインタを介して利用することで、ダックタイピングに似た型付けが可能なトレイトオブジェクトが存在する。ほかに、Anyトレイトにて、実行時リフレクションを用いた動的型付けも可能である。強い型付けと弱い型付けの区分においての型付けは、実行時に変数の型を型変換アップキャスト、ダウンキャスト、クロスキャストおよびボクシングをすることを許さない強い型付けのみをサポートしている。C言語、Javaは実行時に型変換をすることを許す弱い型付けをサポートしているが、Rust言語ではそのような型変換は認められていない。
型推論
Rustコンパイラは変数への代入時variable = value、変数の型を値の型に基づき型推論する。変数の宣言には必ずしも型を決定するための初期値を必要としない。変数の宣言時に初期値が与えられた場合は「変数の型」は「初期値の型」であると型推論がなされるが、初期値が与えられなかった場合は以降のブロックコード中のその変数へ値が初めて代入された時に「左辺の変数の型」は「右辺の代入する値の型」であると型推論がなされる。変数への代入が型不一致により失敗した場合にはコンパイル時にエラーを検出する[36]。
ポリモーフィズムの実現
ポリモーフィズムを実現するため、構造体のフィールドおよび関数の入出力値は特定のトレイトの実装をするジェネリック型を指定することが出来る。そのような定義の中では、ジェネリック型で型が宣言された変数および入出力値はそのトレイトの特性のみ使用できる。これはジェネリック関数が定義されるとすぐに型判定ができることを意味している。これはC++のダック・タイピングで具体的な型がインスタンス化されるまで判定できないテンプレートとは対照的である。しかし、Rustのジェネリクスの実装はC++のテンプレートの典型的な実装と似ており、インスタンス化ごとにコードの個別のコピーが生成される。これは単相化[37]と呼ばれ、JavaやHaskellで通常使用される型消去方式とは対照的である。単相化の利点は特定のユースケースごとに最適化されたコードであり、欠点は結果のバイナリのコンパイル時間およびサイズが増加することである。Rustのトレイトを用いたポリモーフィズムの実現は、実行時のオーバーヘッドがない「ゼロコスト抽象化」と表現されている[38]。
リソース管理
Rustはメモリやその他リソースの管理にRAIIを採用しており、リソースの利用区間をコンパイル時に静的に検証するボローチェッカーborrow checkerという機能で実現されている。ガベージコレクションや参照カウントとは異なり、コンパイル時に静的にリソースの利用区間を検証することで、実行時のリソース管理コストを少量に抑えている。
ボローチェッカー
一つのリソースは一つの所有者変数やブロックのみに関連付けされるという制約がRust特有のリソース管理機能として存在する。これは、あるリソースの所有権ownershipはある所有者ownerが持っている、のように表現される。同時に、リソースの所有権を複数の変数が持つことは出来ない。これはC++のスマートポインタの一種であるunique_ptrの振る舞いに似ている。ボローチェッカーは所有権の競合および不正利用を検証する。
リソースには参照(&記号の概念が存在し、これは所有権の概念と並行して扱われる。所有権は一つの所有者しか持てないが、参照は複数の所有者が持ちうる。参照は同一のリソースを複数の箇所で利用するために利用される。ただし、所有権によるリソース管理は有効であり、所有権が解放されたリソースを指す参照は同時に無効化される。ボローチェッカーはこの参照についてもライフタイムlifetimesとしてリソースの生存期間を検証する。
ボローチェッカーはリソースの所有権とライフタイムの両方を静的に解析することで、ヌルポインタや不正なメモリ域を指すポインター(英語版)、リソース利用競合を制限したメモリ安全性を実現している。
特異なリソース型
リソースのメモリ確保は基本的にはスタックメモリを利用しており、ヒープメモリを利用したメモリ確保はBoxやVecなどの特定の型のみで限定的に利用されている。
コンパイル時に型のサイズが決定できない可変長配列を表すような型はヒープメモリを利用するBox型を使用してリソースを管理する。Boxリソース自体はスタックメモリで管理されるが、Boxリソースが所有権を持つ実体のリソースはヒープメモリで管理される。標準のヒープメモリ確保にはシステムアロケータを利用するが[39]、対象プラットフォームやビルド時の指定により他のメモリ確保APIを利用することもある。ヒープメモリはスタックメモリに比べて速度性能が落ちるため、必要時にのみ限定的に利用されている。
境界チェック
Rustは実行時に境界チェックをおこなう。これによりバッファオーバーランをはじめとしたメモリアクセスに対する安全性を得ている。この機能はゼロコスト抽象化でなく実行時の命令であるため、安全性と引き換えにいくらかの性能オーバーヘッドが発生している。他のシステムプログラミング言語として代表的なC言語やC++は境界チェックを強制しないため、Rustの特徴の1つとなっている。
ライブラリ
Rustのライブラリはクレートcrateという呼称で提供される。多くのクレートはcrates.ioで公開されている。同サイトはバージョン毎のソースコードをアーカイブとして提供している。クレートは必ずしもcrates.ioに登録されている必要はなく、Webサーバやファイルシステムを指すURIで指定することもできる[40]。ライブラリはソースコードプロジェクトで配布されることが一般的だが、コンパイルしたバイナリライブラリファイル拡張子rlibで出力することも可能である。
コアライブラリ
コアライブラリはcoreの名称で提供されている[41]。このライブラリは標準ライブラリに依存しない基幹ライブラリであり、一切の上位ライブラリ、システムライブラリ、libcライブラリにリンクしていない。コアライブラリは最小限であり、ヒープ割り当てを認識せず並行性や入出力も提供していない。それらのことはプラットフォームへの調整が必要であり、このライブラリはプラットフォームに依存しない。
標準ライブラリ
標準ライブラリはstdの名称で提供されている[42]。このライブラリは基礎的な型Vec<T>やOption<T>、言語の基本の処理、標準のマクロ、入出力I/O、マルチスレッドなどの機能を提供する。標準ライブラリは標準でリンクしてソフトウェアがビルドされるが、より根幹的なソフトウェアやリソースの小さい組み込み環境ではリンクを外してソフトウェアをビルドすることができる。
外部ライブラリ
Rustは基本的で汎用的な機能を含め標準ライブラリではなく外部ライブラリとして提供している。これはいわゆる「バッテリー同梱 (“Battery Included”)」の反対を行くもので、言語と共に更新することで保守的になりがちな標準ライブラリではなく、言語とは独立して更新することで最善を繰り返し探求しうる外部ライブラリとすることで、それらの機能をより良い品質で提供する考えに基づいていたものである[43]。外部ライブラリの利便性と品質の保証のためにcrates.ioとAPIガイドラインを提供している。
言語開発のコミュニティがそれらについて携わっていないわけではなく、基礎的な外部ライブラリはコミュニティ配下で開発が進められている。
基礎的なライブラリ
rand - 乱数生成[44]
regex - 正規表現[45]
chrono - 時刻操作[46]
libc - C言語インターフェース[47]
log - ログ出力インターフェース[48]
開発ツール
Rustの開発ツールは独立したソフトウェアとして提供されているが、Rustの公式なインストール方法に従えば、以下のツール一式が手に入る。
rustc
rustcはRustで記述されたRustソースコードをコンパイルするコンパイラ処理系である。コンパイルの成果物として中間コード、および実行ファイル、静的ライブラリ、動的ライブラリを出力する[49]。rustcはクロスコンパイルを可能とし、Windows、Linux、macOS向けの実行ファイル他、AndroidやiOSで動作するライブラリをホストマシンで出力することができる[50]。
対象プラットフォームは完成度に合わせて3つのティアに分かれている[51]。ティア1はバイナリリリースが提供されており、自動ビルド英語版と自動テストが整備され、それらが安定して成功パスすることが保証されている。 ティア2はバイナリリリースが提供されており、自動ビルドと自動テストは整備されているがテストが成功することは保証されていない。ティア3はソースコードとしては対応しているが、自動ビルドと自動テストの動作が保証されておらず、公式リリースは提供されていない。
Windows、Linux、macOS向けのRustコンパイラはティア1でリリースされている。Android、iOS、WebAssembly向けのRustコンパイラはティア2でリリースされている。
Rust 1.12版より導入されたMIR (Mid-level IR)[11] によって、コンパイルと実行時間の迅速化ならびに型チェックの正確性の実現が図られている。
Cargo
CargoはRust製ソフトウェアプロジェクトのCUIのビルドツールである。規定のファイル構成ディレクトリ、設定ファイル、ソースファイルのプロジェクトディレクトリで利用される。プロジェクトのビルドコンパイル、依存ライブラリのダウンロード、テスト、ドキュメント生成などをサポートする[53]。通常はCargoを中心に開発を行えるように設計されているため、rustcコンパイラを直接呼び出すことは稀である。Cargoの依存ライブラリのダウンロード先はcrates.ioである[54]。 サブコマンドは拡張可能で標準のコマンドの他、README.mdファイルの自動生成コマンド[55]などの拡張コマンドが存在する。この拡張はcargo-xxxと名付けたコマンドを適切にインストールするだけで、cargoにxxxというサブコマンドを追加できる。
rustup
rustupはツールチェーンの管理ソフトウェアである。ツールチェーンのダウンロードとインストール、ソフトウェアバージョンの管理、コンパイルターゲットの切り替えの機能を提供する[56][57]。
機能
rustupはRustプロジェクトがリリースしているコンパイラrustc、ビルドツールCargoなどのツールチェーンをインターネットを経由してホストマシンにダウンロード、インストールおよびマネージメントする機能を提供する。インストール対象のツールチェーンのバージョンは、安定版、ベータ版、ナイトリー版の全てを含んでおり、利用者が必要とするバージョンを指定してダウンロードすることができる。また、ターゲットプラットフォームについても全ての種類を含んでおり、ホストマシンと異なるプラットフォーム例えば、ホストがmacOSであってもWindowsやAndroid、iOSのコンパイラをインストールすることができる。この場合、コンパイラはクロスコンパイラとして動作してターゲットプラットフォームに合わせたビルドを実施する。
歴史
Rust 1.13版以前はシェルスクリプトで実装されたrustup.shが公開されていた[58]。これと並行してRust言語で実装された同等機能を提供するrustup.rsの開発が進められており、Rust 1.14版でrustup.shは非推奨となり[59]、Rust 1.14版以降はrustup.rsが公式リリースとして提供されている[60][61]。
評価
Rustは2016〜2022年に渡ってStack Overflow Developer Surveyで「最も愛されているプログラミング言語」で一位を獲得し続け[13]、プログラマの好意的な評価は多い。
一方で、Rustは学習難易度が高い言語とも考えられている[62]。多くのRust初学者のプログラマにおいて、自身が正しいと思って書いたソースコードのコンパイルに対してコンパイラボローチェッカーがエラーを検出する、「ボローチェッカーとの戦い」fighting with the borrow checkerが発生しがちである[63][64]。小さなアプリケーションの実装について同時期に言語開発されているGo言語と比較した場合、Rust言語よりGo言語の方が開発効率が良いという評価がある[14]。学習難易度の高さは開発チームも認識しており、2017年ロードマップでは学習曲線の改善を目的として挙げていた[15][65]。
この問題を改善するために、2020年現在において、自動化をメインテーマにした開発を続けており、前述にあるcargo、rustup等のツール以外にも、rustfmt、clippy、cargo docなどのツール類をIDE環境のみならずCUI環境でも利用可能な状態へと整備を続けている。また、後方互換性を維持しているため、crates.ioを用いる事でライブラリ類などの生産性の向上にも努めている。
Rustの実行時速度性能は同じくコンパイラにLLVMを利用している場合のC言語と同等程度であり[66][67]、一部の処理ではC言語を上回った速度が確認されている[12]。2018年2月時点で、ウェブサーバアプリケーションの汎用処理では速度性能の良いRust製ライブラリは開発が進んでいない[68]。単純なテキスト処理では速度性能は良い[69]。
その後のベンチマークでは、並行処理やグラフィックス処理においても、JavaやGoを上回っており、コンパイラの出力するコードの優秀性が証明されている。ただし、サポートされていないグラフィックスボードCのライブラリをインクルードしなければならないでは、C/C++の実効性能には及んでいない。
誕生
2006年、Mozillaで働いていたグレイドン・ホアレ[70]は現代のインターネット環境で高い並行性と高い安全性が求められるシステムプログラミング言語としてC言語やC++に代わりうるプログラミング言語 Rust言語の開発に着手した[2]。MozillaがRustの開発に関わりはじめたのは2009年で[71][9]、Rustは2010年のモジラ・サミットで公に姿を表した[72]。RustソースコードをコンパイルするRustコンパイラは、初期の頃はOCaml言語で作られたコンパイラrustbootが用いられていたが[73]、2010年にはRust言語自身でRustコンパイラを作るセルフホスティングへ移行したコンパイラrustcの開発が始められ[74]、翌年にはブートストラップ問題を解決した最初の完動品が完成した[75]。この時よりRustコンパイラはコンパイル基盤にLLVMを用いたものとなった[76]。
0.x版
プレアルファ0.1版と呼ばれる最初のバージョンは2012年1月にリリースされた[77]。Mozillaはこれを新しいモ好みの人やプログラミング言語愛好家のためのアルファ版と位置づけていた。最初の安定版である1.0版がリリースされるまでの0.x版リリースでは、いくつもの大きな破壊的な仕様変更が言語およびライブラリに加えられた。
変数名や関数名など識別子は、この言語の開発の初期の頃は、ASCII文字以外の文字を使うことが禁じられていた。言語についてのある質疑応答の中で、現場の非英語圏のプログラマーのほとんどが識別子にはASCII文字を使っていると述べられていた。しかしその制限は反論を引き出すことになった[78]。それにより、2011年2月に言語に変更が行われ、この制限は削除された[79]。
型判定は、0.4版以前の従来の静的型付けに加えて、型状態システムをサポートしていた。型状態システムは、特別なcheck文を使用してプログラム文の前後での型決定をモデル化した。C言語やC++コードでのアサーションの場合と同様に、プログラム実行中ではなくコンパイル時に型不一致を検出する。型状態の概念はRust特有のものではなく、NILで採用されていたものである[80]。実際にはほとんど使用されていなかったため型状態は削除されたが、ブランディングパターンで同じ機能を実現できる[81]。
オブジェクト指向のシステムは、0.2版から0.4版にかけて大きく変わっていった。0.2版で初めてクラスclassが導入され、0.3版でインターフェースinterfaceを通したデストラクタとポリモーフィズムが追加され、0.4版で継承を提供する手段としてトレイトtraitが追加された。インターフェースはトレイトに一部の機能が統合されて、異なる不要な機能として削除された。クラスもまた削除され、構造体とトレイトを使用したミックスインに置き換えられた。
コアのメモリモデルは、0.9版から0.11版の間、2つのビルトインのポインタ型ヒープメモリ型~とガベージコレクション型@を機能を単純化するために用意していた。それらは、標準ライブラリのBox型とGc型で置き換えられ、Gc型は最終的には削除された[82]。
2014年1月、Dr. Dobb's Journalの編集長アンドリュー・ビンストックはD言語やGo言語、Nim言語と同様にC++の競争相手になる機会を得たとコメントした。ビンストックによると、Rustは非常にエレガントな言語として広く見られているが、バージョン間で繰り返し大きく変更されたため普及が遅れているという[83]。
1.x版
2015年5月16日、安定版となるRust 1.0がリリースされた[84]。1.0版の後、安定版およびベータ版が6週間おきに定期リリースされている[85]。またナイトリー版が毎日リリースされている[86]。新たな機能はナイトリー版で開発が進められ、ベータ版で動作が検証されている[87]。
2016年8月2日にリリースされたFirefox 48にはRustで書き直されたメディアパーサが組み込まれており、Mozillaが開発しているブラウザのFirefoxにおいてRustで書かれたコードが書き加えられる初例となった[88][89]。
2016年9月にRustはFedora 24の標準コンポーネントに加えられ、RPMのパッケージ管理システムを用いてのインストール作業が容易化されている[90]。
2018年版
2018年12月6日にバージョン1.31がリリースされた[91]。今回からエディション制が導入され、最新版は"Rust 2018"、従来版は"Rust 2015"と呼ばれることになる。言語機能への破壊的変更は新しいエディションのみに適用されるが、互換性に影響しない機能追加は引き続き両者に適用される。また、2015年版から2018年版へはcargo fixでトランスコンパイルできる[91]。
2021年版
2021年5月11日に、3年ぶりの改訂となる2021年版について公式 Blogへ記載が行われた[92]。当該機能は、2021年10月21日にリリースの1.56より適用される。今回の主要な改訂は、例外処理への対応が強化され、prelude文にTryIntoやTryFrom、FromIteratorなどが追加される。詳細については、公式Blogを参照されたいが、後方互換性を維持しているため、2018年版との間では特に問題なくコンパイルできる。
Source: https://ja.wikipedia.org/wiki/Rust_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E), Creative Commons Attribution-ShareAlike License 3.0

View file

@ -0,0 +1,157 @@
Rustらすとは、せいのう、めもりあんぜんせい、あんぜんなへいこうせいをめざしてせっけいされたまるちぱらだいむのぷろぐらみんぐげんごである。Cげんご、C++にかわるしすてむぷろぐらみんぐげんごをめざしており[2]、こうぶんてきにはC++ににているが[3]、「ぼろーちぇっかー」(borrow checker) でさんしょうのゆうこうせいをけんしょうすることによってめもりあんぜんせいをほしょうできる。Rustはがべーじこれくしょんなしでのめもりあんぜんせいをたっせいしており、ひつようなばめんでさんしょうかうんとをつかうこともできる[4][5] 。
Rustぷろじぇくとはおーぷんそーすのこみゅにてぃべーすかいはつでしんこうしており[6]、げんごしよう(けんとうだんかいふくむ)、そーすこーど、どきゅめんとはおーぷんそーすらいせんすでこうかいされている[7]。2006ねんのかいはつしょきは、Mozillaのじゅうぎょういんのぐれいどん・ほあれGraydon Hoare[8]のこじんぷろじぇくとだったが、2009ねんにMozillaがかいはつにかかわりはじめてMozilla Researchのこうしきぷろじぇくととなった[9][10]。2015ねんに1.0はんがりりーすされるまでにいくつものはかいてきなしようへんこうがあったが、1.0はんいこうはきほんてきにはこうほうごかんをたもって6しゅうかんかんかくでていきてきにりりーすされている。
Rustはまるちぱらだいむぷろぐらみんぐげんごであり、てつづきがたぷろぐらみんぐ、おぶじぇくとしこうぷろぐらみんぐ、かんすうがたぷろぐらみんぐなどのじっそうしゅほうをさぽーとしている。きほんてきなせいぎょこうぶんはCげんごににているが、そのおおくがしきexpressionであるというてんにおいてはMLげんごににている。こんぱいるきばんにMIRとLLVMをもちいており[11]、じっこうじそくどせいのうはCげんごとどうとうていどである[12]。きょうりょくなかたしすてむとりそーすかんりのしくみにより、めもりあんぜんせいがほしょうされている。
Rustは20162022ねんのかんStack Overflow Developer Surveyで「もっともあいされているぷろぐらみんぐげんご」でいちいをかくとくしつづけている[13]。いっぽうで、Rustはがくしゅうなんいどがたかいげんごともかんがえられており[14]、2017ねんろーどまっぷではがくしゅうきょくせんのかいぜんをもくてきとしてあげていた[15]。
Rustというなまえはさびきんにちなんでづけられた[16]。このめいめいののち、とうじのかいはつちーむめんばーのおおくがじてんしゃをあいこうしていたことから、じてんしゃのちぇーんりんぐのさびつきをもとにしたでざいんのろごがこうあんされた[17]。とうぜん、ちぇーんりんぐのさびがさびきんによってしょうじるわけがなく、「せっけいしゃのぐれいどん・ほあれがせいぶつがくおたくであることからさんかてつの「さび」ではなく「さびきん」なのだ」と、さんこうぶんけん16のまつびにしるされている。
かいはつたいけい
Rustはおーぷんそーすのこみゅにてぃべーすでかいはつがすすめられている。ぷろじぇくとのしゅかんはRust Project DevelopersRustかいはつちーむである[18]。2018ねんげんざい、げんごはつめいしゃのぐれいどん・ほあれはぷろじぇくとちーむからはずれている。ぷろじぇくとのすべてのそーすこーどはGitHubでいっぱんにこうかいされており[19]、こみゅにてぃめんばーのきょうりょくによりかいりょうがすすめられる。ぷろじぇくとのだいぶぶんのこみっとはこみゅにてぃめんばーによるものである[20]。
Mozillaのりねん[21]をまもり、Rustげんごはしゃかいにひらかれており、げんごやつーるにたいするしようのていあんはRFCのかたちでとりまとめられ[22]、かんれんするちけっとでしようしょうさいについてりようしゃからかんそうやていげんをうけている[23][24]。
げんごやこあらいぶらりをかいはつするRustかいはつちーむはServoうぇぶぶらうざようれいあうとえんじんやRustこんぱいらのじっそうけいけんをとうしてげんごをかいりょうしている。たとえば、CげんごとRustをれんけいさせるこーどをじどうせいせいするbindgenはもともとはがいぶかいはつしゃがかいはつしていたが[25]、Mozilla ServoかいはつちーむがServoのかいはつでりようするためにC++とRustをれんけいさせるこーどもじどうせいせいできるようかいりょうをおもね、げんざいはServoかいはつちーむとみつにれんけいしているRustかいはつちーむにしゅかんをいこうして[26]Servoのかいはつとともにかいりょうがつづけられている[27]。
せっけいととくちょう
ぱらだいむ
げんごじっそうしゅほうにおいてのぷろぐらみんぐぱらだいむはとくていのじっそうしゅほうにげんていされないひじゅんすいなまるちぱらだいむぷろぐらみんぐげんごである。ぶんぽうのひょうめんてきなきじゅつはてつづきがたぷろぐらみんぐ、ぶろっくこーどのまとまりのいみろんはかんすうがたぷろぐらみんぐ、かたしすてむをもちいたおぶじぇくとこうぞうはおぶじぇくとしこうぷろぐらみんぐのぱらだいむとくせいをもつ。とくていのぷろぐらみんぐぱらだいむのみをしようしてそーすこーどをきじゅつすることはなく、ようしょようしょのひつようなところでひつようなぱらだいむをしようしてそーすこーどをきじゅつすることになる。
そーすこーどをたーげっとぷらっとふぉーむにさいてきかしたおぶじぇくとふぁいるにこんぱいるするこんぱいるげんごのぱらだいむとくせいをもつ。おおくのすくりぷとげんごがもついんたぷりたきのうや、SwiftやGoがていきょうするようなREPLきのうのぱらだいむとくせいはもたない。
そのほかのぱらだいむとして、かんすうのにゅうしゅつりょくぱらめーたにじぇねりっくかたをしていするじぇねりっくぷろぐらみんぐ、ひどうききのうをじつげんするへいこうけいさんのぱらだいむとくせいをもつ。
きそぶんぽう
RustのきそてきなぶんぽうはCげんごやC++ににて、なみかっこでかこまれたぶろっくこーど{ ... }、if, else, whileなどのせいぎょふろーきーわーどをもつ。 すべてのCげんごやC++のきーわーどがじっそうされているわけではなく、いっぽうでいくつかのRustのせいぎょめいれいぱたーんまっちのためのmatchはそれらのげんごをしゅうとくしたぷろぐらまにとってはなじみがすくないものもそんざいする。Rustのめいれいぶんは、ひょうめんてきなCげんごやC++とのぶんぽうのるいじせいにもかかわらず、いみろんてきにはMLけいげんごのめいれいしきにちかく、かんすうほんたいのほぼすべてのぶぶんはせいぎょふろーえんざんしでさえ「ぶんstatement」ではなく「しきexpression」である[28]。たとえばふつうのifしきもCげんごでいうところのじょうけんえんざんしであり、ifしきのけっかとしてかえりちをかえす。
ぶろっくこーどないのめいれいぶんのせぱれーたにはせみころん(;をもちいるが、CげんごのそれとことなりRustのせみころんはちょくぜんのめいれいぶんがぶろっくこーどでくくられるしきのとちゅうしきであることをせんげんするためのものである。せみころんをまつびにおかないめいれいぶんはぶろっくこーどのさいしゅうてきなひょうかしきとしてあつかわれ、そのしきのけっかがぶろっくこーどのそとへもどりちとしてかえされる[29]。これはかんすうていぎであれば、けっかをかえすかしょにはせみころんをつけない。けっかがふようならばせみころんによってめいじてきにすてるのである。そしてけっかをかえさないならば、それはぶんとよばれる。
へんすう
へんすうはletきーわーどでていぎされ、ふへんいみゅーたぶるである[30]。へんすうへのさいだいにゅうはこんぱいるえらーとなる[31]。
かへんへんすうをあつかいたいばあい、へんすうせんげんときにmutきーわーどをりようしてかへんであることをめいじしなければならない[32]。このきのうはたとえばきょだいこうぞうたいのこぴーをさけながらいちぶをへんこうするためにゆうこうかつようできる。
またRustはしゃどーいんぐどうめいへんすうのふくすうかいていぎにたいおうしている[33]。しゃどーいんぐによりいちじてきなへんすうのへんこうやへんすうけいのへんこうがかのうになる[34]。
へんすうとはべつにconstきーわーどでていぎされるていすうをもつ。ていすうはつねにひとしいあたいをもつmutやしゃどーいんぐにたいおうしていない
かたとぽりもーふぃずむ
このげんごのかたしすてむではHaskellげんごにならい「かたくらす」をもちいることができる。これはあどほっくなたあいしょうをよういにするものであり、かへんかたせんげんによりじつげんされるものである。たかかいんどたあいしょう[35]など、Haskellげんごにあるほかのとくちょうはさぽーとされていない。
かたしすてむ
Rustげんごがそなえるかたしすてむは、implじっそう、traitとれいと、structこうぞうたいおよびenumれっきょがたをきほんとしてこうせいされる。implがほかのげんごにおけるくらすにちかいやくわりをはたし、けいしょうとぽりもーふぃずむはtraitによってていきょうされる。traitにはめそっどをていぎすることができ、traitでせんげんされためそっどはimplによってstructへみっくすいんされる。structにはふぃーるどがていぎかのうで、traitとimplはそれじしんにはふぃーるどはていぎできない。enumにはふくすうしゅるいのかたのかてごりへんすうがていぎかのうで、すうちかた、もじれつがた、おぶじぇくとかたなどのふくすうのじょうたいをせんたくてきにもちうる。ひしがたけいしょうもんだいをかいひするためにtraitのみがけいしょうがかのうである。
へんすうのかたをけっていするかたしすてむはせいてきがたづけかつつよいかたづけである。せいてきがたづけとどうてきかたづけのくぶんにおいてのかたづけは、こんぱいるときにすべてのへんすうにたいしてかたをけっていするせいてきがたづけをきほんとしているが、とれいとをぽいんたをかいしてりようすることで、だっくたいぴんぐににたかたづけがかのうなとれいとおぶじぇくとがそんざいする。ほかに、Anyとれいとにて、じっこうじりふれくしょんをもちいたどうてきかたづけもかのうである。つよいかたづけとよわいかたづけのくぶんにおいてのかたづけは、じっこうじにへんすうのかたをかたへんかんあっぷきゃすと、だうんきゃすと、くろすきゃすとおよびぼくしんぐをすることをゆるさないつよいかたづけのみをさぽーとしている。Cげんご、Javaはじっこうじにかたへんかんをすることをゆるすよわいかたづけをさぽーとしているが、Rustげんごではそのようなかたへんかんはみとめられていない。
かたすいろん
Rustこんぱいらはへんすうへのだいにゅうときvariable = value、へんすうのかたをあたいのかたにもとづきかたすいろんする。へんすうのせんげんにはかならずしもかたをけっていするためのしょきちをひつようとしない。へんすうのせんげんときにしょきちがあたえられたばあいは「へんすうのかた」は「しょきちのかた」であるとかたすいろんがなされるが、しょきちがあたえられなかったばあいはいこうのぶろっくこーどなかのそのへんすうへあたいがはじめてだいにゅうされたときに「さへんのへんすうのかた」は「うへんのだいにゅうするあたいのかた」であるとかたすいろんがなされる。へんすうへのだいにゅうがかたふいっちによりしっぱいしたばあいにはこんぱいるときにえらーをけんしゅつする[36]。
ぽりもーふぃずむのじつげん
ぽりもーふぃずむをじつげんするため、こうぞうたいのふぃーるどおよびかんすうのにゅうしゅつりょくちはとくていのとれいとのじっそうをするじぇねりっくかたをしていすることができる。そのようなていぎのなかでは、じぇねりっくかたでかたがせんげんされたへんすうおよびにゅうしゅつりょくちはそのとれいとのとくせいのみしようできる。これはじぇねりっくかんすうがていぎされるとすぐにかたはんていができることをいみしている。これはC++のだっく・たいぴんぐでぐたいてきなかたがいんすたんすかされるまではんていできないてんぷれーととはたいしょうてきである。しかし、RustのじぇねりくすのじっそうはC++のてんぷれーとのてんけいてきなじっそうとにており、いんすたんすかごとにこーどのこべつのこぴーがせいせいされる。これはたんそうか[37]とよばれ、JavaやHaskellでつうじょうしようされるかたしょうきょほうしきとはたいしょうてきである。たんそうかのりてんはとくていのゆーすけーすごとにさいてきかされたこーどであり、けってんはけっかのばいなりのこんぱいるじかんおよびさいずがぞうかすることである。Rustのとれいとをもちいたぽりもーふぃずむのじつげんは、じっこうじのおーばーへっどがない「ぜろこすとちゅうしょうか」とひょうげんされている[38]。
りそーすかんり
RustはめもりやそのほかりそーすのかんりにRAIIをさいようしており、りそーすのりようくかんをこんぱいるときにせいてきにけんしょうするぼろーちぇっかーborrow checkerというきのうでじつげんされている。がべーじこれくしょんやさんしょうかうんととはことなり、こんぱいるときにせいてきにりそーすのりようくかんをけんしょうすることで、じっこうじのりそーすかんりこすとをしょうりょうにおさえている。
ぼろーちぇっかー
ひとつのりそーすはひとつのしょゆうしゃへんすうやぶろっくのみにかんれんづけされるというせいやくがRustとくゆうのりそーすかんりきのうとしてそんざいする。これは、あるりそーすのしょゆうけんownershipはあるしょゆうしゃownerがじっている、のようにひょうげんされる。どうじに、りそーすのしょゆうけんをふくすうのへんすうがもつことはできない。これはC++のすまーとぽいんたのいっしゅであるunique_ptrのふるまいににている。ぼろーちぇっかーはしょゆうけんのきょうごうおよびふせいりようをけんしょうする。
りそーすにはさんしょう(&きごうのがいねんがそんざいし、これはしょゆうけんのがいねんとへいこうしてあつかわれる。しょゆうけんはひとつのしょゆうしゃしかもてないが、さんしょうはふくすうのしょゆうしゃがもちうる。さんしょうはどういつのりそーすをふくすうのかしょでりようするためにりようされる。ただし、しょゆうけんによるりそーすかんりはゆうこうであり、しょゆうけんがかいほうされたりそーすをさすさんしょうはどうじにむこうかされる。ぼろーちぇっかーはこのさんしょうについてもらいふたいむlifetimesとしてりそーすのせいぞんきかんをけんしょうする。
ぼろーちぇっかーはりそーすのしょゆうけんとらいふたいむのりょうほうをせいてきにかいせきすることで、ぬるぽいんたやふせいなめもりいきをさすぽいんたー(えいごばん)、りそーすりようきょうごうをせいげんしためもりあんぜんせいをじつげんしている。
とくいなりそーすかた
りそーすのめもりかくほはきほんてきにはすたっくめもりをりようしており、ひーぷめもりをりようしためもりかくほはBoxやVecなどのとくていのかたのみでげんていてきにりようされている。
こんぱいるときにかたのさいずがけっていできないかへんちょうはいれつをあらわすようなかたはひーぷめもりをりようするBoxかたをしようしてりそーすをかんりする。Boxりそーすじたいはすたっくめもりでかんりされるが、Boxりそーすがしょゆうけんをもつじったいのりそーすはひーぷめもりでかんりされる。ひょうじゅんのひーぷめもりかくほにはしすてむあろけーたをりようするが[39]、たいしょうぷらっとふぉーむやびるどときのしていによりほかのめもりかくほAPIをりようすることもある。ひーぷめもりはすたっくめもりにくらべてそくどせいのうがおちるため、ひつようときにのみげんていてきにりようされている。
きょうかいちぇっく
Rustはじっこうじにきょうかいちぇっくをおこなう。これによりばっふぁおーばーらんをはじめとしためもりあくせすにたいするあんぜんせいをえている。このきのうはぜろこすとちゅうしょうかでなくじっこうじのめいれいであるため、あんぜんせいとひきかえにいくらかのせいのうおーばーへっどがはっせいしている。ほかのしすてむぷろぐらみんぐげんごとしてだいひょうてきなCげんごやC++はきょうかいちぇっくをきょうせいしないため、Rustのとくちょうの1つとなっている。
らいぶらり
Rustのらいぶらりはくれーとcrateというこしょうでていきょうされる。おおくのくれーとはcrates.ioでこうかいされている。どうさいとはばーじょんごとのそーすこーどをあーかいぶとしてていきょうしている。くれーとはかならずしもcrates.ioにとうろくされているひつようはなく、WebさーばやふぁいるしすてむをさすURIでしていすることもできる[40]。らいぶらりはそーすこーどぷろじぇくとではいふされることがいっぱんてきだが、こんぱいるしたばいなりらいぶらりふぁいるかくちょうしrlibでしゅつりょくすることもかのうである。
こあらいぶらり
こあらいぶらりはcoreのめいしょうでていきょうされている[41]。このらいぶらりはひょうじゅんらいぶらりにいぞんしないきかんらいぶらりであり、いっさいのじょういらいぶらり、しすてむらいぶらり、libcらいぶらりにりんくしていない。こあらいぶらりはさいしょうげんであり、ひーぷわりあてをにんしきせずへいこうせいやにゅうしゅつりょくもていきょうしていない。それらのことはぷらっとふぉーむへのちょうせいがひつようであり、このらいぶらりはぷらっとふぉーむにいぞんしない。
ひょうじゅんらいぶらり
ひょうじゅんらいぶらりはstdのめいしょうでていきょうされている[42]。このらいぶらりはきそてきなかたVec<T>やOption<T>、げんごのきほんのしょり、ひょうじゅんのまくろ、にゅうしゅつりょくI/O、まるちすれっどなどのきのうをていきょうする。ひょうじゅんらいぶらりはひょうじゅんでりんくしてそふとうぇあがびるどされるが、よりこんかんてきなそふとうぇあやりそーすのちいさいくみこみかんきょうではりんくをはずしてそふとうぇあをびるどすることができる。
がいぶらいぶらり
Rustはきほんてきではんようてきなきのうをふくめひょうじゅんらいぶらりではなくがいぶらいぶらりとしてていきょうしている。これはいわゆる「ばってりーどうこん (“Battery Included”)」のはんたいをいくもので、げんごとともにこうしんすることでほしゅてきになりがちなひょうじゅんらいぶらりではなく、げんごとはどくりつしてこうしんすることでさいぜんをくりかえしたんきゅうしうるがいぶらいぶらりとすることで、それらのきのうをよりよいひんしつでていきょうするかんがえにもとづいていたものである[43]。がいぶらいぶらりのりべんせいとひんしつのほしょうのためにcrates.ioとAPIがいどらいんをていきょうしている。
げんごかいはつのこみゅにてぃがそれらについてたずさわっていないわけではなく、きそてきながいぶらいぶらりはこみゅにてぃはいかでかいはつがすすめられている。
きそてきならいぶらり
rand - らんすうせいせい[44]
regex - せいきひょうげん[45]
chrono - じこくそうさ[46]
libc - Cげんごいんたーふぇーす[47]
log - ろぐしゅつりょくいんたーふぇーす[48]
かいはつつーる
Rustのかいはつつーるはどくりつしたそふとうぇあとしてていきょうされているが、Rustのこうしきないんすとーるほうほうにしたがえば、いかのつーるいっしきがてにいる。
rustc
rustcはRustできじゅつされたRustそーすこーどをこんぱいるするこんぱいらしょりけいである。こんぱいるのせいかぶつとしてちゅうかんこーど、およびじっこうふぁいる、せいてきらいぶらり、どうてきらいぶらりをしゅつりょくする[49]。rustcはくろすこんぱいるをかのうとし、Windows、Linux、macOSむけのじっこうふぁいるほか、AndroidやiOSでどうさするらいぶらりをほすとましんでしゅつりょくすることができる[50]。
たいしょうぷらっとふぉーむはかんせいどにあわせて3つのてぃあにわかれている[51]。てぃあ1はばいなりりりーすがていきょうされており、じどうびるどえいごばんとじどうてすとがせいびされ、それらがあんていしてせいこうぱすすることがほしょうされている。 てぃあ2はばいなりりりーすがていきょうされており、じどうびるどとじどうてすとはせいびされているがてすとがせいこうすることはほしょうされていない。てぃあ3はそーすこーどとしてはたいおうしているが、じどうびるどとじどうてすとのどうさがほしょうされておらず、こうしきりりーすはていきょうされていない。
Windows、Linux、macOSむけのRustこんぱいらはてぃあ1でりりーすされている。Android、iOS、WebAssemblyむけのRustこんぱいらはてぃあ2でりりーすされている。
Rust 1.12はんよりどうにゅうされたMIR (Mid-level IR)[11] によって、こんぱいるとじっこうじまのじんそくかならびにかたちぇっくのせいかくせいのじつげんがはかられている。
Cargo
CargoはRustせいそふとうぇあぷろじぇくとのCUIのびるどつーるである。きていのふぁいるこうせいでぃれくとり、せっていふぁいる、そーすふぁいるのぷろじぇくとでぃれくとりでりようされる。ぷろじぇくとのびるどこんぱいる、いぞんらいぶらりのだうんろーど、てすと、どきゅめんとせいせいなどをさぽーとする[53]。つうじょうはCargoをちゅうしんにかいはつをおこなえるようにせっけいされているため、rustcこんぱいらをちょくせつよびだすことはまれである。Cargoのいぞんらいぶらりのだうんろーどさきはcrates.ioである[54]。 さぶこまんどはかくちょうかのうでひょうじゅんのこまんどのほか、README.mdふぁいるのじどうせいせいこまんど[55]などのかくちょうこまんどがそんざいする。このかくちょうはcargo-xxxとなづけたこまんどをてきせつにいんすとーるするだけで、cargoにxxxというさぶこまんどをついかできる。
rustup
rustupはつーるちぇーんのかんりそふとうぇあである。つーるちぇーんのだうんろーどといんすとーる、そふとうぇあばーじょんのかんり、こんぱいるたーげっとのきりかえのきのうをていきょうする[56][57]。
きのう
rustupはRustぷろじぇくとがりりーすしているこんぱいらrustc、びるどつーるCargoなどのつーるちぇーんをいんたーねっとをけいゆしてほすとましんにだうんろーど、いんすとーるおよびまねーじめんとするきのうをていきょうする。いんすとーるたいしょうのつーるちぇーんのばーじょんは、あんていはん、べーたはん、ないとりーはんのすべてをふくんでおり、りようしゃがひつようとするばーじょんをしていしてだうんろーどすることができる。また、たーげっとぷらっとふぉーむについてもすべてのしゅるいをふくんでおり、ほすとましんとことなるぷらっとふぉーむたとえば、ほすとがmacOSであってもWindowsやAndroid、iOSのこんぱいらをいんすとーるすることができる。このばあい、こんぱいらはくろすこんぱいらとしてどうさしてたーげっとぷらっとふぉーむにあわせたびるどをじっしする。
れきし
Rust 1.13はんいぜんはしぇるすくりぷとでじっそうされたrustup.shがこうかいされていた[58]。これとへいこうしてRustげんごでじっそうされたどうとうきのうをていきょうするrustup.rsのかいはつがすすめられており、Rust 1.14はんでrustup.shはひすいしょうとなり[59]、Rust 1.14はんいこうはrustup.rsがこうしきりりーすとしてていきょうされている[60][61]。
ひょうか
Rustは2016〜2022ねんにわたってStack Overflow Developer Surveyで「もっともあいされているぷろぐらみんぐげんご」でいちいをかくとくしつづけ[13]、ぷろぐらまのこういてきなひょうかはおおい。
いっぽうで、Rustはがくしゅうなんいどがたかいげんごともかんがえられている[62]。おおくのRustしょがくしゃのぷろぐらまにおいて、じしんがただしいとおもってかいたそーすこーどのこんぱいるにたいしてこんぱいらぼろーちぇっかーがえらーをけんしゅつする、「ぼろーちぇっかーとのたたかい」fighting with the borrow checkerがはっせいしがちである[63][64]。ちいさなあぷりけーしょんのじっそうについてどうじきにげんごかいはつされているGoげんごとひかくしたばあい、RustげんごよりGoげんごのほうがかいはつこうりつがよいというひょうかがある[14]。がくしゅうなんいどのたかさはかいはつちーむもにんしきしており、2017ねんろーどまっぷではがくしゅうきょくせんのかいぜんをもくてきとしてあげていた[15][65]。
このもんだいをかいぜんするために、2020ねんげんざいにおいて、じどうかをめいんてーまにしたかいはつをつづけており、ぜんじゅつにあるcargo、rustupなどのつーるいがいにも、rustfmt、clippy、cargo docなどのつーるるいをIDEかんきょうのみならずCUIかんきょうでもりようかのうなじょうたいへとせいびをつづけている。また、こうほうごかんせいをいじしているため、crates.ioをもちいることでらいぶらりるいなどのせいさんせいのこうじょうにもつとめている。
RustのじっこうじそくどせいのうはおなじくこんぱいらにLLVMをりようしているばあいのCげんごとどうとうていどであり[66][67]、いちぶのしょりではCげんごをうわまわったそくどがかくにんされている[12]。2018ねん2がつじてんで、うぇぶさーばあぷりけーしょんのはんようしょりではそくどせいのうのよいRustせいらいぶらりはかいはつがすすんでいない[68]。たんじゅんなてきすとしょりではそくどせいのうはよい[69]。
そののちのべんちまーくでは、へいこうしょりやぐらふぃっくすしょりにおいても、JavaやGoをうわまわっており、こんぱいらのしゅつりょくするこーどのゆうしゅうせいがしょうめいされている。ただし、さぽーとされていないぐらふぃっくすぼーどCのらいぶらりをいんくるーどしなければならないでは、C/C++のじっこうせいのうにはおよんでいない。
たんじょう
2006ねん、Mozillaではたらいていたぐれいどん・ほあれ[70]はげんだいのいんたーねっとかんきょうでたかいへいこうせいとたかいあんぜんせいがもとめられるしすてむぷろぐらみんぐげんごとしてCげんごやC++にかわりうるぷろぐらみんぐげんご Rustげんごのかいはつにちゃくしゅした[2]。MozillaがRustのかいはつにかかわりはじめたのは2009ねんで[71][9]、Rustは2010ねんのもじら・さみっとでこうにすがたをあらわした[72]。RustそーすこーどをこんぱいるするRustこんぱいらは、しょきのごろはOCamlげんごでつくられたこんぱいらrustbootがもちいられていたが[73]、2010ねんにはRustげんごじしんでRustこんぱいらをつくるせるふほすてぃんぐへいこうしたこんぱいらrustcのかいはつがはじめられ[74]、よくねんにはぶーとすとらっぷもんだいをかいけつしたさいしょのかんどうひんがかんせいした[75]。このときよりRustこんぱいらはこんぱいるきばんにLLVMをもちいたものとなった[76]。
0.xはん
ぷれあるふぁ0.1はんとよばれるさいしょのばーじょんは2012ねん1がつにりりーすされた[77]。Mozillaはこれをあたらしいものこのみのにんやぷろぐらみんぐげんごあいこうかのためのあるふぁはんといちづけていた。さいしょのあんていはんである1.0はんがりりーすされるまでの0.xはんりりーすでは、いくつものおおきなはかいてきなしようへんこうがげんごおよびらいぶらりにくわえられた。
へんすうめいやかんすうめいなどしきべつしは、このげんごのかいはつのしょきのごろは、ASCIIもじいがいのもじをつかうことがきんじられていた。げんごについてのあるしつぎおうとうのなかで、げんばのひえいごけんのぷろぐらまーのほとんどがしきべつしにはASCIIもじをつかっているとのべられていた。しかしそのせいげんははんろんをひきだすことになった[78]。それにより、2011ねん2がつにげんごにへんこうがおこなわれ、このせいげんはさくじょされた[79]。
かたはんていは、0.4はんいぜんのじゅうらいのせいてきがたづけにくわえて、かたじょうたいしすてむをさぽーとしていた。かたじょうたいしすてむは、とくべつなcheckぶんをしようしてぷろぐらむぶんのぜんごでのかたけっていをもでるかした。CげんごやC++こーどでのあさーしょんのばあいとどうように、ぷろぐらむじっこうちゅうではなくこんぱいるときにかたふいっちをけんしゅつする。かたじょうたいのがいねんはRustとくゆうのものではなく、NILでさいようされていたものである[80]。じっさいにはほとんどしようされていなかったためかたじょうたいはさくじょされたが、ぶらんでぃんぐぱたーんでおなじきのうをじつげんできる[81]。
おぶじぇくとしこうのしすてむは、0.2はんから0.4はんにかけておおきくかわっていった。0.2はんではじめてくらすclassがどうにゅうされ、0.3はんでいんたーふぇーすinterfaceをとうしたですとらくたとぽりもーふぃずむがついかされ、0.4はんでけいしょうをていきょうするしゅだんとしてとれいとtraitがついかされた。いんたーふぇーすはとれいとにいちぶのきのうがとうごうされて、ことなるふようなきのうとしてさくじょされた。くらすもまたさくじょされ、こうぞうたいととれいとをしようしたみっくすいんにおきかえられた。
こあのめもりもでるは、0.9はんから0.11はんのかん、2つのびるといんのぽいんたかたひーぷめもりかた~とがべーじこれくしょんかた@をきのうをたんじゅんかするためによういしていた。それらは、ひょうじゅんらいぶらりのBoxかたとGcかたでおきかえられ、Gcかたはさいしゅうてきにはさくじょされた[82]。
2014ねん1がつ、Dr. Dobb's Journalのへんしゅうちょうあんどりゅー・びんすとっくはDげんごやGoげんご、NimげんごとどうようにC++のきょうそうあいてになるきかいをえたとこめんとした。びんすとっくによると、Rustはひじょうにえれがんとなげんごとしてひろくみられているが、ばーじょんかんでくりかえしおおきくへんこうされたためふきゅうがおくれているという[83]。
1.xはん
2015ねん5がつ16にち、あんていはんとなるRust 1.0がりりーすされた[84]。1.0はんののち、あんていはんおよびべーたはんが6しゅうかんおきにていきりりーすされている[85]。またないとりーはんがまいにちりりーすされている[86]。あらたなきのうはないとりーはんでかいはつがすすめられ、べーたはんでどうさがけんしょうされている[87]。
2016ねん8がつ2にちにりりーすされたFirefox 48にはRustでかきなおされためでぃあぱーさがくみこまれており、MozillaがかいはつしているぶらうざのFirefoxにおいてRustでかかれたこーどがかきくわえられるはつれいとなった[88][89]。
2016ねん9がつにRustはFedora 24のひょうじゅんこんぽーねんとにくわえられ、RPMのぱっけーじかんりしすてむをもちいてのいんすとーるさぎょうがよういかされている[90]。
2018ねんばん
2018ねん12がつ6にちにばーじょん1.31がりりーすされた[91]。こんかいからえでぃしょんせいがどうにゅうされ、さいしんばんは"Rust 2018"、じゅうらいはんは"Rust 2015"とよばれることになる。げんごきのうへのはかいてきへんこうはあたらしいえでぃしょんのみにてきようされるが、ごかんせいにえいきょうしないきのうついかはひきつづきりょうしゃにてきようされる。また、2015ねんばんから2018ねんばんへはcargo fixでとらんすこんぱいるできる[91]。
2021ねんばん
2021ねん5がつ11にちに、3ねんぶりのかいていとなる2021ねんばんについてこうしき Blogへきさいがおこなわれた[92]。とうがいきのうは、2021ねん10がつ21にちにりりーすの1.56よりてきようされる。こんかいのしゅようなかいていは、れいがいしょりへのたいおうがきょうかされ、preludeぶんにTryIntoやTryFrom、FromIteratorなどがついかされる。しょうさいについては、こうしきBlogをさんしょうされたいが、こうほうごかんせいをいじしているため、2018ねんばんとのかんではとくにもんだいなくこんぱいるできる。
Source: https://ja.wikipedia.org/wiki/Rust_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E), Creative Commons Attribution-ShareAlike License 3.0

View file

@ -0,0 +1,157 @@
Rust (rasuto) ha, seinou, memori anzensei, anzen na heikousei wo mezashi te sekkei sareta maruchiparadaimu no puroguramingu gengo dearu. C gengo, C++ ni kawa ru shisutemupuroguramingu gengo wo mezashi teori [2], koubunteki niha C++ ni nite iruga [3], "boroochekkaa" (borrow checker) de sanshou no yuukousei wo kenshou surukotoniyotte memori anzensei wo hoshou dekiru. Rust ha gabeejikorekushon nashideno memori anzensei wo tassei shiteori, hitsuyou na bamen de sanshou kaunto wo tsukau kotomodekiru [4][5].
Rust purojiekuto ha oopunsoosu no komyuniteibeesu kaihatsu de shinkou shiteori [6], gengo shiyou (kentou dankai fukumu), soosukoodo, dokyumento ha oopunsoosuraisensu de koukai sareteiru [7]. 2006 nen no kaihatsu shoki ha, Mozilla no juugyouin no gureidon hoare (Graydon Hoare) [8] no kojin purojiekuto dattaga, 2009 nen ni Mozilla ga kaihatsu ni kakawa ri hajime te Mozilla Research no koushiki purojiekuto tonatta [9][10]. 2015 nen ni 1.0 han ga ririisu sarerumadeniikutsumono hakaiteki na shiyou henkou gaattaga, 1.0 han ikou ha kihonteki niha kouhou gokan wo tamotsu te 6 shuukan kankaku de teikiteki ni ririisu sareteiru.
Rust ha maruchiparadaimupuroguramingu gengo deari, tetsuzukigata puroguramingu, obujiekuto shikou puroguramingu, kansuugata puroguramingu nadono jissou shuhou wo sapooto shiteiru. Kihonteki na seigyo koubun ha C gengo ni nite iruga, sono ooku ga shiki (expression) dearutoiu ten nioiteha ML gengo ni nite iru. Konpairu kiban ni MIR to LLVM wo mochiite ori [11], jikkouji sokudo seinou ha C gengo to doutou teido dearu [12]. Kyouryoku na kata shisutemu to risoosu kanri no shikumi niyori, memori anzensei ga hoshou sareteiru.
Rust ha 20162022 nen no kan Stack Overflow Developer Survey de "mottomo aisa reteiru puroguramingu gengo" de ichii wo kakutoku shi tsuzuke teiru [13]. Ippou de, Rust ha gakushuu nan'ido ga takai gengo tomo kangae rareteori [14], 2017 nen roodomappu deha gakushuu kyokusen no kaizen wo mokuteki toshite age teita [15].
Rust toiu namae hasabi kin ni chinan de zuke rareta [16]. Kono meimei no nochi, touji no kaihatsu chiimumenbaa no ooku ga jitensha wo aikou shiteitakotokara, jitensha no cheenringu no sabi tsukiwo motoni shita dezain no rogo ga kouan sareta [17]. Touzen, cheenringu no sabi gasabi kin niyotte shouji ruwakeganaku, "sekkeisha no gureidon hoare ga seibutsugaku otaku dearukotokara sanka tetsu no "sabi" dehanaku "sabi kin" nanoda" to, sankou bunken 16 no matsubi ni shirusa reteiru.
Kaihatsu taikei
Rust ha oopunsoosu no komyuniteibeesu de kaihatsu ga susume rareteiru. Purojiekuto no shukan ha Rust Project Developers (Rust kaihatsu chiimu) dearu [18]. 2018 nen genzai, gengo hatsumeisha no gureidon hoare ha purojiekutochiimu kara hazure teiru. Purojiekuto no subete no soosukoodo ha GitHub de ippanni koukai sareteori [19], komyuniteimenbaa no kyouryoku niyori kairyou ga susume rareru. Purojiekuto no daibubun no komitto ha komyuniteimenbaa niyorumonodearu [20].
Mozilla no rinen [21] wo mamori, Rust gengo ha shakai ni hiraka reteori, gengo ya tsuuru ni taisuru shiyou no teian ha RFC no katachi de tori matomerare [22], kanrensu ru chiketto de shiyou shousai nitsuite riyousha kara kansou ya teigen wo uke teiru [23][24].
Gengo ya koaraiburari wo kaihatsu suru Rust kaihatsu chiimu ha Servo (uebuburauza you reiautoenjin) ya Rust konpaira no jissou keiken wo toushi te gengo wo kairyou shiteiru. Tatoeba, C gengo to Rust wo renkei saseru koodo wo jidou seiseisu ru bindgen ha motomoto ha gaibu kaihatsusha ga kaihatsu shiteitaga [25], Mozilla Servo kaihatsu chiimu ga Servo no kaihatsu de riyou surutameni C++ to Rust wo renkei saseru koodo mo jidou seisei dekiruyou kairyou wo omone, genzai ha Servo kaihatsu chiimu to mitsuni renkei shiteiru Rust kaihatsu chiimu ni shukan wo ikou shite [26]Servo no kaihatsu to tomoni kairyou ga tsuzuke rareteiru [27].
Sekkei to tokuchou
paradaimu
gengo jissou shuhou nioiteno puroguraminguparadaimu ha tokutei no jissou shuhou ni gentei sarenai hi junsui na maruchiparadaimupuroguramingu gengo dearu. Bunpou no hyoumenteki na kijutsu ha tetsuzukigata puroguramingu, burokkukoodo nomatomarino imiron ha kansuugata puroguramingu, kata shisutemu wo mochiita obujiekuto kouzou ha obujiekuto shikou puroguramingu no paradaimu tokusei wo motsu. Tokutei no puroguraminguparadaimu nomiwo shiyoushi te soosukoodo wo kijutsu surukotohanaku, yousho yousho no hitsuyou na tokoro de hitsuyou na paradaimu wo shiyoushi te soosukoodo wo kijutsu surukotoninaru.
Soosukoodo wo taagettopurattofoomu ni saitekika shita obujiekutofairu ni konpairu suru konpairu gengo no paradaimu tokusei wo motsu. Ooku no sukuriputo gengo ga motsu intapurita kinou ya, Swift ya Go ga teikyou suruyouna REPL kinou no paradaimu tokusei ha mota nai.
Sono hokano paradaimu toshite, kansuu no nyuushutsuryoku parameeta ni jienerikku kata wo shiteisu ru jienerikkupuroguramingu, hidouki kinou wo jitsugen suru heikou keisan no paradaimu tokusei wo motsu.
Kiso bunpou
Rust no kisoteki na bunpou ha C gengo ya C++ ni nite, nami kakko de kakoma reta burokkukoodo { ... }, if, else, while nadono seigyo furookiiwaado wo motsu. Subete no C gengo ya C++ no kiiwaado ga jissou sareteiruwakedehanaku, ippou de ikutsuka no Rust no seigyo meirei (pataanmatchi notameno match) hasorerano gengo wo shuutoku shita purogurama nitotteha najimi ga sukunai monomo sonzai suru. Rust no meirei bun ha, hyoumenteki na C gengo ya C++ tono bunpou no ruijisei nimokakawarazu, imiron tekini ha ML kei gengo no meirei shiki ni chikaku, kansuu hontai nohobo subete no bubun ha seigyo furoo enzanshi desae "bun (statement)" dehanaku "shiki (expression)" dearu [28]. Tatoeba futsuu no if shiki mo C gengo de iu tokoro no jouken enzanshi deari, if shiki no kekka toshite kaerichi wo kaesu.
Burokkukoodo nai no meirei bun no separeeta niha semikoron (;) wo mochii ruga, C gengo nosoreto kotona ri Rust no semikoron ha chokuzen no meirei bun ga burokkukoodo de kukura reru shiki no tochuu shiki dearukotowo sengen surutamenomonodearu. Semikoron wo matsubi ni oka nai meirei bun ha burokkukoodo no saishuuteki na hyoukashiki toshite atsukawa re, sono shiki no kekka ga burokkukoodo no soto he modorichi toshite kaesa reru [29]. Koreha kansuu teigi deareba, kekka wo kaesu kasho niha semikoron wotsukenai. Kekka ga fuyou naraba semikoron niyotte meijiteki ni sute runodearu. Soshite kekka wo kaesa nainaraba, soreha bun to yoba reru.
Hensuu
hensuu ha let kiiwaado de teigi sare, fuhen (imyuutaburu) dearu [30]. Hensuu heno sai dainyuu ha konpairueraa tonaru [31].
Kahen hensuu wo atsukai tai baai, hensuu sengen tokini mut kiiwaado wo riyou shite kahen dearukotowo meiji shinakerebanaranai [32]. Kono kinou ha tatoeba kyodai kouzoutai no kopii wo sake nagara ichibu wo henkou surutameni yuukou katsuyou dekiru.
Mata Rust ha shadooingu (doumei hensuu no fukusuukai teigi) ni taiou shiteiru [33]. Shadooingu niyori ichijiteki na hensuu no henkou ya hensuukei no henkou ga kanouni naru [34].
Hensuu toha betsuni const kiiwaado de teigi sareru teisuu wo motsu. Teisuu ha tsuneni hitoshii atai wo motsu (mut ya shadooingu ni taiou shiteinai).
Kata to porimoofizumu
kono gengo no kata shisutemu deha Haskell gengo ni narai "kata kurasu" wo mochii rukotogadekiru. Koreha adohokku na taaishou wo youini surumonodeari, kahen katasengen niyori jitsugen sarerumonodearu. Taka kaindo taaishou [35] nado, Haskell gengo niaru hokano tokuchou ha sapooto sareteinai.
Kata shisutemu
Rust gengo ga sonae ru kata shisutemu ha, impl (jissou), trait (toreito), struct (kouzoutai) oyobi enum (rekkyogata) wo kihon toshite kousei sareru. impl ga hokano gengo niokeru kurasu ni chikai yakuwari wo hata shi, keishou to porimoofizumu ha trait niyotte teikyou sareru. trait niha mesoddo wo teigi surukotogadeki, trait de sengen sareta mesoddo ha impl niyotte struct he mikkusuin sareru. struct niha fiirudo ga teigi kanou de, trait to impl hasore jishin niha fiirudo ha teigi dekinai. enum niha fukusuushu rui no kata no kategori hensuu ga teigi kanou de, suuchi kata, mojiretsugata, obujiekuto kata nadono fukusuu no joutai wo sentakuteki ni mochi uru. Hishigata keishou mondai wo kaihi surutameni trait nomiga keishou ga kanou dearu.
Hensuu no kata wo kettei suru kata shisutemu ha seitekigata zuke katsu tsuyoi katazuke dearu. Seitekigata zuke to douteki katazuke no kubun nioiteno katazuke ha, konpairu tokini subete no hensuu ni taishi te kata wo kettei suru seitekigata zuke wo kihon toshiteiruga, toreito wo pointa wo kaishi te riyou surukotode, dakkutaipingu ni nita katazuke ga kanouna toreitoobujiekuto ga sonzai suru. Hokani, Any toreito nite, jikkouji rifurekushon wo mochiita douteki katazuke mo kanou dearu. Tsuyoi katazuke to yowai katazuke no kubun nioiteno katazuke ha, jikkouji ni hensuu no kata wo katahenkan (appukyasuto, daunkyasuto, kurosukyasuto) oyobi bokushingu wosurukotowo yurusa nai tsuyoi katazuke nomiwo sapooto shiteiru. C gengo, Java ha jikkouji ni katahenkan wosurukotowo yurusu yowai katazuke wo sapooto shiteiruga, Rust gengo dehasonoyouna katahenkan ha mitome rareteinai.
Katasuiron
Rust konpaira ha hensuu heno dainyuu toki (variable = value), hensuu no kata wo atai no kata ni motozu ki katasuiron suru. Hensuu no sengen niha kanarazushimo kata wo kettei surutameno shokichi wo hitsuyou toshinai. Hensuu no sengen tokini shokichi ga atae rareta baai ha "hensuu no kata" ha "shokichi no kata" dearuto katasuiron ganasareruga, shokichi ga atae rarenakatta baai ha ikou no burokkukoodo nakano sono hensuu he atai ga hajimete dainyuu sareta tokini "sahen no hensuu no kata" ha "uhen no dainyuu suru atai no kata" dearuto katasuiron ganasareru. Hensuu heno dainyuu ga kata fuitchi niyori shippai shita baai niha konpairu tokini eraa wo kenshutsu suru [36].
Porimoofizumu no jitsugen
porimoofizumu wo jitsugen surutame, kouzoutai no fiirudo oyobi kansuu no nyuushutsuryokuchi ha tokutei no toreito no jissou wosuru jienerikku kata wo shiteisu rukotoga dekiru. Sonoyouna teigi no naka deha, jienerikku kata de kata ga sengen sareta hensuu oyobi nyuushutsuryokuchi hasono toreito no tokusei nomi shiyoude kiru. Koreha jienerikku kansuu ga teigi sarerutosuguni kata hantei gadekirukotowo imi shiteiru. Koreha C++ no dakku taipingu de gutaiteki na kata ga insutansu kasa rerumade hantei dekinai tenpureeto toha taishouteki dearu. Shikashi, Rust no jienerikusu no jissou ha C++ no tenpureeto no tenkeiteki na jissou to nite ori, insutansu ka gotoni koodo no kobetsu no kopii ga seiseisa reru. Koreha tansou ka [37] to yoba re, Java ya Haskell de tsuujou shiyousa reru kata shoukyo houshiki toha taishouteki dearu. Tansou ka no riten ha tokutei no yuusukeesu gotoni saitekika sareta koodo deari, ketten ha kekka no bainari no konpairu jikan oyobi saizu ga zouka surukotodearu. Rust no toreito wo mochiita porimoofizumu no jitsugen ha, jikkouji no oobaaheddo ganai "zerokosuto chuushouka" to hyougen sareteiru [38].
Risoosu kanri
Rust ha memori yasono hoka risoosu no kanri ni RAII wo saiyou shiteori, risoosu no riyou kukan wo konpairu tokini seiteki ni kenshou suru boroochekkaa (borrow checker) toiu kinou de jitsugen sareteiru. Gabeejikorekushon ya sanshou kaunto toha kotona ri, konpairu tokini seiteki ni risoosu no riyou kukan wo kenshou surukotode, jikkouji no risoosu kanri kosuto wo shouryou ni osae teiru.
Boroochekkaa
hitotsu no risoosu ha hitotsu no shoyuusha (hensuu ya burokku) nomini kanrenzuke sarerutoiu seiyaku ga Rust tokuyuu no risoosu kanriki nou toshite sonzai suru. Koreha, aru risoosu no shoyuuken (ownership) haaru shoyuusha (owner) ga jitsu teiru, noyouni hyougen sareru. Doujini, risoosu no shoyuuken wo fukusuu no hensuu ga motsu kotoha dekina i. Koreha C++ no sumaatopointa no isshu dearu unique_ptr no furu mai ni nite iru. Boroochekkaa ha shoyuuken no kyougou oyobi fusei riyou wo kenshou suru.
Risoosu niha sanshou (& kigou) no gainen ga sonzai shi, koreha shoyuuken no gainen to heikou shite atsukawa reru. Shoyuuken ha hitotsu no shoyuusha shika mote naiga, sanshou ha fukusuu no shoyuusha ga mochi uru. Sanshou ha douitsu no risoosu wo fukusuu no kasho de riyou surutameni riyou sareru. Tadashi, shoyuuken niyoru risoosu kanri ha yuukou deari, shoyuuken ga kaihou sareta risoosu wo sasu sanshou ha doujini mukouka sareru. Boroochekkaa hakono sanshou nitsuitemo raifutaimu (lifetimes) toshite risoosu no seizon kikan wo kenshou suru.
Boroochekkaa ha risoosu no shoyuuken to raifutaimu no ryouhou wo seiteki ni kaiseki surukotode, nurupointa ya fusei na memori iki wo sasu pointaa (eigoban), risoosu riyou kyougou wo seigen shita memori anzensei wo jitsugen shiteiru.
Tokui na risoosu kata
risoosu no memori kakuho ha kihonteki niha sutakkumemori wo riyou shiteori, hiipumemori wo riyou shita memori kakuho ha Box ya Vec nadono tokutei no kata nomide genteiteki ni riyou sareteiru.
Konpairu tokini kata no saizu ga kettei dekinai kahenchou hairetsu wo arawasu youna kata ha hiipumemori wo riyou suru Box kata wo shiyoushi te risoosu wo kanri suru. Box risoosu jitai ha sutakkumemori de kanri sareruga, Box risoosu ga shoyuuken wo motsu jittai no risoosu ha hiipumemori de kanri sareru. Hyoujun no hiipumemori kakuho niha shisutemuarokeeta wo riyou suruga [39], taishou purattofoomu ya birudo tokino shitei niyori hokano memori kakuho API wo riyou surukotomoaru. Hiipumemori ha sutakkumemori ni kurabe te sokudo seinou ga ochiru tame, hitsuyou tokini nomi genteiteki ni riyou sareteiru.
Kyoukai chekku
Rust ha jikkouji ni kyoukai chekku wookonau. Koreniyori baffaoobaaran wohajimetoshita memoriakusesu ni taisuru anzensei wo ete iru. Kono kinou ha zerokosuto chuushouka denaku jikkouji no meirei dearutame, anzensei to hikikae niikurakano seinou oobaaheddo ga hassei shiteiru. Hokano shisutemupuroguramingu gengo toshite daihyouteki na C gengo ya C++ ha kyoukai chekku wo kyousei shinaitame, Rust no tokuchou no 1 tsutonatteiru.
Raiburari
Rust no raiburari ha kureeto (crate) toiu koshou de teikyou sareru. Ooku no kureeto ha crates.io de koukai sareteiru. Dou saito ha baajon gotono soosukoodo wo aakaibu toshite teikyou shiteiru. Kureeto ha kanarazushimo crates.io ni touroku sareteiru hitsuyou hanaku, Web saaba ya fairushisutemu wo sasu URI de shiteisu rukotomodekiru [40]. Raiburari ha soosukoodopurojiekuto de haifu sarerukotoga ippanteki daga, konpairu shita bainariraiburarifairu (kakuchoushi rlib) de shutsuryoku surukotomo kanou dearu.
Koaraiburari
koaraiburari ha core no meishou de teikyou sareteiru [41]. Kono raiburari ha hyoujun raiburari ni izon shinai kikan raiburari deari, issai no joui raiburari, shisutemuraiburari, libc raiburari ni rinku shiteinai. Koaraiburari ha saishougen deari, hiipu wariate wo ninshiki sezu heikousei ya nyuushutsuryoku mo teikyou shiteinai. Soreranokotoha purattofoomu heno chousei ga hitsuyou deari, kono raiburari ha purattofoomu ni izon shinai.
Hyoujun raiburari
hyoujun raiburari ha std no meishou de teikyou sareteiru [42]. Kono raiburari ha kisoteki na kata (Vec<T> ya Option<T>), gengo no kihon no shori, hyoujun no makuro, nyuushutsuryoku (I/O), maruchisureddo nadono kinou wo teikyou suru. Hyoujun raiburari ha hyoujun de rinku shite sofutouea ga birudo sareruga, yori konkan tekina sofutouea ya risoosu no chiisa i kumikomi kankyou deha rinku wo hazushi te sofutouea wo birudo surukotogadekiru.
Gaibu raiburari
Rust ha kihonteki de hanyouteki na kinou wo fukume hyoujun raiburari dehanaku gaibu raiburari toshite teikyou shiteiru. Korehaiwayuru "batterii doukon (“Battery Included”)" no hantai wo iku monode, gengo to tomoni koushin surukotode hoshuteki ninarigachina hyoujun raiburari dehanaku, gengo toha dokuritsu shite koushin surukotode saizen wo kurikaeshi tankyuu shiuru gaibu raiburari tosurukotode, sorerano kinou woyori yoi hinshitsu de teikyou suru kangae ni motozu iteitamonodearu [43]. Gaibu raiburari no ribensei to hinshitsu no hoshou notameni crates.io to API gaidorain wo teikyou shiteiru.
Gengo kaihatsu no komyunitei gasoreranitsuite tazusawa tteinaiwakedehanaku, kisoteki na gaibu raiburari ha komyunitei haika de kaihatsu ga susume rareteiru.
Kisoteki na raiburari
rand - ransuu seisei [44]
regex - seiki hyougen [45]
chrono - jikoku sousa [46]
libc - C gengo intaafeesu [47]
log - rogu shutsuryoku intaafeesu [48]
kaihatsu tsuuru
Rust no kaihatsu tsuuru ha dokuritsu shita sofutouea toshite teikyou sareteiruga, Rust no koushiki na insutooru houhou ni shitagae ba, ikano tsuuru isshiki ga teniiru.
rustc
rustc ha Rust de kijutsu sareta Rust soosukoodo wo konpairu suru konpaira (shorikei) dearu. Konpairu no seikabutsu toshite chuukan koodo, oyobi jikkou fairu, seiteki raiburari, douteki raiburari wo shutsuryoku suru [49]. rustc ha kurosukonpairu wo kanou toshi, Windows, Linux, macOS muke no jikkou fairu hoka, Android ya iOS de dousa suru raiburari wo hosutomashin de shutsuryoku surukotogadekiru [50].
Taishou purattofoomu ha kanseido ni awa sete 3 tsuno teia ni waka reteiru [51]. Teia 1 ha bainariririisu ga teikyou sareteori, jidou birudo (eigoban) to jidou tesuto ga seibi sare, soreraga antei shite seikou (pasu) surukotoga hoshou sareteiru. Teia 2 ha bainariririisu ga teikyou sareteori, jidou birudo to jidou tesuto ha seibi sareteiruga tesuto ga seikou surukotoha hoshou sareteinai. Teia 3 ha soosukoodo toshiteha taiou shiteiruga, jidou birudo to jidou tesuto no dousa ga hoshou sareteorazu, koushiki ririisu ha teikyou sareteinai.
Windows, Linux, macOS muke no Rust konpaira ha teia 1 de ririisu sareteiru. Android, iOS, WebAssembly muke no Rust konpaira ha teia 2 de ririisu sareteiru.
Rust 1.12 han yori dounyuu sareta MIR (Mid-level IR)[11] niyotte, konpairu to jikkouji mano jinsokuka narabini kata chekku no seikakusei no jitsugen ga hakara reteiru.
Cargo
Cargo ha Rust sei sofutoueapurojiekuto no CUI no birudotsuuru dearu. Kitei no fairu kousei (direkutori, settei fairu, soosufairu) no purojiekutodirekutori de riyou sareru. Purojiekuto no birudo (konpairu), izon raiburari no daunroodo, tesuto, dokyumento seisei nadowo sapooto suru [53]. Tsuujou ha Cargo wo chuushin ni kaihatsu wo okonae ruyouni sekkei sareteirutame, rustc konpaira wo chokusetsu yobidasu kotoha mare dearu. Cargo no izon raiburari no daunroodo saki ha crates.io dearu [54]. Sabukomando ha kakuchouka nou de hyoujun no komando no hoka, README.md fairu no jidou seisei komando [55] nadono kakuchou komando ga sonzai suru. Kono kakuchou ha cargo-xxx to nazuketa komando wo tekisetsu ni insutooru surudakede, cargo ni xxx toiu sabukomando wo tsuika dekiru.
rustup
rustup ha tsuurucheen no kanri sofutouea dearu. Tsuurucheen no daunroodo to insutooru, sofutoueabaajon no kanri, konpairutaagetto no kirikae no kinou wo teikyou suru [56][57].
Kinou
rustup ha Rust purojiekuto ga ririisu shiteiru konpaira (rustc), birudotsuuru (Cargo) nadono tsuurucheen wo intaanetto wo keiyu shite hosutomashin ni daunroodo, insutooru oyobi maneejimento suru kinou wo teikyou suru. Insutooru taishou no tsuurucheen no baajon ha, antei han, beeta han, naitorii han no subete wo fukun deori, riyousha ga hitsuyou tosuru baajon wo shiteishi te daunroodo surukotogadekiru. Mata, taagettopurattofoomu nitsuitemo subete no shurui wo fukun deori, hosutomashin to kotonaru purattofoomu (tatoeba, hosuto ga macOS deattemo Windows ya Android, iOS) no konpaira wo insutooru surukotogadekiru. Kono baai, konpaira ha kurosukonpaira toshite dousa shite taagettopurattofoomu ni awa seta birudo wo jisshi suru.
Rekishi
Rust 1.13 han izen ha shierusukuriputo de jissou sareta rustup.sh ga koukai sareteita [58]. Koreto heikou shite Rust gengo de jissou sareta doutou kinou wo teikyou suru rustup.rs no kaihatsu ga susume rareteori, Rust 1.14 han de rustup.sh ha hi suishou tonari [59], Rust 1.14 han ikou ha rustup.rs ga koushiki ririisu toshite teikyou sareteiru [60][61].
Hyouka
Rust ha 2016~2022 nen ni watatsu te Stack Overflow Developer Survey de "mottomo aisa reteiru puroguramingu gengo" de ichii wo kakutoku shi tsuzuke [13], purogurama no kouiteki na hyouka ha ooi.
Ippou de, Rust ha gakushuu nan'ido ga takai gengo tomo kangae rareteiru [62]. Ooku no Rust shogakusha no purogurama nioite, jishin ga tadashi ito omotte kai ta soosukoodo no konpairu ni taishi te konpaira (boroochekkaa) ga eraa wo kenshutsu suru, "boroochekkaa tono tatakai" (fighting with the borrow checker) ga hassei shigachidearu [63][64]. Chiisa na apurikeeshon no jissou nitsuite doujiki ni gengo kaihatsu sareteiru Go gengo to hikaku shita baai, Rust gengo yori Go gengo no houga kaihatsu kouritsu ga yoi toiu hyouka gaaru [14]. Gakushuu nan'ido no takasa ha kaihatsu chiimu mo ninshiki shiteori, 2017 nen roodomappu deha gakushuu kyokusen no kaizen wo mokuteki toshite age teita [15][65].
Kono mondai wo kaizen surutameni, 2020 nen genzai nioite, jidouka wo meinteema nishita kaihatsu wo tsuzuke teori, zenjutsu niaru cargo, rustup nado no tsuuru igai nimo, rustfmt, clippy, cargo doc nadono tsuuru rui wo IDE kankyou nominarazu CUI kankyou demo riyouka nou na joutai heto seibi wo tsuzuke teiru. Mata, kouhou gokansei wo ijishi teirutame, crates.io wo mochii ru koto de raiburari rui nadono seisansei no koujou nimo tsutome teiru.
Rust no jikkouji sokudo seinou ha onaji ku konpaira ni LLVM wo riyou shiteiru baai no C gengo to doutou teido deari [66][67], ichibu no shori deha C gengo wo uwamawatsu ta sokudo ga kakuninsa reteiru [12]. 2018 nen 2 gatsu jitende, uebusaabaapurikeeshon no hanyou shori deha sokudo seinou no yoi Rust sei raiburari ha kaihatsu ga susun deinai [68]. Tanjunna tekisuto shori deha sokudo seinou ha yoi [69].
Sono nochino benchimaaku deha, heikou shori ya gurafikkusu shori nioitemo, Java ya Go wo uwamawatsu teori, konpaira no shutsuryoku suru koodo no yuushuusei ga shoumeisa reteiru. Tadashi, sapooto sareteinai gurafikkusuboodo (C no raiburari wo inkuruudo shinakerebanaranai) deha, C/C++ no jikkousei nou niha oyon deinai.
Tanjou
2006 nen, Mozilla de hatarai teita gureidon hoare [70] ha gendai no intaanetto kankyou de takai heikousei to takai anzensei ga motome rareru shisutemupuroguramingu gengo toshite C gengo ya C++ ni kawari uru puroguramingu gengo Rust gengo no kaihatsu ni chakushu shita [2]. Mozilla ga Rust no kaihatsu ni kakawa rihajimetanoha 2009 nen de [71][9], Rust ha 2010 nen no mojira samitto de kou ni sugata wo arawashi ta [72]. Rust soosukoodo wo konpairu suru Rust konpaira ha, shoki no goro ha OCaml gengo de tsukura reta konpaira (rustboot) ga mochii rareteitaga [73], 2010 nen niha Rust gengo jishin de Rust konpaira wo tsukuru serufuhosuteingu he ikou shita konpaira (rustc) no kaihatsu ga hajime rare [74], yokunen niha buutosutorappu mondai wo kaiketsu shita saisho no kandouhin ga kanseishi ta [75]. Kono toki yori Rust konpaira ha konpairu kiban ni LLVM wo mochiita monotonatta [76].
0.x han
purearufa (0.1 han) to yoba reru saisho no baajon ha 2012 nen 1 gatsu ni ririisu sareta [77]. Mozilla hakorewo atarashi i mono konomi no nin ya puroguramingu gengo aikouka notameno arufa han to ichi zuketeita. Saisho no antei han dearu 1.0 han ga ririisu sarerumadeno 0.x han ririisu deha, ikutsumono ooki na hakaiteki na shiyou henkou ga gengo oyobi raiburari ni kuwae rareta.
Hensuumei ya kansuumei nado shikibetsushi ha, kono gengo no kaihatsu no shoki no goro ha, ASCII moji igai no moji wo tsukau kotoga kinji rareteita. Gengo nitsuitenoaru shitsugi outou no naka de, genba no hi eigoken no puroguramaa nohotondoga shikibetsushi niha ASCII moji wo tsukatte iruto nobe rareteita. Shikashisono seigen ha hanron wo hikidasu kotoninatta [78]. Soreniyori, 2011 nen 2 gatsu ni gengo ni henkou ga okonawa re, kono seigen ha sakujo sareta [79].
Kata hantei ha, 0.4 han izen no juurai no seitekigata zuke ni kuwae te, kata joutai shisutemu wo sapooto shiteita. Kata joutai shisutemu ha, tokubetsu na check bun wo shiyoushi te puroguramu bun no zengo deno kata kettei wo moderu kashi ta. C gengo ya C++ koodo deno asaashon no baai to douyou ni, puroguramu jikkouchuu dehanaku konpairu tokini kata fuitchi wo kenshutsu suru. Kata joutai no gainen ha Rust tokuyuu nomonodehanaku, NIL de saiyou sareteitamonodearu [80]. Jissaini hahotondo shiyousa reteinakattatame kata joutai ha sakujo saretaga, burandingupataan de onaji kinou wo jitsugen dekiru [81].
Obujiekuto shikou no shisutemu ha, 0.2 han kara 0.4 han nikakete ookiku kawa tteitta. 0.2 han de hajimete kurasu (class) ga dounyuu sare, 0.3 han de intaafeesu (interface) wo toushi ta desutorakuta to porimoofizumu ga tsuika sare, 0.4 han de keishou wo teikyou suru shudan toshite toreito (trait) ga tsuika sareta. Intaafeesu ha toreito ni ichibu no kinou ga tougou sarete, kotonaru fuyou na kinou toshite sakujo sareta. Kurasu momata sakujo sare, kouzoutai to toreito wo shiyoushi ta mikkusuin ni okikaera reta.
Koa no memorimoderu ha, 0.9 han kara 0.11 han no kan, 2 tsuno birutoin no pointa kata (hiipumemori kata ~ to gabeejikorekushon kata @) wo kinou wo tanjunka surutameni youishi teita. Soreraha, hyoujun raiburari no Box kata to Gc kata de okikaera re, Gc kata ha saishuuteki niha sakujo sareta [82].
2014 nen 1 gatsu, Dr. Dobb's Journal no henshuuchou andoryuu binsutokku ha D gengo ya Go gengo, Nim gengo to douyou ni C++ no kyousou aite ninaru kikai wo eta to komento shita. Binsutokku niyoruto, Rust ha hijouni ereganto na gengo toshite hiroku mira reteiruga, baajon kan de kurikaeshi ookiku henkou saretatame fukyuu ga okure teirutoiu [83].
1.x han
2015 nen 5 gatsu 16 nichi, antei han tonaru Rust 1.0 ga ririisu sareta [84]. 1.0 han no nochi, antei han oyobi beeta han ga 6 shuukan okini teiki ririisu sareteiru [85]. Mata naitorii han ga mainichi ririisu sareteiru [86]. Arata na kinou ha naitorii han de kaihatsu ga susume rare, beeta han de dousa ga kenshou sareteiru [87].
2016 nen 8 gatsu 2 nichi ni ririisu sareta Firefox 48 niha Rust de kakinaosa reta mediapaasa ga kumikoma reteori, Mozilla ga kaihatsu shiteiru burauza no Firefox nioite Rust de kaka reta koodo ga kakikuwae rareru hatsu rei tonatta [88][89].
2016 nen 9 gatsu ni Rust ha Fedora 24 no hyoujun konpoonento ni kuwae rare, RPM no pakkeeji kanri shisutemu wo mochiite no insutooru sagyou ga youi kasa reteiru [90].
2018 nenban
2018 nen 12 gatsu 6 nichi ni baajon 1.31 ga ririisu sareta [91]. Konkai kara edishon sei ga dounyuu sare, saishinban ha "Rust 2018", juurai han ha "Rust 2015" to yoba rerukotoninaru. Gengo kinou heno hakaiteki henkou ha atarashi i edishon nomini tekiyou sareruga, gokansei ni eikyou shinai kinou tsuika ha hikitsuzuki ryousha ni tekiyou sareru. Mata, 2015 nenban kara 2018 nenban heha cargo fix de toransukonpairu dekiru [91].
2021 nenban
2021 nen 5 gatsu 11 nichi ni, 3 nen burino kaitei tonaru 2021 nenban nitsuite koushiki Blog he kisai ga okonawa reta [92]. Tougai kinou ha, 2021 nen 10 gatsu 21 nichi ni ririisu no 1.56 yori tekiyou sareru. Konkai no shuyou na kaitei ha, reigai shori heno taiou ga kyouka sare, prelude bun ni TryInto ya TryFrom, FromIterator nadoga tsuika sareru. Shousai nitsuiteha, koushiki Blog wo sanshou saretaiga, kouhou gokansei wo ijishi teirutame, 2018 nenban tono kan deha tokuni mondai naku konpairu dekiru.
Source: https://ja.wikipedia.org/wiki/Rust_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E), Creative Commons Attribution-ShareAlike License 3.0

99
tests/tests.rs Normal file
View file

@ -0,0 +1,99 @@
use rstest::rstest;
const RUST_ARTICLE: &str = include_str!("../tests/rust_article.txt");
const RUST_ARTICLE_HIRAGANA: &str = include_str!("../tests/rust_article_hiragana.txt");
const RUST_ARTICLE_ROMAJI: &str = include_str!("../tests/rust_article_romaji.txt");
#[rstest]
#[case("", "", "")]
#[case("構成", "こうせい", "kousei")]
#[case("好き", "すき", "suki")]
#[case("大きい", "おおきい", "ookii")]
#[case("かんたん", "かんたん", "kantan")]
#[case("にゃ", "にゃ", "nya")]
#[case("っき", "っき", "kki")]
#[case("っふぁ", "っふぁ", "ffa")]
#[case("キャ", "きゃ", "kya")]
#[case("キュ", "きゅ", "kyu")]
#[case("キョ", "きょ", "kyo")]
#[case("", "", ".")]
#[case(
"漢字とひらがな交じり文",
"かんじとひらがなまじりぶん",
"kanji tohiragana majiri bun"
)]
#[case(
"Alphabet 123 and 漢字",
"Alphabet 123 and かんじ",
"Alphabet 123 and kanji"
)]
#[case("日経新聞", "にっけいしんぶん", "nikkei shinbun")]
#[case("日本国民は、", "にほんこくみんは、", "nihonkokumin ha,")]
#[case(
"私がこの子を助けなきゃいけないってことだよね",
"わたしがこのこをたすけなきゃいけないってことだよね",
"watashi gakono ko wo tasuke nakyaikenaittekotodayone"
)]
#[case("やったー", "やったー", "yattaa")]
#[case("でっでー", "でっでー", "deddee")]
#[case("てんさーふろー", "てんさーふろー", "tensaafuroo")]
#[case("オレンジ色", "おれんじいろ", "orenji iro")]
#[case("檸檬は、レモン色", "れもんは、れもんいろ", "remon ha, remon iro")]
#[case("血液1μL", "けつえき1μL", "ketsueki 1μL")]
#[case("「和風」", "「わふう」", "\"wafuu\"")]
#[case("て「わ", "て「わ", "te \"wa")]
#[case("号・雅", "ごう・まさ", "gou masa")]
#[case("ビーバーが", "びーばーが", "biibaa ga")]
#[case("ブッシュッー", "ぶっしゅっー", "busshutsuu")]
#[case("ユーベルヹーク大", "ゆーべるゔぇーくだい", "yuuberuveeku dai")]
#[case("ヸーヂャニー品", "ゔぃーぢゃにーひん", "viijanii hin")]
#[case("アヷーリヤ品", "あゔぁーりやひん", "avaariya hin")]
#[case(
"安藤 和風(あんどう はるかぜ、慶応2年1月12日1866年2月26日 - 昭和11年1936年12月26日は、日本のジャーナリスト、マスメディア経営者、俳人、郷土史研究家。通名および俳号は「和風」をそのまま音読みして「わふう」。秋田県の地方紙「秋田魁新報」の事業拡大に貢献し、秋田魁新報社三大柱石の一人と称された。「魁の安藤か、安藤の魁か」と言われるほど、新聞記者としての名声を全国にとどろかせた[4]。",
"あんどう わふう(あんどう はるかぜ、けいおう2ねん1がつ12にち1866ねん2がつ26にち - しょうわ11ねん1936ねん12がつ26にちは、にほんのじゃーなりすと、ますめでぃあけいえいしゃ、はいじん、きょうどしけんきゅうか。とおりめいおよびはいごうは「わふう」をそのままおんよみして「わふう」。あきたけんのちほうし「あきたかいしんぽう」のじぎょうかくだいにこうけんし、あきたかいしんぽうしゃさんだいちゅうせきのひとりとしょうされた。「かいのあんどうか、あんどうのかいか」といわれるほど、しんぶんきしゃとしてのめいせいをぜんこくにとどろかせた[4]。",
"Andou wafuu (andou harukaze, keiou 2 nen 1 gatsu 12 nichi (1866 nen 2 gatsu 26 nichi) - shouwa 11 nen (1936 nen) 12 gatsu 26 nichi) ha, nihon no jaanarisuto, masumedia keieisha, haijin, kyoudoshi kenkyuuka. Toori mei oyobi hai gou ha \"wafuu\" wosonomama onyomi shite \"wafuu\". Akitaken no chihoushi \"akita kai shinpou\" no jigyou kakudai ni kouken shi, akita kai shinpou sha sandai chuuseki no hitori to shousa reta. \"Kai no andou ka, andou no kai ka\" to iwa reruhodo, shinbunkisha toshiteno meisei wo zenkoku nitodorokaseta [4].",
)]
#[case(
"『ザ・トラベルナース』",
"『ざ・とらべるなーす』",
"\"za toraberunaasu\""
)]
#[case(
"緑黄色社会『ミチヲユケ』Official Video -「ファーストペンギン!」主題歌",
"みどりきいろしゃかい『みちをゆけ』Official Video -「ふぁーすとぺんぎん!」しゅだいか",
"midori kiiro shakai \"michiwoyuke\" Official Video - \"faasutopengin!\" shudaika"
)]
#[case(
"MONKEY MAJIK - Running In The Dark【Lyric Video】日本語字幕付",
"MONKEY MAJIK - Running In The Dark【Lyric Video】にほんごじまくつき",
"MONKEY MAJIK - Running In The Dark [Lyric Video] (nihongo jimaku tsuki)"
)]
#[case(
"取締役第二制作技術部々長",
"とりしまりやくだいにせいさくぎじゅつぶぶちょう",
"torishimariyaku daini seisaku gijutsubu buchou"
)]
#[case(
"最初の安定版である1.0版がリリ",
"さいしょのあんていはんである1.0はんがりり",
"saisho no antei han dearu 1.0 han ga riri"
)]
#[case("にゃ$にゃ", "にゃ$にゃ", "nya $ nya")]
#[case(
"安定版となるRust 1.0がリリースされた[84]。1.0版の後、安定版およびベータ版が6週間おきに定期リリースされている[85]。",
"あんていはんとなるRust 1.0がりりーすされた[84]。1.0はんののち、あんていはんおよびべーたはんが6しゅうかんおきにていきりりーすされている[85]。",
"Antei han tonaru Rust 1.0 ga ririisu sareta [84]. 1.0 han no nochi, antei han oyobi beeta han ga 6 shuukan okini teiki ririisu sareteiru [85]."
)]
#[case(
"prelude文にTryIntoやTryFrom",
"preludeぶんにTryIntoやTryFrom",
"prelude bun ni TryInto ya TryFrom"
)]
#[case("要所々々", "ようしょようしょ", "yousho yousho")]
#[case("Hello World. abcd.", "Hello World. abcd.", "Hello World. abcd.")]
#[case::rust_article(RUST_ARTICLE, RUST_ARTICLE_HIRAGANA, RUST_ARTICLE_ROMAJI)]
fn romanize(#[case] text: &str, #[case] hiragana: &str, #[case] romaji: &str) {
let res = kakasi::convert(text);
assert_eq!(res.hiragana, hiragana);
assert_eq!(res.romaji, romaji);
}