プログラミング言語クラッシュコース(ブートストラップパート1)

この記事はより大きいシリーズの一部です – すべてをプログラムする方法:コアルールブック  (親シリーズ

序文

この記事は、私がプログラミング言語とコンピュータメモリについてもっと以前に作った2つの他の投稿のヒールに載っています。私がまだ「プログラミング入門」チュートリアル(言語学、哲学、電気など)を書いていない理由は2つあります。 1つは、私が最も専門家で、2つに導かれた主題です。デバイスをプログラミングするための多くの情報と背景があります。数学的な背景、抽象的な概念の背景、ダングの計算機がどのように機能し、どのような環境をバックグラウンドでプログラミングしているかがあります。つまり、私がバイナリで与えたチュートリアルは、コンピューターをどのようにプログラミングするのかという点で、氷山の一角にすぎません。私はプログラムの方法のシリーズを開始するのはどこの長期間のために考えてきましたか?私は数え上げの歴史から始めるのですか?私にとって、プログラミングは単に適用された方法で使用される数学の拡張であるため、カウントと数の抽象が成功に最も重要です。私は抽象化の過程の哲学的基礎から始めますか?コンクリートから抽象化することができ、抽象化から具体化することができることは、プログラミングの成功にとって最も重要なことです。 Extended Backus-Naur Formのような文字列書換えシステムやそのような言語の文法から始まり、様々なオートマトンや形式言語を調べますか?それは始めるのに適していますが、理論的には厚いです。

私が必要とすることは、プログラミングに関する「ブートストラップ」の投稿を提供することだと私は決めました。 私は一連の特定の言語、この場合はCプログラミング言語を調べることに興味があり、抽象的な思考のすべての歴史を解明することなく、ある時点から始める必要があります。私は何年も前にやったシリーズシリーズをいくつか構築しています。 私は何年も前にこれを書きました。私はコンピュータが何であったか、コンピュータが一般的にどのように働いたか、バイナリを数える方法などから始めました。最も重要なのは2つの特定の記事でした。 「コンピュータのメモリの仕組み」と「プログラミング言語とは何か」これらの記事はこの記事の重要なものです。私たちはそれぞれの記事に簡単に触れてくれるからです。 彼らはかなり短いと私の古いブログから、それはあまりにも難しいはずはありません。

この記事の目的は、今日使用されているほとんどのプログラミング言語が持っている、または使用している基本的な “基本”または少なくとも特性を紹介することです。 同時に、一般的に適用されるほとんどのプログラミングを理解するために必要ないくつかの基本概念を紹介します。 この記事では、異なるプログラミングの「パラダイム」やその類似点や相違点については触れていませんが、それは別の投稿に残されています。 この記事では、Prologなどの言語での論理プログラミングなどの特殊なプログラミング環境/モードについても説明しません。 代わりに、この記事では今日、野生の中にある一般的な普及したプログラミングのコンセプトについて話を進めています。

注:この記事で取り上げることは、「命令型プログラミング」として知られています。 これは、プログラミングの特定のモデル、またはプログラミングのパラダイムです。 他にも多くのモデルがありますが、今日では命令型プログラミングがおそらく最も人気があり、最も適用性が高いと思われます。 ほとんどの汎用プログラミング言語には、命令的パラダイムを利用する方法が含まれています。

プログラミングとは何ですか?

現在の現代では、私たちは “考えることができる”奇妙な機械に囲まれています。すなわち、彼らは与えられたデータに応じて異なる行動をとることができるような方法で情報を処理することができます。私たちはポイントではありませんが、コンピュータが人間の脳の思考過程を正確にシミュレートすることは可能ですが、毎日近づいています。家庭の警報システム、コンピュータネットワーク、ロボット、携帯電話、デスクトップの設置など、これらの計算装置を手に入れるための鍵は、プログラミングを介して行うことです。プログラミングとは、抽象的なタスクや機能を個々のステップ(プロセス)に分割し、これらの特定のステップを実行するためにこれらの思考デバイスの1つを教える(指示する)プロセスです。私たちは、非常に具体的で正確な “正式な”言語でこれを行い、計算装置がとらなければならないすべての小さなステップを例証します。コンピュータは、まだ、私たちのために空白を記入することはできませんので、私たちは何をすべきかを伝えるのに非常に具体的でなければなりません。

これらの正式な言語は人工的であり、人間であり、特定の規則に従います。これらはプログラミング言語と呼ばれます。コンピュータに何かをさせる方法は、私たちが選択するプログラミング言語に依存します。前のプログラミング言語の記事(上記)は、これをもう少し詳しく説明しています。今のところ、プログラミング言語は、あるレベルで何をすべきかをコンピュータに伝える方法です。

面白いやり方で、どのようにプロセスの擬人化する傾向があるのか​​、プログラミングは魔法のようなものです。マジックは、私の正接を許しているなら、現実への意志の適用、現実の「屈曲」、または純粋な意志のプロセスを通じて現実に影響を与えることです。プログラミングとは、あなたの意志をコンピュータに適用し、あなたが望むことをすることです。あなたのロボットやプログラムがあなたが望むことを野生で始めることができるようになると、それは恐ろしいエキサイティングな見通しです…そしてほぼ魔法のようです。

言語の選択

与えられたタスクを達成するために何百ものプログラミング言語があります。ある時点でどのようにプログラミング言語を選択するかは、どのライブラリが利用できるのか、何ができるのかなど、多くの要因によって異なります。あなたがプログラミングにもっと慣れていくにつれ、より抽象的な質問をするようになります。例えば、与えられた言葉でやりたいことをどれほど簡単にするかです。一般的なプログラミング言語であっても、どのプログラミング言語もすべてのタスクに適していますが、誰もが自分の望むことをするための自信を持って努力することを止めるものではありません。

プログラミング言語が持つことができる、またはそれによって測定されることができる多くの性質があります。それは完全なチューリングですか?この問題、またはその問題を処理または解決できますか?何かをするには何行ものコードが必要です。さまざまな言語での経験を積むにつれて、これらのような質問に感謝し、問題を解決するために使用する特定の言語を選択する際に考慮に入れるようになります。

最近人気のあるプログラミング言語には、Java、Python、JavaScript、Go、R、PHP、C、C ++などがあります。 C#、Scratch、Haskell、PERL、Prolog、Verilog、BASICなど、さまざまな目的のプログラミング言語が無数にあります。リストは本当に無限です。しかし、ここでの鍵は、これらの言語の多くがそれらを構成する類似の構造を共有していることです。この記事では、これらの類似点のいくつかについて説明します。

プログラムの流れ

プログラミングが一般的には、単一のプロセッサー(またはコア)の真のナットとボルトになると、時には忘れるのは簡単です。現在では、スレッド、ソケット、マルチコア、オブジェクト指向、並行プログラミングでは別のことが分かりますが、一般に1つのプロセッサ(-core)になると、一度に1つの命令しか実行できません。もちろん、オペレーティングシステムがプロセスを混乱させる可能性があり、複数のプロセッサが同時に複数の命令を実行している可能性がありますが、一般的には一度に1つの命令です。

これはあなたがやろうとしているあらゆる種類のプログラミングに当てはまります。最も簡単なプログラムは最初から最後まで、一度に1つの命令を実行します。オブジェクト指向のパラダイムでプログラミングしている場合でも(プログラムの中ではいつでも)、その特定の場所でコンピュータが実行する単一のスレッドです時間。まれに、1つのステートメントまたは式が別のステートメントまたは式が後に来ることを心配する必要があります。非線形システムを構築することもできますが、コンピュータが実行する手順をプログラムするときには、任意のコンテキストで一度に1つのステップを実行します。

多くのプログラミング言語の共有構造

今日のプログラミングの世界では、コンピュータとのやり取りの多くを「標準化」するために多くの作業が行われています。 さて、誰もが使用している標準化された言語はありませんが、それは良いことです。 プロセッサーが動作しているすべてのプロセッサーと環境が異なるため、機械語を「標準化」することすらできません。 しかし、近代的なプログラミング言語の多くは、ストレートアセンブリを超えて、いくつかの機能を共有しています(独自の方法で実装することもできます)。 これらには、変数とデータ型、演算子、式と文、フロー制御構造、関数、サブルーチン、言語の洗練されたオブジェクト指向に依存します(オブジェクト指向プログラミングはブートストラップ第2部にあります)。 私はこれらが以下に何かをさらに概説します:

変数とデータ型

プログラミングの際には、しばらくの間、数字やデータの一部を「どこかに」「保存」する必要があります。 これは、それを別のデータと比較したり、インクリメントしたりすることができます。 コンピュータは、数値または文字であるデータをそのメモリに「記憶」する。 プロセッサレジスタから、短期記憶のためのランダムアクセスメモリ(RAM)、長期記憶のためのハードドライブまで、計算装置に沿って多くの種類のメモリが存在する。 ここで重要なのは、メモリ内の任意の場所がアドレスを使用して検索可能であることです。 コンピュータにこのアドレス(通常は数値コード)を「与える」ことによって、そのデータを取得できます。

今、そこから一歩前に戻る。 私たちは記憶の海を持ち、その記憶の各点は数字で表されます。 それは素晴らしいことですが、私たちがどこにも保存した小さなデータすべての数値アドレスを覚えなければならない場合、私たちは一緒にプログラミングしていますが、それはちょっと耐え難いものになります。 それが、今日のプログラミング言語に変数が加わるところです。 変数は、覚えやすいラベルの後ろにメモリアドレスを「カプセル化」する識別子です。 そのデータを使用したい場合や、そのアドレスのデータに新しい情報を割り当てる場合は、変数を使用します。 次のように考える: myVariable = 10 、 myVariable> 20 。

多くのプログラミング言語では、変数のストーリーはかなり終わっていません。それは始まりにすぎません。 CやJavaなどの言語では、変数をタイプする必要があります。つまり、プログラマは、その変数のメモリアドレスに格納されるデータの種類を定義する必要があります。 これはデータ型と呼ばれます。 最も単純な2つのデータ型は、数値、整数、浮動小数点10進数、または複素数です。文字列は、 "like this" でつながった文字のリストです。 例えば、C言語は8ビット数の char 型、16ビット数の int 型などです。

少し複雑な重要なデータ型は配列です。 配列は単なるデータポイントのリストです。 実際には、このような文字列は実際には 'l', 'i', 'k', 'e', '', 't', 'h', 'i', ' s ', 0 。 このリストが変数 “arr”に割り当てられていれば、インデックス(通常は0から始まる)を使って個々の部分にアクセスすることができます: arr [0] ('l'); arr [2] ('k') になります); 。 これは配列のインデックス付けと呼ばれます。 考えられるのは、与えられたデータは、メモリのように番号付きのインデックス可能なシリーズであるということです。

