初学者が最初に学ぶのが良いと思われるプログラミング言語(2)

ガルパン最終章2話いつだよ!とかエウレカハイエボリューション続きいつだよ!
そんなふうに荒ぶっていた時期が 俺にもありました

すんませんほんとすんません
最初にあんだけ期待感煽っといてこの体たらく!
めっちゃブーメラン飛んできましたはい。

どう書こうとか考えてはいたんですけどまあその、はい、いろいろありまして、はい
もうちょっとガンバリマス

いつまでも謝ってても進まないのでこのあたりで勘弁してください。


というわけで改めまして、「初学者が最初に学ぶのが良いと思われるプログラミング言語」第二回です。

前回のまとめ

とにかく始めてみようぜ
始めろ言うてお前続き書いてねーから始められないんだよって、あ、はい、すんませんほんとすんませんあっ石は投げないで
そして今回まで予備知識が続きます。次回から手を動かせるようにします、はい。

プログラミング言語の謎進化

機械語

機械語(またはマシン語)というのをご存知でしょうか。
世にプログラミング言語(以後、「言語」)は数多にありますが、コンピュータが理解できる言語はただ1つ。それが機械語です。
内容は置いときますが、コンピュータに対し直接コマンドを与えるため、1つのコマンドでできることが少なく、範囲も狭いです。
そしてそれは全て2進数(0と1で構成される数)で表されます。 2進数の理由は、本来コンピュータは電気信号のONとOFFで動かしているため、表現がマッチしているからというわけです。
「あれ、機械語って16進数じゃないの?」と思われる方もいるかもしれません。
16進数の1桁は2進数の4桁で表現できるため、やや(本当にやや)機械語を人間寄りに表すことができます。

えー、今はあんまり深入りしないのですが一例だけ。
プログラミングを始めようとするとだいたいみんな1度は目にする「Hello,worldと画面に表示してみよう!」というアレ、機械語で表したらどうなるんでしょう?
答え(機械語はモノによって異なるのであくまで例として)はこちら↓
010101011000100111100101011010000000000000000000000000000000000011100000000000000000000000000000000001011001101110000000000000000000000000000000000011001001110000110100100001100101011011000110110001101111001000000101011101101111011100100110110001100100001011100000101000000000
わかるかぁ!いや僕もほんとにそう思います。これ人が見るやつじゃない。
じゃあこれを多少なりとも人間寄りと言った16進数で表してみましょう。はいこちら↓
5589E56800000000E80000000059B800000000C9C348656C6C6F20576F726C642E0A00
んー…ぎりぎりアウト!…いやぎりぎりどころかまったく、完全に、どうしようもなくアウトですね…
というわけで機械語のことは忘れましょう。

進化の方向

「テクノロジーの進化」と聞くとどのようなものを想像するでしょう。
飛行機等を考えてみると、もっと速く、もっと遠く、もっと精度よく…等があるかと思います。
もっと安全に、というのもあるでしょうか。
これに対して、コンピュータの場合も当然ながらハードウェアの進化に応じてもっと速く~はあるのですが、
最速のプログラミング言語は?となると、機械語です。
翻訳無しで直接コンピュータに命令できるので当然ではあるのですが。
先ほど述べたように、コンピュータが理解できるのは機械語のみであるため、他の言語は全て機械語への翻訳を必要とします。
さて、では 言語がこれだけ存在し(現在200種以上あると言われてます)、なお更に増えている理由は何でしょう いくつかあると思いますが、プログラミング言語が増える理由の最たるものは「プログラマーのため」です。 機械語という究極にわかりにくく、反面最高の速度を持つ言語をプログラマーが使いやすくするために、
動作速度を犠牲にしても、読みやすく、書きやすく、考えたものを表現しやすく、効率を上げて同じことを何度も書かなくて済むようにしたり、特定の分野に強くしたり、他のプログラムでも使えるようにしたり、新しい概念を導入したり、プログラムの暴走を抑えてくれるようにしたり、場合によっては自由度が下がったり、一見不便であったりもし、たまにちょっとだけでも速度を上げるようにしたり…と人間が使いやすくあるように仕様を考え世代を積み重ねてきたもの、その結晶が各々の言語として作られてきました(と思います)

分類してみよう

