「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 動的言語における静的型付けの皮肉

動的言語における静的型付けの皮肉

2024 年 11 月 7 日に公開
ブラウズ:459

この記事は Medium でも読むことができます。

プログラミング言語が時間の経過とともにどのように進化するかを見るのはいつも面白いです。

私がソフトウェア開発の世界へ足を踏み入れたとき、Python、PHP、JavaScript などの動的言語は、迅速な開発に適した柔軟性と簡潔な構文で高く評価されていました。

しかし、これらの弱く型付けされた言語は進化するにつれて、強く型付けされた言語の機能を組み込んでおり、C や Java に非常に似ています。

  • Python: 2015 年のバージョン 3.5 から型ヒント機能が導入され、2022 年のバージョン 3.12 で強化されました。
  • PHP: 2015 年のバージョン 7 で導入された宣言型。
  • JavaScript: 2012 年の TypeScript のリリースによって拡張され、「型の構文を備えた JavaScript」として定義されました。

なぜこのシフトなのでしょうか?

厳密な型指定言語では、コード内で変数の型を明示的に定義します。目的は、プログラムを実行する前の開発段階でエラーを捕捉し、これらの変数に割り当てるメモリ サイズに関するヒントをコンパイラに提供することです。

// C   example: 'y' will be an integer
float x = 3.14;
int y = x;  //  y = 3 (ignored the decimal part of the number)

一方、Python、PHP、JavaScript などの動的型付け言語では、変数を作成し、実行時にインタプリタにその型を暗示させることができます。

# In python and PHP: 'y' will take the same type as 'x'
x = 3.14
y = x  // y = 3.14 (float)

明示的型付けは動的言語にどのように導入されるのでしょうか?

次の例では、動的型付けと静的型付けを使用して同じ関数を宣言します。

Python:

# using the classic syntax:
def add(x, y):
    return x   y
# using explicit typing:
def add(x: int, y:int) -> int:
    return x   y

JavaScript / TypeScript:

// using the classic syntax
function add(x, y) {
    return x   y;
}
// using explicit typing
function add(x: number, y: number): number {
    return x   y;
}

PHP:

// using the classic syntax:
function add($x, $y) {
    return $x   $y;
}
// using explicit typing:
function add(int $x, int $y): int {
    return $x   $y;
}

PHP 8.2 (2022 年 12 月リリース) では、スタンドアロン型として null、true、および false のサポートを導入することで、さらにそれを推し進めています:

public null $nil = null;
public false $false = false;`

どこが皮肉なのだろうか?

この記事をこれらの新機能に対する異議とは受け取らないでください。厳密に型指定された言語を使用する利点は認めます。ただし、たとえば、Python で型アノテーションを使用しても、変数の型を変更できます:

x: int = 0
x = "John" 
print(type(x))   # 

PHP の場合も同様で、コンソールには非推奨の警告のみが表示されます。

ではなぜインタプリタがこのコードの実行を許可するのか疑問に思うかもしれません?
それは、これらの言語がそのように構築されているためです。それらは定義により動的に型付けされます。この特性を削除すると、それらは動的ではなくなります。 C のような厳密に型指定された言語になりますが、速度は遅くなります。

できれば、PHP ファイルで strict_types を true に設定することで、インタープリタをより厳密にすることができます。

declare(strict_types=1);

Python を使用している間、「mypy」パッケージを使用してコードを分析し、バグをキャッチできます:

$ mypy program.py
error: Incompatible types in assignment (expression has type "str", variable has type "int")  [assignment]

「mypy」がアドバイザーとして表示され、何が間違っていたかを教えてくれますが、危険を冒してコードを実行することを妨げるものではありません。

The Irony of Static Typing in Dynamic Languages

変数の型がわからない場合でも、union 演算子を使用して、受け入れられる型のリストを減らすことができます:

次の PHP と Python の例は、その方法を示しています。

y: int | float = f(x)   # introduced in Python 3.10
int | float $y = f($x)  // introduced in PHP 8.0
let y: number | string  // typescript

コードの可読性を犠牲にしていませんか?

10 年前、私は博士号取得のために Python を使用することに決めました。その理由は、そのシンプルさと新しいアイデアのプロトタイプをすぐに作成できるからです。その後、他のプロジェクトにもそれを使い始めました。

今、私は奇妙な PEP を読んで、これらの新機能を組み込んでコードベースを複雑にする価値が本当にあるのか自問していることに気づきました。

辞書の項目を出力する関数の例を見てみましょう。初期バージョンは次のとおりです:

def print_attributes(**kwargs):
    for key, value in kwargs.items():
        print(key, value)

person = {"name": "John", "height": 1.84}
print_attributes(**person)

Python 3.12 で導入された PEP 692 の推奨事項を使用すると、コードは次のようになります:

from typing import TypedDict, Unpack

class Person(TypedDict):   # create a class inheriting from TypedDict
    name: str                  
    height: float           

def print_attributes(**kwargs: Unpack[Person]) -> None:  # use the Unpack operator
    for key, value in kwargs.items():
        print(key, value)

person: Person = {"name": "John", "height": 1.84}  # create an instance of the class
print_attributes(**person)

要約すると、TypedDict を継承するクラスを作成し、各項目の名前と型を指定し、Unpack 演算子を使用して、受け取ったオブジェクトが TypedDict であることを「mypy」に伝えました。

その結果、コードのサイズが 2 倍になりました。オブジェクトにさらに多くの項目がある場合は、さらに長くなります。

幸いなことに、コードの一部に静的型付けを使用し、残りを動的のままにしておくことができます。あるいは、希望に応じて、まったく使用しないことも選択できます。

The Irony of Static Typing in Dynamic Languages

いつ使用すればよいですか?

新しい素晴らしい機能を学んだからといって、コードベース全体を書き直さなければならないというプレッシャーを感じる必要はありません。

これらの新機能はツールのようなものです。私のアドバイスは、これらを賢く使うことです:

次のシナリオでは静的型付けを使用します:

  • データベース、ライブラリ、API などの外部ソースからデータを取得する場合。
  • 失敗が許されないコードの重要な部分。
  • コードベースに頻繁なバグが発生しやすい場合。

次の場合は静的型指定の使用を避けてください:

  • アイデアをすばやくテストするためのプロトタイプを設計します。
  • 内部ロジックの実装では、型チェックによって冗長なコードが生成されるだけで、利点はありません。
  • 画面上にデータを表示するだけです (例: グラフ、画像、数値などをプロットするなど)。
  • ユーザー入力なしでコマンド ライン スクリプトを作成します。

コーディングに関しては、物事を複雑にする正当な理由がある場合を除き、常にシンプルさを追求することが黄金律であるということを覚えておいてください

リリースステートメント この記事は次の場所に転載されています: https://dev.to/minehorseman/the-irony-of-static-typing-in-dynamic-langages-31g1?1 侵害がある場合は、削除するために[email protected]に連絡してください。それ
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3