arr["key"] のような、通常は “上位の”言語の文字列やその他の識別子で配列にアクセスすることがあります。 これらのタイプの配列は、連想配列または辞書としてよく知られています。 それらは数値でインデックスされた配列と同じように機能し、指定されたキーに関連付けられた値を返します。

より複雑なデータ型は、これらの2種類のデータ型から構造体と呼ぶものに構築できます。 構造体は、複数のデータ型とデータ型を1つのレコードに結合し、それ自体がデータ型として機能します。 たとえば、1つのレコードに人の年齢、名前、生年月日が含まれている場合があります。 この構造は「人」と呼ばれ、そのデータ型の組み合わせを含む変数はデータ型「人」のものです。 これはオブジェクト指向プログラミングの後半で重要になります。

変数をすべて強制的に強制的に特定のデータ型にし、特に型を変更しないようにする言語は、静的型付き言語と呼ばれます。 そこには、PHPやPythonなどのスクリプト言語のような言語があり、いつでも任意の変数に任意のデータ型を割り当てることができます。 これは混乱を招くように思えますが、実際にはダックタイピング(オブジェクト指向のセクションではダックタイピング)のような重大な利点があります。 変数との関係は、動的に型付けされた言語と呼ばれます。

いくつかのプログラムには定数(PHPなど)という特別な機能もあります。 定数は、決して値を変更しない変数です。 それらを一度割り当てたり定義したりしてから、残りのプログラムで使用します。 通常、大文字はすべての大文字を使用してプログラムに示されます。(LIKE THIS, THIS IS UPPER CASE) これらは、プログラム全体で何度も使用されるすべてのタイプの設定を設定するのに便利です。

