本記事は別サイトで勝手に連載していた自分の記事をお引越ししてきたものです。
少し情報が古いものもありますが、読み物程度にどうぞ。
C++とSwiftがあるからなぁ…。
40年以上の歴史の中で、Cを発展させてオブジェクト指向プログラミングを行えるようにした言語は他にもたくさんあります。その中でObjective-Cは「C++との競争に負けた言語」と表現するのが一番当てはまるでしょう。
「四角いトランクの中身ですか?大事なメッセージです」(Bing Image Creatorで生成)
オブジェクト指向プログラミングは大規模な開発には欠かせない概念ですが、 Objective-Cはほぼ同時期(1年前)に登場したC++の方が性能が良かったことと、コードの見た目がCとはあまりにかけ離れていたため学びにくく浸透しませんでした。
勝負を制したC++は現在でもCやC#と並んでトップレベルのシェアを持つプログラミング言語です。 C++もObjective-Cと同様、Cのコードを混在させてコンパイルできる上位互換言語 ですので、質問者様の希望は満たせると思います。
とはいえObjective-Cは他の多くの言語とは違い、完全に忘れ去られたわけではありませんでした。 C++と比較して性能が少し悪かったのは、メモリやオブジェクトの管理がかなり自動化されていて設計が複雑だったからです。つまり現代から見ると先進的な設計だったとも言えます。まぁとにかく見た目が独特すぎたのが最大の敗因でしょう。
/** Objective-C **/
// インスタンス生成
NSObject *obj1 = [[NSObject alloc] init];
//クラス関数の呼び出し
[obj1 msg];
// 引数付き呼び出し
[receiver msg: arg1 with: arg2];
このやたら [角張った] 文法は、オブジェクト指向を取り入れるために参考にしたSmalltalkの影響です。
オブジェクトのメンバ呼び出し(SmalltalkやObjective-Cではメッセージ送信と呼びます) を囲む[ ]が独特で、正直これでCもコンパイルできる言語だと言われてもピンときませんね。でも、メモリの確保をオブジェクトに任せる仕組み (C++ではシングルトンなど少しトリッキーな実装が必要です) や、引数名を使用した順不同の引数など、かなり現代的な機能が組み込まれているのが分かります。40年前の言語とは思えない言語設計です。
対する C++は「オブジェクトとメンバを.(ドット)で区切る」記法を提唱し、これが浸透したため後の多くの言語でも一般的になりました。
Cユーザーには構造体のメンバ呼び出しとよく似た概念かつ同じ記法のため見慣れていたことと、「オブジェクトの中のオブジェクトを呼び出す」場合も、先頭の [ などが不要でつらつらと続けて書けるので、カーソル移動やミスタイプが少なく記述しやすかったのです。
/** C++ **/
// インスタンス生成
CppObj obj1 = new CppObj();
// クラス関数の呼び出し
obj1.msg();
// 引数付き呼び出し
obj1.msg( arg1, arg2 );
ちなみに Objective-Cは、主にUNIX系のNeXTSTEP (OPENSTEP) というOSの開発言語として細々と生き延びてきました。
これらのOSはObjective-Cと同様、商業的には成功しなかったものの非常に良くできたデザインと設計が売りで、Windows95を含め他の多くのOSにパク取り入れられました。
例えばマウスでクリックできる「立体的なボタン」「チェックボックス」「ラジオボタン」「スライダー」など様々なGUIパーツ群はほぼNeXTSTEPが起源です。Objective-CもOPENSTEPも、少数ながら熱烈なファンがいたので長らく生き延びてきたということですね。
しかし2001年、世界の片隅でゆっくりと忘れ去られていくのを待っていたはずのObjective-Cは、突然再び世界の表舞台に引っ張り出されます。
AppleのCEOスティーブ・ジョブスが瀕死のMacOSを再開発するため、Objective-Cで書かれたOPENSTEPをMac OS Xの土台として採用したからです。そのため、OS Xが出たての頃はMacでプログラムを書きたければObjective-Cを学ぶ必要がありました。もちろん現在はC++やPythonなど色々な言語が使えます。
とはいえ突然世界的な注目を浴びたものの、 長年ほぼ忘れ去られた状態でユーザーが少なく、成長する機会の少なかったObjective-Cは、既にかなり時代遅れの言語になっていました。
現代のプログラミング言語でいう「先進的」にはいろんな基準がありますが、その中でも 「書くコードが少ない」 というポイントはかなり重要です。自動補完やAIが進歩しても、同じことをするなら1文字でも少ない方が楽ですしね。
それで AppleはOS XやiOS向けに、より現代的に洗練されたSwiftという新しいプログラム言語を開発しました。それで最近のApple向け開発者は、ほぼ全員Swiftに移行しています。
SwiftはC系言語にかなり近い(特にC++やRustに似ていますが行末のセミコロン;がありません)記法ですが、内部的にはObjective-Cの概念やメモリ管理機能を踏襲しています。またSwiftは最新の多くの言語で採用されている、便利な記法や機能を追加した先進的な言語です。iPhoneアプリの開発をしたい方には必須ですね。(下はSwift公式サイト)
そんなわけでObjective-Cは、一躍再注目を浴びせたApple自身に再び見捨てられてしまった わけですが、実際ずっと少ないコード量でいろいろなことができるので、今からObjective-Cを学ぶならSwiftの方がずっと良いでしょう。
ちなみに、CにはCでしか書けないプログラミングの分野があります。
Cは数多くのプログラミング言語の中で49年という最長老級の汎用言語ですが、今でもトップ10以内の安定したシェアを持つ現役の言語です。詳しくは下のリンクをどうぞ。