プログラミングの基礎を学ぶ

…もうかなり前のことになりますが、作者もこれまで勤めてきた会社の中で、コンピュータ(※パソコン)のプログラムを組む…という仕事に携わったことがありました。
今回は、その年齢層を問わず、これからコンピュータのプログラミングというものを入門したい方や、実際にプログラマという仕事に就きたい方のために、その学習方法について、作者なりに解説してみようと思います。
題して、50歳を迎えた偏屈オヤジが主催する、コンピュータプログラミング入門です。

この記事は、2024年4月下旬に修正されました。

・入門を始める前に

そんなわけで、これから解説を始めるわけだが…ご覧の皆さんに、まず最初にお断りしておく。
それは…ここに掲載されている内容や事柄は、「決して正しい」という保証はないということだ。
また、多少なりとも個人の見解というものが含まれている
但し、この中には多くのIT企業に勤めるプロから教わったことなども多数含まれている
この点については、どの部分がそうだということはわざわざ掲載しないが、その現場を知らない方は大いに活用していただくと良いだろう。
以上のことを踏まえ、予めご理解いただき、また、ご覧いただければ幸いである。

さて、実際にコンピュータのプログラミング、または、そのスキルを身につけるにはどうすればよいか?…などの解説をしていくわけだが、ここではあえてプログラミング言語そのものの概要やその詳細な解説、加えてそのプログラミングの一例などを示すソースプログラムなどの掲載をしたりということは殆どしない。(※解説のためにプログラムの一例やその一部は掲載するが)
なぜなら、この入門は主に「プログラミング入門以前の入門」について重きをおいているからだ。
…というか、まずこの入門を、今後プログラミングというものを学ぶ、ある意味の「基準」にするといいだろう。
そのため、このページで公開しているプログラミング関連のコンテンツでは、ほかに実際のプログラミング言語を例に挙げた解説を多数掲載している。
それからもう一つ。
御覧の皆さんが、今後これらを入門をするにあたって、「どんなにくだらないことでも、どんなに小さなことでも、感動というものを大いに大切にしていただきたい」と思う。



・プログラマを目指す人へ…

この解説は、「将来プログラマを目指している」という方のみ、ご覧いただくと良い。
さて、そもそも少し本題から離れるが、「どんな人でも、きちんと努力すればプログラマーになれる」…と、いいたいところだが、ただやみくもに勉強をしただけでは、その仕事に就くことはできない。
これは一概にはいえないが、実はプログラマ向きの人、またはそうでない人の、ある意味の指標というものがあるからだ。
ときにプログラマの仕事は、パソコンなど機械に対して、ある「指示を行う命令の集まり」…つまりその「プログラム」というものを記述していく仕事がメインとなる。
いわば、機械…コンピュータそのものに対して、いかに効率よく、そして、ムダのない動きをさせるかが重要となるためだ。
そのためには、使用する機械…いわゆるハードウェアの仕様の理解うんぬん…ということはまた別として、とにかくまずは、その機械を動かすためのプログラムを書くことだ。
また、その指示のもととなる「仕様書」への理解というものが必要となるのだが…まず、ここが一つ目のポイントである。
…それは、いかにこの「仕様」というものを、自分の頭の中に正確に叩き込めるか?…ということだ。
しかもこれは、迅速かつ正確に行わなければならない。
なぜなら…そのプログラムを組む時間というものは、実際の開発現場では仕事上のスケジュールの都合というものもあるが、たいていは「限られた時間内で行わなければならない作業」となるからだ。
変な話、「週休二日の企業だから」…といっている場合ではなく、連日連夜、完全な徹夜状態ということも当たり前のことである。

さて…そんなプログラマとして自分にその素養があるのかどうか?…というものを試す方法がある。
そして、ここが二つ目のポイントだ。
それは、古くから毎年二度開催されている、IT資格の代表格・「情報処理試験」を受けてみることだ。
また、この資格試験はその試験のカテゴリでいえば、「基本情報処理技術者試験」が、プログラマを目指す人に最も最適な試験と思われる。(※ここではまず基本という意味で理解していただきたい)