では、これらの変数をどうすればいいのですか? どのように私たちはこのデータすべてを処理するようコンピュータに指示しますか? 答えは演算子です。

演算子

 

プログラミング言語は、さまざまなことを行う演算子で構成されています。たとえば、式の結果を変数に代入する代入演算子(通常は “=”)があります。 2つの式の結果を加算して別の結果を得る加算演算子(通常は “+”)もあります。ここでの表現の使い方がちょっと混乱していても心配しないでください。すぐに表現をカバーします。

いくつかの演算子は単項演算子であり、 “++”のような1つのオペランドで動作します: myVariable++ 。これは、myVariableが保持する値を1だけインクリメントするようプログラミング言語に指示します。他の演算子はバイナリであり、2つのオペランドで動作します。通常、算術演算子は、加算、減算、除算、および乗算などのilkです。 2 * 2; 3/1; 4 + 5; 9 - 3;  。この例のオペランドはオペレータの左右にあります(ただし、LispやPostScriptなどのプログラミング言語ではありません)。いくつかの言語では通常は条件をテストする珍しい三項演算子が存在しますが、後で残すのが最良です。

一般的な考え方は、演算子が与えられると、プログラミング言語は値を計算し、演算子に応じて、その値で何かを実行するということです。

表現とステートメント

