プログラミング言語のバージョン
みなさんは自分が書いているプログラミング言語のバージョンを意識していますか?
書いているときは気にしなくてもいいですが、プロジェクトの最初に何のバージョンを使うかをきめなきゃいけないですよね。
その時に新しいフレームワークや開発環境が出ているにもかかわらず、古いフレームワークや、古い開発環境を使用する関係で、最新ではないバージョンの言語を使用することになってしまいます。
それがどれだけ悲しいことかという話です。
プログラミング言語は日々進化し、より書きやすく見やすくなっています。
3つの言語C#
C++
Swift
を使ってバージョンによる書きやすさを見ていきます。
例1 C# null判定
value
がnullだったら新しいインスタンスを作成するという処理をしています。
以下はすべて同じ処理です。
// C# 6.0以前
if (newValue != null) {
value = newValue;
}
// C# 7.0
if (!(newValue is null)) {
value = newValue;
}
// C# 9.0
if (newValue is not null) {
value = newValue;
}
is null
のいいところは、==
ではstruct
などのNull非許容型
も無駄に判定できました。
しかしis null
でstruct
をnull判定しようとするとちゃんとエラーが出るようになります。
is not null
のいいところはis null
では否定のために!
などを使用しないといけませんでしたが、これが必要なくなります。
例2 C++ 初期化を伴う範囲for文(foreach)
// C++ 11より前
for (int i = 0; i < vectors.size(); i++) {
bar(vectors[i], i);
}
// C++ 11
std::size_t i = 0;
for (int x : vectors) {
bar(x, i);
++i;
}
// C++ 20
for (std::size_t i = 0; int x : vectors) {
bar(x, i);
++i;
}
c++11
のいいところは、配列の要素をとってくる際に、Indexを気にしなくていいことです。
c++20
のいいところは、Index(i)をfor文のスコープ内で宣言できるので、for文が終われば、(i)は破棄され、再度変数名(i)を使って、別のインスタンスを作成することが可能です。
例3 Swift 非同期処理
非同期で天気データを取得して、非同期で平均を計算して、非同期で平均を送信して非同期で送信結果をprintしています。
// Swift 5.5より前
func processWeather() {
fetchWeatherHistory { records in
calculateAverageTemperature(for: records) { average in
upload(result: average) { response in
print("Server response: \(response)")
}
}
}
}
// Swift 5.5
func processWeather() async {
let records = await fetchWeatherHistory()
let average = await calculateAverageTemperature(for: records)
let response = await upload(result: average)
print("Server response: \(response)")
}
swift 5.5
ではasync/await
が導入され非同期処理時のコードのネスト地獄
をなくすことができるようになりました。
(おまけ)最新のバージョンを追うには
こういった最新の機能を使うにはまず知らなければいけないのですが、これは結構大変です。
なので1つ好きな言語を作り、それを追いましょう。1つわかっていれば、この機能はあの言語にはないのかな?という考えで別言語でも最新の機能を使えることが多いです。
自分はSwift
が好きで、Swift
を好きな人は熱量が大きく、Twitterなどで最新の機能や、できることを紹介している人が多い印象なので、そういった人たちから勉強したりしています。
Swiftは今や、Mac
Linux
Windows
どれでも使用できるので、おすすめです!