web-dev-qa-db-ja.com

Objective-Cを学習する前にまずCを学習する

意欲的なApple開発者であるため、Objective-C、最終的にはCocoa Frameworkに移行する前に、最初にCを学習した方がよい場合、コミュニティの意見を聞きたいですか?

私の腸はCを学ぶと言い、それは私に良い基盤を与えるでしょう。

106
Lark

私は最初にCを学びます。 Obj-Cに移る前に、Cを学びました(そしてCで多くのことをしました)。本当のCプログラマーではなかった同僚がたくさんいます。彼らはObj-Cから始めて、必要なだけCを学んだだけです。

時々、私は彼らがObj-Cで問題を完全に解決し、時には非常に不器用な解決策をもたらす方法を見ています。通常、Obj-Cコードを純粋なCコードに置き換えます(Obj-Cメソッドのコンテンツは完全に純粋なCコードにすることができます)。 Obj-Cプログラマーをin辱するつもりはありませんが、Obj-Cには非常にエレガントなソリューションがあります。これらはobjects(OOPプログラミングにより関数型プログラミングよりも複雑なプログラムをはるかに美しくします。たとえば、ポリモーフィズムは素晴らしい機能です)...そして、私は本当にObj-Cが好きです(C++よりもはるかに多く!開発パターンIMHO);しかし、同僚のObj-Cコードを時々書き直すと(そして、これが絶対に必要だと思う場合にだけ本当にそうします)、結果のコードは通常50%小さく、必要なメモリの25%しか必要としません実行時に約400%高速です。

ここで私が言おうとしていること:すべての言語には長所と短所があります。 Cには長所と短所があり、Obj-Cも長所と短所があります。ただし、Obj-Cの非常に優れた機能(Javaよりも好きな理由です)を使用すると、プレーンCに自由にジャンプして、元に戻すことができます。なぜこれがすばらしい機能なのでしょうか? Obj-Cが純粋なCの多くの短所を修正するように、純粋なCはObj-Cの短所の一部を修正できます。それらを一緒に混ぜると、非常に強力なチームになります。

Obj-Cのみを学習し、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の強みです。

別の例は、多くのグラフを描いたUIコードです。グラフの描画に必要なデータを保存するために、NSArrayを使用しました。グラフがアニメーション化されたため、実際にはNSMutableArrayの。結果:グラフのアニメーションが非常に遅くなります。すべてのNSArrayを通常のC配列、オブジェクトを構造体(すべてのグラフ座標情報はオブジェクトに必要なものではないため)、シンプルなforループを使用した列挙子アクセス、および1つの配列からデータを取得する代わりにmemcopyを使用して配列間でデータの移動を開始しましたもう1つは、インデックスのインデックスです。結果:係数4で速度が向上しました。グラフは、古いPPC=システムでもスムーズにアニメーション化されました。

Cの弱点は、長い目で見れば、より複雑なプログラムはすべていものになることです。 Cアプリケーションを読み取り可能、拡張可能、管理可能に保つには、プログラマーの多くの訓練が必要です。この分野が欠落しているため、多くのプロジェクトが失敗します。 Obj-Cを使用すると、クラス、継承、プロトコルなどを使用してアプリケーションを簡単に構築できます。ただし、必要な場合を除き、メソッドの境界を越えて純粋なC機能を使用することはありません。私はすべてのコードをObjective-Cアプリのオブジェクトのメソッド内に保持することを好みます。他のすべてはOOアプリケーションの目的を無効にします。ただし、メソッド内では、純粋なCを排他的に使用することがあります。

162
Mecki

CとObjective-Cを同時に十分に習得できます。Objective-Cの言語への追加を開始する前に、また初心者プログラマーとしてCの詳細(ポインター演算などを含む)を学ぶ必要はありません。 Objective-Cをすぐに使用すると、「オブジェクトの考え方」をより迅速に開始できる場合があります。

利用可能なリソースの点では、Appleのドキュメントは通常Cに精通していることを前提としているため、 Objective-C 2.0プログラミング言語 から始めることはあまり有益ではありません。私は、Stephen KochanによるObjective-Cのプログラミングのコピーに投資します(どのくらい早く進行したいかによっては、第2版を待つことを検討できます)。

Programming Objective-C Developers LibraryProgramming Objective-C 2.0 Developers Library

事前の経験がないことを前提とし、Objective-Cと必要なだけCを教えます。

少し野心的であれば、最初に Scott Stevensonの「Learn C」チュートリアル から始めるかもしれませんが、いくつかの前提条件があります(「少なくとも1つのスクリプト言語またはプログラミング言語(関数を含む) 、変数、ループ。MacOS Xターミナルにコマンドを入力する必要もあります。」)。

(記録と文脈のためだけに:1991年に両方を同時に学んだ-それは私に害を与えるようには見えなかった。しかし、私はbackgroundBASIC、Pascal、Logo、およびLISPで。)

25
mmalc