いくつかの言語では、式とステートメントの違いは少しぼやけています。 私は一般的に、式として直ちに計算可能なものを定義します。つまり、そのまま値に置き換えることができます。 ステートメントは、通常、オペレーターの解釈を通して、何かを行うものです。 式とステートメントの両方に演算子を使用でき、式とステートメントの両方に副作用が生じることがあります。 演算子は、コンピュータに何かを実行させるか、何らかの方法で何かを計算させるコード(通常はシンボル)です。

演算子を想像したり理解したりする最も簡単な方法は、まず数学を考えることです。 私たちは 2 + 3 + 5 を見れば、「ああ、それは10に等しい。それは2対5を加えて、その結果を別の5に加えるからだ。 私の友人は加算演算子を使った式です。 なぜそれは表現であり、陳述ではないのですか? まあ、どんなプログラミング言語でも与えられた表現は10の値を計算する(置き換えられる)が、それが計算されたのと同じくらい速く、我々は何もしなかったので忘れてしまった。

Where as the following is a statement:  myVariable = 10 .  Why is this a statement?  It uses the assignment operator to make myVariable (a variable, see above) equal and store the value 10.  This actually does something so to speak, if I were type  myVariable in the programming language from now on it’ll be equivalent to 10.

次の文は myVariable = 10 です。 これはなぜ声明ですか? これは代入演算子を使用して myVariable (変数、上を参照)を等しくし、値10を格納します。これはプログラミング言語でmyVariableをタイプした場合、10と同じになります。

表現やステートメントは難しいことです。 例えば、上記の myVariable を単に入力することによって実行された可変解像度は、式です。 それは myVariable の値を計算し、それを置き換えました。 myVariable = 2 + 5 + (3 * 6) 行は式とステートメントの組み合わせです。 式は計算可能な限り小さな式で構成することができます。この場合、 2 + 5 +(3 * 6) は次のような小さな式に分割できます。

“exp”は式を表し、 “stmt”はステートメントを表し、 ” – “は演算子を表します。 ここで重要なのは、式が計算され、置き換えられる一方で、ステートメントが実行される(何かを行う)と、私たちに価値を与えないかもしれないということです。

フロー制御

あなたは一緒に行くし、あなたの小さな心をプログラミングしているが、あなたはいくつかの難しさに走っている。 たとえば、ロボットを10歩歩進させ、10歩歩くようにすることができます。 しかし、実際に10歩歩くことができるようにするには、動きセンサーの入力に応じて、左右に10歩歩きます。 ここで、フロー制御構造と呼ばれるものが必要です。

条件式

ここで検討しているフロー制御文の正確なタイプは、「if節」と呼ばれます。 「forループ」、「while」など、いくつかのタイプのフロー制御ステートメントがあります。しかし、これらの文/節はすべて、比較演算子を使用する特定のタイプの式(上記参照)に依存します(上記参照)。これはどういう意味ですか?ここでは、ほとんどのプログラミング言語が基本的な基礎として提供する一般的な比較演算子を示します: <, >, >=, <=, == 。それぞれ、「より小さい」、「より大きい」、「より大きいか等しい」、「より小さいか等しい」および「等しい」(または同等)を意味する。あなたは次のように使います: variable1> variable2; 6 <= variable3; myVariable == 6;  。これは真偽値を計算する点で特別な表現です。示された条件が真の場合、variable1が実際にvariable2より大きい場合、最初の式は “true”として計算されます。多くのプログラミング言語では、「not」演算子、通常は感嘆符、括弧で囲むことができる機能、複数の条件を論理接続に含める機能など、これらの真理式(比較式)をより洗練されたものにしています。 “と” and “または” operators(通常&&と||)を使用します。例えば、より洗練された言語では、 (a <3)&&!((b == 4)||(b == 1)) と書くことができます。これは、 “変数bは4または1ではなく、変数aは3未満です。心配しないでください。コンピュータはそれをすべて計算し、真実または偽の結果を与えます。

