目次
プログラミング言語雑感(2024年):C, C++, Java, C#, Python, JavaScript, Ruby, PHP, Flutter, Rust, Go
2024/09/04,
言語雑感を書いてみます。
すべての言語に精通しているわけでもないし、すべての言語を使ったわけでもないので、あくまで個人的な感想や偏見を書いているだけであることを留意してほしいです。というか、あくまで個人的な感想や偏見なので、参考程度にしてください。
雑感の記述量は言語に依ってメチャクチャムラがあります。詳しい言語、興味のある言語ほど詳しく書いています。
今回紹介している言語
- C/C++
- Java
- C#
- Python
- JavaScript(TypeScript)
- Ruby
- PHP
- Flutter(Dart)
- Rust
- Go
今回紹介している言語では Ruby 以外は何かしら触っている。筆者はWebアプリを個人で開発することが多いです。
C言語/C++言語
筆者のレベル:やっぱり基本からだよね。ということで中学くらいの時に一番最初に手を出した言語。なので抑えているのは基本文法くらいでかんたんなターミナルアプリが作れるくらい
C, C++の評価、雑感、偏見
究極の速度がほしい場合や組込機械やマイコンとかで使う場合には適している。Linuxカーネル(C)といった基礎領域やセンサー制御、マイコン制御といった低レイヤー領域で活躍中。
Unreal Engineなどのゲーム開発でC++が使われることが多いので、美麗なゲームを作りたい場合にはC++を学ぶと良いかもしれない。
ただし丁寧にプログラミングしないとメモリリークやセキュリティホールが発生しやすいので取り扱い注意。アメリカの国家安全保障局がC、C++ではなくRustやGo, Java, C#といったメモリ安全のプログラミング言語を推奨していたりするので、現在この言語を積極的に採用しようとは個人的には思わない。
CのおすすめIDE
- CLion
- Visual Studio
Java (Kotlin / Scala)
筆者のレベル:簡単なGUIアプリケーションを作った。
Javaの評価、雑感、偏見
大規模アプリケーションでよく利用されている。他の言語と比べると記述が冗長になりがち。最近はIDEのサポートが充実していたり、AIの補完が効いたりするのでそれほど気にならないかも?
日本のSIerや金融業界でよく使われている。典型的なオブジェクト志向言語。昔から使われているから開発会社各社でノウハウが蓄積されており、ウォーターフォール開発と相性が良いのかな。
Javaの求人は多いので、就職活動をするならJavaを学んでおくと良いかもしれない。
人材が豊富で人員採用がしやすく、言語自体も枯れており比較的安全。企業の視点からならとても魅力的な言語だと思う。
KotlinやScalaという親戚がいる。触っていないのでよくわからない。Androidの推奨言語がKotlinなので、Androidアプリ開発をするならKotlinを学ぶと良い。
デスクトップアプリ開発を行う場合、一つのコードでWindows, Mac, Linuxと多くのOSに対応できるのが強かった。最近はいろいろな言語でマルチプラットフォーム開発ができるようになってきたので、この点の優位性は薄れてきている。
JavaのおすすめIDE
- IntelliJ IDEA
- Eclipse
C#
筆者のレベル:Unityでかんたんなゲームを作った程度。
C#の評価、雑感、偏見
Microsoftが開発した言語。リリースされた時はWindows専用言語という感じだった。今はWindows, Mac, Linux,Android, iOSとマルチプラットフォームのアプリ開発が行える。
Unityのおかげでゲーム開発にも向いている。ただし最近Unityのライセンス変更によってUnityで開発するのはやめようという動きもあるので、Unityのシェアが今後どうなるかわからない。
軽く触った感じだとJavaと似た感じの書き心地だった。
一つの言語でWebアプリ、デスクトップアプリ、モバイルアプリ、ゲームアプリを作成できるのは強い。結構お徳な言語だと思う。JavaとC#のどっちでコードを書きたいかというと、C#のほうが好きかもしれない。
C#のおすすめIDE
- Visual Studio
- Rider
- VSCode
Python
筆者の経験:基本文法は抑えている。FastAPIをちょっと触ったり、機械学習ライブラリで勉強したり。
Pythonの評価、雑感、偏見
機械学習を行うならPython一択の状況。
プロトタイピングにはとても向いている言語だと思う。ライブラリが充実していて簡単なコードでさくっと動かせる。
Jupyter Notebookという開発環境があり、行単位でコードを実行したり、実行途中にコードを書き換えたり、追加したりできるので、データ分析や機械学習にはとても向いている。触ったことがない人は一度触ってみると良い。結構感動する。
他の言語に比べてより英語の文法に近いので、英語圏の人には読みやすく書きやすいだろうなと思う。
if x == 1 and y == 2:
print("x is 1 and y is 2")
論理演算子の表
演算子 | C | Python |
---|---|---|
AND | && | and |
OR | || | or |
NOT | ! | not |
Pythonはコードブロックを示すのがインデント(字下げ)なので、インデントがズレるとエラーになる。コピペしてきたときにインデントがズレがち。
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
世界中で需要がある言語でライブラリの充実度が高い。充実しているから開発に使われて、さらに充実していくという好循環。
世界中でコードが書かれているので、公開されているコードの絶対量も多く、AIが学習するデータも多い。そのため、AIが生成するPythonコードの精度は高い印象。
型ヒンティングができるようになったので、型がないという欠点も解消されつつある……たぶん。
素のPythonだとパフォーマンスが出ないので、高速な処理が必要な場合はC言語のバインディングを利用するか、他の言語を利用するべき。
誰でも同じように書けるといわれているがアレは嘘だと思う。書こうと思えばいくらでも複雑なコードを書くことができる。Pythonの三項演算子やリスト内包表記などの書き方はPythonに慣れていないと読みにくい。
# 三項演算子
a = 1
b = 2
max = a if a > b else b
print(max)
# 2
# リスト内包表記
squares = [x**2 for x in range(10)]
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
PythonのおすすめIDE
- PyCharm
- VSCode
JavaScript(TypeScript)
筆者の経験: Webアプリケーションを作ったり、React Nativeでモバイルアプリを作ったり。たぶん一番触っている言語。
JavaScriptの評価、雑感、偏見
Webアプリケーションを作成するなら必須。HTMLとCSSでデザインを作り、JavaScriptで動的な挙動を実装するというのが基本。最近はJavaScriptのなかにHTMLやCSSを書いてしまうReactやVueといったフレームワークが主流になったため、HTMLやCSSを書くことが少なくなってきている。
もともとはブラウザだけで動く言語だったが、Node.jsというサーバーサイドJavaScriptが登場してから、サーバーサイドでも使われるようになった。
世界中のブラウザで使われる言語のためか、言語の実行速度がカリカリにチューニングされていて、スクリプト言語のくせに速い。
ただ言語仕様が結構ゆるふわでミスを起してはいけない厳格なサーバー処理は別の言語で書いたほうが良いだろうと思っている。
いかにJavaScriptがゆるふわな言語かという例をいくつか。
// 暗黙の型変換
console.log(1 + "2"); // "12" (数値が文字列に変換される)
console.log("3" - 1); // 2 (文字列が数値に変換される)
// == と === の違い
console.log(1 == "1"); // true
console.log(1 === "1"); // false
// 変数のスコープ
var x = 10;
if (true) {
var x = 20; // 同じ x を上書き
}
console.log(x); // 20
// NaN の扱い
console.log(NaN === NaN); // false
console.log(typeof NaN); // "number"
// 配列の長さ
var arr = [1, 2, 3];
arr[10] = 10;
console.log(arr.length); // 11
console.log(arr); // [1, 2, 3, empty × 7, 10]
// const のプロパティ書き換え
const obj = {a: 1};
obj.a = 2;
console.log(obj); // {a: 2}
React NativeやElectronなどのフレームワークをつかうと、JavaScriptでモバイルアプリやデスクトップアプリも作成できる。
流行り廃りが激しく、「この〇〇ライブラリがいいぞ」と話題になって3年~5年後には「〇〇ライブラリの負債をどうするか」というスライドが登場したりする。狂気。
UIライブラリはReact, Vue, Angular, Svelte, SolidJS, Qwikなど多くの選択肢がある。今はReactが一番人気なのでReactを覚えておけば間違いなさそう。
最近はJavaScriptじゃなくて、TypeScriptが使われる。TypeScriptはJavaScriptに型をつけた言語で、型のおかげでバグが減らせる。Microsoft製。TypeScriptで書かれたコードをビルドするとJavaScriptに変換される。
JavaScriptのおすすめIDE
- VSCode
- WebStorm
Ruby
筆者の経験: 触ったこともなければ、今後も触る予定もない。
Rubyの評価、雑感、偏見
日本発祥のプログラミング言語。
Ruby on RailsというWebフレームワークが有名。めちゃくちゃ早くWebアプリケーションを作成できると評判。
ベンチャー企業に人気がある。とりあえず動くものを作って市場に投入しないといけないという状況に向いている。
型がないので、コードベースが大きくなるとバグが発生しやすくならないのだろうかという不安がある。
RubyのおすすめIDE
- VSCode
- RubyMine
PHP
筆者の経験: CakePHPからLaravelへフレームワークの移行案件に携わったことがある。
PHPの評価、雑感、偏見
PHPで書かれたアプリとしてはWordPressが有名。Webアプリ制作によく使われる。
HTMLの中にPHPを埋め込むというスタイルで動的ページを作成しやすかった。
<!DOCTYPE html>
<html>
<body>
<h1>My first PHP page</h1>
<?php
echo "Hello World!";
?>
</body>
</html>
ただ最近だとフロントエンドはReactやVueで書いてしまうと思うので、PHPとHTMLを混在させるスタイルはあまり使われないかもしれない。
Laravelはかなり簡単にWebアプリを作成できるフレームワーク。DB連携も行いやすくサクッとWebアプリを作成したいときに向いている。
Laravelの人気が圧倒的でフレームワーク選びで迷うことは少ない。
PHPのおすすめIDE
- PHPStorm
- VSCode
Flutter (Dart)
筆者の経験: チュートリアルちょっとやった程度。
Flutterの評価、雑感、偏見
Googleが開発しているモバイルアプリ開発フレームワーク。Flutter for WebやFlutter for Desktopと対応が広がっており、マルチプラットフォーム開発が可能。
標準のコンポーネントライブラリが充実しているので、サクッとアプリをつくりたいときに向いている。ホットリロードにより、コードを書いているときにリアルタイムで変更が反映されるので、開発効率が良い。
Flutter for WebでWebアプリの開発もできるが、初期ロードが遅かったり、SEO(検索エンジン最適化)に不向きなので、使える場面が限られる。やはり本命はモバイルアプリ開発。
iOS, Androidの両方に対応したアプリを開発したいという場合にはFlutterが向いている。
Flutterって書いちゃったけど、言語自体はDart。
開発リソースが少なくてモバイルアプリ開発をするときはFlutterかReact Nativeかという選択肢になることが多い。Flutterのほうが多分簡単に開発できると思う。
ただReact NativeはJavaScriptで書けるので、JavaScriptを知っている人にはReact Nativeのほうが敷居が低いかもしれない。
どちらもAndroidやiOS固有の機能を使いたいときは、ネイティブコードを書かないといけないので、ガチ開発しようと思ったら結局iOSアプリエンジニア、Androidアプリエンジニアが必要になる。
FlutterのおすすめIDE
- Android Studio
- VSCode
- IntelliJ IDEA
Rust
筆者の経験: ちょこちょこtauriで個人用途のデスクトップアプリを作ったり、CLIツールを作ったり。
Rustの評価、雑感、偏見
メモリ安全なプログラミング言語として有名。C, C++のような速度を出しつつ、メモリリークやセキュリティホールが発生しにくい。
他の言語にはない所有権の概念があり、とっつきにくい。
C,C++の代替言語になりうる言語。ただしまだまだコミュニティが発展途上で、ライブラリの充実度が低い。JavaScriptのツール類がRustで書き換えられつつあり、一定の需要はある。
かなり学習コストが高くエンジニア採用のハードルが高い。ただし、採用したエンジニアは優秀なエンジニアである可能性が高い……かもしれない。
個人的にはめちゃくちゃ好きな言語。
プログラミングにどこかまずいところがあればコンパイルエラーが出るので、バグを見つけやすい。もちろんコンパイルが通ったからといってバグがないわけではない。
丁寧にコードを書かないとコンパイルエラーになるので、言語がエンジニアを調教してくれる。Rustを触ってから他の言語でも堅牢なプログラミングをするようになったので、一度Rustに触ってみるのはおすすめ。
AIが生成したコードも何処かまずいところがあればコンパイルエラーがでるので、AIと相性が良いと思う。ただしコードの学習量が少ないのか、PythonやJavaScriptよりも生成されるコードの質が低い気がする。
以下の動画が面白かった。所有権の理解がはかどる。
https://www.youtube.com/watch?v=lG7YbM2AfU8&t=2551s&pp=ygUOcnVzdCDmiYDmnInmqKk%3D
Javaのインターフェースのようなトレイトという機能がある。面白いのはトレイトはあとから追加できること。外部のライブラリに対してもトレイトを追加できるので、ライブラリの拡張がしやすい。
// Flyトレイトを定義
trait Fly {
fn fly(&self);
}
// Bird構造体を定義
struct Bird;
// BirdにFlyトレイトを実装
impl Fly for Bird {
fn fly(&self) {
println!("Bird is flying");
}
}
GoとRustでベンチマーク比較がされがち。実装方法によるのかもしれないが、ベンチだとGoのほうが速い結果になりやすい。
擁護するなら、DiscordのサーバーはGoで書かれていたが、Rustに書き換えるとガベージコレクションの影響がなくなりパフォーマンスが向上したという話もあるので、単純なベンチマークだけで速度を判断するのは難しい。
WebAssemblyと相性がよい。WebAssemblyとは、バイナリー形式の低レベルのアセンブリー風言語で、ブラウザ上で高速に動作する。C,C++,Rust、その他言語からコンパイルできる。Rustが向いている理由は、Rustは高速で、ランタイムが不要で、ガベージコレクションもないため。
ただ速度を求めてWebAssembly用のRustコードを書いてもJavaScriptとの通信がボトルネックで、普通にJavaScriptで書いたほうが速い、となってしまうこともあり使いどころがとても難しい。
WebAssembly環境はJavaScriptから隔離されておりセキュリティ面で利点がある。速度よりもそちらの要件で使うのはありかも。Rustの型システムにより堅牢なプログラムになりがちなのもセキュリティ面で有利。
RustのおすすめIDE
- VSCode
- RustRover
GO
筆者の経験:ちょっとサーバーを書いたり。
GOの評価、雑感、偏見
Googleが開発した言語。言語仕様がシンプル。goでコードを書くととてもコード量が多くなる。
javaなどはクラス定義のときにインターフェースを継承する必要があるが、GOはインターフェースを継承する必要がない。
構造体を定義して、その構造体にメソッドを定義するというスタイルが特徴的。構造体にメソッドを定義することでクラスのような振る舞いを実現できる。そしてインターフェースに定義したメソッドが実装されていれば、その構造体はそのインターフェースを実装しているということになる。
// Shapeインターフェースを定義
type Shape interface {
Area() float64
Perimeter() float64
}
// Rectangle構造体を定義
type Rectangle struct {
Width float64
Height float64
}
// Rectangleに対するAreaメソッドを実装
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// Rectangleに対するPerimeterメソッドを実装
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
並行処理が得意で、goroutineという軽量スレッドを使って並行処理を行うことができる。
コンパイルが早く、バイナリが単一ファイルで配布できるので、デプロイが楽。
サーバー用途にとても向いている言語だと思う。
GOのおすすめIDE
- VSCode
- GoLand
まとめ
あらためて色々触っているなぁ。言語ごとに特徴があり、いろいろと触ってみるのは楽しいです。こういう設計方法もあるのか、こういう書き方もあるのか、という発見があります。
以上、各種言語雑感でした。