プログラムとはなにか？ プログラミング言語とは何か？

# プログラミングってなんでしょうか？

## なんでこんなことを書くのか

最近Twitterとかを見ていると、○○はプログラミング言語じゃない、△△は言語だ、なんていう話が飛び交ってました（2018年8月）。
別に人それぞれなので、それにとやかく言うつもりはありませんが...... とはいえ、それで傷つく人がいたりするとあまり良いことじゃありません。

> わたしも１プログラマなので実は傷つく一人です；；

といことでまとめました。

ちなみに、類似のことを前に note にまとめましたが、note はもう少しデザイナよりというかポエミーな感じで書いてます。この中で Code と言ってるのは、ほぼほぼプログラミング言語のことです。

["Code"という想い。DX - デジタルトランスフォーメーシ時代に向けて](https://note.mu/note567000/n/n147c57530244)

# プログラミングとは？

## 正しそうな定義（Wiki）

Wikiさんによると。

> プログラミング（英: programming）とは、コンピュータプログラムを作成することにより、人間の意図した処理を行うようにコンピュータに指示を与える行為である。

そうですね、プログラミングは `program + ing` なのでこういうことです。
では、`プログラム` とはなんでしょう？

> コンピュータプログラム（英：computer programs）とは、コンピュータに対する命令（処理）を記述したものである。

つまるところ、コンピュータに対する命令を記述して人間の意図した処理を行わせるためのモノ、ですね。
ここでは「処理」というものが何か？というのがあいまいですが、とりあえずなにか「処理」なのでしょう。。。（雑

## より正しそうな定義（JIS）

JISの方も見てみましょう。

> ソフトウェア：
> 情報処理システムのプログラム，手続き，規則及び関連文書の全体又は一部分。
> 
> プログラム：
> アルゴリズムの記述に適した人工言語の規則に従った構文上の単位であって，ある機能若しくは仕事の遂行又は問題の解決のために必要な宣言と文若しくは命令とから構成されるもの。

こちらでは「仕事の遂行」または「問題の解決」のためのものがプログラムだといっています。

> 人工言語：
> 使用前から規則が明示的に確立されている言語。

かつ、この「人工言語」というのが、プログラムのための言語、つまり、プログラミング言語です。

## つまるところ？

普段話している日本語とか英語とかの自然言語ではなく、人工的に作られた言語を使って書かれるモノであって、それによって「何か問題を解決する」ことができるモノ、が、プログラムです。

# 具体的には？

## RubyとかPythonとかJavaScriptとか

たぶんみなさん何にも疑うことなくプログラミング言語です。

## HTMLとかCSSとか

ここがちょっと話題になったやつですね。

謎に論争が深まると思うので断定はしたくありませんが…… 定義からしてみたら、プログラミング言語と言っていいと思います。

なぜって、特殊な「人工言語」によって記述されて、その記述によって「処理≒画面の描画」「仕事の遂行≒画面を描画する」や「問題の解決≒情報の可視化」をするからです。

> ここで、画面の描画はブラウザのレンダリングエンジンでは？だからHTMLは言語ではないと思う、という方がいると思いますが、それを言ってしまえば、ほとんどどんな言語だってレンダリングエンジン相当のランタイム環境がグラフィックメモリに値を書き込むことで描画されるので、HTMLだけ特別視するのはおかしいと思います。
> HTMLは宣言だけで命令がない、という考えもありますが、それも切り分けが難しく。 記述の順番によって描画が変わったりすることから、それは宣言ではなく命令だととらえることも可能です。

# ということで、とりあえずの結論

定義からすればHTMLもCSSもプログラミング言語と呼んでいいです！！！ と、とりあえず言い切ってみましょう。
なので、勉強はじめたばかりのエンジニアさんでHTMLやっている方、むねをはってプログラム勉強してると言いましょう。

---

**ここから先は多少ややこしい話に突入しますよーーーーーー**

# ではなぜ？ HTMLは言語じゃないとか言われるの？

おそらくは、[ダイクストラ](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%89%E3%82%AC%E3%83%BC%E3%83%BB%E3%83%80%E3%82%A4%E3%82%AF%E3%82%B9%E3%83%88%E3%83%A9)さんや[ヴィルト](https://ja.wikipedia.org/wiki/%E3%83%8B%E3%82%AF%E3%83%A9%E3%82%A6%E3%82%B9%E3%83%BB%E3%83%B4%E3%82%A3%E3%83%AB%E3%83%88)さんの構造化定理や構造化プログラミングの影響が大きいと思います。
2人ともソフトウェアの世界で有名な方です。

お2人がなにを言ってるかと言うと。簡単に言ってしまうと、「順次」「反復」「分岐」によってプログラムは書くことができる。というものです。

> 正確には、書き換えることができる、であって別にこれだけで書け！というわけではないです。

**順次：**
プログラムが（普通は）上から順番に実行されていく、という考え方。

**反復：**
for文やwhile文みたいなもので繰り返し実行ができる。

**分岐：**
if文やswitch文みたいなもので条件分岐が行える。

というものです。
あと、ヴィルトさんは「アルゴリズム ＋ データ構造 ＝ プログラム」だという考えを持っていました。

**アルゴリズム：**
ざっくり言ってしまうと計算です。

**データ構造：**
データ、１とか、２とか、配列とか、文字列とか。

たしかに普通どんなプログラミング言語でも、こういう要素は持っているし、分岐や反復もできますよね？
でも、HTMLにはこれがないのです。

> Vue.js みたいな拡張があるとできますが、それはもはやHTMLではないので...

なので、HTML はプログラミング言語ではない！というのが世の中の一部でいわれていることです。

まあ、わからないでもないですね。

ただ、これに関しては、構造化定理などの考え方を持ったり構造化プログラミングをすることによって、プログラムはより素敵に書くことができる、と言っているだけであって、それを満たさないとプログラムではない、ということではないとわたしは理解しています。

> ちなみに、CSSは、Media Query他いろいろ複雑な言語仕様をもっているので、そもそも言語扱いされることも多いそうです

## 私見

さて、ここからは私見です。

HTMLもCSSも、プログラミング言語でいいと思います。

まず、JISなどで定義されている考え方では、プログラミング言語と言いきってしまっても過言じゃないです。（そもそもJISとかの定義もかなり古いので、今の時代とはすこしあってない感じもしますけど。。。）

ダイクストラさん等が言ってるのは、ある特定の分野で、プログラムをより最適化するための手法であったり、考え方の１つです。 ましてダイクストラさんがもし「構造化定理を満たさないものはプログラムとは呼べん！」と言ってたとして、それが何でしょう？ わたしは「構造化定理を満たしてなくてもプログラムですー」って言い返します。ただそれだけのことです。

少しだけポエミーな意見としても、そんな細かな定義で足を引っ張っても意味がないというか... HTMLを学ぶことで狭義のプログラミング言語への理解は絶対に深まるので、プログラミング言語じゃない＝HTML勉強しない なんてフィルターをかけたくないです ← これが一番の理由

# さいごに

ということでとりあえずまとめました。
字数と時間の関係で多少説明さぼったところありますが、大事なことだけは書いたつもりです。
変な議論に巻き込まれるよりも、一歩でも前に、１行でも多くコードを書くのをおすすめいたします m__m

おしまい