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は2016–2022ねんのかんStack Overflow Developer Surveyで「もっともあいされているぷろぐらみんぐげんご」でいちいをかくとくしつづけている[13]。いっぽうで、Rustはがくしゅうなんいどがたかいげんごともかんがえられており[14]、2017ねんろーどまっぷではがくしゅうきょくせんのかいぜんをもくてきとしてあげていた[15]。 Rustというなまえはさびきんにちなんでづけられた[16]。このめいめいののち、とうじのかいはつちーむめんばーのおおくがじてんしゃをあいこうしていたことから、じてんしゃのちぇーんりんぐのさびつきをもとにしたでざいんのろごがこうあんされた[17]。とうぜん、ちぇーんりんぐのさびがさびきんによってしょうじるわけがなく、「せっけいしゃのぐれいどん・ほあれがせいぶつがくおたくであることからさんかてつの「さび」ではなく「さびきん」なのだ」と、さんこうぶんけん16のまつびにしるされている。 かいはつたいけい Rustはおーぷんそーすのこみゅにてぃべーすでかいはつがすすめられている。ぷろじぇくとのしゅかんはRust Project Developers(Rustかいはつちーむ)である[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やOption)、げんごのきほんのしょり、ひょうじゅんのまくろ、にゅうしゅつりょく(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