若い人はポインターの概念を学ぶ必要がありますか?


89

CマスターのDennis RitchieがCにポインターを導入したのはなぜですか?そして、なぜVB.NETやJavaやC#などの他のプログラミング言語がそれらを排除したのですか?Googleでいくつかのポイントを見つけました。あなたのコメントも聞きたいです。なぜ現代の言語でポインターの概念を排除するのですか?

Cは基本的な言語であり、ポインターはCを強力で際立ったものにし、Cをより現代的な言語と競争させる概念であると人々は言います。それから、なぜ彼らはより近代的な言語のポインターを排除したのですか?

新しいプログラマーにとって、ポインターの知識はまだ重要だと思いますか?最近人々はVB.NETまたはJavaを使用していますが、これはCよりも高度な機能をサポートしており(ポインターの概念を使用していません)、現在見ている多くの人々(私の友人)は、高度な機能をサポートするためCを無視してこれらの言語を選択します。Cから始めるように伝えます。Cでは不可能なVB.NETまたはJavaの高度なことをしているときに、ポインターの概念を学ぶのは無駄だと言います。

どう思いますか?

更新

Googleで読んだコメントは次のとおりです。

  1. 初期のコンピューターは遅すぎて最適化されていませんでした。

  2. ポインターを使用すると、アドレスに直接アクセスできるようになり、関数呼び出しでアドレスのコピーを作成する代わりに時間を節約できます。

  3. ポインターを使用するとセキュリティが著しく低下するため、JavaとC#にはポインターが含まれていません。

これらと、さらに私が見つけたもの。私はまだいくつかの貴重な答えが必要です。それは大歓迎です。


52
Javaにはポインターがありませんか?それは真実ではない。Javaのすべてのオブジェクト参照は、基本的にはポインターです。
quant_dev

20
quant_devの意味するところは、Javaは透過的に使用されるポインターでいっぱいですが、プログラマーはそれらを明示的に使用することはできません。
サキスク

9
これは、関連するJoel Spolskyの記事です... joelonsoftware.com/articles/fog0000000319.html
Joe Internet

11
「Cマスターのデニスリッチーがなぜcにポインターを導入したのですか?」cにはポインターは導入されていませんが、名前を含めてアセンブリーの練習からまっすぐに出ました。
-dmckee

14
@quaint_dev:まあ、Javaには実際にはポインターがありません。参照は、ポインターが実行できるすべてのことを実行できるわけではないため、参照の観点からポインターを理解しようとすることは、進むべき道ではありません(CやC ++を学ぶ多くのプログラマーが犯す間違いです)。ポインターは算術演算を実行できます。参照はできません。(Javaを使用せざるを得ないたびに本当に悪臭を放つ制限)
ビリーONeal

回答:


128

当時、開発者は金属にずっと近づいていました。Cは基本的にアセンブリの上位レベルの置き換えであり、入手可能なハードウェアにほぼ近いため、コーディングの問題を効率的に解決するためにポインターが必要なのは当然でした。ただし、ポインターは鋭利なツールであり、不注意に使用すると大きな損傷を引き起こす可能性があります。また、ポインターを直接使用すると、当時は問題ではなかった多くのセキュリティ問題の可能性が開かれます(1970年には、インターネットはいくつかの大学にまたがる数十台のマシンで構成されており、 ...)、しかしそれ以来ますます重要になった。したがって、今日では、生のメモリポインタを回避するために、高レベルの言語が意識的に設計されています。

「VB.NetまたはJavaで行われた高度なことはCでは不可能」と言うことは、控えめに言っても非常に限定的な視点を示しています。

まず第一に、これらの言語はすべて(アセンブリでさえ)チューリング完全であるため、理論的には1つの言語で可能なことはすべて可能である。VB.NetまたはJavaコードの一部がコンパイルおよび実行されたときに何が起こるかを考えてみてください。最終的に、それはマシンコードに変換(またはマッピング)されます。CやC ++などのコンパイル済み言語では、元の高レベルのソースコードに相当するマシンコードの完全な本体を、1つ以上の実行可能ファイル/ライブラリとして実際に取得できます。VMベースの言語では、プログラムの同等のマシンコード表現全体を取得することはより困難です(不可能な場合もあります)が、最終的には、ランタイムシステムとJITの奥深くのどこかにあります。

