4 ポイント 投稿者 GN⁺ 2024-09-07 | 1件のコメント | WhatsAppで共有

Rust

  • Rustは非常に愛されている言語で、高速で優れたコミュニティを持っている
  • Rustは所有権の概念を導入して、メモリ管理の問題を解決している
  • RcArcCow のようなユーティリティを提供し、参照カウントと "clone-on-write" をサポートしている
  • より低レベルの作業が必要なときは、unsafe システムを使って raw C ポインタにアクセスできる
  • Rustはタグ付き列挙型、マッチ式、一級関数、強力な型システムなど、多くの関数型言語の特徴を持っている
  • LLVMベースのコンパイラを使用して、ネイティブコードとWASMにコンパイルできる

Swift

  • Swiftも数年間使ってきたが、Rustを学びながらSwiftとの類似性を発見した
  • Swiftもタグ付き列挙型、マッチ式、一級関数など、関数型言語の特徴を持っている
  • Swiftはデフォルトで値型を使い、"copy-on-write" セマンティクスを持つ
  • より高速な性能が必要なときは所有権システムを選択して、値を "move" できる
  • より低レベルの作業が必要なときは unsafe システムを使って raw C ポインタにアクセスできる
  • SwiftもLLVMベースのコンパイラを使用して、ネイティブコードとWASMにコンパイルできる

デジャヴ?

  • SwiftとRustは非常によく似た機能セットを持っている
  • 大きな違いは 視点 にある
  • 基本のメモリモデルを考えると、その違いは明確になる

Rustはトップダウン、Swiftはボトムアップ

  • Rustは低レベルのシステム言語として始まり、高レベルへ上がっていけるツールを提供する
  • Swiftは高レベル言語として始まり、低レベルへ下りていけるツールを提供する
  • メモリ管理モデルが最も明確な例である
  • Swiftはデフォルトで値型を使い、"copy-on-write" セマンティクスを持つ
  • Rustは "moved" と "borrowed" の値を簡単に扱えるが、Cow 値を使うには追加の作業が必要である
  • Swiftは "copy-on-write" の値を簡単に扱える一方で、借用と移動を使うときには追加の作業が必要である
  • Rustはデフォルトでより高速で、Swiftはデフォルトでよりシンプルで使いやすい

SwiftはRustのアイデアをCライクな構文に隠している

  • Swiftの構文は、関数型言語の概念をCライクな構文の中に隠し、開発者が受け入れやすくしている
  • Rustの match 文とSwiftの switch 文の比較
  • Swiftの switch 文は実際には match 式と同じだが、名前と構文が異なる
  • Swiftでは enum にメソッドを直接追加できる

オプショナル型

  • Rustには null はないが None はある
  • Swiftには nil があるが、実際には None と同じである
  • Swiftは Option の代わりに T? を使い、コンパイラが nil ではないことを確認するよう強制する
  • Swiftではオプショナル型を簡単に使える

エラー処理

  • Rustには try-catch はないが Result 型を使う
  • Swiftは try-catch の代わりに do-catch を使い、関数呼び出しの前に try を使う必要がある
  • Swiftのエラー処理はRustに似ているが、より親しみやすい構文の中に隠されている

Rustのコンパイラは問題を検出し、Swiftのコンパイラは一部の問題を解決する

  • Rustのコンパイラは多くの一般的な問題をコンパイル時に検出し、解決策を提案する
  • 自己参照列挙型の例
  • Swiftは indirect キーワードを使って再帰型を示し、残りはコンパイラが処理する

Swiftはそれほど "純粋" ではない

  • SwiftはObjective-Cを置き換えるために設計され、既存のコードとインターフェースできる必要があった
  • Swiftは多くの実用的な選択を行っており、Rustよりも大きな言語である
  • Swiftは "段階的な公開" を念頭に設計されており、言語をより学ぶほど、より多くの機能が見えてくる
  • Swiftの一部の言語機能:
    • クラス / 継承
    • async-await
    • async-sequences
    • actors
    • getterとsetter
    • lazy properties
    • property wrappers
    • Result Builders(例: HTML / SwiftUI)

