プログラミング言語のすべての単語が実際に何かを行う理由は何ですか? つまり、コンピューターにこれらの単語の意味を理解させるために実際に何が起こっているのでしょうか? 自分のコンピューターに何かをするように口頭で伝えても、コンピューターはそれを理解しません。では、これらの人間の言葉を言語に書き込んで、実際にコンピューターに望ましい動作をさせるにはどうすればよいのでしょうか?
13 に答える
すべては CPU またはプロセッサから始まります。プロセッサの種類ごとに、実行できる一連の命令が定義されています。これらの命令は 1 と 0 で動作し、数字、文字、さらには命令そのものまで、あなたが望むものを順番に表します。
最低レベルでは、ゼロはトランジスタでの特定の電圧 (通常は 0V に近い) の存在によって決定され、1 は異なる電圧 (CPU に依存、たとえば 5V) の存在によって決定されます。
マシン命令自体は、プロセッサ内のレジスタと呼ばれる特別な場所に配置された 0 と 1 のセットです。プロセッサは、命令とそのオペランドを特定の場所から取得して演算を実行し、結果をさらに別の場所に配置し、その後、実行する命令がなくなるかオフになるまで、次の命令などを繰り返します。
簡単な例。マシン命令 001 が 2 つの数値を加算することを意味するとしましょう。
次に、通常は次のように、2 つの数値を加算するプログラムを作成します。
4 + 5
次に、このテキストをコンパイラに渡します。コンパイラは、プログラムを実行するプロセッサに適したマシン コードを生成します (補足: 現在実行しているプロセッサとは別のプロセッサで実行するコードをコンパイルできます。クロス コンパイルが可能であり、組み込みプラットフォームなどで役立ちます)。まあ、コンパイラは最終的に大まかに、
001 00000100 00000101
次の命令レジスタ (命令ポインタ) に 001 命令を配置し、データ レジスタ (または RAM) に 2 進数でエンコードされた数値を配置する追加のボイラープレート マシン コードを使用します。
構造化言語から機械語を生成するプロセスはかなり複雑であり、これらの言語が最終的にどの程度正常に見えるかには制限があります。英語でプログラムを書くことができないのはそのためです。コンパイラが適切なゼロと 1 のシーケンスを生成するにはあいまいさが多すぎます。
CPU が実行できる命令は、かなり基本的で単純なもので、加算、除算、否定、RAM からの読み取り、RAM への配置、レジスタからの読み取りなどです。
次の問題は、これらの単純な数値命令が、コンピューティング (インターネット、ゲーム、映画プレーヤーなど) で見られるすべての驚異をどのように生成できるかということです。
基本的には、適切なモデルの作成に要約されます。たとえば、3D ゲーム エンジンには、ゲームの世界を表す数学的モデルがあり、それに基づいてゲーム オブジェクトの位置/衝突を計算できます。
これらのモデルは、これらの小さな命令の非常に多くに基づいて構築されており、ここで (機械語ではない) 高水準言語が真に輝きます。なぜなら、それらは抽象化レベルを上げ、実装したいモデルにより近く考えることができるからです。 0 を忘れないようにするのに忙しすぎて簡単に推論できないようにするのではなく、コントローラーから受け取った入力に基づいて、兵士が移動する次の位置を効率的に計算する方法などについて簡単に推論できます。
アセンブリ言語 (機械語に非常によく似た言語で、最初のプログラミング言語であり、CPU 固有の言語です。すべてのアセンブリ命令は機械語コードに直接変換されます) から C (異なる CPU 間で移植可能であり、アセンブリよりも高いレベルの抽象化: C コードの各行は、多くのマシン コード命令を表します)。これはプログラマーにとって生産性の大幅な向上であり、異なる CPU 間でプログラムを移植する必要がなくなり、基礎となるモデルについてより簡単に考えることができるようになり、ソフトウェアの継続的な複雑化 (さらには需要) につながりました。 1970年代から今日まで。
保留中のミッシング リンクは、その情報をどう処理するか、外部ソースからの入力を受け取る方法を制御する方法です。たとえば、画面に画像を表示する、ハード ドライブに情報を書き込む、プリンターで画像を印刷する、コンピューターからキーパンチを受信するなどです。キーボード。これはすべて、CPU と同様の方法で制御されるコンピューターに存在する残りのハードウェアによって可能になります。グラフィック カード、ネットワーク カード、ハード ドライブ、または羊。CPU には、さまざまなハードウェアの適切な場所にデータまたは命令を配置する (または情報を読み取る) ことができる命令があります。
私たちが今日持っているものの存在に関連するもう 1 つのことは、すべての最新のコンピューターにはオペレーティング システムと呼ばれる大きなプログラムが付属しており、ハードウェアとの通信やエラー処理 (プログラムがクラッシュした場合に何が起こるかなど) などの基本的なことをすべて管理することです。さらに、多くの最新のプログラミング環境には、画面への描画やファイルの読み取りなどの多くの基本的なタスクを処理するために、既に記述されたコード (標準ライブラリ) が多数付属しています。このライブラリは、代わりにオペレーティング システムにハードウェアと対話するように要求します。
これらが利用できない場合、プログラミングは非常に困難で退屈な作業になります。作成するすべてのプログラムで、画面に 1 文字を描画したり、特定の種類のハード ドライブから 1 ビットを読み取ったりするためのコードを再度作成する必要があるからです。例えば。
私は夢中になったようです、あなたがこれから何かを理解してくれることを願っています:-)
コンピュータプログラミング言語は、実際には高度に抽象化された言語であり、コンピュータが実際に理解できる非常に基本的な言語に変換されます。
基本的に、コンピューターは機械語しか理解できません。機械語は、バイナリ (1 と 0) で実装された基本的な言語です。これより 1 レベル上のアセンブリ言語は、少なくとも人間が読める非常に原始的な言語です。
高級言語では、次のようなものがあります。
Person.WalkForward(10 steps)
マシンコードでは、次のようになります。
Lift Persons Left Foot Up
Lean Forward
Place Left Foot Down
Lift Right Foot up
Lean Forward
Place Right Foot Down
etc
当然のことながら、コンピューターに繰り返し実行することを指示するプログラムを作成したいと思う人は誰もいません。そのため、コンパイラーと呼ばれるツールが用意されています。
コンパイラは、人間が理解しやすい高水準の言語を使用して、コンピューターが実行できるように機械語に変換します。
非エンジニア向けのコンピューターについて説明している良書は、Charles Petzold の「Code」です。それがあなたの質問を正確にカバーしているかどうかは正確には思い出せませんが、そう思います。もっと遠くまで行くことに興味があるなら、それは良い選択です。
最も単純なケースでは、コンパイラと呼ばれるプログラムが、ユーザーが記述したプログラミング言語の単語を受け取り、コンピューターが理解できる機械語に変換します。コンパイラは、特定のプログラミング言語 (C#、Java など) を理解します。このプログラミング言語には、コンパイラに何をさせたいかを説明する方法に関する非常に具体的な規則があります。
これらのルールの解釈と理解は、スタック オーバーフローのほとんどの目的です。:)
プログラミングとは、特定の問題を解決する一連の手順を実行し、特定の構文を必要とする特定の言語でそれらを書き出すことです。これらのステップを言語で記述したら、その言語からコンピューターが解釈できる言語に変換するコンパイラーを使用できます (Greg のコメントによる)。
技術は、手順を十分に説明することにあります:)
典型的なプログラミング言語からプロセッサが実行できる実際の機械語コードへの変換プロセスの概要を、何人かの人々がすでに提供しています。
このプロセスを理解するには、機械語レベルでのプログラミングが実際にどのようなものかを具体的に理解することが役に立ちます。プロセッサ自体ができることを理解すると、高レベルのプログラミング構造を略語として理解しやすくなります。
しかし残念なことに、デスクトップ コンピューター用のマシン コードを書くのはあまり楽しくありません。
別の方法として、単純化された機械語を使用して小さなプログラムを作成する、Corewarと呼ばれる非常に古いゲームがあります。これらのプログラムは、生存のために互いに戦います。生の機械語で基本的なプログラムを書くことができます。マクロのシステムがあるので、何度も繰り返す必要はありません。これが、フル機能の言語への第一歩です。
もう 1 つの簡単でやりがいのある低レベルの方法は、Arduinoのような単純な組み込みコントローラーをプログラムすることです。このような簡単な紹介がたくさんあります。引き続きコンパイラを使用しますが、プロセッサの機能がはるかに単純であるため、結果として得られるマシン コードは (必要に応じて) 理解しやすくなります。
これらはどちらも、デジタル コンピューターが実際にどのように機能するかを理解するのに最適な方法です。
クレイジーな提案が 2 つあります。時間内に戻る!
1. プログラム可能な電卓を入手します。
プログラム式電卓は通常の電卓です。数値を入力し、操作記号を入力し、equel キーを押した後、小さなディスプレイで結果を読み取ることができます。さらに、プログラマブル電卓は、キーストロークの短いシーケンスをプログラムとして保存でき、後でキーを 1 回押すだけで「再生」できます。たとえば、このシーケンスをプログラムとして設定します (1 行に 1 つの命令):
(Start)
*
2
+
1
=
(Stop)
これで、カスタム操作ができました。「プログラム」キー (または割り当てたキー) を押すと、それ以上の支援なしでシーケンスが実行され、ディスプレイの内容が 2 倍され、1 が加算されます。プログラム!
後で、より高度な手法を試すことができます: 一時的な結果をメモリに保存し、結果で分岐します。
長所:
- 電卓は身近な環境です。あなたはすでに基本を持っています。
- それは簡単です。多くの命令やプログラミング技術を学ぶ必要はありません。
- プログラム可能な電卓が「その上にある」一方で、現代のプログラミング言語は地面から遠く離れています。メモリ、分岐、基本操作などの基礎を学びます。コンピュータは(機械語レベルで)まったく同じように機能します。
- メモリ、ゼロ除算などの低レベルの問題に遭遇します。
- それは非常にクールです。
短所:
- 時代遅れです。最新のプログラミング言語を学ばなければなりませんが、それは異なるでしょう。
- それは不快です (うーん、代わりにそれはプロです: 快適なクリックアンドプレイのおもちゃを使用することはできません)。コードを保存することさえできないかもしれません。
- 取得するのは簡単な作業ではありません。E-Bayでお試しいただけます。また、ドキュメンテーションにも問題はありません。ほとんどのモデルには、インターネット上に大きなユーザー グループがあります。
私見の最良の選択はTI-59です。
2. エミュレーターを使用して BASIC 言語を学習します。
BASIC 言語インタープリターが組み込まれているマシンの電源を入れると、コマンドを受け入れる準備が整い、入力したとおりに実行されます。まず、コマンド モードでいくつかの指示を試すことができます。
PRINT 5*4
次の行に「20」と表示されます。コマンドモードで十分にプレイした場合は、命令をプログラムに編成して、実行、編集、強化することができます。
長所:
- BASIC は、教育用に設計された真のプログラミング言語です。
- 後で最新のプログラミング言語に出会い、違いを発見すると、過去 30 年間のプログラミング手法 (手続き型、構造体など) の進歩がわかります。
- 特に、単なるエミュレーターではなく、実際のものを入手した場合はクールです。
短所
- 時代遅れです。その時代から約30年が経ちました。
- 古いマシンはコンパクトなクローズド システムです。ファイル (現在使用している形式)、フォルダー、ファイルの種類はありません。初心者を混乱させる可能性があります。
私のお気に入りの BASIC システムはCommodore 16 (Plus/4)で、有名な C64 に非常によく似ています。しかし、より快適です。私はYAPEエミュレータを好みます。これは、メモリ スナップショットまたは BASIC プログラムをファイルに保存/ロードできます。
プログラミングの仕組みを言語間の翻訳と比較できます。あなたが他の2人と無人島にいたとしましょう。あなたはフランス語しか話せません。人物番号 1 (フレッドと呼びます) は、フランス語と日本語しか話せません。Person 2 (Bob) は日本語しか話せません。ボブに薪を集めるのを手伝ってもらう必要があるとしましょう。この場合、あなたがプログラムで、ボブがコンピューターだと想像してください。あなたはフレッドにフランス語で「ボブに助けに来るように言ってくれませんか」と言います。フレッドは日本語に翻訳し、ボブに助けを求めます。この場合、Fred がコンパイラになります。彼はその要求をボブが理解できるものに翻訳します。それは、コンピュータープログラムがどのように機能するかのようなものです。
物事を説明するHow Stuff Worksの良い記事があります。
個人的には、デジタル エレクトロニクスのクラスを受講するまで、コンピューターがどのように機能するのかをよく理解していませんでした。その前に、コンピューターが私にとってどのように機能するかについての全体的な考え. バイナリカウンターを構築した後、すべてが理にかなっています。
簡単に言うと、コンピュータ プログラミングとは、コンピュータが理解できる言語で一連の命令をコンピュータに与える行為です。プログラマーは通常、高級プログラミング言語で命令を記述し、それらの命令はコンピューターが理解できるバイナリ言語に変換されます。この翻訳を行うプログラムはコンパイラと呼ばれます。
人々がすでに気づいているように、プログラムの単語を「マシンコード」と呼ばれるより長い「低レベル」言語に変換する事前プログラム(通常は「コンパイラ」)があります。
マシンコードは非常に単純な命令で構成されており、基盤となるプロセッサによってすでに「理解」されている (または少なくとも意味を成す) ものです。たとえば、データをメモリ ロケーションからプロセッサの特別な部分 (単純な算術演算を実行できる「アキュムレータ」と呼ばれる) にコピーする命令や、2 つのスロットの内容を加算する命令などです。アキュムレータで。
目にする複雑で洗練されたプログラム (高水準言語のコンパイラーやインタープリターを含む) はすべて、何百万回も実行されたこれらの単純な命令から最終的に構築されています。
CPUには、命令ポインタと呼ばれるレジスタ(数値を格納できるもの)があります。命令ポインタは、メモリ内のどのアドレスから命令をプルするかを示します。CPU は命令を引き出して実行し、実行した命令が別の場所に移動するように指示されていない限り、次の命令に進みます。これらの指示はかなり弱いです。この番号をその番号に追加します。この番号をそこに保管してください。そちらから次の指示を受けてください。コンパイラと呼ばれるプログラムがプログラムを分析し、マシン コードに変換します (ここではいくつかの手順を省略しています)。
コンピュータにはあらかじめ設定された数の命令があります。それはすでに方法を知っています。コンピュータプログラムは、コンピュータが順番に実行する命令の単なるリストです。
初期のプログラムは機械語で直接書かれていました。プログラマーは、生活を楽にするために、書く必要のあるプログラムを単純化するための抽象化を作成し始めました。時間が経つにつれて、タマネギの層のように、より多くの抽象化が追加されますが、本質的にはすべて同じこと、つまり一連の命令を実行することになります。
コンパイラーやテクノロジーなどに焦点を当てずにプログラミングについて学びたい場合は、Aliceで 3D シーンを作成し始めると、プログラムが何であるかをよく知ることができます。アリスはカーネギー メロン大学を卒業しました。プログラミングを学ぼうとせずに、プログラミングの方法を学ぶことになります。
ただし、技術的な詳細について詳しく知りたい場合は、入門用のコンピ科学大学の教科書を参照することをお勧めします。次のHow C Programming Worksもいくつかの答えを与えてくれるかもしれません。
基本的に、次のような単純なものから始めます。
print("Hello World");
次に、必要な結果が得られるまで、構文糖と魔法のトークンをその上に振りかけるだけです。