もちろん、特定の言語で何らかの解決策が実現可能かどうかは、まったく別の質問です。賢明な開発者はアセンブリでWebアプリを書き始めることはありません:-)しかし、これらの高レベル言語のほとんどまたはすべては、膨大な量のランタイムおよびクラスライブラリコードの上に構築されていることを覚えておくと便利です。これは、低レベルの言語、通常はCで実装されます。

質問に答えるために、

若者への指針に関する知識は重要だと思いますか[...]

ポインターの背後にある概念は、間接指定です。これは非常に重要な概念であり、すべての優秀なプログラマーが特定のレベルでそれを把握する必要があります。誰かが高級言語のみで作業している場合でも、間接指定と参照は依然として重要です。これを理解しないと、非常に強力なツールのクラス全体を使用できなくなり、長期的には問題解決能力が著しく制限されます。

私の答えはイエスです。本当に良いプログラマーになりたいのであれば、ポインターも理解する必要があります(再帰だけでなく、これは新進の開発者にとっての典型的な障害です)。あなたはそれで始める必要はないかもしれません-私はCが最近の第一言語として最適であるとは思いません。しかし、ある時点でインダイレクションに慣れる必要があります。それなしでは、使用しているツール、ライブラリ、フレームワークが実際にどのように機能するかを理解することはできません。そして、彼/彼女のツールがどのように機能するかを理解していない職人は非常に限られたものです。まあ、高レベルのプログラミング言語でも理解できるかもしれません。優れたリトマステストの1つは、二重にリンクされたリストを正しく実装することです。お気に入りの言語で実行できる場合、間接参照を十分に理解していると主張できます。

しかし、他に何かがなければ、信じられないほどシンプルなツールを使って信じられないようなものを構築することができた古いプログラマーへの敬意を学ばなければなりません(現在と比較して)。私たちは皆巨人の肩の上に立っており、私たち自身が巨人であるふりをするよりも、これを認めることは良いことです。


5
これは良い答えですが、「若者の心はポインターの概念を学ぶ必要があるのですか?」という質問には本当に答えていません。
ファルコン

11
+1良い答え。ただし、チューリング完全性の引数は削除します。実際のプログラミングでは、後で説明するように、これは赤いニシンです。それは計算可能性理論です。つまり、完全なチューリングとは、同じアルゴリズムを実装する潜在的なプログラムの(多くの言語、無限の)空間にプログラムが存在することを意味します。最後にすべてのマシンコードを指摘するだけで、愚かさを植え付けることなく、ポイントを証明できます。シード。

5
「そして、自分のツールがどのように機能するかを理解していない職人は非常に限られたものです」
すぐに

6
また、ポインターのメカニズムを(および拡張参照によって)理解していないということは、結果として、追跡が難しい深刻なバグを引き起こす可能性のある浅い/深いデータ構造コピーの概念を理解していないことを意味します。「現代の」高級言語でも。
マヴリック

1
CはUnix用のポータブルアセンブラ、つまり金属に近いものとして設計されました。

39

異なる必要があると思います。

Javaおよびその他の高レベル言語では、ポインターは削除されませんでした。彼らがしたことは、単純なポインタ演算を削除することでした。

実際、Javaでは、保護および制限されたポインター演算、つまり配列アクセスが依然として許可されています。単純な古いCでは、配列アクセスは逆参照にすぎません。あなたがしていることを明確に伝えるために、それは別の表記法、構文糖です。
それでも、はとarray[index]同等*(array+index)です。そのため、index[array]一部のCコンパイラが警告を出す可能性があると考えられますが、それと同じ場合も同じです。
結果として、pointer[0]と同等*pointerです。これは、単に「配列へのポインタ」が配列の最初のエントリのアドレスであり、後続の要素のアドレスがインデックスを追加することで計算されるためです。

Javaでは、プレーンポインター演算(参照および逆参照)はもう存在しません。ただし、ポインターは存在します。それらは参照と呼ばれますが、それが何であるかは変わりません。配列アクセスもまったく同じです。アドレスを見て、インデックスを追加し、そのメモリの場所を使用します。ただし、Javaでは、そのインデックスが最初に割り当てた配列の境界内にあるかどうかをチェックします。そうでない場合は、例外がスローされます。