これらの比較式は、真または偽の値を返す単純な式ですが、それでも式です。 コンピュータはそれらを計算し、その値を置き換えて移動します。 私たちはどのようにしてa <3を使用するのですか? 比較の結果を使用する最も簡単な方法の1つはif節です。 if節は、何かが真であれば1組のステートメントを実行し、オプションであれば何かが偽であれば別のステートメントのセットを実行するようにコンピューターに指示する方法です。 これは一般的に次のように構成されています(一部のプログラミング言語では角括弧は使用されません)。

これは基本的に読み取ります: “aが3未満の場合はstatement1とstatement2を実行し、そうでなければ(3以上の場合)statement3とstatement4を実行します”。

これはフロー制御構造と呼ばれ、コンピュータによるプログラムの線形ステップバイステップ解釈を中断し、テストを提示し、そのテストに応じて異なるステートメントに進みます。 これはプログラムフローに影響します。 if節文が実行された後、フローは通常のようにプログラムを続けます。 たいていの場合、else節はオプションであることに注意してください。しかし、新しいif節を書かずに、何かが偽である場合に何かしたい場合に使用できます。

ルーピングコンストラクト

いくつかのことを何度もしたいが、ステートメントを繰り返しコピーアンドペーストしてプログラムに貼り付けたくない場合はどうなるのだろうか?ループ構造を使用できます。与えられた言語にはいくつかのループ構造がありますが、通常はwhileループとforループの2つの基礎を基礎として持っています。 foreachループとdo-whileループもあります。

ループ構造は変数と条件式を使用して、囲み文を何回実行するかを決定します。通常、変数はループのたびにインクリメントされるか、そうでなければ更新され、与えられた式の条件が満たされるとループが停止します。変数を正しく更新したり、不正な条件文を記述したり、無限ループと呼ばれる原因となる可能性があります。非常に特殊な状況を除いて、これらは避けなければならない。

与えられたwhileループの構文や構造は次のようになります(一部の言語では角括弧は使用されません)。

見て分かるように、if節のように非常によく似ています。というのは、ループが括弧の先頭に戻り、式の条件が真と評価されている限り、何度もやり直すという利点です。 この場合、aが0に等しくなると、statement1とstatement2は3回実行されます。 1つはa = 0、1つはa = 1、もう1つはa = 2です。

再び、これがフロー制御構造と見なされる理由は、プログラムの次の命令、次の命令、次の命令…の通常の線形流れを取り、それを “戻る”ようにして、 条件が満たされる。

forループの構文や構造はもう少し複雑です。通常の構文を示すためにC言語のバージョンから取り上げますが、多くの言語が異なります:

ここでは、forループがステートメントの本体(statement1-3)と、そのconditional節に2つのステートメントと1つの条件式で構成されていることがわかります。最初に、使用する変数a(to 0)を初期化します。次に、ループを再実行するかどうかを決定する条件を決定します(a <5)。最後に、すべてのループの最後に何をすべきかをコンピュータに伝えます(statement3が実行された後、aが1つ増えます)。

この場合、statement1、statement2、およびstatement3がこの順番で5回実行されます(a = 0、a = 1、a = 2、a = 3、a = 4)。

foreachループの構文や構造は、言語に依存しています。この場合、PHPのバージョンのforeachループを使用してその機能を説明します。 foreachループはforループと異なり、配列全体に対して反復処理(または一度に1つずつ処理)します(上記参照)。つまり、ループ内のステートメントが使用できる一時変数に配列の単一要素を割り当てます。これを説明する例を次に示します。

この場合、statement1とstatement2は6回実行され、各ループ$ valは配列 “arr”の次の項目と等しくなります:val = 0、val = 5、val = 8,2,4,3。 スクリプティング言語のような高級言語には、この種のフロー制御構造がありますので、今それを熟知することをお勧めします。 すべての言語がこの構文を持っているわけではありませんし、しばしばその構文が非常に異なっています(たとえば、 “as”の代わりに “in”を使用するなど)。

