2015年1月17日土曜日

RustとC++言語仕様比較

最近、個人的にRustという言語が熱いです。まだ、正式版リリース前なので、日本語の公式ドキュメントも存在しませんが、一言で表現するならば「Cライクな記号を使用する関数型言語」とでも言いましょうか。文法的にも見た目も、CやC++のそれに酷似しているのですが、その実、意味論的には異なる部分の方が多く、どちらかといえばHaskellに代表される関数型言語に分類されるべきかもしれません。

さて、Rustは公式にも、C++と同等程度のパフォーマンスを出しつつ、メモリセーフで並列化可能なプログラムを書くための言語として開発が進められていると書かれています。そして、実際C++と似通った概念も多いので、C++とRustの違いを明確にするため、以下にC++の概念とRustの概念を極力、対になるように列挙してみました。

mod = namespace
& = const& (Rustの参照とC++の参照は同じ。ただし、Rustはデフォルトでimmutable)
&mut = &
デリファレンスと参照化(ポインタ化)は同じ演算子でできる。宣言と演算子で意味が変わらない分、Rustの方が親切(unsafe時は、その限りではない)(C++でナマのポインタを扱う人は稀だろうから、これは当てはまらないかも)
fn method(&mut self) = void method()
fn method(&self) = void method() const
fn new() -> SomeType = SomeType() (コンストラクタは、ファクトリメソッドとして定義)
(デストラクタはfn drop(self)と書くのが通例のよう。Clone traitを実装してると挙動変わるかも?基本的にデストラクタは、スコープ外に抜けさせて作用させるので、明示的にdropするのは、RAIIを使ってる時ぐらいみたい。それも、リソースを解放するよという意思表示の意味が強そう)

fn staticMethod() -> () = static void staticMethod() (特殊変数selfを第1引数に取らないメソッドは、staticメソッドとして解釈される。Rustのコンストラクタはこの性質を利用したもの。デフォルトコンストラクタをnewと書くのは、単なる習慣みたい)

std::boxed::Box = std::unique_ptr (メモリの所有権を持つスマートポインタ)
他にもReference Countを使用したスマポもある。

/*****
use std::os;
fn main() {
    let args = os::args();
    let arg1 = match args.len() {
        1 => args[0],...
/*****
int main(int argc, char* argv[])
{
    char* arg1 = (argc == 1) ? argv[0] :...
*****/
(main関数は、引数も戻り値もなしがRust流。コマンドライン引数には、std::osモジュール経由でアクセスする)

/*****
impl Add for SomeType {
    type Result = SomeType;
    pub fn add(self, rhs: SomeType) -> SomeType {...
/*****
class SomeType
{
public:
    static SomeType operator+(SomeType rhs)
    {....
*****/
(オペレータのオーバーロードは、対応するtraitをimplすることで行う。+演算子がaddメソッド呼び出しのsyntactic sugarになっている)

(まだ追記するかも...)

0 件のコメント:

コメントを投稿

なにか意見や感想、質問などがあれば、ご自由にお書きください。