動的型付け言語はそろそろ淘汰されるべき
Pythonがめっちゃ嫌い
私はPythonが嫌いです。
というより、動的型付け言語が嫌いです。
Jupyter Notebook (Google Colab) などの、セル単位での実行が有効な状況であれば、動的型付け言語のメリットは十分に活きると思います。
しかし、一般的なプロダクト開発においては、動的型付け言語のメリットはもはや過去のものになっていると感じます。
そう考える理由について、プログラミング言語の歴史を振り返りながら、私の考えを述べていきたいと思います。
型システムの進化と淘汰の歴史
プログラミング言語の長い歴史の中で、様々な言語がそれぞれの特徴を武器に台頭し、また消えていきました。
いずれも、その時代の技術的なニーズや開発スタイルにマッチしていたからこそ、広く採用されていったわけです。
その歴史は、ハードウェアの進化と開発手法の変化に密接に結びついています。
| 時代 | 主流の型システム | 代表的な言語 | 背景 |
|---|---|---|---|
| 1970〜1990年代 | 静的型付け | C, Java | メモリ制約、実行速度重視 |
| 2000〜2010年代 | 動的型付け | Ruby, PHP, JS, Python | Web普及、アジャイル開発 |
| 2010年代後半〜現在 | 漸進的型付け・静的回帰 | TypeScript, Go, Rust | ツール進化、大規模化、保守性重視 |
-
黎明期と静的型付けの台頭 (1970年代〜1990年代)
-
C言語やJavaに代表されるように、初期から中期のシステム開発では静的型付けが主流でした。ハードウェアリソースが限られている中、コンパイル時に型を決定し、安全性と実行速度を強固に担保する必要があったためです。
-
そもそも、当時は動的型付けの概念自体がまだ広く認識されていなかったこともあり、静的型付けが圧倒的なシェアを占めていました。
-
-
動的型付け言語の黄金期 (2000年代〜2010年代)
-
インターネットの普及とアジャイル開発の台頭により、「素早く作ってリリースする」ことが重視されるようになりました。コンパイルが不要で、記述量が少なく柔軟なRuby、PHP、JavaScript、Pythonなどが爆発的に普及し、Webの歴史を作りました。
-
この「開発速度の向上」というメリットは、当時のコンピュータの性能向上とも相まって、動的型付け言語が主流になる大きな要因となりました。
-
-
静的型付けへの回帰と「漸進的型付け」 (2010年代後半〜現在)
-
システムの大規模化に伴い、動的型付けの保守性の限界が顕在化してきました。特に、複数の開発者が関わるプロジェクトでは、型情報の欠如が技術的負債を生み出すことが多くなりました。
-
その結果、JavaScriptに対するTypeScriptの圧倒的な普及、Pythonにおける型ヒント(Type Hints)の標準化など、動的型付け言語に静的な型システムを後付けする「漸進的型付け」が現代の確固たるトレンドとなっています。
-
同時に、GoやRustといったモダンな静的型付け言語も大きくシェアを拡大しています。
現代のコンピュータの性能向上により、コンパイル時間が大きな問題にならなくなったことも、静的型付け言語の復権を後押ししていると言えるでしょう。
-
動的型付け言語は淘汰されるべき
歴史を振り返ると、動的型付け言語は「開発速度」という強力なメリットを武器に普及しました。果たして、現代においても動的型付け言語のほうが「開発速度で優れている」と言えるのでしょうか?
私は以下の理由から、純粋な動的型付け言語は第一線から退くべき時期に来ていると考えます。
1. 保守性の限界
現代のアプリケーションは複雑化しており、数年単位で複数の開発者がコードに触れます。
型情報がないコードは、変更時の影響範囲の特定を困難にし、深刻な技術的負債を生み出します。
技術的負債は、結果として開発速度を大幅に低下させます。
2. ツールの進化
かつては動的型付けの方が「手軽」でしたが、現在は開発環境の進化により状況が逆転しました。
静的型付け言語がもたらす強力なコード補完機能や安全なリファクタリング機能の恩恵は、型定義にかかる手間を遥かに上回ります。
| 機能 | 動的型付け | 静的型付け |
|---|---|---|
| コード補完 | △ 推測ベース | ◎ 型情報に基づく正確な補完 |
| リファクタリング | △ 手動確認が必要 | ◎ 安全な自動リファクタリング |
| エラー検出 | ✕ 実行時 | ◎ コンパイル時(即座) |
| ドキュメント性 | △ コメント頼り | ◎ 型が仕様書になる |
3. AIとの相性
AIコーディングアシスタントは、コードの文脈を読み取って提案を行います。明確な型情報が存在するほど、AIはより精度の高い推論やコード生成を行うことができ、AI時代の開発効率に直結します。
また、現在のAIが出力するコードは、まだ常に完全であるとは限りません。厳密な型システムが存在することで、AIは自律的にエラーを検出・修正することが可能になります。
動的型付け言語では、AIが生成したコードの品質を保証するために、より多くの手動テストやデバッグが必要になるでしょう。
4. オブジェクト指向との相性
型注釈のない動的型付け言語でオブジェクト指向を採用することは、むしろコードの複雑性を増すと感じています。
型のないオブジェクトはただのデータの塊でしかなく、オブジェクトの中身を静的に把握することができません。
関数の呼び出し元を辿り、渡される値を実際に確かめなければ、オブジェクトが持つプロパティすら分からないのです。
個人的には、オブジェクト指向の本質は「コードの構造を明確にすること」だと考えています。
クラスやインターフェイスによって、独自に構造を型として定義できることこそ、オブジェクト指向をメリットのあるものにするための重要な要素だと思います。
もっと未来の話
先述の通り、どの技術が主流になるかは、その時代の技術的なニーズや開発スタイルに大きく依存します。
いつかAIが、型定義すら不要になるほどの高度なコード生成能力を持つようになれば、型システムの存在意義も変わってくるかもしれません。
さらに、コンピュータの性能向上によってインタプリタのオーバーヘッドが無視できるほど小さくなれば、動的型付け言語の持つ柔軟性は再び魅力的な選択肢となるでしょう。
AIがリアルタイムでコードを生成し続けるような動的に変わり続けるシステムが主流になる未来もあり得ます。そうなれば、動的型付け言語のメリットが再び脚光を浴びる可能性もあるでしょう。
技術は目的ではなく手段です。
エンジニアは、その時代のニーズに最もマッチした技術を選択する柔軟性を持つべきだと考えています。
おわりに
もちろん、現代においても動的型付け言語が完全に消えるわけではないでしょう。
例えば、研究開発などの特定の用途においては、Jupyter Notebookのような特殊な実行環境のニーズは今後も存在し続けると思いますし、そういった環境では動的型付け言語のメリットが活きる場面もあるでしょう。
しかし、中規模以上のプロダクト開発において「型のない言語」を新たに採用する合理的な理由は、もはや"ほとんど存在しない"のではないかと考えています。
そろそろ私たちは、動的型付け言語が果たしてきた役割に感謝しつつ、次のステージへ進むべきではないでしょうか。
もちろん、Pythonのライブラリエコシステムは非常に魅力的で、Pythonを完全に捨てるのは難しいかもしれません。
そういった場合でも、型ヒントを積極的に活用するようにしませんか?
型はコードの仕様書であり、保守性を高めるための重要なドキュメントです。
Pythonの型ヒントは完全な静的型付けではありませんが、動的型付け言語の中でできる限りの型安全性を提供するための素晴らしい機能です。
ぜひ、型ヒントを活用して、Pythonコードの品質と保守性を向上させていきましょう。
Discussion
python最高!
諸事情あってTypeScriptバックエンドから、Pythonバックエンドにいます。
個人的にはこの記事にかなり同意しています。
というのも最近Pythonもやたら型エコシステム周り整えています。
また、私もtyを導入して、リポジトリに入れてチームで強制的に使うようにしています。
もちろん、
.claude/rulesに入れてAIにtyを強制させるようにしています。が、AIはこれまでのPythonの使い方を学習してしまっていて、当たり前のように型エラーを修整しない、握り潰す、あげく--no-verifyをします...
そのせいで、とても開発速度のボトルネックになっています...
また、tyの型のルール130個くらいでもPythonエコシステムでは一番多いみたいな話を聞いて、とてもじゃないですが型が信頼できるものではなくなりました...
と、上記のようにTypeScript一色で生きてきた自分にとっては、この記事はかなり同意できる内容しかなかったです...
動的型付けを排除しようとするということは、
実質的にはインタプリタ文化そのものを排除することにつながっていく。
学習や探索のための“即時実行できる環境”がなくなると、
プログラマが育つための土壌まで失われてしまう。
静的型付けが強くなるほど、
その裏側で自由に試せる“遊び場”としての動的型付けやインタプリタが必要になる。
コンパイル言語が生き残るためにも、
実はインタプリタの存在が不可欠なんだと思います。
そして、言語生態系には必ず“異端”が必要です。
Pythonは異端というより、もはや主流の一角。
本物の異端は APL や Ada、Lisp、Prolog のような、
“人間を選ぶ言語”のほうで、こういう存在が生態系の変異源になっています。
アリの群れから2割の怠け者を排除しても、
しばらくするとまた別の2割が怠け者になるように、
言語の世界でも“気に入らないもの”を排除しても、
また別の形で必ず異端が生まれる。
主流8割・異端2割のバランスで生態系が安定するのは、
自然界もプログラミング言語も同じなんですよね。
なかなか哲学的なコメントですね笑
でも、実際そういうことだと思います。
広く使われる言語にも完璧なものなんてなくて、小さな不満から異端言語が生まれるのでしょう。
言語は作者の意図があって生まれ、利用者の目的があって利用されるものです。
今あるどんな言語も一意に否定できるものではないですね。
システム開発の場で型のないコードは辞めてほしい、という提案の記事でした。
いいんじゃないですか、いっぱい釣れたみたいだし。
どちらかというと、スクリプト系よりもコンパイル系言語のほうが好きですね。
文法や変数程度は実行前にエラー検出してほしいからね。
動かすときにはロジックに集中したいので。
普及した言語で言えば、動的型付けの始まりはBASICとかLISPじゃないでしょうか?
それ以前にも存在はしましたが、普及したとは言い難い。
BASICには整数型、浮動小数点型、文字列型や配列型など型がありますよ。
確かに。懐かしい。
整数型指定のdefint a-zとか、a%なんか指定すると少しだけ速くなりましたね。
うp主は
Python(2ではなく3のみ)で作られたエコシステム上でしか「 生成AI」が商業的に成り立っていないということを知っていて淘汰されるべきと言っているのでしょうか?
静的型付け言語のみで生成AIを作ることは事実上不可能なんですよ。理解していますか?
AIとの相性も何もPythonじゃないと生成AI自体が作れない。生成AI系ライブラリがPythonに偏っているのは生成AIにとってPythonは母国語だからです。
コメントありがとうございます。
内容拝見いただけましたでしょうか?
タイトルは興味を引くために少し過激に「淘汰されるべき」と記載しましたが、実際には一般のプロダクト開発の場でPythonが必要なプロジェクトは少ないのでは?という意図の内容です。
不必要に動的型付け言語で負債を増やすのはやめ、必要な場であっても型ヒントを活用しませんか?という「提案」でもあります。
その点、Pythonという言語自体を否定する内容ではないということ、ご理解いただければと思います。
また、個人的に、生成AI自体の開発においてもpythonは全然必須のものではないと考えています。
人工知能の発展に寄与した要因として、構文のシンプルさから研究等の場面で用いられやすかった事があると思います。
型の安全性や便利さよりも、研究内容以外の学習にコストを割きたくなかった研究者が多かったのではないでしょうか?
それによって必要なライブラリも整備されてきたのだと思います。
ライブラリの整備がよりその業界の需要を生み、Python一強になってしまったと考えています。
現在では、GoやRustなどのモダンな静的型付け言語にAI関連のライブラリが充実しており、生成AI自体を作るのはpythonの特権とは言えなくなっています。
上記のような要因によって作り上げられてきたPythonの強力なライブラリエコシステムが商業的に大きな価値を持っているという点には賛同できますが、現代においてはPythonを利用するデメリットも大きいです。
ぜひ、一度本文の内容に目を通していただければと思います。
今日は。
動的型付け言語で育ってきて、今でも好んで使いますが、TypeScriptやRustを触ると、感情的な物以外は反論できないな……と感じています。
動的型付け言語が滅んだ未来を少し想像してみようとしました。
シェルスクリプトみたいなのって、どうなるのかがうまく考えられませんでした。シェルスクリプトのファイル自体は、ビルドされたバイナリーに置き換えることはできると思いますが、cronやsystemdのユニットファイルにはどう書くといいんだろう……と考えが止まってしまいます。コマンドライン引数やオプションの型については、どのタイミングで評価されて「コンパイル」されるのがいいんでしょう。OSに登録される……?
極論ではありますが妄想してみたらちょっと困り楽しだったのでコメントしてしまいました。
実際に静的型付け言語のリファクタリング時の安心感などは開発速度を早めるなあと感じています。
コメントありがとうございます。
簡単なスクリプトレベルでは動的型付け言語の手軽さは有用だと思います。
例えば、AIに何かしらの指示をした時、簡単なpythonスクリプトを実行してタスクを行うことがあります。
そのような場合、作ったスクリプトをその後も使うことはほとんどないですし、コンパイル言語の保守性の高さはメリットとして弱いと感じます。
記事の主張としては、一般的なシステム開発の場においては動的型付け言語の柔軟性は負債になり得るというものです。
まだ有用な場面は色々とあると思います。
ちなみに、コンパイル言語での引数の型ですが、基本的には言語側が吸収する部分になると思います。
たとえば、Go言語では「os.Args」というStringの配列が用意されており、引数に入力があれば空白でスライスされて格納されます。