Objective-Cに関する本を書く前に、この問題について多くのことを考えました。まず、Objective-Cを学ぶ前にC言語を学ぶことは間違った道だと本当に信じています。 Cは、特に初心者レベルでは、Objective-Cでのプログラミングに不要な多くの機能を含む手続き言語です。実際、これらの機能のいくつかに頼ることは、優れたオブジェクト指向プログラミング方法論に固執するという穀物に反します。また、オブジェクト指向言語を学習する前に、手続き型言語のすべての詳細を教える(および関数と構造化プログラミング技術を使用して問題の解決策を攻撃する)こともお勧めできません。これにより、プログラマーは間違った方向に出発し、適切なオブジェクト指向プログラミングの訓練を促進するための間違った方向と考え方を開発することにつながる可能性があります。 Objective-CがC言語の拡張であるからといって、最初にCを学ぶ必要があるわけではありません。

Objective-Cと基礎となるC言語を単一の統合言語として教えることは正しいアプローチだと思います。 「for」ステートメントがC言語からであり、そのスーパーセットであるObjective-C言語からではないことを学ぶ理由はありません。さらに、なぜCの配列と文字列(およびそれらを操作する)のようなものについて詳細に学ぶのですか?beforeたとえば配列(NSArray)と文字列オブジェクト(NSString)について学ぶ多くのCテキストは、構造と構造へのポインターに多くの時間を費やし、ポインターを使用して配列を反復処理します。ただし、これらのC言語機能を知らなくてもObjective-Cプログラムの作成を開始できます。そして、初心者プログラマにとっては、それは大したことです。これにより、学習曲線が短縮されるだけでなく、Objective-Cプログラムを作成するために学習する必要のある(および選択的に除外される)教材の量も削減されます。

基礎となるC機能のすべてではないにしても、ほとんどを学びたいと思うことに同意しますが、多くはクラスとメソッドの定義、オブジェクトとメッセージ式の操作、および継承の概念の理解をしっかりと把握するまで延期できます多型はよく理解されています。

18
skochan

Objective Cに飛び込みます-すでにいくつかの言語を習得している場合、学習曲線であるのは構文ではなく、Cocoaです。

15
Paul Dixon

少なくとも、事前にパッケージ化された商品を使用する前に、ソフトウェア開発の内部の仕組みを理解するために、何かがうまくいかない場合は、ほとんどの場合、Cを学習することは良いアイデアだと思いますあなたは内部の仕組みを理解するより良いチャンスを持っています。これについてはSOで多くの議論があり、かなり主観的な質問ですが、一般的にObjective-Cコード内で本質的にCを使用するので、本当にあなた次第です。私は基本的な人ですが、時には邪魔になることもありますし、トップダウンで自分のやり方で働いたいくつかの賢い人を知っています、私は重要な部分はあなたが思うように内部の仕組みを理解することですあなたの能力を、そうでない人々と区別して設定し、あなたの能力を高めてください。

10
TheXenocide

Objective-Cを学習する前にCを学習することをお勧めします。Objective-Cは、Cの厳密なスーパーセットです。つまり、Objective-Cはすべての通常のCコードをサポートできるため、Cプログラムに共通するコードは、Objective- Cコード。

言語の観点から純粋に物事を見ることに加えて、Mac OS Xは完全なUnixオペレーティングシステムであることがわかります。すべてのシステムレベルライブラリはCで記述されています。

両方を同時に学習することはおそらく可能ですが、最初にCの実用的な知識があれば、Objective-Cをより理解し、理解できると思います。

7
Doug

Objective-CとCocoaを学習するとき、Cのビットの学習を避けることはできません。たとえば、長方形はC構造体であるCGRectによって一般的に表されます。

時間があれば、ぜひCを学んでください。他の人がここで言っているように、Kochanの本(第2版と第1版)は、本を読むのに最適です。

5
mattwestbright

Objective-Cを学習し、必要なだけCを学習します。

あまり依存しないCの領域:

  • ポインター演算と配列。私はC配列をまったく使用していません。
  • C文字列。 Objective-Cの文字列は、仕事をより良く安全にします。
  • Obj-C 2.1でGCを使用する場合の手動メモリ管理。開発速度とパフォーマンスの理由から、このルートを強くお勧めします。
5
Giao

Objective-Cで純粋にできないことはたくさんあるため、基本的なCスキルを習得することは非常に重要です。少なくとも変数宣言と基本的なCライブラリ関数を理解する必要があります。さもないと、イライラするでしょう。

4
Mark Bessey

はい。他の高度な言語の前にC言語を学習すると、他の言語をすばやく学習するのに役立ちます。

3
Coding future

より良いのは、Objective-Cに精通していないためです。
しかし、Cの基礎は学ぶのがそれほど難しくなく、非常に複雑な言語でもありません(構文の面では、マスタリングの面ではありません!)。時間。
個人的には、Cを学ぶことは常に良い考えだと思います。コンピューターがどのように機能するかについての良い洞察を与えてくれます。結局のところ、ほとんどの言語とシステムはまだCで書かれています。 :-)

