🦀

100日後にRustをちょっと知ってる人になる: [Day 1]Rust について調べる

2022/08/23に公開

はじめに

#100DaysOfCode というチャレンジは有名ですよね。100日間毎日最低でも1時間はコードを書いてスキルアップをしましょうという取り組みです。

このチャレンジとは関係なく、昨年くらいまではほぼ毎日コードを書いたりしていました。その時は JavaKotlin を使って Spring なアプリケーションを作ったりしていました。ところが、この直近の半年くらいの間なのですが、ロールやポジションも変わったりもして少しコードを書くことが減ってしまったように感じています。そこで、またコードに向かう時間を増やそうと思い、100DaysOfCode にチャレンジしてみることにした、というわけなのです。

100DaysOfRust

この100DaysOfCodeのチャレンジで何をしようかなと思っていたのですが、来年は WebAssembly (Wasm) に注力していきたいと思っていることもあり、Rust に取り組もうと思います。ちなみに、Rust は登場してきた当初に少しかじってみた程度でほぼ素人なのです。頭の中は、ほぼJVMな言語で出来上がっています。だからこそ、「100日後にRustをちょっと知ってる人になる」 を目指してみたいと思ってます。
(まずは、三日坊主にならないようにがんばりますね。)

Rust とは

プログラミング言語を学ぶにあたり、言語仕様のイメージを掴むことも大事だとは思います。ですが、既に他の言語を学んだこともあるので仕様よりも、まずどういった場面で使われているのかという点を調べてみました。

Rust に関するアナウンスメント

少し調べただけでも Big Tech 企業が Rust を用いたサービスやプラットフォームを開発していることが見つかりました。

Rust 言語の特徴

次に言語仕様に少し関わることですが、Rust の売りとしている特徴について調べてみました。概ね以下の3つの観点が特徴となりそうです。

  • 高い安全性
  • 早い処理速度
  • 効率的な並行処理

この中でも特に 安全性 の点で他の言語と比べて特長とされているようです。不正なデータアクセスをコンパイル時に防止することが可能です。
世の中には多くのセキュリティ問題が発生していますが、その原因になっているのは無効なデータアクセスに関するものだと言われています。

Rust 採用により回避できるリスク

Rust による高い安全性により、次のようなリスクを回避することができます。

  • ダングリングポインタ
  • データ競合
  • バッファオーバーフロー
  • イテレータ無効化
ダングリングポインタ

プログラムの実行中にポインタが不正なメモリ領域を指している状態を、ダンデリングポインタ と呼びます。
本来有効だったメモリ領域が解放処理などによって無効化されたにも関わらず、そのメモリ領域を参照し続けているポインタのことです。そのようなメモリに異なるデータが書き込まれた後に、誤ってそのポインタを再参照してしまうと予想不可能な動作が発生してしまうリスクがあります。

データ競合

複数スレッド間で共有する変数に対して、同時に読み/書きアクセスが行われる事象のことを、データ競合 と呼びます。
データ競合が発生すると、そのスレッドの実行結果は予測ができないものとなります。この競合状態を防ぐには、変数に対して同時アクセスをスレッド間に排他制御を行う仕組みを実装することになります。

バッファオーバーフロー

まず、バッファとはデータの一時保存領域です。この一時データ領域に対して想定以上のデータサイズを送りつけて異常な挙動が発生することを、バッファオーバーフローと呼びます。
バッファオーバーフローを用いた攻撃の例にスタックとヒープの領域を対象とした攻撃があります。スタックを対象とした攻撃では、関数の戻り先アドレスを上書きすることで制御を奪い、ヒープを対象とした攻撃では、ヒープのメモリ構造を壊したり偽装することで制御を奪ったりします。

イテレータ無効化

データ構造に対してイテレータを用いて順番にアクセスして削除するとイテレータ自体も無効になってしまい、以降のデータに対してアクセスできなくなる状態を、イテレータ無効化と呼びます。

Day 1 のまとめ

今日は Rust の実装については全く見ませんでした。どのような言語なのかということは確認できたので、明日からは実装に入ってみようかなと考えてます。さて、これから100日間でどこまで知ってるといえるようになるんでしょうね。

GitHubで編集を提案

Discussion