概念の話が続きますがもうちょっとだけおつきあいください。
前述のように言語は色んな考えの元に作られていますが、いくつか分類方法があります。
といっても俗称が多かったり、両方の性質を持っていたりするのも多く、きっちり分類しづらかったりします。
ですが、こういう用語は今後頻繁に目にすることになると思うのでざっと紹介します。あくまでも大雑把な理解としてオネガイシマス。

  1. 機械語への翻訳方法(プログラムの実行方法)
    割と有名な分類方法です。

    • コンパイルするタイプ:コンパイラ型言語と言われたりします(俗称)。 プログラム実行前(≒プログラム完成時)にコンパイルという翻訳作業が必要になるタイプです。
      実行ファイル(拡張子が.exe)で提供されるのはこちらです。
      いざプログラムを実行する時は、すでに翻訳作業が終わっているので実行速度は速いです。ただしバグがあるとコンパイルやりなおしになります。コンパイルの時間は規模によりますが早いものは10秒かからなかったりするので時間がネックになることはそれほどは無いですけども。
      このタイプで有名な言語にC言語C++とかがあります。
      だいたい、カッチリとした作りで、言語の習得難易度も高い傾向にあります。
    • コンパイルしないタイプ:スクリプト言語とかインタプリタ言語とか言われたりします。「コンパイルしない方」でも通ります。
      軽量プログラミング言語とかLL(lightweight language)という言い方もあります。 コンパイルという翻訳作業を行わないため、とりあえず書いてすぐお試し実行できちゃいます。 「ちょちょっとプログラム書いて動き確認する」とかとても楽です。 プログラムを実行する時に1行ずつプログラムを読んで実行、という動作をするため、実行速度は遅くなります。
      言語はJavascriptPerlPHPPythonRubyなどはこちらと言われることが多いです。
  2. 世代(パラダイム
    プログラミング言語にも歴史がありまして、モノの考え方というかモノの捉え方に変遷があります。
    それに従って分類もいくつかあるんですが…うーん。
    いや、説明が長くなったり、マルチパラダイムが流行な最近とか、そもそも今この概念必要か?となったのでこの話はいずれ…
    こんな用語があります/関係しますよ、という紹介だけ以下にちょっとだけ。

  3. プラットフォーム OSと言っても良いです。どの環境で動かせる?ということですね。
    ※抜け道はあったりしますが今はおいといてください

    • Windowsでしか動かないよ
      .NET Frameworkってものを使用する、C#やF#がこれにあたります。

    • iOSでしか動かないよ
      Appleが提供している言語、Objective-C、Swiftはこちら。

    • だいたいどこでも動くよ
      上記以外はだいたいこれに分類されると思って良いです。

  4. 向き・不向き
    プログラミング言語は人間のため、ということで、言語毎に分野の得意/不得意があります。 これ関係のものを作りたい!というのがあるなら最初は該当分野にマッチした言語を選ぶのが良いと思います。

    • Webアプリ
      Java、Javascipt、PHPPythonRuby等、Webアプリに強い言語は人気で、そのため数も多いです。
    • スマホアプリ
      AndroidであればJavaが真っ先に挙がります。次点でKotlinでしょうか(個人的好み)。C#JavascriptPythonでもいけるようです。

    • ゲーム
      ゲーム開発エンジンで開発環境も兼ねるUnityというものがあるのですが、これが対応しているのがC#です。
      (最近まではJavascriptも対応してたんですがサポート終了になりました…)

    • 人工知能/統計
      PythonとRが特に有名です…が最初にこの分野に飛び込むのはなかなか大変そうな気も。

    • オールマイティ
      C言語C++Java等、汎用と言われる言語はありますがいずれも習得難易度は高い傾向に。

選んでみよう

  • 習得難易度は低い方が嬉しい
  • どうせなら汎用的な言語の方が嬉しい(現状で考えるならWeb系やスマホアプリが作れると良さそう?)
  • Apple系はお金がかかるから避けたい
  • せっかくならトレンドというか人気のある、需要もあるならいいよね

ということを考えると個人的には以下の3つが(細かい一長一短はあるけども)オススメになるかと。

  • Javascript
    有名度ではこの中ではトップクラス?
    Javaと組み合わせてWeb関連に使われることが多いけどJavaとは関係ないぞ!(命名Javaが売れそうだから名前を変えたという経歴があるらしいですが)

  • Python
    「1つの機能には1つの書き方」という理念があって、別の人が書いても同じような記述になりやすい(なるとは言っていない)
    他の多数の言語で使われる{}でまとめる書き方をしないのである意味書き方に癖がある

  • Ruby
    実は触ったことがなくてよくわからないですエヘヘ
    えへへではないだろすんませんすんません。

次回より、上記から1つ選んで実際にプログラミングを始めたいと思います。
どれにするかはちょっと悩んでいるので次回までに考えます。
「これがいい!」という声が多かったらそれにします(他力本願)

おまけ:今回のNG

「いしはなげないで」って書いて変換したら「石鼻毛ないで」って変換された。どんな鼻毛だよ。そりゃないに決まってるわ!