「x=x+1」問題をプログラマーから単純明快な説明をする
ちょっと時期が遅れてしまったが、「x=x+1」問題をプログラマーから単純明快な説明したいと思う。実は頭がいい人ほどがわからないが、基本的なプログラマー脳を持っている人なら普通にシンプルな問題なんじゃないかな。
一旦はX(旧Twitter)でどんな話題になっているかをまとめてみた
「x=x+1」問題 ポストまとめ
x=x+1がわからない初心者がいる ← わかる
— Yukihiro Matz (@yukihiro_matz) November 8, 2023
だから代入記号を変えて:=などにしよう ← わからない
初見でわからないのは当然としても、説明されてもわかりたくない人は学習意欲がないだけでは。初心者も成長するので、初心者向け機能は(学習向け専用言語以外では)不要だというのが言語進化の教訓では
「京大生でもx=x+1がわからない」ってやつ、最初は何も知識ないからわからない(当たり前)だけなのに、「わからない」を「習っても理解できない」と勝手に読み替えてる人が多くてウーンという感じだ
— 乱歩 (@iIovebio1) November 8, 2023
プログラミングには縁がないけれど、x=x+1 のように変数に割り当てられた値を変更することは数学の証明でも事実上行われていて、「ε>0 をより小さい数に取り換えて、…としてよい」などはその例だと思う。
— Atsushi Yamashita (@yamyam_topo) November 10, 2023
x=x+1は有名だが、こちらは新鮮だった>『繰り返し構文に使われる「for i」という表現に学生が戸惑うことも例として挙げた。「for you」という英語を連想してしまうからだ』 / “「京大生でもx=x+1が分からない」、喜多教授が明かすPython教育の実態” https://t.co/8jpxac6PPJ
— 徳丸 浩 (@ockeghem) November 7, 2023
そうか。数学を先にやってプログラミングをやると x=x+1 は方程式に見えてしまうのか
— 椚座 くにゅくにゅ/// 淳介 @ NT東京運営 (@kunukunu) November 7, 2023
x = x + 1 が受け入れられない人、x++ や x += 1 は受け入れられるのか謎
— シャポコ🌵 (@shapoco) November 7, 2023
言われてみれば、確かにプログラム書いたことない人からしたら、x=x+1とか、どうあがいても成立しない意味不明な式だよな。
— お侍さん (@ZanEngineer) November 7, 2023
>「京大生でもx=x+1が分からない」、喜多教授が明かすPython教育の実態 pic.twitter.com/Plx5oHqLeF
数学脳とプログラマー脳の違い
X(旧Twitter)でポストしている人達の内容を考えるに基本的には、数学脳とプログラマー脳の違いだという事が分かる。何故、解釈が違くなってしまうのか?そこがこの問題のポイントだと思う。
数学脳は「=」が代入演算子だという事が理解できないからでは
数学での代入演算子は「:=」だ。
最初に数学を勉強したか、プログラミングを勉強したかで、各々で「=」の解釈が変わってしまうのが「x=x+1」問題の根本の問題。
そもそもプログラミング言語と数学との整合性はない
- 数学の代入演算子
- 数学の等価演算子
- プログラミング言語の代入演算子
- プログラミング言語の等価演算子
がかなり違いがあるのも混乱の元であるのは間違いない。
数学とプログラミング言語の代入演算子,等価演算子 比較一覧表
様式 | 代入演算子 | 等価演算子 | 備考 |
数学 | := | = | |
フローチャート | <- | = | 矢印(<-)は反対向き(->)も可能 |
ALGOL 68 | := | = | |
BASICライク[note 1] | = | = | 代入時にはLETキーワードを使用(省略可能) |
C言語ライク[note 2] | = | == | |
COBOL | = or MOVE TO | = | = 演算子を使う際にはCOMPUTEキーワードを付ける |
ColdFusion | = | EQ | |
Fortran | = | .EQ. | Fortran 90からはC言語ライクの等価演算子もサポート |
APL | ← | = | 専用のキーボードを使い直接入力可能 |
Smalltalk | ← | = | Pharoなど比較的新しい処理系では代入に:=も使用可能に |
GO | = or := | == | 関数内に限り:=演算子を使用することで、varキーワードも省略可能 |
Haskellライク[note 3] | = | = | 束縛時にLETキーワードを付けるとローカル変数、付けないとグローバル変数扱い |
Javascript | = | == | 代入時にvarキーワードを付けるとローカル変数、付けないとグローバル変数扱い |
Pascalライク[note 4] | := | = | |
PL/SQL(Oracle) | := | = | |
Prolog | = | is or =:= | 代入は束縛 |
Scala | = | = | varキーワードを付けると再代入可能、valキーワードを付ける再代入不可 |
R | <- or = | == | 矢印(<-)は反対向き(->)も可能、= 演算子は関数呼出の際の引数[省略]名時に使用 |
shライクなシェル[note 5] | = | -eq | |
MATLAB | = | == | |
Mathematica | = | == | |
バッチファイル | = | EQU | 代入時にはSETキーワードを使用 |
なでしこ | = or は or 代入 | = or == | 変数への代入方法は3つ。変数 = 値、変数は値、値を変数に代入 |
数学ならxは定数。プログラムならxは入れ物
プログラミング脳では当たり前の変数に関しても、数学脳で考えると混乱するという。自分自身も変数はだたの箱だと感覚では思っていて、どんな箱かは代入内容によって変わる。
- シンプルな数字や文字列なのか
- 箱に箱を入れたarrayなのか
- はたまたオブジェクト型なのか
でプログラミング脳では考えたり解釈する
決して「定数」ではないのだ。
プログラミング言語では「定数」は「定数」として定義できるので。
まとめ
プログラミング言語を学習せず京大のような頭の良い大学へ行く人がかかる特殊な病みたいなものだと思った。
自分はほぼ数学ができないので、この病にかかった事がない。
全ての情報をまとめて出した結論は単純明快で
- 「=」の解釈の違い
- 「変数」の解釈の違い
この2点に集約される。
- 完全無料Basicはオープンソースで運営されています。誰しもが自由にBasicを利用できます。
- 超軽量化で超高速配信通常のCMSよりページ容量を70%以上を自動で圧縮を行い更に自動で静的化・圧縮化されたページが配信されます。
- SEOにつよつよ70%以上軽量化に加えて最新SEOに対応した構造で静的化・圧縮化されたページはライバルサイトより圧倒的に評価されます
ライバルサイトより一歩前にいけるCMSでサイトを構築しませんか?