現在、Javaアプローチの利点は、任意のバイトを任意のメモリ位置に盲目的に書き込むだけのコードがないことです。これにより、安全性とセキュリティが向上します。バッファオーバーフローなどのチェックに失敗すると、ランタイムが自動的に実行するためです。

これの欠点は、それが単に強力ではないことです。Cでメモリセーフプログラミングを行うことは可能です。Javaでの安全でないプログラミングの速度と可能性の恩恵を受けることは不可能です。

実際、ポインターやポインター演算について難しいことは何もありません。それらは通常、複雑な方法で説明されていますが、すべてのポインターは1つの巨大な配列(メモリ空間)へのインデックスであり、値を参照することはすべて、それを見つける場所にインデックスを与えることです、逆参照することはルックアップすることです指定されたインデックスの値。(これは、タイプによってメモリ内の値のサイズが異なることを考慮していないため、少し簡略化されています。しかし、実際の概念の一部ではなく、状況の詳細です)

私見、私たちの仕事の誰もがそれを理解できるはずです、または彼らは単に間違った分野にいます。


13
+1 JavaとC#にはまだポインターがあり、もちろんNullPointerExceptions
jkです。

5
また、参照は、ガベージコレクターがさまざまな場所を移動するため、時間の経過とともに異なる領域を指す場合があることに注意してください。通常、ポインターは静的です。

