初学者が最初に学ぶのが良いと思われるプログラミング言語(2)
ガルパン最終章2話いつだよ!とかエウレカハイエボリューション続きいつだよ!
そんなふうに荒ぶっていた時期が 俺にもありました
すんませんほんとすんません
最初にあんだけ期待感煽っといてこの体たらく!
めっちゃブーメラン飛んできましたはい。
どう書こうとか考えてはいたんですけどまあその、はい、いろいろありまして、はい
もうちょっとガンバリマス
いつまでも謝ってても進まないのでこのあたりで勘弁してください。
というわけで改めまして、「初学者が最初に学ぶのが良いと思われるプログラミング言語」第二回です。
前回のまとめ
とにかく始めてみようぜ
始めろ言うてお前続き書いてねーから始められないんだよって、あ、はい、すんませんほんとすんませんあっ石は投げないで
そして今回まで予備知識が続きます。次回から手を動かせるようにします、はい。
プログラミング言語の謎進化
機械語
機械語(またはマシン語)というのをご存知でしょうか。
世にプログラミング言語(以後、「言語」)は数多にありますが、コンピュータが理解できる言語はただ1つ。それが機械語です。
内容は置いときますが、コンピュータに対し直接コマンドを与えるため、1つのコマンドでできることが少なく、範囲も狭いです。
そしてそれは全て2進数(0と1で構成される数)で表されます。
2進数の理由は、本来コンピュータは電気信号のONとOFFで動かしているため、表現がマッチしているからというわけです。
「あれ、機械語って16進数じゃないの?」と思われる方もいるかもしれません。
16進数の1桁は2進数の4桁で表現できるため、やや(本当にやや)機械語を人間寄りに表すことができます。
えー、今はあんまり深入りしないのですが一例だけ。
プログラミングを始めようとするとだいたいみんな1度は目にする「Hello,worldと画面に表示してみよう!」というアレ、機械語で表したらどうなるんでしょう?
答え(機械語はモノによって異なるのであくまで例として)はこちら↓
010101011000100111100101011010000000000000000000000000000000000011100000000000000000000000000000000001011001101110000000000000000000000000000000000011001001110000110100100001100101011011000110110001101111001000000101011101101111011100100110110001100100001011100000101000000000
わかるかぁ!いや僕もほんとにそう思います。これ人が見るやつじゃない。
じゃあこれを多少なりとも人間寄りと言った16進数で表してみましょう。はいこちら↓
5589E56800000000E80000000059B800000000C9C348656C6C6F20576F726C642E0A00
んー…ぎりぎりアウト!…いやぎりぎりどころかまったく、完全に、どうしようもなくアウトですね…
というわけで機械語のことは忘れましょう。
進化の方向
「テクノロジーの進化」と聞くとどのようなものを想像するでしょう。
飛行機等を考えてみると、もっと速く、もっと遠く、もっと精度よく…等があるかと思います。
もっと安全に、というのもあるでしょうか。
これに対して、コンピュータの場合も当然ながらハードウェアの進化に応じてもっと速く~はあるのですが、
最速のプログラミング言語は?となると、機械語です。
翻訳無しで直接コンピュータに命令できるので当然ではあるのですが。
先ほど述べたように、コンピュータが理解できるのは機械語のみであるため、他の言語は全て機械語への翻訳を必要とします。
さて、では 言語がこれだけ存在し(現在200種以上あると言われてます)、なお更に増えている理由は何でしょう
いくつかあると思いますが、プログラミング言語が増える理由の最たるものは「プログラマーのため」です。
機械語という究極にわかりにくく、反面最高の速度を持つ言語をプログラマーが使いやすくするために、
動作速度を犠牲にしても、読みやすく、書きやすく、考えたものを表現しやすく、効率を上げて同じことを何度も書かなくて済むようにしたり、特定の分野に強くしたり、他のプログラムでも使えるようにしたり、新しい概念を導入したり、プログラムの暴走を抑えてくれるようにしたり、場合によっては自由度が下がったり、一見不便であったりもし、たまにちょっとだけでも速度を上げるようにしたり…と人間が使いやすくあるように仕様を考え世代を積み重ねてきたもの、その結晶が各々の言語として作られてきました(と思います)
分類してみよう
概念の話が続きますがもうちょっとだけおつきあいください。
前述のように言語は色んな考えの元に作られていますが、いくつか分類方法があります。
といっても俗称が多かったり、両方の性質を持っていたりするのも多く、きっちり分類しづらかったりします。
ですが、こういう用語は今後頻繁に目にすることになると思うのでざっと紹介します。あくまでも大雑把な理解としてオネガイシマス。
機械語への翻訳方法(プログラムの実行方法)
割と有名な分類方法です。- コンパイルするタイプ:コンパイラ型言語と言われたりします(俗称)。 プログラム実行前(≒プログラム完成時)にコンパイルという翻訳作業が必要になるタイプです。
実行ファイル(拡張子が.exe)で提供されるのはこちらです。
いざプログラムを実行する時は、すでに翻訳作業が終わっているので実行速度は速いです。ただしバグがあるとコンパイルやりなおしになります。コンパイルの時間は規模によりますが早いものは10秒かからなかったりするので時間がネックになることはそれほどは無いですけども。
このタイプで有名な言語にC言語、C++とかがあります。
だいたい、カッチリとした作りで、言語の習得難易度も高い傾向にあります。 - コンパイルしないタイプ:スクリプト言語とかインタプリタ言語とか言われたりします。「コンパイルしない方」でも通ります。
軽量プログラミング言語とかLL(lightweight language)という言い方もあります。 コンパイルという翻訳作業を行わないため、とりあえず書いてすぐお試し実行できちゃいます。 「ちょちょっとプログラム書いて動き確認する」とかとても楽です。 プログラムを実行する時に1行ずつプログラムを読んで実行、という動作をするため、実行速度は遅くなります。
言語はJavascript、Perl、PHP、Python、Rubyなどはこちらと言われることが多いです。
- コンパイルするタイプ:コンパイラ型言語と言われたりします(俗称)。 プログラム実行前(≒プログラム完成時)にコンパイルという翻訳作業が必要になるタイプです。
世代(パラダイム)
プログラミング言語にも歴史がありまして、モノの考え方というかモノの捉え方に変遷があります。
それに従って分類もいくつかあるんですが…うーん。
いや、説明が長くなったり、マルチパラダイムが流行な最近とか、そもそも今この概念必要か?となったのでこの話はいずれ…
こんな用語があります/関係しますよ、という紹介だけ以下にちょっとだけ。- 手続き型
- 構造化プログラミング
- オブジェクト指向
プラットフォーム OSと言っても良いです。どの環境で動かせる?ということですね。
※抜け道はあったりしますが今はおいといてくださいWindowsでしか動かないよ
.NET Frameworkってものを使用する、C#やF#がこれにあたります。iOSでしか動かないよ
Appleが提供している言語、Objective-C、Swiftはこちら。だいたいどこでも動くよ
上記以外はだいたいこれに分類されると思って良いです。
向き・不向き
プログラミング言語は人間のため、ということで、言語毎に分野の得意/不得意があります。 これ関係のものを作りたい!というのがあるなら最初は該当分野にマッチした言語を選ぶのが良いと思います。
選んでみよう
- 習得難易度は低い方が嬉しい
- どうせなら汎用的な言語の方が嬉しい(現状で考えるならWeb系やスマホアプリが作れると良さそう?)
- Apple系はお金がかかるから避けたい
- せっかくならトレンドというか人気のある、需要もあるならいいよね
ということを考えると個人的には以下の3つが(細かい一長一短はあるけども)オススメになるかと。
Javascript
有名度ではこの中ではトップクラス?
Javaと組み合わせてWeb関連に使われることが多いけどJavaとは関係ないぞ!(命名はJavaが売れそうだから名前を変えたという経歴があるらしいですが)Python
「1つの機能には1つの書き方」という理念があって、別の人が書いても同じような記述になりやすい(なるとは言っていない)
他の多数の言語で使われる{}でまとめる書き方をしないのである意味書き方に癖があるRuby
実は触ったことがなくてよくわからないですエヘヘ
えへへではないだろすんませんすんません。
次回より、上記から1つ選んで実際にプログラミングを始めたいと思います。
どれにするかはちょっと悩んでいるので次回までに考えます。
「これがいい!」という声が多かったらそれにします(他力本願)
おまけ:今回のNG
「いしはなげないで」って書いて変換したら「石鼻毛ないで」って変換された。どんな鼻毛だよ。そりゃないに決まってるわ!
初学者が最初に学ぶのが良いと思われるプログラミング言語(1)
前振り
ネットで探せば掃いて捨てるほど見つかるこの話題。
今年のトレンド10選!とかこれがおすすめ!とか、過激なところではそんなの人に聞いてる時点で向いてない!とか。 皆思い思いの論旨でそれ自体は良いのですが。
そもそもが、皆が思い思いの前提で話しているので「どんな読者が対象?」というのが非常になんというかアレだと思うのです(ぼかす)
「今からプログラムって勉強できるのかな」「ものづくりって今から始められるのかな」というような初学者向けの内容は「プログラミング言語 おすすめ」とかでぐぐっても案外見つからないわけで。 (もちろん検索ワード変えればそれはそれでいっぱいあるんだけども)
そんなわけでいわゆる非エンジニアの初学者志望、というか「プログラムとかよくわからないけどどんなの?」的な人に向けて書ければなと思ったり。
まず何を準備すればいいの?
当たり前ですがプログラムは書いただけでは動きません。
動かすためには大きく2つ、「開発環境」と「実行環境」が必要になります。
- 開発環境とは?
細かい用語はおいといて…
プログラムを書いたり、それを実行させる「モノ」に変換するツール。
コンパイルとかそういう用語を聞いたことがあればソレです。
それらをひとまとめにした「これがあれば開発全部できるよ」というのを統合開発環境(IDE)とか言ったりします。
具体的にはEclipceとかVisualStudioとか。 - 実行環境とは?
開発環境で作った「モノ」を動かす場所です。
簡単に言うと、例えばiPhone用アプリやAndroid用アプリを作るのに、必ずしもiPhoneやAndroidが必要ではないということです。
当たり前といえば当たり前なんですけど、実際開発環境はほぼPCです。
環境構築はそれなりに厄介なことが多く、初学者が一から準備しようとすると躓きやすく、 「めんどくせぇ、もうプログラミングとかいいかな」となりかねなく、後回しにすることを強く勧めます。
最近はオンライン開発環境も充実してるようで、それを使うのをオススメします。
ざっと見た限りですが、paiza.IOなんかいいのかなと思います。
- 特徴
- 選べる言語が多い
- ボタン1つでコンパイル&実行
- ユーザー登録不要(登録もできる)
- ファイルアップロード可
- 日本語
- paizaラーニング良さそう
あれ、準備するものPC(とインターネット環境)くらいで良くねぇ!?
というわけでとりあえず始めてみましょう!٩( 'ω' )و
イメージ、だいじ
ええもう始められるんですけど。
最初に1つだけ知っててほしいことがありまして、
作業、結構地味ですよ
いやほんと。
初学者への教え方でとても共感を覚えた話がありまして、以下。
先生が提唱していたやり方は、まず最初に典型的なプログラミングのプロセスを一通りやってみせつつ生徒にも同じことをやってもらう、というものだった。段階としては、
1. サンプルコードを書き写す
2. コンパイルエラーをなおす
3. 動かしてみる
4. 意図しない動作をしているコードをなおす
を一通り体験してもらう。先生が言うには「書いたプログラムが実際に動くまでには 2 つの壁がある。1 つはコンパイルエラーの修正、もう 1 つは自分の思ったとおりにプログラムが動くまでコードを修正すること。これはプログラマーである限り一生付きまとうことなので、いちばん最初にこのことを教えたほうがいい」という
Hello, world から始まらないプログラミング教育
また、同じ記事からですが、
先生曰く、「やたらと出てくる(英文の)エラーメッセージに圧倒されてやる気が削がれてしまう人間が少なからずいる」という。であれば「コンパイルエラーがたくさん出て困ってしまうのは、初心者にはありがちなこと」だと始めに教えるのが良策ではないか、と。
Hello, world から始まらないプログラミング教育
つまり、作業としては、
- コードを書く
- コンパイルする
- 出てきたエラーを潰す or 動かしておかしいところを直す)
を延々、延々、延々、延々…繰り返すことになります(´-ω-)
いやでも(納期間際とかそういう条件は置いといて)つらいわけではなくて、ちょっとずつ組みあがっていったり動くようになるのは楽しいんですよ!
なのでちょっと興味を持った方にはぜひこんな話では怯えず竦まずプログラミングという世界に飛び込んでもらいたいです、はい。
えー…思ったより長くなってしまったので続きます。
言語の話全然してませんね…あうあうあー
挨拶、自己紹介とか。
はじめましての方ははじめまして。
はてなでびぅです、でびぅ。
経緯
・普段はTwitterやゲーム内チャットでだらだらしゃべってるよ
・でも自分の思ったことや考えたことをまとめたくなってきたよ
・ついでにTwitterやチャットで言いにくい(自称)ITエンジニアな話題もまとめたくなったよ
そんなわけでぼんやり考えていることをつらつらまとめたりしていこうかなと思ってます。
言語的な技術にそこまで深入りはしない、予定です。
自己紹介
・ゲームからプログラムに入り込んだ感じ
・仕事は最初DBだった
・途中で組み込みに転進してなう
・最近暇な部署でほとんどコーディングしてないせいで何か書きたくなってる(blogのモチベの一番の要因はこれかも)
・PC関係の履歴はPC-6001→PC-6601→(空白期間)→PC98シリーズ→Windows、他途中UnixやLinuxやiOSさわったり。
・言語的には(忘れてるのも含めて)N60-BASIC→(空白)→C,FORTRAN,COBOLとかJCとか→Cをメインに
あとC++とかObjective-CとかVBとかC#とかPythonとかJavaとかをうすーくあさーく
最近WPF使ってちょこちょこしてるくらい
そういえばRagnarokOnlineしてたくせにLua触ってませんね。てへ
あと気が向いたり必要あれば追記します。
そんな感じでよろしくお願いします。
(追記)しょっぱなからタイトル書き忘れてた。