プログラミングを覚えても

# はじめに

これはたぶんエッセイです。
なぜこんな駄文を書き出したのか。。。

# 私

私には友達が一人もいません。
できないのではなくて、いらないタイプです。
人付き合いは得意ですが、人と付き合うのが嫌いです。
人様にやたらモテますが、私はあまり人類に好感を持っていないようです。

私は人に物事を教わるのが苦手です。
何でも独学でないと頭に入ってきません。
IQ はたぶん低いです。EQ はたぶん高いです。
根っからのマイペース人間のようです。

というわけで、プログラミングは独学です。
もちろん書籍・ネットは利用します。

10年以上プログラミングを独学していますが、
面白いことに仕事で役に立ったことがありません。
日常が便利になった記憶もありません。

ですが、世の中のものの見方は大いに変わりました。
私にとってプログラミングとは、思想・哲学に近いようです。

独学していて日々感じるのは、
書籍もネットも「使い方」のオンパレードです。
私は「どうやるか」ではなく「何なのか」が知りたいタイプです。

プログラミングを学んだことで、
世間にも「命令型」と「宣言型」が見えるようになりました。

こちらは実装重視、あちらは仕様重視なんだと。
日本は命令型かな？諸外国は宣言型かな？
日本は算数的で、諸外国は数学的かな？
この人の話し方は How だな。
あの人の話し方は What だね。
もうひとつあるなー、Why の人もいるなー。
Why のプログラミング言語って何だろ？
そこが芸術の領域なのかな？

そんなことを考えるようになってしまいました。

# プログラミングとは何か？

[プログラミング (コンピュータ) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF) "プログラミング (コンピュータ) - Wikipedia")

計算を自動で行う「コンピューター」というものがありまして、
それに指示を出す「プログラマー」もおりまして、
そのプログラマーは「プログラム」というもので指示を与えるわけで、
このプログラムを作る方法を知らないといけないわけです。

プログラム作成法を覚え、それをコンピューターに指示する方法を知り、
この一連の流れが「プログラミング」であり、
このプログラミングの成否には一切関係なく、
この行いをした者は「プログラマー」だということみたいです。

そういうわけで、私はたぶんプログラマーです。

# コンピューターとは何か？