3
+1:これ!そして、ポインター(一般的に)について把握するのが難しい2つのことがあると思います:間接(C、C#、Javaで発生します...)とポインター演算(Javaで同じように発生しません)。私の意見では、両方のは、学ぶための重要な概念であり、両方が初心者のための大きな障害ブロックです。しかし、それらを混同しないでください。間接演算はポインター演算なしで発生する可能性があります。
ヨアヒムザウアー

2
実際にback2dos(array + index)、オブジェクトのサイズ(Cで)を既に考慮しているため、初めてでした。
マシューフラシェン

4
@Cyber​​Skull、答えはの構文と同等を与えていたarray[index]、それはです*(array+index)。コンパイラーが内部でどのように処理するかを示したい場合は、明示的にバイトについて話すか、アセンブリーを指定できます。
マシューフラシェン

24

ポインターの概念は、一般的なコンピュータープログラミングの知識体系において重要です。概念を理解することは、たとえ言語が直接それをサポートしていなくても、どんな言語のプログラマーやプログラマーにとっても良いことです。

ポインターは、データ構造(リンクリスト)およびデータベース設計(外部キー)で使用されます。

VBやC#のような言語は、「参照」によってデータをメソッドに渡すことができます。これは、一種のポインターと考えることができます。

メモリ内のデータの割り当て場所(スタックとヒープ)を理解することは、アルゴリズムの効率にとって依然として重要です。

私の意見では、基本を正しく学ぶことは重要です。


一般的な概念は役に立つと思いますが、ポインターが必要な状況を発見したことはありません(JavaとPHPを主に使用することを許可しました)。私のC ++のコースが今までのポインタのために思い付いた例だけでは...で始まるように任意の高水準言語に存在するリストや辞書のような、より複雑なデータ構造を作成するためにそれらを使用していた
ベンBrocka

2
ある意味では正しいのですが、メソッドにデータを渡すとき、場合によっては変数へのポインターを渡す可能性があります。ただし、ポインタの概念は、ソフトウェア言語での実装に関係なく(私の意見では)有用です。
-NoChance

1
@SirTapTap:それは、ある種のコースでC ++を学んだ場合、C ++を教えるからです。C ++を使用する最善の方法ではありません。ポインター演算は、C ++の知識があり、知らないことがあるので、通常は光沢があります。しかし、一般的なコレクションを反復処理するようなことでも、実/慣用的C ++のポインターを使用して行われます。(標準テンプレートライブラリの機能の基礎であるため)
ビリーONeal

@BillyONealポインターはコースのほぼ半分でしたが、実際、プログラマーとして(スマート)ポインターの実用的な使用法を見つけることはありませんでした。もちろん、コースが不十分に教えられた可能性は常にあり、それは私のお気に入りではありませんでした。
ベンブロッカ

1
@SirTapTap:実際の使用:STLのすべてのコレクションとアルゴリズム。std::sortstd::partitionstd::find、など彼らはポインタで動作し、彼らはポインタ(イテレータ)のように振る舞うオブジェクトを操作します。そして、彼らは一般的なコレクションを操作します。リンクリスト、動的配列、deques、ツリー、またはその他の種類のユーザー定義コレクション。ポインタなしでは、そのような抽象化はできません。
ビリーONeal

19

はい、はい、はい、はい、はい!!!

あなたが基本を知らないなら、あなたはあなたの道に来る本当に難しい、奇妙で、難しくて複雑な問題を決して解決することができないでしょう。

そして、基本を本当によく理解していれば、雇用市場ではるかに市場性があります。


私は10年間プログラミングをしていて、ポインターがどのように機能するか分からなかった人と一度働いたことがあります。私(はるかに後輩)は彼を教育するホワイトボードで何時間も過ごしました。それは私の目を開きました。彼は非常に多くの基本的なことについて何も考えていませんでした。

可能な限り知っている。


しかし、基本は何ですか?アセンブリ、バイナリコード?
SiberianGuy

5
「できる限り知っている」というあなたの一般的なポイントは健全なものですが、あなたが「あなたの道に来る本当に難しい、奇妙な、困難で複雑な問題を決して解決できない」という考えに疑問を呈しますポインタを理解しないでください。これは何らかの理由で、これらの「魔法の」ポインターを使用してすべての難しい問題を解決できることを意味しますが、そうではありません。ポインター間の概念は知っておくと便利ですが、プログラミングの多くの分野に直接必要なわけではありません。
ダンディプロ

4
@Idsa:いいえ、さらに基本的な、多くのプログラマーは、最近ではgoo 'ole'チップでトランジスタと論理ゲートがどのように機能するかさえ知らず、電子がどのように動き、量子化の不確実性が小型化に及ぼす影響を知っているはずです; 私は鳴き声、リプトン、バイソンでさえ始めていません!しゃっくりバイソン粒子!
ライライアン

2
基本....ものの保管方法など。バイト、ワード、署名と署名なしの動作の違い。ポインターの仕組み。キャラクターとは ASCII(および最近ではUnicode)でのコーディング方法。単純な構造のみを使用して、リンクリストをメモリ内に作成する方法。文字列が本当に機能する方法。これらの小さなものから、より大きなものが成長します。
すぐに

5
できる限り知っていることは良い原則ですが、馬の前にカートがあると思います。優れた開発者は優れた開発者であるため、できることは何でも学ぶよう努めています。知識への憧れは、優れた開発者の特徴です。それは良い開発者の原因ではありません。外に出て、できる限り多くのことを学んでも、あなたは優れた開発者にはなりません。それはあなたをウォーキング百科事典にするだけです。優れた開発者であれば、得た知識を適用して問題を解決できます。しかし、あなたがまだ優秀な開発者でない場合、知識はあなたをあまり得ません。
corsiKa

18

はい、理解は重要です。

数か月前、私はC#でプログラミングしていたので、リストのコピーを作成したかったのです。もちろん私がやったことはNewList = OldList;修正し始めましたNewList。両方のリストを印刷しようとしたとき、コピーではなくNewList単なるポインタであったため、両方とも同じであったOldListため、実際にはOldListずっと変更していました。それを理解するのにそれほど時間はかかりませんでしたが、クラスメートの何人かはそれほど速くなく、なぜこれが起こっているのか説明する必要がありました。

例:

List<int> a = new List<int>();
a.Add(2);
a.Add(9);
a.Add(8);
a.Add(1);
List<int> b = new List<int>();
b = a; //Does not make a copy, b is just a synonym!
b.Sort();
for (int i = 0; i < a.Count; i++)
{
    Console.WriteLine("a: " + a[i] + " b: " + b[i]);
}

そしてもちろん、結果は次のようになります。

a: 1 b: 1
a: 2 b: 2
a: 8 b: 8
a: 9 b: 9

それらの使用方法を知ることはそれほど重要ではありませんが、それらを理解することは非常に重要です!


2
代わりに、なぜそれらを使用するか、いつ使用するかが最も重要です:)
ニコ

5
NewListちょうどポインタがあったOldList、正確であることの両方を- NewListOldList同じを参照して、単にポインタたListオブジェクト。
ペテルトレック

また、作成した新しいリストにbは参照がなく、不要になっていることを理解することも重要です。
TMN

14

概念のポインター!=算術のポインター!=構文のポインター

ディープ/シャローコピー、参照渡し/値渡しなどを理解する必要がある場合(および行う場合)、最初の問題は常に重要です。