ところでこの資格は作者の時代、「第二種情報処理技術者試験」と呼ばれていたが、その資格試験を取得していなければ、就職の際でもその手の企業から門前払いされるほどであった。
さらに、これらの資格試験に対して、ネットではお馴染みの某「掲示板」では、こんなことが書き込まれていた。
この資格試験くらいパスできないのであれば、プログラマー向きではない」…という一文であった。
実は当時、作者もこれをみたときは随分と頭にきたものだが…いま考えれば、それも一理あるのではないか?と思うようになった。
なぜなら、作者もこの資格を取得できない間は、本当に周りの誰からも言われ続けてきたことだからだ。
ちなみに作者は随分と遅れて取得したわけだが…あとで考えれば本当に必要な資格だったんだな…と、いまは実感している。(※画像は合格証書/詳細情報は個人情報なので伏せる)

そんなわけで、その道を目指す人なら、一度はこの資格試験にチャレンジされることをお勧めしておく。
そうすれば、その手の仕事に対する基礎的な知識、そしてその実際の現場における知識などが少しは学べるはずだ。(試験問題の内容はそういったものが多いため)
そしてこの資格を取得することにより、特に若い世代の方なら後々その手の企業への就職や転職は、きっと有利になるだろう。
また、余談だが以前にこんな話を聞いたこともある。
前は全然違う仕事をしていたが、この資格を取得したことにより、見事な転職を果たした人もいるらしい。


・実際の学習について

それでは実際に、どのようにプログラミングというものを学習すればいいのか解説していこう。
さて、現代では様々なプログラミング言語が世に出回っており、習得が容易なものから難解なものまで様々だ。
そこで作者もプロから教わったこと(※あくまでもあとで聞いた話ではあるが)だが…まず、「自分がプログラミングを学ぶ上で、その基準となるプログラミング言語をなにか一つ習得する」…ということだ。
つまり、それを基準として、ほかの言語に応用させる…ということである。
また、最近のプログラミング言語は、その構文が非常に似通っているのも事実だ。
…では、その基準となるべきプログラミング言語は、どんな言語が最適なのであろうか?
そんなわけで、次はそれについて少し解説しよう。

