web-dev-qa-db-ja.com

Objective-CがCocoa環境以外で広く使用されないのはなぜですか?

Objective-Cは、優れたオブジェクト指向、シンプルさ、優雅さ、および(Cのスーパーセットとしての)低レベルの機能を備えています。多くの人がGoで探して見つけようとする、C++のシンプルでモダンな代替手段のように思えるかもしれません。ただし、CocoaおよびNexSTEP後の環境で使用されるだけであり、この場合でも、最適な選択というよりも、歴史的な理由による負担と見なされます。

なぜそれがそれほど広く使われていないのですか?その問題は何ですか?

24
Toni Cárdenas

IMO、Objective-Cの問題は、大きな欠点ではなく、マイナーな欠点(特に早い段階)と認識されている利点の欠如です。

Objective-CはCの純粋なスーパーセットだったので、C codeはObjective-Cに簡単に移行できました。 se Objective-Cへの考え方は、Cの考え方lotとは異なりました。 CからObjective-Cへの移行はコードにとっては簡単ですが、多くのプログラマにとっては簡単ではありません。 Cプログラマーは、Objective-Cのいくつかの新しい便利な機能を簡単に選択して、すぐに生産性を向上させることは簡単にできません。

C++は一部のコードの移行を少し難しくしましたが、ほとんどのプログラマにとって移行ははるかに簡単になりました。コードのあらゆる細部に対処することに慣れているCプログラマは、C++で希望どおりの範囲でそれを行うことができます。 C++はまた、考え方を実際に変更することなく、いくつかの新機能(たとえば、構造体のメンバーを自動的に初期化するためのctorの追加)を簡単に使用できるようにしました。多くのOO Purists pushed思考の根本的な変更)が、多くのCプログラマーは(少なくともすぐに-頻繁に)何もせずにC++に切り替えましたこれまで、物事のルックスから)。

C++も見た目ほとんどのCプログラマーにとって、より身近なものです。いくつかの新しいキーワードが追加されましたが、(特に初期の段階では)コードはまだかなりなじみがあります。その「純粋なスーパーセット」ステータスにもかかわらず、ほとんどのObjective-Cコードlooksは、ほとんどのCプログラマにとってかなり異質です。 C++の多くは、Cでの動作の観点からも説明や理解がかなり簡単です。Objective-Cへの切り替えには、「私を信頼して、知っていると思っていることはすべて忘れてください」と言えるほど多くの場所があります。 」

Objective-Cの設計上の決定の多くは、C++よりも(やや)遅くなりました。特に、遅いプロセッサや限られたメモリなどを備えた比較的古いマシンでは、正しくまたは誤って、主に単一企業製品と見なされていました。 C++は、誰でも、誰でも実装できるように無料で利用できました。

これらはすべて、C++が早期に採用され、「クリティカルマス」がかなり迅速に達成されるようになったため、(とりわけ)すでに広く使用され、よく知られているという理由だけで、多くのプロジェクトにとって明らかな選択肢となりました。量。

Objective-Cはその時点に到達したことがありません。実際、Appleがシステムのために開発したいと思っている人にほぼ強制することによってそれを復活させたとき、それはあいまいさへのフェードインに向かって進んでいました。Appleの市場シェアはそのために十分に大きくありません。ただし、実際にクリティカルマスを与えるには-ニッチが大きいだけです。これは、Appleがそのようにするために/だけなので、「デフォルト」の選択です。

また、少なくとも私の意見では、Objective-CのSmalltalkのようなオブジェクトモデルは、実際には、C++よりもJavaの方がはるかに直接的な競合相手であることを意味します。はい、それでもCの基礎、そしてはい、別の言語を使用しなくても低レベルのコードを書くことができます-しかし、純粋なCと実際のObjective-Cは十分に異なり、2つの完全に異なる言語が両方で処理されるよりも、単一の言語に似ていません。単一のコンパイラー(JNIのようなものがなくても2つのコンパイラーが互いに対話できるので便利です)。

28
Jerry Coffin

まあ、基本的に、Appleは、しばらく前からObjective-Cの原動力です:

  • 最後のバージョンは事実上廃止されましたが、Objective-C 2.0は実際にはコアとなる基礎クラス/プロトコルの一部にますます結びつき始めています。つまり、言語機能とフレームワークの間に固有のリンク NSFastEnumerationがあります。 頭に浮かぶ。オブジェクトがfor inループに適切に応答するために必要です。つまり、言語とプラットフォームの間のリンクが拡大しています。
  • Cocoaに代わる実際の代替手段はありません。そして、Cocoaは、ますます多くのOSX機能に依存し始めています。技術的には、任意のコアフレームワークを備えた任意のOSでObjective-C実装を実行できますが、他のプラットフォーム向けの最新のものはあまりありません。

現在のように、AppleはObjective-Cを完全に制御し、ニーズに応じて言語を駆動しますが、Apple以外のデバイスでObjective-Cを実行することに関心のあるこの惑星の組織はありません、それは標準ライブラリとツールキットを提供するのに十分な大きさであり、.NET/Mono、C++またはJavaによって提示されるエコシステムにリモートで対抗することさえできます。

11
back2dos