1
今日では、ポインタの構文/数学ではなく、参照の基本概念のみを知る必要があります。私はその日、Cでポインター(算術と構文を使用)を学びました。私が現在プログラミングしている言語は、安全でないことをするCスタイルのポインターを処理しません。一つの理由は、Pythonで理解することができa=[1,2]; b=a; a.append(3)、両方ことabの両方を行っているが同じオブジェクトを参照する[1,2,3]Cのようなものを知らずにiアレイの番目の要素はで参照することができarr[i]、またはi[arr]共にとして*(arr+i)。言語をi[arr]使用させないときが好きです。
ジンボブ博士11

他の2つの問題は、あなたの言語があなたがそれらを使用することを許可する場合にのみです。」-その文は、それ自身の自己破壊者を運んでいます。言語du jourは、定義上、明日使用されるのと同じ言語になることはほとんどありません。そして明日、ポインター対応言語に直面するかもしれません。一番下の行?より良いものは、今一度、永遠にそれを把握します。それほど難しくはありませんが、それだけの価値はあります。
JensG 14年

14

CのマスターDennis RitchieがCにポインターを導入したのはなぜですか?

ポインターは多くの方法で使用できる非常に強力なメカニズムだからです。

そして、なぜVB.NETやJavaやC#などの他のプログラミング言語がそれらを排除したのですか?

ポインターは非常に危険なメカニズムであり、さまざまな方法で悪用される可能性があるためです。

プログラマーはポインターについて学ぶ必要があると思いますが、教育の観点からは、それらを早期に導入するのは賢明ではありません。その理由は、それらが非常に多くの異なる目的に使用されているため、特定の状況でポインターを使用している理由を初心者として伝えるのが難しいからです。

