意欲的な Apple 開発者として、Objective-C に移行し、最終的には Cocoa Framework に移行する前に、まず C を学習した方がよいかどうか、コミュニティの意見を聞きたいと思います。
私の直感は、C を学べば良い基礎ができると言っています。
意欲的な Apple 開発者として、Objective-C に移行し、最終的には Cocoa Framework に移行する前に、まず C を学習した方がよいかどうか、コミュニティの意見を聞きたいと思います。
私の直感は、C を学べば良い基礎ができると言っています。
私は最初にCを学びます。Obj-C に移行する前に C を学びました (そして C で多くのことを行いました)。私には、本物の C プログラマーではなかった多くの同僚がいます。彼らは Obj-C から始めて、必要なだけ C を学びました。
時々、Obj-C で問題を完全に解決する方法を目にしますが、非常に不器用な解決策になることもあります。通常は、いくつかの Obj-C コードを純粋な C コードに置き換えます (結局のところ、好きなだけ混合することができます。Obj-C メソッドの内容は完全に純粋な C コードにすることができます)。Obj-C プログラマーを侮辱する意図はまったくありませんが、Obj-C には非常に洗練されたソリューションがあります。これらは、オブジェクトのおかげで機能する (そして見た目が良い) ソリューションです。(OOP プログラミングは、複雑なプログラムを関数型プログラミングよりもはるかに美しくすることができます。たとえば、ポリモーフィズムは優れた機能です)...そして、私は Obj-C が本当に好きです (C++ よりもはるかに! C++ 構文が嫌いで、いくつかの言語機能は単純にやり過ぎです)。悪い開発パターンにつながる IMHO); ただし、同僚の Obj-C コードを時々書き直すと (絶対に必要だと思う場合にのみ書き直します)、結果のコードは通常 50% 小さくなり、使用したメモリの 25% しか必要としません。実行時は約 400% 高速です。
ここで言いたいこと: どの言語にも長所と短所があります。C には長所と短所があり、Obj-C にも長所と短所があります。しかし、Obj-C の本当に優れた機能 (それが私が Java よりも好きな理由です) は、プレーン C に自由にジャンプして、また元に戻すことができることです。なぜこれが素晴らしい機能なのですか?Obj-C が純粋な C の短所の多くを修正するように、純粋な C は Obj-C の短所のいくつかを修正できるためです。それらを混ぜ合わせると、非常に強力なチームになります。
Obj-C だけを学び、C の知識がない、またはその基本しか知らず、一般的な問題をどれだけエレガントに解決できるかを試したことがない場合は、実際には Obj-C の半分しか習得していません。C は Obj-C の基本的な部分です。いつでもどこでも C を使用できることは、C の基本的な機能です。
典型的な例は、base64 でデータをエンコードする必要があるコードでしたが、そのために外部ライブラリを使用できませんでした (OpenSSL ライブラリはありません)。Cocoa クラスを使用して完全に記述された base64 エンコーダーを使用しました。問題なく動作していましたが、200 MB のバイナリ データをエンコードするようにすると、非常に時間がかかり、メモリのオーバーヘッドが許容できないものになりました。それを、1 つの C 関数として完全に記述された小型で超コンパクトな base64 エンコーダーに置き換えました (関数本体をメソッド本体にコピーしました。メソッドは入力として NSData を受け取り、出力として NSString を返しましたが、関数内ではすべてが C でした)。C エンコーダーは非常にコンパクトで、純粋な Cocoa エンコーダーよりも速度が 8 倍速く、メモリ オーバーヘッドもはるかに少なくなっています。データのエンコード/デコード、ビットの操作、および同様の低レベルのタスクは、C の長所にすぎません。
もう 1 つの例は、多数のグラフを描画する UI コードです。グラフの描画に必要なデータを格納するために、NSArray を使用しました。グラフがアニメーション化されたので、実際には NSMutableArray のものです。結果: グラフのアニメーションが非常に遅くなります。すべての NSArray を通常の C 配列に置き換え、オブジェクトを構造体に置き換え (すべてのグラフ座標情報はオブジェクトに含める必要がないため)、単純な for ループを使用した列挙子アクセスを行い、1 つの配列からデータを取得する代わりに memcopy を使用して配列間でデータを移動し始めました。もう 1 つは、index の index です。結果: 速度が 4 倍になりました。古い PPC システムでも、グラフはスムーズにアニメーション化されました。
C の弱点は、長い目で見れば複雑なプログラムはどれも見苦しくなるということです。C アプリケーションを読みやすく、拡張可能で、管理しやすい状態に保つには、プログラマーに多くの規律が要求されます。この規律が欠けているために、多くのプロジェクトが失敗します。Obj-C を使用すると、クラス、継承、プロトコルなどを使用してアプリケーションを簡単に構築できます。そうは言っても、必要でない限り、メソッドの境界を越えて純粋な C 機能を使用することはありません。Objective-C アプリのすべてのコードをオブジェクトのメソッド内に保持することを好みます。それ以外はすべて、OO アプリケーションの目的を無効にします。ただし、メソッド内では純粋な C のみを使用することがあります。
C と Objective-C を同時に十分に十分に学習できます。言語への Objective-C の追加を開始する前に、C の詳細 (ポインター演算などを含む) を学習する必要はありません。 Objective-C をすぐに使い始めると、「オブジェクトで考える」ことをより早く始めるのに役立つかもしれません。
利用可能なリソースに関しては、Apple のドキュメントは通常、C に精通していることを前提としているため、Objective-C 2.0 プログラミング言語から始めてもあまり役に立ちません。私は、Stephen Kochan による Programming in Objective-C のコピーに投資します (どれだけ早く始めたいかによって、第 2 版を待つことを検討してください)。
Objective-C 開発者ライブラリ のプログラミング Objective-C 2.0 開発者ライブラリのプログラミング
これまでの経験がなくても、Objective-C と必要なだけの C を学習できます。
少し野心がある場合は、Scott Stevenson の "Learn C" Tutorialから始めることもできますが、前提条件がいくつかあります (「関数、変数、ループを含む、少なくとも 1 つのスクリプトまたはプログラミング言語を既に知っている必要があります。また、Mac OS X ターミナルにコマンドを入力する必要があります。")
(記録と文脈のために: 私は 1991 年に両方を同時に学びました -- それは私に害を及ぼすようには見えませんでした. ただし、私はBASIC、Pascal、Logo、および LISPのバックグラウンドを持っていました. )
Objective-C に関する本を書く前に、この問題についてよく考えました。まず、Objective-C を学習する前に C 言語を学習することは間違った道であると本当に信じています。Cは手続き型です特に初心者レベルでは、Objective-C でのプログラミングには必要のない多くの機能を含む言語です。実際、これらの機能のいくつかに頼ることは、優れたオブジェクト指向プログラミングの方法論に固執することに反することになります。また、オブジェクト指向言語を学習する前に、手続き型言語のすべての詳細を教えること (および関数と構造化プログラミング手法を使用して問題の解決に取り組むこと) もお勧めできません。これにより、プログラマーは間違った方向に進み、優れたオブジェクト指向プログラミングの規律を育成するための間違った方向性と考え方を開発する可能性があります。Objective-C が C 言語の拡張であるからといって、最初に C を学ばなければならないというわけではありません。
Objective-C とその基礎となる C 言語を単一の統合言語として教えることは正しいアプローチだと思います。「for」ステートメントが C 言語からのものであり、そのスーパーセットである Objective-C 言語からのものではないことを学ぶ理由はありません。さらに、C 配列や文字列 (およびそれらの操作) などについて詳細に学ぶ必要があるのはなぜですか?たとえば、配列 (NSArray) と文字列オブジェクト (NSString) について学習しますか? 多くの C テキストは、構造体、構造体へのポインター、およびポインターを使用した配列の反復処理に多くの時間を費やしています。しかし、これらの C 言語の機能を知らなくても、Objective-C プログラムを書き始めることができます。そして、初心者のプログラマーにとって、それは大したことです。これにより、学習曲線が短縮されるだけでなく、Objective-C プログラムを作成するために学習する必要のある資料の量が削減されます (一部は選択的に除外されます)。
基本的な C 機能のすべてではないにしても、ほとんどを学びたいと思うことには同意しますが、多くは、クラスとメソッドの定義、オブジェクトとメッセージ式の操作、および継承と継承の概念の理解をしっかりと理解するまで延期できます。ポリモーフィズムはよく理解されています。
私は Objective C に飛び込みます。すでにいくつかの言語を習得している場合、学習曲線となるのは構文ではなく、Cocoa です。
ほとんどの場合、C を学習することは、あなたがどの分野に進もうとしていようと、少なくともパッケージ化された製品を使用する前にソフトウェア開発の内部の仕組みを理解するのに良い考えだと思います。内部の仕組みを理解する可能性が高くなります。これについては SO で多くの議論があり、かなり主観的な質問ですが、一般に、Objective-C コード内で本質的に C を使用することになるため、それは本当にあなた次第だと思います。私は根っからの人間ですが、時にはそれが邪魔になることもあります。私は、トップダウンで自分のやり方で働いた賢い人を何人か知っています。重要な部分は、内部の仕組みを理解することだと思います。あなたの能力を向上させるだけでなく、そうでない人からあなたの能力を際立たせます。
C の厳密なスーパーセットである Objective-C を学習する前に、C を学習することをお勧めします。これは、Objective-C がすべての通常の C コードをサポートできることを意味します。したがって、C プログラムに共通のコードは、Objective- C コード。
純粋に言語の観点から物事を見ることに加えて、Mac OS X は完全な Unix オペレーティング システムであることがわかります。システム レベルのライブラリはすべて C で記述されています。
両方を同時に学習することはおそらく可能ですが、最初に C の実用的な知識があれば、Objective-C の評価と理解が深まると思います。
Objective-C と Cocoa を学ぶとき、C のビットを学ぶことを避けることはできません。
時間があれば、ぜひCを学んでください。ここで他の人が言っているように、Kochanの本(第2版と第1版)は、浸る本として優れています。
私は Objective-C を学び、必要なだけ C を学びます。
あまり依存しない C の領域:
Objective-C だけではできないことがたくさんあるため、基本的な C スキルを習得することは非常に重要です。少なくとも、変数の宣言と基本的な C ライブラリ関数を理解する必要があります。
正直なところ、非常に多くの言語が C 構文に基づいているため、慣れておくと便利です。とにかく、Cに慣れるのに1、2週間かかります。
そうは言っても、私は Objective C を独学しただけで、正直に言うと、C の経験が思ったほど役に立たなかったということです。Objective C は間違いなく私にとって目を見張るものでした。
私はObjective-Cに慣れていないので、よくわかりません。
しかし、C の基本を学ぶのはそれほど難しくありません。C はそれほど複雑な言語ではありません (習得の点ではなく、構文の点で!)。
個人的には、C を学ぶことは常に良い考えだと思います。それは、コンピューターがどのように機能するかについての良い洞察を与えてくれます。結局、ほとんどの言語とシステムはまだ C で書かれています。:-)
PS.: 「先に進む」とは、「やめろ」という意味ではなく、単に「もっと学び、違うことを学ぶ」という意味です。C を知ったら、絶対にやめないかもしれません。Java は JNI を使用して低レベルの C ルーチンを呼び出します。Python、Lua などは C コードで拡張されることがよくあります (Lua リファレンスは、いくつかの関数について C の知識があることを前提としています。背後にある C 関数への薄いラッパー) など。
はい、他の高度な言語よりも先に C 言語を学ぶことで、他の言語をすばやく習得することができます。
Objective-C に直接ジャンプすると、次の利点があります。
少なくとも私にとっては、特定のアプリやサンプルに興味を持っているときに新しい言語を学ぶ方が簡単ですが、まったく興味のないことを学ばなければならないときは失敗します.
低レベルのプログラミングに興味がある場合は、後でいつでも C の知識を磨くことができます。
Objective C は、C を最初に学習する価値がないほど、C とは十分に異なります。
構文/言語ファミリーの観点からは、SmallTalk (オブジェクティブ C が基づいている) を勉強する方がほとんど良いでしょう。
実用的な観点から、一度に 1 つの言語を学習することに集中してください。
後で別の言語を学びたい場合、C++、Java、および Python は、1) まとめて学ぶのが簡単である、2) 人気があり、したがって市場性がある、3) 強力です。
筋金入りの開発者になりたいですか? 次に、最初に c を学習します。
c を完全にマスターするために必要な本は、テクノロジーに関する最高の著作の一部です。必要なものは次のとおりです。
Wikipediaによると、Objective-C は C の厳密なスーパーセットです。そのため、最初に C を学習することをお勧めします。その後、Objective-C を学習すると、Objective-C の一部としてどの部分が追加されたかが明確になります。
C では、アセンブリからの抽象化はほとんどありません。一部の C コンパイラでは、アセンブリをインライン化することさえできます。これは、知っておくことが重要なコンピューターの仕組みを考えるのに非常に役立ちます。
そうは言っても、Object-C に本当に興味があるのであれば、「あなたにとって良い」という理由だけで C で何かを書くことに行き詰まってはいけません。新しいスキル セットを習得しようとしているときに、イライラする必要はありません。自分がやっていることに楽しく取り組むことが重要です。
Objective_C を始める前に C の基本的な知識が必要ですが、C のすべての詳細をマスターする必要はありません。
「Objective-C でのプログラミング」を読んだ後、他の人に役立つ場合に備えてメモを公開しました。
私はすぐに Objective-C を学び、約 1 年間は問題なく動作しました。プロジェクトをダウンロードして動作を確認したとき、C コードを読むのに少し苦労しましたが、今では C を学ぶ必要性を強く感じています。学習を試すことができます。 C なしの ObjC ですが、遅かれ早かれ、C が必要になります。
すでに知っている多くの言語によっては、Objective-C の学習を開始する方がよい場合もあります。ほとんどの言語の基盤は基本的に同じで、異なるのは構文です。C を最初に学習しても、Objective-C の学習に関しては大きな違いはありません。
私見は、最初に少なくともいくつかのC、特にポインターについて学ぶ必要があります。ポインターを持たない言語からのものである場合、これはさらに重要です。多くの人が次のようなコードについて尋ねます
NSString *string = [[NSString alloc] init];
string = @"something";
彼らはポインタとそれが指しているオブジェクトの違いを知らないからです。
もちろん、Objective-C を使い始める前に C のすべてを学ぶ必要はありませんが、いくつかの基本的なことは絶対に必要です。
いいえ、ObjectiveCに直接進んでください。
私はActionScript3からObjectiveCに移行しましたが、すでに会社にインターンがいます。
あなたがやりたいことをしなさい。
以前に他の言語を学んでいた場合、正しい構文を書く際に常に混乱が生じます。目的はわかりませんが、Object C はオブジェクト メソッドの呼び出しに奇妙な (一般的ではない) 構文を使用します。それはメッセージを送信するという名前です。はい、それは純粋なオブジェクト指向の概念です。ただし、ほとんどのオブジェクト指向言語はそれを呼び出しメソッドと呼び、呼び出しメソッドのより伝統的な構文を使用します。ガベージ コレクションも非常に奇妙なものです。オブジェクト C は古い学校の参照カウントに基づいています。そのため、他の言語から切り替えると、受け入れるのが難しくなります。私は、C/C++ プログラマー向けの Object C クイック マイグレーション ガイドという本を書いています。これは、人々がすべての違いをより迅速に理解できるようにするためです。