みんなちがって、みんないい(各プログラミング言語解説)

プログラミング

暇なので、私が今まで経験してきたプログラミング言語の特徴やらなんやらをまとめてみようと思います。(以下、すべて主観!!)

C言語

習得難易度★★☆☆☆
実装難易度★★★★★
型システム静的型付け
強い分野組み込み系、OS、ドライバ、ミドルウェア 等々
特徴高速
省メモリ
・メモリ管理は開発者任せ
・自由度が高い
×プラットフォーム(ハードウェア・OS等)に強依存

よくポインタが難しいと言われるが、実際に難しいのはポインタの概念。
そしてこれは、言語そのものの難しさというより、コンピュータサイエンスの一般的な知識を持ち合わせているかどうかに依存する問題。
実は言語自体は非常にシンプル。

やろうと思えば何でもできる言語だが、簡単にできるというわけではない
言語のシンプルさゆえに、一から実装するのが大変なこともしばしばある。

良い意味でも悪い意味でも制限がなく、何でもできる開発者任せの言語である。
他の言語と比べて安全な言語ではないため、実務で使用する場合は事故を起こさないために、より一層正しい知識を持って実装することが必要となる。

Python

習得難易度★☆☆☆☆
実装難易度★★☆☆☆
型システム動的型付け
強い分野データサイエンス、機械学習、Webアプリ(サーバサイド) 等々
特徴ライブラリが豊富
データサイエンス、機械学習のライブラリが豊富
リストや辞書など(多数のデータを持つデータ構造)に対する操作が柔軟
・メモリ管理はガーベジコレクションにより自動
×遅い

「初心者にオススメしたい言語」とよく聞く。
ライブラリが多いのと、リスト等のデータ構造に対してあらかじめ柔軟な操作ができるように設計されている言語であり、開発者が「これがしたい!」と思ったときに、1,2行で実現できたりするのが大きなポイント。
大体のことが、他の言語より数行短く書けるイメージ。

あとデータサイエンスや機械学習に非常に強い。
ライブラリが多いのもそうだが、リスト等に対するデータ整形等が簡単に行えるのも大きい。
これらの分野では、データセットの前処理や後処理、つまりライブラリに食わしてやる前後のデータへの操作が非常に大事であり、そういったことが簡単に行えることは、データサイエンティストが、本筋でないプログラミングで躓くことの大きな助けになっていることだろう。

ちなみにPython自体の速度は非常に遅いのだが、機械学習が遅くていいのか?といわれたら、勿論そうではない。
それらのライブラリは大抵C++という非常に高速な言語で実装されている。

あと、機械学習自体はめちゃくちゃ難しい。
最適なハイパーパラメータ見つけるとことか。
私はコーディングよりも、よくそこで詰まる。

Java

習得難易度★★★★☆
実装難易度★★★★☆
型システム静的型付け
強い分野Webアプリ、スマホアプリ、業務アプリ 様々
特徴JVMにより、プラットフォームに依存しない
ネットやら書籍やら情報多数
堅牢
まあ高速
・オブジェクト指向
・メモリ管理はガーベジコレクションにより自動

みんな大好きJava。
ほんっっと~~~うに多くの企業のシステムで使われてる。多分最多??
プラットフォームを移行しやすいことや堅牢な言語であることが、企業システムで多用される大きな理由だろうか。

Javaでシステムを開発しようとすると、「オブジェクト指向」の理解がほぼ必須となる。
設計思想と言語は完全にイコールではなく、例えばPythonであればオブジェクト指向的な言語でありながら、手続型言語のように実装することもできる。
しかしJavaでは、それは実用的ではない。
Javaを学ぶうえで、オブジェクト指向での書き方を学ぶ、というのはほぼ100%必要ではないだろうか?
そして、このオブジェクト指向がめちゃくちゃ難しい。
奥が深すぎる・・・。一生理解できん。

JavaScript