最後に説明するフロー制御式/文は、関数またはサブルーチンです。

関数とサブルーチン

だから私たちはプログラムを持っており、それは最初から最後まで続きますが、途中で特定のステートメントを実行するかもしれないし、他のセクションも実行しないかもしれませんが、いくつかの部分はある回数繰り返されますが、終わりに終わります。すべてはうまくいいですね。さて、私たちの小さなロボットに戻ってみましょう。

私たちのロボットが、腕を上げ、目が緑色に変わって、喜んで応答するようになるたびに、「Yay!」と言いたいとしましょう。それは可愛いじゃない?しかし、私たちは少し問題があります。彼は、多くの異なる時間に、そして多くの異なる種類の入力に応じて、彼に3段階の幸せな応答を与えるかもしれません。現時点では、私たちのプログラミング知識では、3つの特定のステップをプログラムのどこにでも挿入して、その応答を行う必要があります。それは良い考えではありません。

1つは、あなたがオレンジ色に目を変えることを決めたらどうでしょうか?さて、あなたはいつも自分の目の色を常に一定にして(上記参照)、それを使って定数をオレンジ色に変えることができます。さて、もしあなたが後で両方の代わりに1つのアームを上げることを決めたら?それから、プログラム全体を見て、両腕を上げて「ええ」と言い、片方の腕を上げるだけの声明で置き換えてみましょう。それは退屈でエラーを起こしやすい。では、私たちは何をすべきですか?

答えはサブルーチンです。すべての言語が基本的なサブルーチンを持っているわけではなく、このようなものを関数として実装しているわけではありません。サブルーチンにはない機能がいくつかあります(意図しない)。サブルーチンは、コンピュータが任意の時点で「呼び出す」ことができ、その後メインプログラムフローに戻ることができるステートメントの集合です。つまり、プログラムは停止し、プログラム内のどこに記録し、サブルーチンに含まれているステートメントにジャンプして実行し、以前の位置に戻ります。

これは気の利いたものです!ここでは、サブルーチンとしてのロボットの幸せな応答を書くことができます。そして、コード内のどこからでもそのサブルーチンを “ジャンプ”したり呼び出すことができます。これは便利なのですが、プログラムを適切に記述すれば、サブルーチンを変更してプログラムのどこにでも反映させることができます。それは次のようになります(BASICで):

ここでは、 “gosub”演算子がプログラムを “line” 10000にジャンプしてから、 “return”演算子がプログラムの流れをどこに戻ったかを見ることができます。非常に素晴らしい!しかし、サブルーチンにはいくつかの欠点があります。何らかの情報をサブルーチンに渡して、少し違った動作をさせたいのであればどうでしょうか?つまり、いくつかの情報を入力しますか?サブルーチンが何かを計算したので、サブルーチンから値を返す場合はどうしますか?このBASICの例では、グローバル変数を使用する必要があります(下記のグローバルスコープの詳細についてはこちらをご覧ください)。より良い答えは関数です。

関数は基本的にサブルーチンですが、いくつかの追加されたベルとホイッスルが付属しています。それが持つ最初の特別な機能は、引数と呼ばれるものを取ることができるということです。これらは、呼び出されたときに関数に渡すことができるデータの部分です。それらは、その関数でのみ使用される関数定義内の変数によって定義されます(以下のスコープを参照)。もう一つのパズルは、関数が値を返すことができるということです。あなたが戻ってきたときにプログラムにいた場所に単にジャンプするのではなく、実際に関数で計算された値を、呼び出されたときの関数の値として置き換えることができます。次に例を示します。

ここでは、単に数値を加算するsumという関数を定義します。ここでsumは関数の名前なので、プログラム内のどこかでその識別子を使用すると、コンピュータは関数を “呼び出し”ていることが分かります。関数定義の中で “arg1″と “arg2″を識別することができます。これらは関数の引数であり、プログラム内のどこからでも呼び出されたときに関数に渡されるデータを保持します。関数の文ブロック内では、arg1 + arg2の式の結果を格納する変数 “localvar”(これについてはこれ以上)を定義しています。最後に、localvarを返します。これは、localvarに格納されているデータを返します。これは元の関数呼び出しを戻り値で置き換え、その値は呼び出しステートメントの残りの部分で使用されます。

一度に多くの魔法が進行するので、私はそれを打ち破ります。