[コンピューターと呼ばれた女性たち](http://www.infonet.co.jp/ueyama/ip/episode/computer.html "コンピューターと呼ばれた女性たち")

やはり歴史は面白いですね。
コンピューターは人間から機械に置き換わったわけですが、
「果たしてそうだろうか？」と考えると微妙です。

# 計算とは何か？

ここまで普遍的になってくると、もう哲学です。

では、言語とは？記憶とは？意識とは？生命とは？
人類はまだまだ何も理解していないようです。

とりあえず落とし所を決めましょう。

昔々どこぞの頭のやたらいい人がでっち上げました。

「これこれこういう性質のあるものは数である」
「数同士は計算できる」

どこぞのカリスマ CEO の様な感じです。

「私にはビジョンがあります！」

宣言型です。

そんなことが世界各地で同時多発して、色々とふるいに掛けられ、
その知恵の結晶の一部を我々は算数や数学の授業で学びます。
そして、そろばんや電卓の意味を漠然と掴みます。

私の経験上、
整数の意味と、四則演算の簡単なルールを知っていれば、
プログラミングができます！
そして、そのプログラミングが成功しようが失敗しようが、
その行いをしたあなたはもうプログラマーなのです！（うるさい

あとあれです、
プログラマとか、コンピュータとか、
最後の横棒を省くと、知ってる奴的な感じになれます。

# はじめの一歩

私が最初に勉強した言語は Java でした。
当時やっていた MMORPG の BOT スクリプトをいじり出しましてね、
そしたらゲーム自体に興味が無くなってしまいまして、
BOT やってるとアカウントが消されちゃうなーと、
エミュレート・サーバ拾ってきたら Java で作られていたという話です。

このはじめの一歩のお蔭で Java が嫌いです。
というかオブジェクト指向言語が嫌いです。

とにかくゲームが作りたかったので C言語に移ったわけですが、
そのお蔭で命令型言語が嫌いです。
というか静的型付け言語が嫌いです。

もうこれはプログラミングの資質が無いんだと諦めたところ Lisp を知ります。
お陰様で動的型付け・宣言型言語が好きになるわけですが、
Windows が嫌いになりました。

どうやら私はミニマリストのようです。

# プログラミング言語

「人気のプログラミング言語」とか検索すると、
ほとんどがオブジェクト指向・命令型言語です。
この「人気」ってのが誤解を生みそうです。
「好かれている」よりは「シェアが高い」という意味な気がします。
OS 界の Windows と同じ感じがします。

プログラミングを勉強する立場からすると、
三大 OS の順位は Linux > Mac > Windows だと思います。
私の偏見ですが、Mac、Windows はもう家電 OS としか感じません。
これは家電の OS という意味ではなく、
この OS が入った時点で家電だ、という意味です。

また、最近の若者はスマホだけの人が多いようですし、
セキュリティ・リスクも考慮して Windows 一強の牙城は崩れそうです。

そんな Windows 嫌いな私ですが、それでも Windows しか使っていません。

「あれができる、あそこにもある」

これにはなかなか勝てません。
ですが、プログラミングとなると話は逆転します。

「あれもなければ、これもない」
「インストールしたけど、まともに動かない」
「そもそもインストールの仕方がわからない」

資本主義社会ではどこも同じ状況になります。
「何なのか？」よりも「どうやるか？」の方がシェアが取れます。

「なんだかわからんけどコピペしたら動いた」

私はそんなライフハックにはあまり興味がありません。

# Programming in Windows

Windows のインストールされたパソコンを所有しているとして、
初期状態でプログラミングをやってみようと考えます。
候補は極めて少ないです。

- PowerShell
- コマンドプロンプト（バッチファイル）
- Active Scripting

Microsoft は PowerShell 以外は残す気はないでしょう。
ということで PowerShell をやってみたのですが、
これでプログラミングとか、ちょっとゲッソリです。
これはあくまでも Shell ですからね。
しかもコマンドプロンプトぐらいサクッと使えるだろうと思うと、
泥沼が待っています。

「.Net 理解してください」
「その内 C# 覚えましょうね」

ってメッセージを感じます。
ゲッソリです。
もっとサクッとプログラミングしたいなー。

MSX 時代のワクワク感が懐かしくなる世代です。
まぁその当時はプログラミングしてませんけど。

## 一番楽しかった言語

今まで色々な言語を触ってきましたが、
もっとも楽しめたのは HTML です。
Javascript じゃないです。

マークアップ言語って宣言的じゃないですか。
それなのになんでそれを操作する言語は命令型ばかりなんでしょうか。

## Hello World!

```html:index.html
<html>
  <head>
    <title>Hello World!</title>
  </head>
  <body>
    <p>Hello World!</p>
  </body>
</html>
```
![html.png](https://qiita-image-store.s3.amazonaws.com/0/105190/89c3ce22-0044-cbe2-62e0-b2c699ed667e.png)

書いてすぐ結果が確認できる。
これが一番楽しいです。

```scheme:Lisp
(html
  (head
    (title "Hello World!") )
  (body
    (p "Hello World!") ))
```

どう考えても Lisp の方がマッチする気がするんですが、
Lisp が人間にマッチしないということだったんでしょうね。

```hello.cmd
@echo Hello World!
```

```cmd.exe
> hello
Hello World!

> hello > sample.txt

> type sample.txt
Hello World!
```

これぐらいならバッチファイルも楽なんですが、
Linux のシェルスクリプトと同じかなーと思うと泥沼です。

だから PowerShell なんですけど、
スクリプト書いてもすぐ動かせません。
「セキュリティ・リスクを考慮してうんだらかんだら」と始まります。

## 私のおすすめ

特に明確な目標があるわけでもなく、
プログラミング自体に興味があるならば、
加えて、Windows だけしか環境がないならば、
私は Lua をおすすめします。
C への組み込み用途ではなく、スタンドアローンです。

### Hello World! by Lua

下記より `lua-5.3.X_WinXX_bin.zip` をダウンロードします。
私は `lua-5.3.5_Win64_bin.zip` をダウンロードしました。

[Lua - Joe DF's Builds](https://joedf.ahkscript.org/LuaBuilds/ "Lua - Joe DF's Builds")

中身は、

- lua.exe
- lua53.dll
- luac.exe

ただ言語を動かすだけなら `luac.exe` はいりません。
これは Lua 仮想マシンのバイトコード・コンパイラです。
これらを任意のフォルダに入れて環境変数 Path へ通します。

何がいいって３つのファイルで 2MB もありません。
フロッピーディスク一枚に収まる処理系なんて中々ないですよ。
え？フロッピーディスクって何かって？まぢで？

```hello.lua
print "Hello World!"
```

```cmd.exe
> lua hello.lua
Hello World!
```

Lua は今大人気の Javascript と同じくプロトタイプベースです。
クラスが無いことで不評を買いますが、
私の様なタイプにはクラスの方が邪魔です。

Lisp の様に、関数を主体にしながら
オブジェクト指向へ向かう方が本筋な気がします。
プログラミングとは何かが気になるタイプには。

Lua は動的型付け・命令型言語、プロトタイプベースです。
Lua 単体ではあまりゴージャスなものは作れないでしょう。
しかし、関数はファーストクラス、末尾呼出最適化もあり、
関数型パラダイムで書くことも容易です。

Shift-JIS(CP932)は扱えないので nkf と共に USBメモリへ。
これでもう出先で処理系に悩むことはありません。
どこでもプログラミングができます。

# おわりに

2020年度から小学校でプログラミングが必修になるようですが、
この IT 後進国・日本で誰が何をどう教えるつもりなのか。

私は日々こう感じているんです。
理数離れの方がよっぽど深刻では？
英語ばかりで国語力が落ちているのでは？
なぜ国語は文系なの？理系じゃない？

英語とプログラミングに力を入れるより、
国語は理系ですと言って数学と合わせて教えた方がいいのでは？
なぜそんなことが言えるのか？という疑問をもたせて歴史を教える。

世界史が好きだった理系の私はそう思ってしまうのでした。