便利さの代償

  • Swiftは始めやすく、生産性を高めやすい言語である
  • 構文がより親しみやすく、多くの作業が自動的に処理される
  • Swiftはより高レベルな言語であり、それに伴う同じトレードオフがある
  • デフォルトでは、RustプログラムはSwiftプログラムよりはるかに高速である
  • Rustはデフォルトで高速で、遅くすることもでき、Swiftはデフォルトで簡単で、高速化もできる
  • 両言語にはそれぞれの用途がある
    • Rustはシステムおよび組み込みプログラミングにより適している
    • SwiftはUIおよびサーバーの作成により適している
  • 時間が経つにつれて、両言語の重なる部分はさらに大きくなると予想される

GN⁺のまとめ

  • この記事はSwiftとRustの類似点と相違点を比較して説明している
  • SwiftはRustの多くのアイデアを取り入れ、より親しみやすい構文で提供している
  • 両言語にはそれぞれの強みと用途があり、時間が経つにつれてより多くの重なりが生まれると予想される
  • SwiftとRustのメモリ管理モデル、エラー処理、オプショナル型など、さまざまな側面での違いを理解するのに役立つ
  • 似た機能を持つ言語としては Kotlin、TypeScript などがある

1件のコメント

 
GN⁺ 2024-09-07
Hacker Newsのコメント
  • Rustを初めて使う人たちがRustを好む理由は、ML系言語に初めて触れたからである

    • RustはUnixハッカーにとって親しみやすいコミュニティを提供している
  • Rustは、GCなしの自動メモリ管理をメインストリームにもたらした最初の言語である

    • Swift、OCaml、Scalaのような代替も存在する
  • Smalltalkの時代は終わり、今はMLの時代である

    • 2000年代の言語はSmalltalkから派生している
    • 新しい言語はML系言語である
    • Scalaを学べばRustやSwiftも簡単に学べる
  • RustをiOSのSwiftアプリに統合する作業をしながら、Swiftをもっと使いたくなった

    • Swiftはクロスプラットフォームでも使えるが、主にAppleプラットフォームを対象としている
    • Rustにはさまざまなパッケージシステムがある
    • SwiftパッケージはOS APIに依存することが多く、LinuxやWASMでは動作しない
    • IBMがサーバーでのSwiftを断念した事例がある
  • Rustはメモリ管理の問題を解決するために所有権の概念を導入したが、それを発明したわけではない

    • Cycloneのような言語が影響を与えた
  • RustとSwiftにはそれぞれの強みがある

    • Swiftはより簡潔な文法を持っているが、一部の領域はコンパイラ専用である
    • SwiftはAppleエコシステムの外では2番目または3番目に重要な言語である
    • この問題が解決されなければ、Swiftは主にApple専用言語のままだろう
  • SwiftのツールはRustより使いづらい

    • macOS 12を使っている2018年製MacBook AirではXcodeがサポートされていない
    • SourceKit-LSPは2番目に重要なツールとして扱われている
    • Rust 1.81とrust-analyzerはうまく動作する
  • Rustを学ぼうとしたが、例が複雑すぎて苦労した

    • RustのWebサイトのサンプルコードが複雑である
  • Swiftは列挙型にメソッドを直接追加できる

    • Rustでも同じことができる
  • Swiftはデフォルトで値型を使い、copy-on-writeセマンティクスを使用する

    • これは配列、辞書、文字列にのみ適用される
    • Swiftの値型は即座にコピーされる
  • Swiftを褒める文章を読むたびに、Apple/macOSエコシステムを使っていない開発者たちの経験が気になる

    • macOSを使っていないSwift開発者に会ったことがない
    • 標準ライブラリだけでなく、ツール、LSP、ライブラリ、チュートリアルなども重要である
    • Swiftが良い言語だとは信じているが、macOS上でのみ良いように思える
  • ZigとSwiftのドット構文を嫌うのは自分だけなのか気になる

    • .variant vs Type::Variant
    • 十分に長い、あるいは複雑なコードでは、型名が近くにないと不便だろう
    • IDEのような機能がないエディタでは特にそうだろう