プログラミング入門者の方へ、言語を問わない基本の考え方 | サービス | プロエンジニア

    プログラミング入門者の方へ、言語を問わない基本の考え方

    • このページをはてなブックマークに追加

    公開日:2016年12月19日 最終更新日:2019年06月13日

    初めて独学でプログラミングを始めたころ、参考書を開いても全く頭に入ってこなくて苦労した覚えがあります。その理由は、コンピュータやプログラムというものの仕組みを知らずに、いきなりプログラミング言語の構文を覚えようとしていたためでした。

    そこで今回は、そもそもプログラムとは、プログラミング言語とはどんなものなのか、プログラミング学習自体が初めての方向けに成り立ちや考え方をご紹介したいと思います。

    目次

    1.プログラムとは?

    1.1 プログラムとは

    プログラムとは、コンピュータに実行させたい処理を記載した手順書のことです。コンピュータは常にこの手順書に沿って動いており、それ以外の動きをすることはできません。手順書に沿っていない動きをしたように見えるときは、その手順書=プログラムが間違っているのです。

    ▲目次へ戻る

    1.2 プログラミング言語とは

    プログラミング言語とは、プログラムを組む(プログラミングする)ために使用する言語のことです。決められた単語や構文が存在し、コンピュータに命令を伝えるための専用の言語です。

    プログラミング言語には低水準言語(低級言語)と高水準言語(高級言語)があります。ここでいう低水準とは、劣っているという意味ではありません。より機械が理解しやすいものが低水準、より人間が理解しやすいものが高水準と分類されています。

    <低水準言語(機械が理解しやすい)>
    ・機械語
    ・アセンブリ言語(アセンブラ)

    <高水準言語(人間が理解しやすい)>
    ・C言語
    ・Java など。他言語すべて

    基本的には、機械語とアセンブリ言語の2種類以外の言語は全て人間寄りの高水準言語になります。しかし近年人気のスクリプト言語等と比べるとかなり機械寄りであるC言語などのコンパイラ言語を、低水準言語と呼ぶ場合もあります。

    column_image6214_01

    ▲目次へ戻る

    1.3 アルゴリズムとは

    アルゴリズムとはプログラミングにとってとても大事な存在であり、課題を解決するための「解法」です。

    目的地への道順は一本ではないように、同じ問題を解決するためのアルゴリズムも複数存在します。出来るだけ早く到着したいのか、他の目的地にも対応できるようにしたい(汎用性を高くしたい)のか、途中の景色を楽しみたい(副産物がほしい)のかで、通る道順は大きく違ってくる可能性があります。

    いろいろな道順を考えて、どの道順が最も要求を満たしているかを考えることが、アルゴリズムを考えることなのです。

    ▲目次へ戻る

    1.4 コンパイルとは

    コンパイル(Compile)をそのまま日本語訳すると「翻訳」ですが、プログラミング用語としてのコンパイルは「機械語に翻訳する」という意味を持っています。人間が理解しやすいプログラミング言語からコンピュータが理解しやすい機械語に翻訳し、コンピュータが理解して実行できる状態にすることが「コンパイル」と呼ばれています。さらにコンパイルしていつでもコンピュータが読める状態になったものが、拡張子「.exe」などの「実行ファイル」です。

    なおコンパイルを行うための開発ツールのことを、「コンパイラ」と呼びます。プログラムの開発には、他にプログラミング言語を入力・編集するための「エディタ」や、プログラムの誤り=バグを発見するための「デバッガ」などの開発ツールを主に使用します。

    この「エディタ」「コンパイラ」「デバッガ」を全て組み合わせたものを、「統合開発環境」と呼びます。かつて統合開発環境は、C言語のVisual Studioなどを代表としてパッケージで販売されており、数万円するものが主流でした。しかし現在はJavaの統合開発環境である「Eclipse」など、誰でも無料でダウンロードして使えるものが主流となっています。

    このEclipseなどの統合開発環境には、コンパイルという名称の代わりに「ビルド」と名づけられた機能がある場合があります。この「ビルド」では、コンパイルを行った上で、さらにライブラリへの関連付けが行われています。

    column_image6214_02

    ▲目次へ戻る

    1.5 バグとは

    バグとは英語の虫(bug)が語源で、IT界隈では主にプログラムの誤り(エラー)のことを指します。かつてプログラムは、長い紙テープにパンチで穴を開けて記録していました。一説ではこの紙テープに予定外に空いてしまった穴を虫食い穴に見立てて、バグと呼ぶようになったと言われています。(ただしこの説はコンピュータの登場より以前から機械の不具合をバグと呼んでいた例があるため、誤りではないかと言われています。)

    column_image6214_03

    余談ですが先日定年を迎えた元エンジニアの方に聞いた話によると、彼が20代だった頃はこの穴あきテープによる記録が主流で、テープの穴を機械に通さずそのまま読んでいたそうです。その時代に比べると今はプログラムを学ぶハードルがかなり下がっているようで、いい時代になったものだなあと思います。

    column_image6214_04

    ▲目次へ戻る

    1.6 ライブラリとは

    ライブラリとは、あらかじめよく使う機能を共通プログラムとして準備しておき、誰でも呼び出して自由に使える部品のことです。その言語に最初から同梱されているものだけでなく、有志が作成した部品を読み込んで使用することもできます。一からプログラミングすると何行も必要な処理をたったの一行で呼び出すことが可能なので、ライブラリが充実しているほどすっきりとしてコンパクトなコードを書くことができます。

    ▲目次へ戻る

    2.プログラムの仕組みとプログラミングの流れ

    次にプログラムが動く仕組みと、プログラミングの流れについてご紹介したいと思います。

    2.1 命令はたったの5種類

    コンピュータは次のような、たったの5種類の装置で構成されています。

    ・入力装置
    ・演算装置
    ・制御装置
    ・記憶装置
    ・出力装置

    このそれぞれの装置を動かすのが次の5つの「命令」です。

    ・入力せよ
    ・計算せよ
    ・処理の流れを制御せよ
    ・記憶せよ
    ・出力せよ

    実はプログラミング言語とは、大きく分けるとこの5つの命令の組み合わせのみで構成されています。この5つの命令で構成された手順書に沿ってそれぞれ対応する装置が動くことで、コンピュータが動作するのです。

    column_image6214_05

    ▲目次へ戻る

    2.2 アルゴリズムを考える(例:ソートのアルゴリズム)

    前項でも述べましたが、アルゴリズムとは簡単に言うと、課題を解決するための方法です。プログラミングを行うには、まず手始めに前項で登場した5つの命令をどのように組み合わせれば課題を解決できるのか考える(アルゴリズムを考える)必要があります。

    アルゴリズムを学ぶ際によく例に挙げられるものとして、「ソーティングのアルゴリズム」があります。「ソーティング(ソート)」とは、「並べ替え」のことです。例えば、バラバラに並んだ数字を小さい順(昇順)に並べ替えるには、コンピュータにどのような命令をどのような順番で与えればいいでしょうか。

    ■バブルソートのアルゴリズム

    並べ替えでもっとも単純なアルゴリズムは、順番に隣と比べて交換していく方法です。

    バブルソートの処理方法は、次の通りです。

    column_image6214_06

    この方法は図のように隣り合う数字を比較して、「小さい方を左端に寄せていく」=「軽い方を上に浮かせていく」ことから、バブルソートと名づけられました。

    なおプログラムの処理性能を評価する方法に、オーダ(O)という概念があります。計算量から処理時間を算出するという方法ですが、ソートする要素の数を「n」とすると、バブルソートの平均計算時間と最大計算時間は、次のように表すことが可能です。

    平均計算時間:O(n²)
    最大計算時間:O(n²)

    バブルソートは総当たり戦のようなものなので、平均も最大も計算時間は常に同じです。

    ■クイックソートのアルゴリズム

    現時点で最も早いと言われている、並べ替えのアルゴリズムです。

    クイックソートの処理方法は、次の図の通りです。

    column_image6214_07

    このように「軸要素」を決定して、それより小さいか大きいかで分割していくのがクイックソートです。開発当時に存在した他のどのソートのアルゴリズムよりも処理速度が速かったことから、クイックソートと名づけられました。

    なおクイックソートの平均計算時間と最大計算時間は、次のように表すことができます。

    平均計算時間:O(nlog(n))
    最大計算時間:O(n²)

    クイックソートについては、軸要素にうまく中央値が選択できるかどうかで計算時間が大幅に変化してきます。そのため中央値の求め方は多数ありますが、主に次のような求め方があります。

    ・配列の真ん中の数字を、軸要素とする。
    ・左右どちらかの1番端と2番目を比べて、大きいほうを軸要素とする。
    ・左右の端と真ん中の数字の平均値を、軸要素とする。 (ほか多数)

    ■その他のソートのアルゴリズム

    他にもソーティングのアルゴリズムは数多く考案されており、代表的なものには次のようなものがあります。

    ・選択ソート
    ・挿入ソート
    ・2分木ソート
    ・マージソート
    ・ヒープソート
    ・バケットソート
    ・シェルソート

    興味のある方は、ぜひそれぞれのアルゴリズムについても調べてみて下さい。

    ▲目次へ戻る

    2.3 流れ図を書く(例:JISフローチャートの書き方)

    前項で考えたアルゴリズムを元に、プログラムの具体的な流れを図に起こします。これは「流れ図(フローチャート)」と呼ばれており、フローチャートに使用する図記号は、JIS規格に定められています。

    ■フローチャートに使用する図記号の例

    流れ線 column_image6214_08 処理の流れを表す
    端子 column_image6214_09 処理の開始と終了を表す
    処理 column_image6214_10 演算などの処理を表す
    定義済み処理 column_image6214_11 サブルーチンやモジュールなど、他所で定義した処理を表す
    準備 column_image6214_12 初期設定や変数定義など、その後の処理の準備を表す
    判断 column_image6214_13 条件分岐など、処理の流れを変える制御を表す
    ループ端(始) column_image6214_14 ループの始まりを表す
    ループ端(終) column_image6214_15 ループの終わりを表す
    記憶データ column_image6214_16 処理に適した形で記憶されているデータを表す
    入出力 column_image6214_17 媒体を指定しないデータ入出力を表す
    表示 column_image6214_18 画面表示による出力を表す
    手入力 column_image6214_19 手作業による入力を表す
    書類 column_image6214_20 外部書類への出力(プリントアウト)を表す

    ■フローチャートの作成例

    前項で挙げた「バブルソート」のプログラムをフローチャートにすると、次のように表すことができます。

    column_image6214_21
    • (参考:平成25年度秋期 応用情報技術者試験 午前試験 問9)

    ▲目次へ戻る

    2.4 プログラムを組む

    最後に、作成したフローチャートを元にプログラミングして完成です。

    次のソースは、C言語で上のフローチャートを実装した場合のサンプルです。


    int BubbleSort(int x[ ], int n)
    {
      int i, j, temp;

      for (i = 1; i < n-1; i++) {
        for (j = n; j > i+1; j--) {
          /* 1つ前の要素の方が大きいならば */
          if (a[j - 1] > a[j]) {
            /* 要素を交換する */
            temp = a[j];
            a[j] = a[j - 1];
            a[j - 1]= temp;
          }
        }
      }
    }


    ▲目次へ戻る

    3.独学におすすめの入門ツール

    本項では、JIS規格そのものではありませんがアルゴリズムの考案やフローチャートの作成をゲーム感覚で楽しめる、おすすめの入門ツールをご紹介したいと思います。

    column_image6214_22

    ■公式サイトURL:https://scratch.mit.edu/

    ScratchとはMITメディアラボが開発した、教育用プログラミング環境です。フローチャートを書く感覚でプログラミングできる、ビジュアルプログラミング言語を採用しています。複雑な構文を覚えることなく論理的にプログラミングする感覚を練習することができるため、子供にだけでなくこれからプログラミングを始めたい大人にもおすすめです。

    ▲目次へ戻る

    column_image6214_23

    ■公式サイトURL: https://home.jeita.or.jp/is/highschool/algo/

    アルゴロジックとはJEITA(電子情報技術産業協会)が開発した、パズルゲーム感覚で楽しく学べるアルゴリズム学習環境です。ロボットを動かして赤い旗を全て回収することが目的ですが、いかにして効率よく動かすかを考えるところに醍醐味があります。繰り返し(Loop)や条件分岐(If)などの制御も登場しよりプログラミング風になっている、アルゴロジック2もリリースされています。

    ▲目次へ戻る

    4.アルゴリズムはプログラムを支える屋台骨

    アルゴリズムの項で例に挙げたソーティングのプログラムですが、今では自力で作成することはほとんどありません。なぜならばライブラリを呼び出す「たった一行」を書くだけで、最も効率的なソーティングを実現できる言語が多くなったためです。

    特に大規模開発が主流となっている現在では可読性(他人が読んで修正できること)が最重要視されており、かつての家庭用ゲーム開発現場のように限られたハードウェア性能の中でいかにグラフィックやレスポンスに優れたゲームを作るかに心血を注いだ時代のような、オリジナリティあふれるコードを書く機会は少なくなりました。

    しかし言い換えると、誰にでも書ける・読めるようなプログラムは、いずれAIでも書けるようになってしまうかもしれません。可読性の高いプログラムだけでなく性能の高いプログラムも状況に応じて書けるようなプログラマになるためにも、ぜひコンピュータの仕組みやアルゴリズムから考えてプログラミングする習慣を身に着けてみて下さいね。

    • このページをはてなブックマークに追加

    おすすめ記事

  • OCTPASS

    ピックアップ

    フリーランス

    【Swift】アプリ開発エンジニア★コミュニティサービス新規開発(iOS)

    月額単価 :60万円〜90万円

    ・iOS ネイティブアプリケーションの設計、開発 ・プロダクトのUI/UX改善 ・iOSバージョンアップへの...

    フリーランス

    【Python】サーバーサイドエンジニア★EnergyTech向け自社クラウドプラットフォーム開発

    月額単価 :60万円〜100万円

    電力系をメインに自社サービスを展開している企業で 要件定義~テストまでの工程をご担当していただき...

    フリーランス

    【Java】システムエンジニア★国内最大の宅配注文サイト開発

    月額単価 :70万円〜80万円

    自社で運営する国内最大の宅配注文サイトの 設計、開発を担当して頂きます。 担当業務はスキルによ...

    正社員

    【プロジェクトマネージャー】1億4千万ユーザーのアプリ開発/O2Oソリューション

    スマートフォンアプリ向けの自社プロダクトFANSHIPを用いた大規模案件の プロジェクトマネジメント業務...

    株式会社アイリッジ

    正社員

    【JavaScript】アプリケーションエンジニア|訪日旅行者向けプラットフォームサービスの開発

    ・訪日旅行者向けプラットフォームサービス「WAmazing」の 設計・開発・運用を行っていただきます。 ...

    WAmazing株式会社

    OCTPASS

    絞り込みメニュー

    絞り込みメニュー

    職種で探す

    SEACH_LISTjobcat257

    SEACH_LISTjobcat258

    SEACH_LISTjobcat259

    SEACH_LISTjobcat260

    SEACH_LISTjobcat261

    SEACH_LISTjobcat262

    SEACH_LISTjobcat263

    SEACH_LISTjobcat264

    SEACH_LISTjobcat265

    SEACH_LISTjobcat266

    SEACH_LISTjobcat267

    業種で探す

    雇用形態で探す

    勤務地で探す

    SEACH_LISTloccat391

    SEACH_LISTloccat394

    SEACH_LISTloccat403

    SEACH_LISTloccat413

    スキルで探す

    SEACH_LISTsklcat465

    SEACH_LISTsklcat466

    SEACH_LISTsklcat467

    SEACH_LISTsklcat468

    SEACH_LISTsklcat469

    SEACH_LISTsklcat470

    SEACH_LISTsklcat471

    こだわり条件で探す

    SEACH_LISTgoodcat337

    SEACH_LISTgoodcat338

    SEACH_LISTgoodcat339

    SEACH_LISTgoodcat340

    SEACH_LISTgoodcat341

    SEACH_LISTgoodcat342

    SEACH_LISTgoodcat343