プログラミングの基礎知識
まず、万能チューリングマシンにおいては分岐とループができればあらゆる処理ができる証明がされている。
分岐においては概ねの高級言語ではIF文という形で実装されている。
また、複数先への分岐についてはswitch文という形が多い。
ループにおいてはfor文とwhile文という組み合わせが多い。
※機械語の場合、IF文は値の比較において次に参照するメモリ番地が異なることで実装される。
ループにおいては参照するメモリ番地をループ開始地点の番地とすることで実装される。
プログラミング言語論のお話
プログラミング初心者からよく聞かれる質問として、「稼げる言語はどれですか?」というものが定番で存在します。
そんなもんは毎年の状況によって変化するので一概に「これがいい」とは言えないのですが・・・
本稿執筆時点で自分戦略研究所の記事として最新だったのがこれ。
https://www.atmarkit.co.jp/ait/articles/2104/16/news032.html#_ga=2.170555811.2077575163.1623852330-1856187527.1588054852
paizaに掲載している求人のプログラミング言語別の割合を調べたところ、最も多かった言語はJavaScriptの11.9%。次いで、Javaが11.3%、PHPが11.0%、C#が7.4%、Pythonが6.2%だった。
paizaに掲載している求人のプログラミング言語別平均提示年収を見ると、比較的新しい言語が上位を占めている。トップは「Scala」の632万円。次いで、「TypeScript」が616万円、「Go」が612万円、「Kotlin」が600万円、「Python」が591万円だった。
では脳死でScalaを学べばいいのか?というとそうでもない。
本来最も金になるのは「システム化」である、と主張させていただこう。
システム化とは具体的にどういうことを指すのか、というと「慣習や俗人化している作業の流れを共通化せよ」ということから始まる。
そして共通化出来たら手順書を作る事だ。なお、手順書をしっかりと読んで作業をする、ということについてはそれなりの訓練がいることも忘れてはならない。
手順書実施の際はヒューマンエラーを踏まえてヒューマンエラーを起こしづらいように手順書を作る、という観点も大事である。
ヒューマンエラーについてはhttps://bookmeter.com/books/6904753 などを読むといい。
そして手順書が作れたものの中で自動化できそうなものにだけようやくプログラミングという話が出てくるのである。
最近ではDX(デジタルトランスフォーメーション)だーとかいってローコード・ノーコードをもてはやす空気があるが、結局のところローコード・ノーコードでも「仕事を分割・システム化」しないことには「コンピュータに仕事をさせる」ということができないのである。
古来から「知的な仕事を進める」には「自分でやる」か「他人にやらせる」の2択しか無かった。(力仕事だと道具・設備を用いるという3つ目の手段があったが知的仕事にはせいぜい電卓程度の道具しかなかった。) そこに対し、「コンピュータにやらせる」という選択肢が出てきたのがプログラミングなわけだが、プログラミングは適切なメンテナンスを続けないといけない。
ここでいう「適切なメンテナンス」とは「仕事の中身に変更要望が入る」とか「OS基板などが古くなるのでリプレースする」とかである。詳細は後に回す。
こういったシステム化が土台にあってからこそのプログラムなので、このレベルで仕事の整理が出来ないならDXなんぞできるわけない。
そしておまけにこういった「仕事自体」に対するメスは「今までこうやってきたんだ」という既存勢力によってケチをつけられるので社内政治が必要になるという笑えない笑い話になるのである...。
さて、技術面でのプログラミング言語比較をしてみよう。
プログラミング言語は大きく3つの系統に分類される。1.手続き型言語 2.関数型言語 3.論理型言語。
1.手続き型言語 は処理が上から順に実行され、処理の流れが1本の矢印のように追うことができる。C言語などがこれに該当する。一番わかりやすい言語パターン。
2.関数型言語 は変数に対し、関数の結果の結果の結果の...という形で記載する言語で、純粋な関数型言語だと括弧だらけになる。LISPなどが該当。先の例で上がっているScalaはJavaをベースに関数型言語と手続き型言語の両方の性質を持って設計された。 そのあとJava8でjavaにラムダ関数が導入されたりしたのでJava自身が微妙に関数型言語に近づいたりした。
3.論理型言語 は前提条件を踏まえたうえでの真偽をもとに計算させることでAI的な処理をさせよう、という設計思想の言語。Prologとかが該当。エキスパートシステム向きだったけど最近のAIは手続き型言語による計算量のごり押しで作る事のほうが多い。ほとんど研究用。
ということで利用が多いのは手続き型か関数型言語である。
そのうえで最近ではライブラリのを利用しての構築が多く(なにせ複雑な作業を先にまとめてくれているのだから使わない手はない)、強力なライブラリがある言語が自動的に強くなる。
例えばSpring やApache Struts2などがjavaで強力なライブラリである。
jqueryやnode.jsはjavascriptでよく使われるライブラリである。
※余談ではあるがjavascriptがjavaと近い言語だと思っている人がいたらその勘違いは捨てるべきだ。
もともとLivescriptという名前になりそうだったところを「javaが流行っているから名前ぱちってjavascriptにしよう」となったレベルの関係性しかない。
各所でネタにされているがこのような発言をエンジニアにした場合、「この程度の下調べもしないド無能の提案は聞く価値もない」扱いされるのでくれぐれも気を付けるべし。
・Scalaが強い一因としてはjava用のライブラリやクラスがそのままScalaで利用できるという点にもある。
アルゴリズム
ある特定の問題を解く際、「停止することがわかっている有限の計算手順」を示すことで効率よく問題を解くことができる。
数学の公式のようなものなのだが、このアルゴリズムはプログラミング言語の種類に依存しない。
アルゴリズムは例えるならレシピのようなもので、レシピが日本語だろうと英語だろうとドイツ語だろうと材料と内容が一緒であれば同じものが作れる。
プログラミング言語の違いはこのレシピの言語の違い程度の差しかない。
しかも、同じ問題を解こうとするときアルゴリズムの種類で効率の良しあしがある。
この話は長くなるのでまた別途解説の機会を取る。
では期末テストでは何の言語を使うの?
なるべく特定の言語を使いたくないので、基本情報で出てくる疑似言語を用いてアルゴリズム問題を出題する方向で考えています。
コメント
ぽーる
typescript は、Microsoftのやつでは?
LiveScriptですね。
随分きつい言葉で書いてらっしゃいますが、下調べしました?
マスター吹越
ぽーる様
ご指摘ありがとうございます!
夜中に書くとダメですね···元の名前をwikipediaで調べ直しもせずに書いた辺り駄目駄目です。
修正させて頂きました。
ぽーる
いえいえ、ちょっと面白かったです。
響きが似てるから、気づかないうちにってこともありますね。
喋り言葉とかでも間違ってて気になるけど本人は気づかずに喋り続けるとか。
匿名
文章は下手くそですね!
マスター吹越
ぽーる様
やらかしました。
口頭ミスはありますよね…。数学界だとグロタンディーク素数が代表格ですが・・・。
匿名様
眠い目こすって書くとグダグダになりますよね。
校正案お待ちしてますのでコメントください。