昔からプログラミング言語には、その特徴として「コンパイラ言語」と「インタプリタ言語」というものがある。
前者は、プログラムの作成(※「ソースプログラム」という) → コンパイル(※「翻訳」 → リンク(※そのファイルを「実行形式」に変換)の作業を繰り返してプログラム作成を行う。
一方後者は、プログラムの作成 → 実行 → 結果を確認という作業を繰り返しプログラムの作成を行う。
…さて、どちらが学習に最適なのか?
実はその答えというものはない。
つまり、どちらでも構わないということだ。
…ただ、願わくばプログラムを作って実行して即座に結果が得られるインタプリタ言語の方が効率がよいといえる。
また、現代の初心者向けのプログラミング言語といえば、「Javaスクリプト」が代表的だ。
ところでJavaスクリプトは、いまどきのパソコン(※Windows・MacOS)に標準で付いてくるものだが、厳密には、インターネットのホームページを閲覧するソフトウェアである「ブラウザ」があれば、いつでも使うことができる。
主なものを挙げれば、Windowsでは定番だった「インターネットエクスプローラ」(※現在は廃止)、「Edge」そのほかGoogleの「Chrome」などがある。(※MacやiPhoneでは「Safari」など、ほかにも種類はある)
また、最近ではブラウザ本体に開発ツールが内蔵されているものが殆どだ。
特にJavaスクリプトは、現代ではその開発ツール内でのプログラムの作成・実行が直接行える様になっている。

ところで初心者向けのプログラミング言語は、実はもう一つある。
それは「C言語」だ。
C言語は前述したコンパイラ言語だが、現代のプログラミング言語の基礎ともいえる言語でもある。
実は前述のJavaスクリプトの基本となる構文の記述方法は、C言語に似通っている。(但し、厳密にはその言語仕様はまったく異なるものなので、そのへんはご理解いただきたい)
それだけでなく、プログラムの内部では「関数」といったものを使用するが、それはJavaスクリプトでも実現できる。

しかし…。
プログラムを組む上での厳密なその決まりというものをきちんと理解するためには…作者としてはC言語の方がよいと思っている。
その理由は、たとえばプログラムの内部で使用する「変数」といったもの…これは、数値を扱うなら「数値型」、あるいは文字を扱うなら「文字型」という風に、そのある意味の「区別」をするための定義(宣言)をしなければならないことをよく理解して欲しいためだ。
それでは、前述した事柄が、Javaスクリプトなら、どうなるのであろうか?
その一例を挙げれば…その区別というものは…実はない。
いや、数値や文字が変数に格納されるものの、あらかじめ定義は成されない。(※「var a」などと定義はするが)
つまり、変数の使用は思いのままなのだ。
…ただ、厳密にはプログラム上で扱うその変数が数値か文字か?…いわゆる、その「」の判定は成される。
以上の通り、ここまでで両者には既にそのような違いというものがあることを理解して欲しい。
そんなわけで、今回はそのC言語を例に取り上げ、解説していきたいと思う。


・C言語について

さて、この入門の解説ではC言語を取り上げるが、こちらも前述した通り、この言語の概要や詳細については、ここでは一切解説はしない。
但し、少しだけこのプログラミング言語の概要を説明しておこう。

まず同言語は、「システム開発向きの言語」であるということだ。
その昔、コンピュータ(※パソコン)のシステムは、「アセンブリ言語」で記述されていた。(※このホームページ内の「ハードウェア関連」の「作者の昔のパソコン体験記」を参照)
そしてその後、それに代わる言語としてC言語が採用されるようになったのである。
ちなみに昔を問わず、いまでもC言語は利用され続けており、コンピュータのシステム(※パソコンのOS)、カーナビや家電製品などの内部のマイクロコンピュータの制御、そのほか家庭用テレビゲーム機や現代ではiPhoneのアプリ開発などでも利用されている。(※iPhoneは「Objective C」が使用されている)

さて、このC言語。
このプログラミング言語を完全に理解するためには、アセンブリ言語の知識とその理論が必要不可欠となる。
また、それは「ポインタ」と呼ばれる概念だ。
これはC言語を習得するためには、どちらかといえば学んでおく方がいい部分でもある。

ところでアセンブリ言語でできることは、C言語で実現できるといわれている。
逆にC言語でできることは、アセンブリ言語では実現できない。(これも調べてみれば、その理由が分かるだろう)
そのため、C言語は、別名「小アセンブリ言語」とも呼ばれる。
その理由は、アセンブリ言語に代わってC言語が多く利用されるようになったためだ。
…だが、両者のその違いというものがどこにあるのかなど、その答えを導き出すことができれば、この言語のより深い部分が理解できるようになり、今後きっと「大きな力」となるだろう。


・学習のための環境を作る

さて、そんなC言語を現代のコンピュータ(※パソコン)を使ってどうやって学習するのか?
また、学習のためには何が必要なのか?
…いわゆる「学習をするための環境」が必要となるだろう。
ここではその「環境構築」の方法について解説するが、作者が思うに、それは様々な方法がある。


1.コンパイラとエディタのみを使用する

基本的にパソコンの上でC言語を使用するためには、ソースプログラム(※ここではプログラムそのものをいう)を編集するためのエディタ、そして、それを翻訳して実行可能形式のファイルに変換する「コンパイラ」をインストールする方法である。
ちなみにこれは、一番原始的な学習環境といえるものだ。
また、プログラムの実行とその実証は、「プロンプト画面」(※従来の「コマンドプロンプト画面」)の上で、その指示をすべて手操作で行う。
エディタについては、たとえば「Windows」の場合、標準で搭載されている「メモ帳」で幾らでも代用することができるが、専用のエディタを用意(※またはダウンロード)するといいだろう。(※これらの中にはシェアウェア」といって料金がかかるものもあるのでご注意を)
また、このエディタについては、「自分が一番使いやすいものを選ぶ」ことだ。
一例を挙げると…「秀丸エディタ」、「Notepad++」、「VSCode」などがある。
一方、コンパイラでは、「GCC」や「Borland C++」などがある。
GCCはサーバー用OSである「Linux」でも、もっともよく使用されている。(※さすがにもとは「UNIX」開発用といえる)
後者は「MS-DOS」時代から定評のあるコンパイラだが…近年言語仕様も古くなっているため、新しいプログラムの記述方法に対応していない部分があるため注意が必要だ。


2.IDEを使用する

ひとことでいえば、前述の1の方法を「すべてひとまとめにして、その処理を自動化させたもの」である。
つまり、プログラムの編集からその実行、さらに実行の上での検証作業(※「デバッグ」や「トレース」)まで一つの「環境」で実行できるというものである。
初めての方は、こちらを使用するのもいいだろう。
但し…ここではそのインストールの方法から操作方法など、その詳細は一切解説しないので、ご自身で環境構築をしていただく必要がある。
どのみち、後で追加の機能(※「プラグイン」)などをインストールしなければならなくなるが、その辺をスムーズに執り行うには、やはり自身で操作に慣れておく必要は大いにある。
仮にその道を目指す人であるなら、その作業をスムーズに行えるようになっておく方がいい。
なぜなら、いざ実際の開発現場に入ると教えてくれる人はいないし、むしろそれが「当たり前」の作業となるためだ。
ちなみに「IDE」という語句についてはここでは解説していないが、まずはその語句の意味を調べていただくことからお勧めする。(なお、これは決して意地悪ではないので、くれぐれもご理解を!)


3.ポケットコンピュータを使用する

こちらは、このホームページ内の「プログラミング関連」の「誰も知らないコンピュータプログラミング」の記事で例に取り上げた、「ポケットコンピュータ」を使用する方法である。
但し、ポケットコンピュータ本体については、シャープの「PC-G850V」または「PC-G850VS」の使用を前提としたものであり、その内部の「C言語機能」を使用する方法である。
同機のその機能は、パソコン上で実行できるC言語に比べると、使用する機能にかなり制限があるが、基本的なその文法や構文はともかく、このクラスでC言語で画面上にグラフィック図形を描けるのはたいしたものだと思う。
余談だが、昔のパソコンでは花形だった「Z80」CPUの「アセンブラ」も内蔵されているので、「アセンブリ言語」の理論を学ぶこともでき、より理解を深めることができるだろう。
ただ、本体が現在でも入手可能かどうかは不明なので注意が必要である。


4.エミュレータを使用する

…正直、この方法はあまりにもマニアックなものとなるが、その一例という意味で参考に掲載した。
現在、「Windows」の上では「エミュレータ」と呼ばれるソフトウェアが出回っている。
これは、昔のパソコンやテレビゲームなどをWindows上で実行・再現できるというものだ。
さて、このホームページ内の「ハードウェア関連」の「作者の昔のパソコン体験記」で解説している昔当時のパソコンで、シャープが販売したパソコン・「X68000」シリーズのエミュレータと、当時その本体に付属していたC言語のようなBASIC言語・「X-BASIC」を使用する方法だ。
その内容については詳しくは解説しないが、最近になってこの言語仕様が、あの「iPhone」の開発用プログラミング言語である「Objective C」と幾らか互換性があるということらしい。
もしその環境が整うのなら、いまどきの最新のソフトウェア開発についての知識を得ることができるようになるかもしれない。(※その関連したサイトを一度ご覧いただくとよい)


・学習の進め方について

学習する環境が整ったら、あとはそのプログラミングについての学習を始めるだけである。
しかし…。
学習しようにも、その「お手本」となるべきものが必要であろう。
それについては、参考書籍から学ぶか?それともインターネットから随時情報を得るか?ということになる。
これについては、ズバリ最初は書籍から学ぶのがベストである。
できれば、インターネットから情報を得るという方法は、ある程度の基礎知識がついてからの方がいい。
なぜなら、これは後で解説するが、ネット上のサイトでは、すべてが初心者用として製作されたものではないからである。
さて、作者が書籍での学習を勧めるその大きな理由としては、「本を読む」ということは、どんな年齢においても読解力が得られるからである。
別の言い方をすると、それは若い世代の方なら、将来非常に役に立つ。
たとえば、実際にプログラマの職種に就いたとき、プログラムの基となる多くの仕様書を迅速かつ正確に読み取れるようになるし、読解力がつくということは、他人が記述したプログラムそのものも、正確に読み取ることにつながるからだ。

さて、それではどんな書籍が最適なのか?
ここでは、どの出版社のどの書籍ということは掲載しないが、作者から一つだけお勧めの書籍をご紹介しよう。
それは、共立出版の「プログラミング言語・C」である。
この書籍は、C言語の開発者自らが執筆したもので、その翻訳書でもある。
但し、初心者の方には、かなり難解な内容かもしれないが「事典」代わりに手元においておくと役に立つはずだ。
そんなわけで、普通のC言語の参考書籍の場合、基本文法はともかく、ポインタと関数、ファイル処理、構造体について解説されていることが最低条件だ。
また、最近のC言語の参考書籍では、前述の重要部分の解説が、そのまま省かれているものもあるので注意が必要である。(※作者の住む地元の図書館でも新しいC言語に関する書籍はあるが、重要部分が抜けていた)
なお…。
できれば既に準備したパソコン側の学習をする環境も対応しているかどうかを調べておくとよい。
そうすれば、書籍に沿って学習を進めていけるからだ。(※書籍に前述した「環境構築」について書かれているものがある)

では次に、前述のように書籍である程度学んだとして、そのあとインターネットを利用する場合である。
これは前述のように、プログラミング言語の解説については、実に多くのサイトが公開されている。
勿論、それがネットの強みなのだが…ここで注意が必要だ。
それは、そのサイトが「個人で運営」されているものの場合である。
そこに掲載されているであろう、サンプルのプログラムは「個人のクセ」が入っており、「完全な解法」とはいえない場合があるのだ。
…というのは、「適当にやっていて正しい答が得られた」、もしくは、「偶然に正しい答えが得られた」…という状況が考えられるからだ。
また、C言語というものは、そのプログラムを記述した「個人の性格」もよく現れるという。(※プロの方から教わったことである)
そんなわけで、そのプログラムを記述した人のクセも交えながら参考にする、或いは吸収できる部分は、得ておけばいいだろう。
但し…。
その際には、その内容や意味を必ず理解しておくことが重要である。
つまり、ただ真似をするだけではいけない…ということだ。


・理解度チェック

さて、この入門で例に取り上げたC言語を正しく理解できたかどうかの判定…というわけではないが、下記のように幾つかの練習問題を作っておいた。
同言語について、ある程度学習が進んだ段階でもかまわないので、ぜひ取り組んでみて欲しい。
なお、掲載しているプログラムは一部分ではなく、「すべての行」を掲載しているが、その使用するコンパイラの種類は問わないものとする。
念のため、その動作結果は、「VisualStudio」(※C++)と「Borland C++」で確認している。

問題1 次のプログラムを実行すると、どんな結果が表示されるか?

また、プログラム中の「p = &i[0];」の記述では、どのようなことが行われているのか?
さらにこのとき、「p」にはどんな値が格納されているのか詳しく述べよ。





問題2 問題1のプログラムを左のように書き換えた。どんな結果が表示されるか?

また、プログラム中の「p = (int *)…」の記述は、どのような意味を持つのか?
そして、この記述がなければ、プログラムの実行結果はどのようになるのか答えよ。

※何も変わらないのであれば、「何も変わらない」で良い。


…いかがだろうか?
どちらも実際に実行することができるので、その結果を確認することができるはずである。
ちなみにどちらのプログラムも、前述の通り、C言語では大切な部分についての例題である。
自分で作り変えたり、知っていることについて手を加えてみるとよい。

さて、この入門は一度公開したものを最近修正したものである。
但し、この入門をご覧になって、随分と不親切だ…と思う方もおられると思う。
それは、その情報の入手先の掲載…いわゆる「各種リンク先」の掲載が一切されていない点であろう。

時に、プログラミング言語というものは、さほど頻繁ではないものの、その仕様はどんどんと新しくなっていく
そのため、たとえばこのあいだダウンロードしたプログラミング開発のための「IDE」が、今日には新たにバージョンアップされていた…ということは、現代では当たり前のことだ。
たとえばIDEなど、その入手先のサイトでは日々バージョンアップが行われており、何かのためにせっかく説明画面ごとページを保存しても、すぐに変わってしまうのも珍しいことではない。
だから本ページで各種情報のリンク先や、参照サイトを掲載しなかったのは、まさにそれが理由である。
また…。
現在、個人でプログラミングについてページを公開している方は多い。
だが、作者の観るところ、だいたいどれも似たり寄ったりで同じような内容だ。(例題プログラムの掲載と、その解説が殆どである)
だから、この入門では、ちょっと違うものを目指してみた…というわけである。


・さらなるステップアップ

ある程度の学習が終了したら、いよいよ現代のプログラミング言語の習得に向けてチャレンジしてみるといいだろう 。
また、プログラマを目指す方なら、この段階で、ある意味「自分の方向性」を見出すこともできるはずだ。
なお、現段階ではコンピュータにおけるプログラミング言語の、そのプログラミングの方法についての基礎を学んだ…という段階に過ぎない。
但し…。
現代のプログラミング言語を学ぶ上で、その基準となる言語として、C言語を一通り学んだわけだから、必要なその基礎知識は十分についているはずだ。
そんなわけで、ここから次のステップに進めばよい。

たとえばWindows上で動作するアプリケーションソフトを作りたいのであれば…「C++言語」や「C#言語」、Webアプリケーションソフトを作りたいのなら…「Java言語」や「PHP言語」になる。
そしてそれに伴い、避けては通れないある大きなプログラミング言語の「概念」というものが絡んでくる。
それは…「オブジェクト指向」と呼ばれる概念だ。
このページの中でも、それらを入門するための解説を含めたプログラミング入門を掲載してあるので、引き続き大いにチャレンジして欲しいと思う。


※この記事は2018年11月に修正され、翌2019年8月に一部修正されました。
 なお、その後は2024年4月に追加修正されています。