PS .:「進む」とは、「落とす」という意味ではなく、「もっと学び、違うことを学ぶ」という意味です。 Cを知ったら、それを決して落とさないかもしれません:Javaは、JNIを使​​用して低レベルのもののためのCルーチンを呼び出し、Python、LuaなどはしばしばCコードで拡張されます(Luaリファレンスは単にC関数の薄いラッパーにすぎない一部の関数に関するCの知識など)。

3
PhiLho

正直なところ、非常に多くの言語がC構文に基づいているため、よく知っているのは良いことです。とにかく、Cに慣れるのに1、2週間かかります。

とは言うものの、私は自分でObjective Cを教えただけで、正直に言う必要があります。自分のCの経験が思ったほど役に立つとは思いませんでした。客観的Cは私にとって間違いなく目を見張るものでした。

3
user25967

次の利点があるObjective-Cに直接ジャンプできます。

  1. その方法で「いくつかの」Cを学習します。
  2. あなたに関係のあるCパーツを学びます。

少なくとも、特定のアプリやサンプルに興味がある場合は新しい言語を習得しやすく、興味のあるものとは異なる他のことを学ばなければならない場合は失敗します。

低レベルのプログラミングに興味があれば、後でいつでもCの知識を磨くことができます。

3
OscarRyz

Wikipedia によると、Objective-CはCの厳密なスーパーセットです。これが当てはまるので、最初にCを学習することをお勧めします。次に、Objective-Cを学習すると、Objective-Cの一部として追加される部分が明確になります。

2
Trent

Cは、アセンブリからの抽象化をほとんど提供しません。一部のCコンパイラでは、インラインアセンブリも可能です。これは、コンピューターがどのように機能するかを考えるのに非常に役立ちます。これは知っておくことが重要です。

そうは言っても、Object-Cに本当に興味があるなら、「良い」という理由だけでCで何かを書くのにこだわらないでください。新しいスキルセットを習得しようとしている間、自分を苛立たせる必要はありません。自分がやっていることを楽しんでいることが重要です。

2
Steve g

Objective_Cを開始する前にCの基本的な知識が必要ですが、Cのすべての詳細を習得する必要はありません。

「Objective-Cでのプログラミング」を読んだ後、他の人に役立つ場合に備えてメモを公開しました。

プログラミングでObjective Cを学ぶ-

2
cfischer

ハードコア開発者になりたいですか?次に、最初にcを学習します。

Cを完全にマスターするために必要な本は、テクノロジーの最高の著作です。必要なものは次のとおりです。

Cプログラミング言語

標準Cライブラリ

2
Freddie

客観的Cは、最初にCを学習することに値しないように、Cとは十分に異なります。

構文/言語ファミリの観点からは、Smalltalk(Objective Cのベース)を勉強するほうがよいでしょう。

実用的な観点から、一度に1つの言語を学習することに注力してください。

後で、別の言語であるC++を学びたい場合は、JavaおよびPythonは1)束として習得しやすい2)人気があり、したがって市場性3)パワフル。

2
Brooks

すでに知っている多くの言語に応じて、Objective-Cの学習を開始することをお勧めします。ほとんどの言語の基礎は基本的に同じですが、構文が異なります。最初にCを学習しても、Objective-Cの学習に関してはそれほど大きな違いはありません。

1
Dave

私見では、最初に少なくともいくつかのC、特にポインターについて学習する必要があります。ポインターを持たない言語に由来する場合、それはさらに重要です。多くの人が次のようなコードについて尋ねます

NSString *string = [[NSString alloc] init];
string = @"something";

ポインターとポインターが指すオブジェクトの違いを知らないためです。

もちろん、Objective-Cから始める前にCのallを学ぶ必要はありませんが、いくつかの基本的なことは絶対に必要です。

1
Sven

Objective-Cをすぐに学び、約1年間問題なく動作しました。プロジェクトをダウンロードして動作を確認するときにCコードを読むのが少し困難でしたが、今ではCを学ぶ必要性を本当に感じています。 CなしのObjCですが、遅かれ早かれ、Cが必要になります。

1

事前に他の言語を学習している場合、正しい構文を書くことに常に混乱が生じます。目的はわかりませんが、オブジェクトCはオブジェクトメソッドの呼び出しに奇妙な(一般的ではない)構文を使用します。それはメッセージを送信するという名前です。はい、それに応じて純粋なオブジェクト指向の概念に当てはまりますが、ほとんどのオブジェクト指向言語は呼び出しメソッドとして名前を付け、呼び出しメソッドのより伝統的な構文を使用します。ガベージコレクションも非常に奇妙です。オブジェクトCは古い学校の参照カウントに基づいています。そのため、他の言語から切り替えると、受け入れるのが困難になります。 C/C++プログラマー向けのObject Cクイックマイグレーションガイドを書いています。

0
Dmitriy

いいえ、Objective Cに直行してください!

ActionScript 3からObjective Cに移行しましたが、すでに会社でインターンをしています!

あなたがしたいことをしてください。

0
Nathan