基本情報技術者試験でアルゴリズムと並んで鬼門と言われるプログラミング問題(ソフトウェア開発)。プログラミングの知識だけでなく、プログラムの仕様を理解する力、論理的に考える力が要求される問題です。プログラミング問題は5つのプログラミング言語から選択式ですが、その中で一番簡単な言語はどれか、なぜその言語が簡単なのか解説していきたいと思います。
Contents
基本情報技術者試験のプログラミングで一番簡単なのはアセンブラ
午後問題の1つとして出題されるのがこのプログラミング問題です。下記の5つのプログラミング言語から1つを選択して問題に答える形式となっています。
・C言語
・COBOL
・Java
・アセンブラ
・表計算
馴染みのあるのはC言語とJavaだと思います。この2つを選択して解答する人も多いと思いますが、基本情報技術者試験のプログラミングにおいてこの2つは難易度高めの問題となる場合が多いです。逆に簡単なのは実はアセンブラです。コンピュータの知識が必須でとっつきにくいイメージですが、問題自体はシンプルなものが多いのです。
アセンブラについて
スポンサーリンク
アセンブラとは
そもそもアセンブラとは何かをまず見ていきましょう。基本情報技術者試験におけるアセンブラとはアセンブリ言語のことです。アセンブリ言語の説明をWikipediaから引用します。
アセンブリ言語(アセンブリげんご、英: assembly language)とは、コンピュータ、マイクロコントローラ、その他のプログラム可能な機器を動作させるための機械語を人間にわかりやすい形で記述する、代表的な低水準言語である。
要は機械語を人に分かりやすい形で記述したものがアセンブラ(アセンブリ言語)になります。
CASLⅡ
CASLⅡとは基本情報技術者試験用のアセンブラです。
アセンブリ言語は低水準言語であり、ハードウェアとの関連性が強く、ハードウェアによって記載の仕方が異なります。では基本情報技術者試験で扱うアセンブリ言語はどのハードウェアを対象としたものか?と言うと、実は実在するハードウェアではなく、基本情報技術者試験用の仮想のハードウェアをターゲットとしています。そしてこのハードウェアを動かすためのアセンブリ言語がCASLⅡです。
アセンブラのプログラム
ではプログラムの基本の形を見てみましょう。下記はGR0レジスタに格納されている値をGR2レジスタに格納するプログラムです。
LD GR2, GR0
LD部分は命令コード、GR2とGR1の部分はオペランドとそれぞれ呼ばれ、基本的にアセンブラのプログラムは
命令コード オペランド
の構成で記載されます。オペランドは命令コードによっては1つのことも複数のこともあります。またオペランドなしの場合もあります。
LDは具体的にロード命令であり、オペランド1のレジスタにオペランド2のレジスタの値を格納する命令となります。
スポンサーリンク
アセンブラが簡単な理由
基本情報技術者試験の午後プログラミング(ソフトウェア開発)問題では他の4つに比べてアセンブラが一番簡単だと思います。その理由を説明していきます。
問題内容がシンプル
基本的にプログラミング問題は下記のような問題から構成されます。
- 知識だけでほぼ解けてしまう問題
- 知識だけではなくプログラムの仕様から論理的に考えて答えを考える必要のある問題
問題を解く上で苦労するのはおそらく後者の方だと思います。知識だけでは解けないので、C言語やJavaの知識があっても解くのが大変で時間がかかります。アセンブラも上記2つの問題から構成されるのですが、後者の「知識だけで解けない問題」も問題自体がシンプルなので解きやすく、解く時間も短くなります。
参考にC言語とJava・アセンブラの問題文(プログラム以外の部分と解答の選択肢以外)の部分がそれぞれ何行あるかを数えてみました。
C言語 | Java | アセンブラ | |
---|---|---|---|
H30秋 | 66 | 57 | 29 |
H30春 | 53 | 61 | 36 |
H29秋 | 62 | 35 | 24 |
H29春 | 49 | 43 | 28 |
H28秋 | 63 | 44 | 33 |
H28春 | 35 | 29 | 26 |
H27秋 | 52 | 70 | 31 |
H27春 | 38 | 39 | 26 |
H26秋 | 66 | 65 | 25 |
H26春 | 41 | 57 | 43 |
基本的にアセンブラは他のC言語やJavaに比べて問題文が短いことが分かると思います。問題文が短いから問題が簡単である、とは一概には言えないですが、説明が長いほど複雑なプログラムを作ろうとしている問題となりますし、問題文の長さは問題文を読む時間に比例することになります。問題文が短いアセンブラは、問題文を読む時間を短縮でき、問題もシンプルになっています。
プログラムがシンプル
アセンブラとはコンピュータが読みこんで処理を行う機械語を人に分かるように直訳したものです。コンピュータは処理速度は非常に高速ですが、一度に処理できることは簡単なことのみです。アセンブラではこの一度行わせる処理がプログラムの1行分に相当します。この1行分の処理を何行分も組み合わせることでコンピュータは複雑な処理を一瞬で実行しているのです。
処理が簡単な分、機械語自体も非常にシンプルなものであり、それを直訳したアセンブラも非常に簡単なものになります。
スポンサーリンク
プログラム言語仕様が問題に記載されている
確かに命令コードやその動作、必要なオペランドの数などを覚えるのは大変です。ですが、実はアセンブラの場合、問題文の最後の方にアセンブラ言語の仕様が載っています。なのでこれを読みながら問題を解くことも可能です。暗記は不要ですし、命令や動きをド忘れして解答できないと言ったことがありません。
例えば下記リンクから見れる平成30年秋の問題において77ページ目からアセンブラの仕様が説明されています。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_2/2018h30a_fe_pm_qs.pdf
説明の内容は下記のような感じになります。
アセンブラ問題を解くコツ
平成30年秋のアセンブラ問題を実際に見てみましょう。その中でコツを解説していきたいと思います。
平成30年秋の過去問題はIPAのページから閲覧することが可能です。下のリンクをクリックすると過去問題のPDFが開きます。アセンブラ問題は問12で、62ページ目から問題が始まります。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_2/2018h30a_fe_pm_qs.pdf
問題の内容
指定された日付が1970年1月1日から何日目の日になるかを求めるプログラム作成に関するものです。ポイントは閏年の扱いですね。問題は非常にシンプルです。
プログラム
[プログラム1]の前半は下図のようになっています。
命令コードを理解しておく
LDやSUBL、JMIなどの命令コードがたくさん出てきます。アセンブラのプログラムを初めて見る人には馴染みのない文字列で意味不明という方も多いと思います。この馴染みのない文字列がアセンブラがとっつきにくい理由です。この命令コードがどういう命令であるかを理解しておくことがアセンブラ問題を解くコツの1つです(当たり前ですが・・・)。
前述の通り命令コードの説明は問題文に付いていますので、分からない命令コードは試験中に調べることが可能です。ただ試験中に全ての命令コードを理解しながら問題を解こうとすると時間がかかります。時間を短縮する&命令コードに慣れておくためにもアセンブラの使用や命令コードには事前に目を通し、理解しておくようにしましょう。もちろんド忘れした内容を思い出したり、確認のために試験中に仕様を参照するのはオーケーです。
スポンサーリンク
レジスタの値をトレースする
これはC言語やJava・アルゴリズム問題でも重要なテクニックですね。各変数がプログラムによってどのように変化していくかを追う・メモしておくことは問題を解くのに重要なヒントとなります。このテクニックは同様にアセンブラでも有効であり、アセンブラの場合は変数ではなくレジスタに格納される値がどのように変化していくかをトレースする必要があります。
レジスタの意味をトレースする
プログラムの中で注目していただきたい行の処理を1行ずつ解説していきます。
プログラム実行時
GR2には日付を格納したメモリ領域のアドレスが格納されている。
3行目
GR2に格納されたアドレスの値(年)をGR5に格納。GR5は年を格納している。
4行目
GR2に格納されたアドレス+1番地の値(月)をGR3に格納。GR3は月を格納している。
5行目
GR2に格納されたアドレス+2番地の値(日)をGR1に格納。GR1は日を格納している。
6行目
GR1に格納されている値を1引いた数値をGR1に格納。GR1は日数を格納することになる。
11行目
GR2にGR5の値を格納。GR5には年が格納されているので、GR2にも年が格納されていることになる。
緑蛍光ペンでなぞった部分に注目です。緑蛍光ペンでなぞった部分はレジスタの意味合いが変わった部分です。このようにアセンブラのプログラムではレジスタの意味合いがどんどん変化していきます。
例えばC言語の問題では用途ごとに変数を分けているケースが多く、変数の値はトレースする必要がありますが意味までトレースする必要はありません。ですので、プログラムのどの部分でレジスタがどういう意味で使用されているかをトレースしていく必要があります。
ここがC言語やJavaと異なる特徴の1つであり、アセンブラ問題を解くコツの1つでもあります。
アセンブラを勉強する方法(PR)
まず試してみると良いのが過去問です。時間がかかっても良いので、アセンブラ仕様を見ながら実際にアセンブラの問題を解いてみましょう。
スポンサーリンク
仕様を参照しながら過去問が解ける方
仕様を参照しながら問題を解けるのであれば、問題の最後に記載されているアセンブラの仕様を一通り理解し、あとは過去問を何回か解いて実戦慣れしておけば良いと思います。
過去問はIPAのWebサイトで閲覧することが可能です。ただし問題と解答は載っていますが解説が無いので、解説まで読みたいという方は市販の問題集を購入することをお勧めします。例えば「パーフェクトラーニング過去問題集」であれば解説も充実しています。表紙に記載の通り売上連続第一位の過去問であり人気の過去問題集になっています。
基本情報技術者パーフェクトラーニング過去問題集
仕様を参照しても過去問が解けない方
もし仕様を参照してもアセンブラプログラムの意味が理解できない・レジスタや主記憶が何であるかの知識に自信がない、といった方には「プログラミング入門 CASL2」を読んで勉強するのがオススメです。
プログラミング入門 CASL2
他のCASLⅡの解説書に比べて分かりやすい内容であり、プログラミング未経験でも読みやすい参考書になっています。コンピュータの知識と紐付けながらアセンブラについて説明してくれますので、アセンブラの知識が身につくのはもちろんのこと、コンピュータの知識も身につけることが可能です。どのようにコンピュータが動いてプログラムが実行されるかのイメージが付きようになりますので、この本で身につけた内容はアセンブラ言語だけでなく他の言語のプログラミング時にも活かすことが可能です。またコンピュータの知識が身につきますので基本情報技術者試験の午前問題対策にも有効です。
アセンブラ以外を選択しようとしている人にもアセンブラ学習はオススメ
プログラミング未学習の人にもアセンブラはオススメですが、すでにC言語やJava等を学んできた人にもセンブラの学習はオススメです。
なぜなら、試験本番時に選択できるプログラミング言語の選択肢が増えるからです。プログラミング問題ははっきりいって回によって難易度の差が大きいです。なので、解答可能なプログラミング言語が1つのままで受験するのはリスクが高いです。特に他の言語を理解している人にとってはアセンブラは命令コードさえ理解すれば馴染みやすいプログラミング言語だと思います。問題自体も他のプログラミング言語に比べてシンプルなものが多いため、リスク分散するためにもアセンブラを学習しておくことは試験対策にかなり有効です。
私も最初に基本情報技術者試験に合格した時は、C言語に一番自信があったのですが本番ではアセンブラを選択して解答しています。
スポンサーリンク
まとめ
基本情報技術者試験においてプログラミングの問題は難易度が高いですが、その中でもアセンブラは易しめの問題であることが多いです。文法や命令コードに馴染みがなくてとっつきにくいかもしれませんが、プログラムの仕様が問題に掲載されており、さらに問題もシンプルなものが多いですので、慣れれば簡単に問題を解けるようになります。どうしても基本情報技術者試験に合格したい方・プログラミングで点数が稼げない方は是非アセンブラも学習してみてください。