これまでのように関数sumを定義したとしましょう。私たちが最初のsumvar1ステートメントを実行するとき、ステップを進めましょう:

私は、この図が、私が反復したばかりのプロセスを説明できることを願っています。要するに、関数を呼び出すときに値を関数に渡します。これらの値は関数の引数として割り当てられ、関数はこれらの引数に作用し、値を返します。

関数呼び出しは戻り値で置き換えられるため、実際には文ではありませんが、プログラミング言語によっては異なる場合がありますが、式であることに注意してください。それらは直ちに計算可能である。これは混乱するようになることがあります。たまに関数が副作用を持ち、物事を計算するだけでなく、時には機能することもあるからです。しかし、一般的に、ほとんどの言語では、戻り値に解決できるため、式です。

しかし、それらは式なので、if節やwhileループなどの他のフロー制御構造でも使用できます。これは、関数がtrueまたはfalseの値を返すことができるため、その式を評価するときにすべてif節またはwhileループを探しているからです。だからあなたは次のようなものを持つことができます:

一般に、式を使用できる場所であればどこでも関数呼び出しや呼び出しを使用できます。

可変スコープ

私たちがsum関数でlocalvar変数を作ったとき、私はそれを “local”というラベルを付けたことに気付いたかもしれません。これは、最も一般的なプログラミング言語にも存在するためです。それが範囲の概念です。

スコープはやや抽象的な概念であり、すべてのプログラミング言語は残念ながら独自のスコープの定義を持っています。スコープは、基本的には、言語で何が参照できるかという考え方です。つまり、ここで変数を作成すると、その変数をここで参照できますか?私がここで機能を作ったら、その機能をこのプログラムの他の部分で参照できますか?それに対する答えは範囲です。アイデアは、一般に2つの異なるスコープがあるということです。そこに定義されているものがプログラムのどこでも参照できるグローバルなスコープがあります。スコープの幅は狭く、狭くなります。いくつかのプログラミング言語には、モジュールスコープ、ファイルスコープなどがあります。これらをすべてローカルスコープと呼んでいます。ローカルスコープは、関数や変数などの何かを定義すると、プログラムの他の部分がそれを “参照”または参照することができなくなる、プログラム内の場所です。私は例を挙げます:

ブロックスコープを使用している場合、これはエラーをスローします。 スコープにはさまざまなモデルがあり、スコープはクラスとオブジェクト(次の記事)になると全く新しい次元を取ります。 myFunc関数でmylocalvarvを定義したため、これはエラーをスローします。 各関数は独自のローカルスコープを定義しています。この場合、mylocalvarはその特定の関数のスコープに入ります。 その関数の外にあるもの、メインコード、別の関数などはその関数スコープにアクセスできません。 実際、関数が返ってくるとすぐに、mylocalvarはコンピュータによって忘れ去られます。 mylocalvarをmyglobalvarに割り当てると、mylocalvarが存在しないため、できません。 それが範囲の力です。

結論

変数、データ型、フロー制御、関数、式、ステートメント、サブルーチンなどをベルトの下に置くことで、広く普及している一般的な目的言語からどのようなプログラミングも完全に理解できるようになります。 これは実際に今日のプログラミングを構成するものの中核です(PrologやLISPなどのより特殊な言語を使用していないことが認められています)。 あなたは、C、PHP、Pythonなどでこの理解をかなり遠くに得ることができます。 すべてのプログラミング言語はこれらの構文にバリエーションがありますので、その言語でプログラミングしたい場合はそれぞれを学習する必要がありますが、これらはコアです。

次回の記事では、オブジェクト指向プログラミングと、それがプログラマーに提供する用語やニュアンスのスルーを探求したいと考えています。 クラス、オブジェクト、プロトタイプ、継承、ポリモフィズムなどのことを学びます。 次回お会いしましょう!

私のチュートリアルと知恵に感謝したら、私をパトリオンで支えてください。

しかし、毎月の約束があなたにとって少し不必要であれば、私にコーヒーを買うことを検討するかもしれません。

この記事はより大きいシリーズの一部です – すべてをプログラムする方法:コアルールブック  (親シリーズ

photo credit: catsocmedia Staying hydrated via photopin (license)

Liked it? Take a second to support kadar on Patreon!

あわせて読みたい

コメントを残す

%d人のブロガーが「いいね」をつけました。