EY-Office ブログ

Rustを学んでみた、Rustは超モダンなC言語 !?

先日のTauri記事に書いたように、The Rust Programming Language 日本語版を読んでRustを学んでみました。

そこで感じたRustの印象は、Rustは超モダンなC言語だ! です。
C言語に、新しいメモリ安全性とHaskell、npmからインスパイアされた機能を盛り込んだ超モダンな言語だと思いました。

The Rust programming language is a super modern C language Bing Image Creatorが生成した画像です

C(C++)言語

皆さんはC(C++)言語を使った事がありますか? 現在のWebアプリケーションはPHP, Python, Ruby, JavaScript…などの以前は軽量プログラミング(LL)言語と呼ばれているプログラミング言語を中心に、JavaやGoなどで書かれていると思います。

それに対し、OSやデータベース等のミドルウェア、大部分の言語処理系はCやC++で書かれています。これらのソフトウェアは実行速度が必要でかつ使用リソースも小さくしたいので、LL言語での実装は難しいです。たまにGoやJavaで実装したものもありますが、やはりC,C++が主流ですね。

私も昔いたスタートアップ企業ではC言語でCADを作っていました。CADも大量の図形データを高速に扱える必要があり、その時代ではC言語一択でした(一部CADは拡張されたPascelを使っていましたが)。 ただし、C言語での開発では小さなミスでプログラムが落ちてしまう言語でした。

  • C言語ではポインターが多用されますが、
    • 初期化されてないポインターや、もう使われてないメモリーを指しているポインターを使ってアクセスするとセグメンテーション違反が発生したり、不思議な動作をしたり・・・
    • 絶対の間違ってないと思われるコードが落ちることがあります。ポインターを使うとメモリー上のいたるとこをアクセスできるるので、他のコードのバグで関係ない変数が書き変えらてしまう事があります・・・
  • メモリーの割付(malloc)、解放(free)をコードに書かないと行けないので、
    • 解放忘れでメモリーを使いすぎて、メモリー割付けエラーになったり、極度に遅くなったり・・・
    • まだ使われているデータを解放してしまい、どこかでセグメンテーション違反が発生したり、不可思議な動作をしたり・・・

私はC++は詳しくないですが、スマートポインターなどメモリー管理を楽にする機能が導入されているようです。そういえば初期のiOSアプリはObjectve-Cで開発していましたが、参照カウントの管理を間違えると落ちてました。😅
(あるバージョンからは自動参照カウント(ARC)が登場し、だいぶ楽になりました)。

Rustの感想

まず、The Rust Programming Language 日本語版 は良いドキュメントだと思います。2. 数当てゲームのプログラミングを読みながらハンズオンを試すと、Rust言語の雰囲気を知る事ができます。

2章を試すだけでC/C++言語を知っている方は、だいぶRustの特徴を理解できると思います。3章〜6章がRust言語の基本、7章〜13章はRustのより深い理解に通ずる内容、14章以降はさらに深い(高度)な内容です。

開発環境

昔C言語の開発環境は、gcc等をインストールし、ソースコード以外に、Makefileを自前で書きました。必要なライブラリーがあればソースコードをダウンロードしコンパイルし・・・ と大変でした。

Rustでは、The Rust Programming Language 日本語版の11章のHello, Cargo!にあるようにcargo newでプロジェクトを作成し、必要なライブラリーはcargo installでインストール、開発(コンパイル・実行)はcargo run、実行イメージの作成はcargo buildと、npm(node.js)のように簡単で感動しました。 😁

静的型付き言語

C言語も型がありますが、キャストすればホイホイと違う型になってしまう言語でした。しかしRsutは厳格な静的型付き言語です。
EnumのOption、そしてパターンマッチング等など・・・まるでHaskellみたいです(Haskellは何冊も本を買いましたが、いまだに使いこなせないプログラム言語です 😅)。

オブジェクト指向言語ではない

現在使われているPHP, Python, Ruby, JavaScript, Javaなどのプログラミング言語は1990年代に生まれました、これらの言語はすべてオブジェクト指向言語です。オブジェクト指向は現在のソフトウェア世界に多大な成果をもたらしました、ただしオブジェクト指向を現実ので世界で利用してきた、2000年代には「継承」のように手放しで推奨できるものではない部分もわかってきました。

2000年代に生まれたGo言語には、オブジェクト指向の象徴のようなクラスはありません。またScalaやSwiftにはクラスがありますが90年代のオブジェクト指向言語とは異な特徴を持っていました。
2000年代に生まれたRustのもクラスはありません。構造体にトレイトを使いメソッドを定義することで、オブジェクト指向的なプログラミングは行えますが、構造体は継承できません。

それ以外にクロージャなど関数型言語からの影響もたくさんありますね。😁

新しいメモリ安全性(所有権)

Rust言語には所有権という他の言語にはない特徴があります。所有権に付いては是非The Rust Programming Language 日本語版の所有権を理解するを読んでください(ここでは解説はしません)。

Rustではキャストを許さない厳格な静的型付所有権により、C(C++)言語のところで書いたようなポインターやメモリ割当・解放に関連するバグをコンパイル時に検出してくれます❗❗

所有権の考え方は、Swift言語にも導入されています、ガベージコレクション(GC)無しの言語でも、ここまで出来るんですね。

つづき

だいたいRustの基本がわかったので、先日のデスクトップアプリ開発ツール Tauri に触れてみたに書いたように、Core Process(バックエンド)を書いてみたいと思います。

続く・・・

- about -

EY-Office代表取締役
・プログラマー
吉田裕美の
開発者向けブログ