プログラミング言語が割り当てに=を使用し始めたのはなぜですか?


13

ほとんどの初期のアルゴリズムの本では、<-割り当てと=比較に言及していました。しかし、最近では、=割り当てに使用しない言語はPascal(:=)とCOOLのようなおもちゃの言語だけです。現代のプログラミング言語=が、数学的な平等の意味ではなく、意味の割り当てに変わった原因は何ですか?


8
私を始めさせないでください===...
鹿ハンター

1
アルゴリズム作業では一般的です。これは、アルゴリズムを記述するときの割り当ての3つの一般的な表記法の1つです(他は:=and =)。プログラマー全員が使用するからと=いって、数学者全員が落ちたというわけではありません
15年

@DeerHunter ===は大丈夫です。
ダースEgregious

1
私は中学生のgirlえ声がありました:「どうしてxにxプラス1を等しくすることができますか?」私が教えたイントロで。これはコンピューターの根本的な奇妙さです。変数は自然界には存在せず、宇宙の他の物とは異なります。

1
User251748:私の財布は現実世界の変数であり、複数セットのコイン、紙幣、時々紙片が含まれています。
gnasher729

回答:


14

ウィキペディアによると、割り当てにイコールを使用することは、1949年から1951年に設計されたハインツルティスハウザーの言語スーパープランにまでさかのぼり、Fortranで特に普及しました。

悪いアイデアの悪名高い例は、割り当てを示す等号の選択でした。1957年にFortranに戻り、言語デザイナーの軍隊によって盲目的にコピーされました。なぜ悪い考えですか?「=」が平等の比較、つまり真または偽のいずれかの述語を表すようにすることは、世紀の伝統を覆すためです。しかし、Fortranは、割り当て、平等の強制を意味します。この場合、オペランドは等しくないフッターにあります。左のオペランド(変数)は右のオペランド(式)と等しくなります。x = yは、y = xと同じことを意味しません。

—Niklaus Wirth、良いアイデア、ガラスを通して

Konrad ZuseはPlankalkulにも等号を使用しましたが、これはRutishauserのSuperplanに影響を与えましたが、コンパイラは考案されていませんでした。なぜ彼は等号を選んだのですか?彼に尋ねる必要があると思います。


4
まあ、確かに悪いアイデアがありました。結局のところ、数学のテキストは=、述語として、および変数を定義するために、たとえば「x = 4とします。その後、y = 4の場合、√(x-y)はゼロです」を使用します。これが機能するのは、数学表記が命令的ではなく宣言的に理解される必要があるためです。関数型プログラミング言語(MLファミリなど)は、デフォルトで変更不可能な変数であるため=、問題なく二重の役割で引き続き使用できます。より正確に=は、演算子であり、let構文の一部です。
アモン

2
@amon:数学の二重の意味については同意しません。「Let 4 = x」は「Let x = 4」と同じくらい有効です。
から来る

4
@COMEFROM "Let 4 = x"は、ユーザー名を取得するINTERCALステートメントと同じくらい不自然です。「x」がこれまでに言及されたことがない場合、「Let x = {something}」または「Let x as a {widget}」は、値を指定することに加えて変数を導入します。それは、少なくとも直観の点では、これは単に「値が...に等しい」と述べることとは異なるためです。

3
@delnan "Let x = 4"は、 "Let x∈ℤand x = 4"の短縮形です。コンテキストは新しい変数を導入し、=使用される他の場所と同じように、単なる述語になります。コンテキストに応じて、「Let x = 4」は「Let x∈ℝand x = 4」も意味することに注意してください。
ドーバル

2
@RobertHarvey私たちは、Cプログラミングではなく数学的記述について話しています。来て:私はそれが前に置いたほど明確ではないことを認めますが、数学的散文は慣習に基づいており、「let 4 = x」を許可するために弁護士化できる仕様がないので、そうではありません「let x = 4」ほど有効ではありません。少なくとも、読者を混乱させるため、散文の主要な目的を達成できません

7

しかし、私が学校で数学をしたとき、「let x = 123」

一般的なフレージングでした。Basicの初期バージョンでは、equalの前に「let」キーワードが必要でした。したがって、基本的に「許可」するために行われる沸騰が理解されます。

通常は考慮されていないが、実際に何を入力したかは重要なドライバーです。

実行可能な入力デバイスは2つあり、

  • 標準のテレタイプマシンを使用してペーパーリボンに小さな穴を開けて、コンピューターで読み取ることができる「テレタイプ」。これは、大文字と小文字の標準的なaplphabetとキーボードの一番上の行のほとんどの文字をサポートしているので、それほど悪くはありませんでした。
  • パンチカード-大企業ではソーター、タブレーター、プリンターの使用が一般的であるため、多くのパンチカードマシンがぶら下がっていました。これらは、非常に限られた文字セットの大文字のみのアルファベットと限られた数の「特殊」文字をサポートしていました。

テレタイプは、アカデミックショップやミリタリーショップ、より多くの商業店でのカードパンチで使用される傾向がありました。したがって、Pascalのような学術言語は、小文字の識別子と、「:=」のような「賢明な」表記法を割り当てにサポートしていました。より商業的な聴衆を対象とした言語は、パンチカードが入力のメイン形式であると想定していたため、FORTRANやCOBOLなどの大文字のみの言語は、標準のキーパンチでは使用できなかった「:;> <」文字のサポートが制限されていました。

ちなみに、比較は「.LT。」、「。LE。」、「。EQ。」、「。GE。」を使用して行われたため、「=」が初期FORTRANの割り当てに使用されていることについてあいまいさはありませんでした。および「.GT」構文。


しかし、私はどんな種類の課題よりもlet x = 123似ていると思いますassert(x == 123)
-AKHolland

1
PSあなたがつまらなくなっているなら、COBOL「MOVE」構文は、コンピューターが実際に行っていることの最も正確な記述です。「コピー」はさらに正確ですが。
ジェームズアンダーソン

123の値が大きいため@AKHolland

C ++が移動コンストラクターを発明したため、COBOLの「MOVE」はかなり奇妙に聞こえます。
gnasher729

LETは、割り当てを平等性テストから際立たせるため、BASICでは必須であり続けるべきだと常に考えていました。COBOL風の速記のようなもの。問題は、ソース内の別の別のトークン、当時のteeeenyの小さなPC内の別の貴重なバイトを使用することです。そこで彼らはそれを落とした。
チャックアダムス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.