ポインタが使用される不完全なリストは次のとおりです。

  • ダイナミックアロケーション(new T
  • 再帰的なデータ構造(struct T { T* next; /* ... */ };
  • 配列のイテレータ(for (T* p = &a[0]; p != &a[0] + n; ++p) { ... }
  • オブジェクトへの共有アクセス(T* new_pointer = existing_pointer;
  • サブタイプ多型(T* pointer_to_base = pointer_to_derived;
  • 参照によるレガシーコール(mutate(&object);
  • オプションのタイプ(if (p) { /* ... */ }

これらすべての概念に単一のメカニズムを使用することは、経験豊富なプログラマーの力と優雅さ、およびプログラミングの初心者にとって大きな混乱の可能性を示すことに注意してください。


CマスターのDennis RitchieがCにポインターを導入したのはなぜですか。ポインターは非常に強力なメカニズムであり、さまざまな方法で使用できるためです。」-事実はわかりませんが、C言語にラップされるマシン命令、およびCの前身と関係があると思います。アセンブラープログラマーはポインターで考えるのに慣れているので、彼がこれらのよく知られた強力なメカニズムを使用していなかったら驚きです。1978年から1960年代に至るまで、他のものはあまりにも遠く離れていたでしょう。
JensG 14年

12

どうして?フォームデザイナとコードジェネレータを使用して、巨大なシステムを作成できます。十分ではありませんか?(アイロニー)

そして今、真剣に、ポインターは多くの分野でプログラミングの重要な部分ではありませんが、内部がどのように機能するかを人々に理解させることができます。内部がどのように機能するかを誰も理解していない場合、SQL2020、Windows 15、Linux 20.04は、JavaScriptでIDEを介して生成されたコードを使用して、30層以上の抽象化を実行するガベージコレクション仮想マシンに書き込まれる状況になります。

これは間違いなく私が見たいものではありません。

そうです、間違いなく彼らはしなければなりません!


2
良いユーモア!+1と完全に同意します。
heltonbiker

7

JavaもC#もポインターを削除しませんでした。ほとんど同じ参照があります。削除されたのはポインター算術であり、入門コースでは省略できます。
ポインタや参照の概念なしに非自明なアプリケーションを実行することはできないため、教える価値があります(動的メモリ割り当てはそれらなしでは実行できません)。

C ++とJavaで次のことを検討してください。C#
aClass *x = new aClass();
aClass x = new aClass();
でもそれほど違いはないと思います。ポインターと参照の違いはあまりありませんよね?
ポインターの算術演算は、必要でない限り、また高レベルのモデルでプログラミングするときは避けてください。そうすれば、それほど問題はありません。


6

プロのプログラマーはポインターをマスターする必要があります。

プログラミングを知りたい人は、その存在と影響について学ぶ必要がありますが、必ずしもそれらを使用する必要はありません。

プログラミングによって個人的な問題を解決したい人(私のように、多くのPythonスクリプトを使用している人)は、それらをまったく無視することができます。

まあ、それは私の意見です...; o)


3

可変アドレスポインターは、より一般化された間接化の概念の特定のケースです。インダイレクションは、デリゲートやコールバックなどの多くの構成要素で、ほとんどの(すべて?)現代言語で使用されています。インダイレクションの概念を理解することにより、これらのツールをいつどのように使用するのが最適かを知ることができます。


3

Absufreakinglutely YES!プログラムを作成するすべての人は、ポインターと間接参照を理解する必要があります。

ポインターは、すべての言語で大量のデータアクセスが行われる方法です。ポインターは、すべてのマイクロプロセッサーのハードウェア機能です。Java、VB、C#などの高レベル言語は、基本的に、参照を持つ言語のユーザーからのポインターへの直接アクセスを遮断します。参照は、言語のメモリ管理スキームを介してオブジェクトを参照します(たとえば、メタデータを含むポインタ、またはメモリテーブルの単なる番号など)。

ポインターがどのように機能するかを理解することは、コンピューターが実際にどのように機能するかを理解するための基本です。ポインターは、参照よりも柔軟で強力です。

たとえば、配列がインデックス0で始まる理由は、配列が実際にポインター演算の省略形であるためです。ポインターがどのように機能するかを学習しないと、多くの初心者プログラマーは配列を取得できません。

int a, foo[10];
foo[2] = a;

ポインター演算の2行目は次のようになります。

*(foo + sizeof(int) * 2) = a;

ポインタを理解しなければ、メモリ管理、スタック、ヒープ、さらには配列さえも理解できません!さらに、ポインターと逆参照を理解して、関数とオブジェクトがどのように渡されるかを理解する必要があります。

TL:DR:ポインターを理解することは、コンピューターが実際に機能することを理解するための基本です。


2

プログラマーが実行している直接的なハードウェアへの対処が減ったため、ポインターに対処する必要性がなくなったという事実に要約されると思います。たとえば、リンクされたリストのデータ構造を、特殊なハードウェアが持っていた640バイトのメモリモジュールのシーケンスに完全に適合するように割り当てる。

ポインタを手動で処理すると、エラーが発生しやすくなり(メモリリークや悪用可能なコードにつながる)、適切に処理するのに時間がかかります。したがって、JavaとC#などはすべて、仮想マシン(VM)を介してメモリとポインタを管理します。VMは絶えず改善されていますが、これは未加工のC / C ++を使用するよりも間違いなく効率的ではありません。

C(およびC ++)は、特にハイパフォーマンスコンピューティング、ゲーム、組み込みハードウェアの分野で、依然として広く使用されている言語です。Javaの参照(ポインターと同様の概念)への移行は非常に簡単で、最初のNullPointerException(実際にはNullReferenceExceptionと呼ばれるべきですが、私は逃げる)を見たときに失われなかったので、ポインターについて学んだことに個人的に感謝しています。

ポインターはまだ多くのデータ構造などを支えているので、ポインターの概念について学習することをお勧めします。次に、NPEのようなものが登場した場合、実際に何が起こっているかを知って、作業したい言語を選択します。


0

これが客観的な真実です。

一部の言語はダイレクトメモリアクセス(ポインター)をサポートしていますが、一部の言語はサポートしていません。それぞれの場合には十分な理由があります。

  1. ここで誰かが言ったように、Cの時代には、自動メモリ管理は今日ほど精巧ではありませんでした。とにかく、人々はそれに慣れていました。当時の優秀なプログラマーは、私たちの世代(21歳)よりもコンピュータープログラムをはるかに深く理解していました。彼らはパンチカードを使用し、メインフレームでのコンパイル時間を数日間待っていました。彼らはおそらく、コード内のすべてのビットが存在する理由を知っていたでしょう。

  2. Cのような言語の明らかな利点は、プログラムをより細かく制御できることです。最近、実際に必要になるのはいつですか?OS関連プログラムやランタイム環境などのインフラストラクチャアプリケーションを作成する場合のみ。優れた、高速、堅牢で信頼性の高いソフトウェアを開発したい場合、ほとんどの場合、自動メモリ管理がより良い選択です。

  3. 事実、ソフトウェア開発の歴史の中で、直接メモリアクセスのほとんどが悪用されてきました。人々はメモリをリークするプログラムを作成していましたが、実際には冗長なメモリ割り当てのために遅くなりました(Cでは、単一の割り当てごとにプロセスの仮想メモリ空​​間を拡張するのは簡単で一般的です)。

  4. 最近では、メモリの割り当てと解放に関して、仮想マシン/ランタイムがプログラマの99%よりもはるかに優れた仕事をしています。その上、適切な時間と場所に割り当てられたメモリを解放することで(ほとんど)占有されていないため、プログラムに必要なフローの柔軟性を高めることができます。

  5. 知識に関しては。プログラマーがプログラミングする環境がどのように実装されているかをプログラマーが知っていることは素晴らしいと思います。必ずしも細部までではなく、全体像です。

ポインターの動作を(少なくとも)知ることは興味深いと思います。ポリモーフィズムの実装方法を知ることと同じです。プロセスがメモリを取得する場所と方法。これらは個人的に常に私にとって興味のあるものです。正直に言って、彼らが私をより良いプログラマーにしたと言えますが、彼らが良いプログラマーになりたい人にとって教育的な必要性だとは言えません。どちらの場合でも、より多くを知ることはあなたの仕事をより良くするでしょ

  1. 私の見方では、JavaやC#などでアプリケーションを作成するように求められた場合、適切な設計と実装の手法に集中する必要があります。テスト可能なコード、クリーンなコード、柔軟なコード。その順序で。

たとえあなたがすべての小さな詳細を知らなくても、誰かがあなたが作成したものを単により良いパフォーマンスに変えることができるからです。そして、適切で、クリーンで、テスト可能な設計が整ったら、それは難しい仕事ではないことがよくあります(そして、それが通常ほとんどの作業です)。

もし私が高水準言語のアプリケーションのために誰かを雇おうとするインタビュアーであれば、それらは私が最も興味を持っているものでしょう。

低レベルの知識はボーナスです。これはデバッグに役立ち、ときどき少し優れたソリューションを作成します。それはあなたを専門的に面白い人にします。職場での尊敬を与えてくれます。

しかし、今日の世界では、それは神聖な要件ではありません。


-1

参照を理解する高レベルOO言語で最も実用的な目的を達成するには、これらの言語がポインターの観点から参照を実装する方法を理解する必要はありません。

機能的で最新のマルチパラダイムアプローチがあり、ファンシーポインター演算を行うよりもはるかに高く評価し、1000番目に最適化された文字列コピー関数を書くと、おそらくstd libのString.copyよりもパフォーマンスが低下します。

ハードウェアに近いものに特化する前に、より多くのより高いレベルの概念を最初に学び、さまざまなデザインの言語を学び、視野を広げることをお勧めします。

キャッシング(メモ化)、SQL最適化、またはWebサーバー構成のチューニングだけでわずかな労力で100%以上を達成できる場合、Webサーブレットまたは類似のコードを5%向上させるために完全に失敗する試みが頻繁に見られます。ほとんどの場合、ポインターをいじるのは時期尚早な最適化です。


-1

あなたが本当に良いプログラマーになりたいのであれば、間違いなくポインターの徹底的なコンセプトが必要です。ポインタ概念の理由は、時間の制約により効率的かつ効果的になる、あなたの価値への直接アクセスでした...

また、非常に限られたメモリを備えたモバイルアプリケーションを考えると、操作がユーザーの応答で非常に高速になるように、非常に慎重に使用する必要があります。

Appleのデバイス、または完全にポインターの概念のみで機能するObjective C言語を検討してください。Objective Cで宣言されたすべての変数にはポインターがあります。Objective Cのwikiを確認する必要があります


今日のモバイルアプリは、一部のデータセンターCが考えていたよりも多くのメモリを使用できます。多くのモバイルアプリはJavaまたは完全なhtml + javascriptで記述されており、すべてポインターがありません(リファレンスがあります)。非常に専門的なプログラマーのほんの一部だけが、基礎となるOSレイヤーを見ることができます。
ユルゲンストロベル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.