4. Python との比較・入口
4.1. この章で学ぶこと
Mojo が Python と根本的に違う4つの点
Python に慣れた人が読み替えるコツ
Part 2 をどう読めばよいか
Mojo は見た目が Python によく似ています。 でも、似ているのは文法の表面だけです。 設計の中心はシステムプログラミング言語に近く、Python と根本的に異なる点がいくつかあります。 この章では、その違いを先に押さえます。
4.2. Python との4つの違い
観点 |
Python |
Mojo |
|---|---|---|
静的型・コンパイル時 |
実行時の動的型が基本。型ヒントは補助的 |
型がはっきりし、 |
値の扱い(ownership) |
オブジェクト参照として考えることが多い |
value semantics と ownership を重視する |
エラー( |
例外が中心。シグネチャにコストが見えない |
|
Python interop |
外部連携として考えることが多い |
相互運用が言語の大事な機能として組み込まれている |
つまり、Mojo は 見た目は Python に近いが、設計の中心はシステムプログラミング言語 です。
4.3. 似ているところ
最初に見るコードは、かなり Python に近く見えます(def・インデント・for・print など)。
def calculate_average(temps: List[Float64]) -> Float64:
var total: Float64 = 0.0
for index in range(len(temps)):
total += temps[index]
return total / Float64(len(temps))
def main():
var temps: List[Float64] = [20.5, 22.3, 19.8, 25.1]
var avg = calculate_average(temps)
print("Average:", avg)
リスト-1: python_comparison_calculate_average_simple.mojo
出典: Quickstart
Python 経験者ならかなり読みやすいはずです。ただし、入り口が似ているだけで、中身の考え方はかなり違います。
4.4. raises を見ると違いがわかりやすい
次のコードを見ると、Mojo が Python そのものではないことがよくわかります。
def calculate_average(temps: List[Float64]) raises -> Float64:
if len(temps) == 0:
raise Error("No temperature data")
var total: Float64 = 0.0
for index in range(len(temps)):
total += temps[index]
return total / Float64(len(temps))
リスト-2: python_comparison_calculate_average_raises.mojo
関数定義に raises が入っています。
「この関数はエラーを返す可能性がある」 とシグネチャで明示している、ということです。
エラーのコストが型として見える。これが Python との大きな違いの一つです。
出典: Functions / Ownership / Parameters
4.5. Python に慣れた人の読み替えのコツ
Python の感覚のままだと、少し混乱しやすい点があります。 最初は次の 3 つを意識すると読みやすくなります。
「名前がオブジェクトを指す」より「だれが値を持っているか」 を意識する
Mojo では ownership が大事です。関数シグネチャをしっかり見る
read、mut、var、raisesなどに、関数の性質がはっきり表れます。[]と()を混同しない
[]は compile-time、()は runtime と考えると整理しやすくなります。
4.6. 6 章以降の読み方
ここから先は、Mojo Manual の流れに沿って、次のようなテーマを順番に見ていきます。
言語の基本・関数・型と
struct値と所有権・メタプログラミング
GPU やレイアウト・Python 相互運用
最初は Python と似ている部分から入れますが、読み進めるほど 型、所有権、compile-time の重要さが見えてきます。 その変化を意識しながら読むと、Mojo の特徴がつかみやすくなります。
4.7. まとめ
Mojo は、最初の見た目は Python によく似ています。
でも中身は、型、所有権、compile-time を重視する別の言語です。
特に
raises、ownership、[]と()の違いは早めに押さえておくと役立ちます。
4.8. 出典
補足: この章では、Python とどこが似ていて、どこで分かれるのかをつかめれば十分です。細かい構文は 6 章以降で順に見ていきます。