習得難易度★★☆☆☆
実装難易度★★★☆☆
型システム動的型付け
強い分野静的Webサイト、Webアプリ(クライアントサイド/サーバサイド)、スマホアプリ 等々
特徴古来よりWebブラウザ上で、Webブラウザ単体で動作できる
多数のライブラリやフレームワーク(React.js、Vue.js、Node.jsなど)が開発されており、これ1つでWebアプリ全て、更にはスマホアプリまで開発可能
ユーザ操作に対するイベントハンドラが用意されている等、クライアントサイドの開発がしやすい設計になっている
・メモリ管理はガーベジコレクションにより自動
ブラウザに依存
×Webサイトの脆弱性を突いたセキュリティ攻撃の有名どころは、JavaScriptに仕込まれることが多い

最近は、Webアプリ開発においてはTypeScriptの使用が必須のような感じがある。
昔はJavaScriptは、Webサイトにちょっとした動きをつけたいときに使われてたのだが、昨今では様々なフレームワークやライブラリの台頭とともに、Webアプリ開発でフルスタックに使われるようになった。
ちょっとした動きどころかほとんどアプリ全体である。
そのような実装をするうえで、JavaScriptが扱うパラメータやモジュール間でのパラメータの受け渡しが増え、型を意識するニーズが高まったことが一因としてあると考えている。
実際、JavaScriptは誤った型の扱いが原因で、Webアプリがおかしな挙動をすることがよくあった。

バックエンドのNode.js、スマホアプリのReact Nativeは驚くべき進化である。
これの何がいいか?って、JavaScript(TypeScript)一つで、様々な分野の開発ができてしまうことである。
これまで紹介した言語のように、各言語に得意・不得意があり、開発者は作りたいものによって新たに言語を学習する必要があった。
しかしJavaScriptをマスターしていれば、少なくともWebアプリ、API開発、スマホアプリ開発はこれのみでできるかもしれない。

Rust

習得難易度★★★★★
実装難易度★★★☆☆
型システム静的型付け
強い分野組み込み、OS、ミドルウェア、Webアプリ 等々(ほぼ全てちゃう?)
特徴高速
省メモリ
メモリ管理は、自動(※ただし、ガーベジコレクションなしで)
堅牢
自由度が高い
×習得難(今までの言語と毛色が違う)

これはほんっっっとうにすごい。革命的な言語。
出てきてたった数年で、OracleやMicrosoft等の大きな企業が主要システムの開発言語として取り入れている。

所有権という概念。
簡単に言えば、各値に対して所有者が一つという規則なのだが、これがめちゃくちゃ難しくて初学者を困らせる。
しかしガーベジコレクションなしでメモリ管理を自動化してくれているのは、まさにこのおかげだ。
ガーベジコレクションという、ある程度重い処理がないおかげで、高速に省メモリで動作することができる。
最高じゃない?
「いや、待てよ。所有権って、今まで他の言語でできたことを制限しただけじゃないの?不便にならない?」と思われるかもしれない。
しかし今までのように、色んな変数が同じ値を使いまわし、参照し、書き換える。
これは責任の分散、値の生存スコープの複雑化、競合等、膨大なバグの温床となっていたはずだ。
であれば、簡単にミスを発生させうる私達いち人間がコーディングする言語として、Rustのような姿がもともとあるべき姿だったのではないか??というのが私なりの考えだ。
Rust最高。

初学者がRustの開発を始めたとき、まず最初の壁に直面する。
コンパイルエラーの数に驚愕するだろう。
エラー、エラー、エラー。おめでとう、それは救いだ。
膨大なコンパイルエラーの解消後にプログラムを実行した際には、おそらくメモリ破壊はないし、クラッシュもない。
Rustは非常に安全な言語だ。
安全に書くことを強いてくる言語だ。
そのうえ、やろうと思えばなんでもできる最強の言語であると思う。
ただ、超難しい・・・。

最後に

以上、5つの言語、100%私の感覚で書いてみました。
これらの言語の細かいノウハウも、ちまちま書いていきたいと思います。
私は全言語好きです(^^
みんなちがって、みんないい

コメント

タイトルとURLをコピーしました