開発環境について
Hello World では駆け足で最初のプログラムを動かすまでを紹介しました。もう一度順を追って詳しくみていきます。
プログラムを動かすまでの手順の確認
原始的な手法
- コーヒーを入れる。
- テキストエディタでコードを書く。
- シェルに操作を切り替える。
- コンパイルする。
- エラーが出たらコードを直す。
- 実行して結果を確認する。
- 期待通りになっていなかったらコードを直す。
- 冷めたコーヒーを飲む。
できるだけ複雑なものを持ち込まないようにしたこの手法でもいくつかソフトウェアが必要です。
- テキストエディタ
- ターミナル
- コンパイラ (+リンカなど)
このうちテキストエディタとターミナルは何かしら最初からインストールされているのでそれを使うことにします。コンパイラはインストールされていないことも多いのでインストール方法を書いておきます。
GCCのインストール
コンパイラの選択肢はあまり多くありません。GCCかClangがよく使われると思われます。ここで使うのはGCCです。GCCは"GNU Compiler Collection"という意味で、C++以外にもいくつかの言語のコンパイラが含まれています。Cコンパイラが最も基本ですが、C++コンパイラも含まれています。インストールされているかどうか確認するにはg++ --version
を実行します。
g++ --version
g++ (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
「コマンドが見つかりません」というようなメッセージが出たらインストールされていません。
その場合、DebianやUbuntuでは以下のコマンドでインストールすることが出来ます。
sudo apt install g++
もう一度g++ --version
とタイプしてインストールされたことを確認します。
テキストエディタ
テキストエディタは何を使ってもいいです。EmacsかVimのどちらかは使えるようになっておいたほうが箔が付くかもしれませんが、最初はなんでもいいです。KDEならKate、GNOMEならgeditというのが最初から入ってます。コンソール用のだとnanoというのが入ってます。今回はKateを使いますがなんでもいいです。というのもKate自体がKDEを前提に作られているようなもので、KDEを使ってるのでなければ多くの依存するパッケージが一緒にインストールされてしまうからです。試しに使ってみるのにインストールするのはちょっとためらわれます。
nanoを使う場合
nanoはデフォルトのままだとかなり使いづらいので ~/.nanorc というファイルに以下の設定を書いておきます:
set autoindent
set multibuffer
set tabsize 4
set tabstospaces
tabsizeはインデント幅です。好みによって2にしたりしておきます。ただ、nanoは設定ファイルの編集に使うことも多く、設定ファイルはタブ幅8を基本にしていることも多いので、むやみに設定しないほうがいいかもしれません。
ターミナル
より正確に言うならターミナルエミュレータです。コマンドを入力するあれです。たくさんあるのですが、あまり試したことないです。KDEやGNOMEやXfceを使っているならセットで付いてくるものが十分高機能なのでそれを使えばとりあえずは大丈夫かと思います。なんならxtermのようなものでもOKです。
実際にやってみる
スクリーンショット付きで実際にやってみます。
1. コーヒーを入れます。☕☕☕
2. Kateを立ち上げて前回のHello Worldのコードを打ち込みます。
3. ターミナルを立ち上げてソースコードを保存した場所に移動します。
すでに立ち上がってる場合はAlt+TABでウィンドウを切り替えます。
4. コンパイルします。コマンドはg++ -o hello hello.cpp
です。セミコロンが抜けていたのでエラーになりました。
5. Alt+TABでKateに戻ってセミコロンが抜けていたところを修正し、保存します。
3. Alt+TABでターミナルに切り替えます。
4. 再度g++ -o hello hello.cpp
でコンパイルします。今度はエラーが出ませんでした。helloというファイルが作成されています。
6. ./hello
と打ち込んで実行します。hello, world!
と出力されました。
7. ここで、helloよりもHelloとしたくなったとします。修正するためにAlt+TABでKateに切り替えて、コードを修正して保存します。
3. Alt+TABでターミナルに戻ります。
4. 再びg++ -o hello hello.cpp
と打ち込んでコンパイルします。エラーはありませんでした。
6. ./hello
と打ち込んでプログラムを実行します。期待したとおりHello, world!
と出力されました。
8. 冷めたコーヒーを飲みます。☕☕☕
ウィンドウを切り替えるのが面倒過ぎる
このやり方の一番の問題は、コンパイルするためにターミナルのウィンドウに切り替えないといけないというところです。この小さなHello Worldを動かすためだけにも5回もAlt+TABでウィンドウを切り替えています。
できればコードを編集したらその場でコンパイルして結果を確認して、その場で実行したいところです。
Kateにはプラグインで組み込みのターミナルが使えるようになっています。
上ではテキストエディタKateの中でコードを編集してコンパイルから実行までを行っています。これでだいぶ苦痛は緩和されます。
さらに進んだ機能として、ターミナルからコンパイルコマンドg++を入力せずとも、メニューからクリックするかショートカットを叩くだけでコンパイルを行ってくれるビルドプラグインというものもあります。
この機能を活用するには、makeというプログムにどのようにコンパイルするか指示を与えるMakefileというものを記述しなければいけません。規模が大きなプログラムになるとMakefileはかなり難解なものになります。ですが、ソースコードが2つか3つ程度のものなら簡単に手作業で記述出来ます。
ビルドとはコンパイルに関連する複数の作業をまとめて、何らかのターゲットを生成するようなプロセスのことをいいます。
Kateは高機能なため組み込みのターミナルが使えたりメニューからビルドできたりします。残念ながらすべてのテキストエディタがこのような機能は持っているわけではないです。その場合はテキストエディタを乗り換えるかAlt+TABでウィンドウをとターミナルを行き来しながらプログラミングすることになります。最初はこれでも十分かもしれません。
原始的な手法から一歩足を踏み出して、ソースコードの編集とビルドのためにあるようなIDE (統合開発環境)と呼ばれるソフトウェアを使うことも出来ます。最初からIDEを使えば良いという意見もあると思いますが、IDEを使うにはプログラミングを始めたばかりの段階だと何をしているのか分かりづらくなるという欠点もあります。IDEの操作や仕組みの学習とプログラミングの学習を同時に行わなければならなくなり、少なからず複雑さを持ち込むことになります。
IDEを試す
これまでで、コンパイラ、テキストエディタ、ターミナルと最低限必要なツールが揃いました。しばらくこのやり方で進めることも何かの訓練にはなるとは思います。しかし、あまりに原始的すぎて苦痛に感じられる部分もあるかとおもうので、もう少し楽をさせてくれるものを導入しようと思います。
導入するのはIDE (統合開発環境)と呼ばれるものです。コードの編集、コンパイル、ビルド、デバッグなどの機能がまとまったソフトウェアです。大体IDEとよばれるものはコマンドを叩くことなく作業が行えるようになってます。
先のKateでテキストエディタ上からビルドを行ったのである意味IDEのようなものではあり、テキストエディタとIDEの境界は微妙なところでもあります。
Linuxで使えるIDEはいくつか候補があります:
- KDevelop
- QtCreator
- Anjuta
- Code::Blocks
- CodeLite
- Geany
- など..
Emacs、Visual Studio CodeのようなIDEに近い環境を構築できるテキストエディタもあります。
この中ではGeanyが一番使い方が簡単で、学習用途にも向いていると感じました。しばらくGeanyを使おうと思います。別におすすめしているわけではなく、すでに使っているものがあればまったく乗り換える変える必要ありません。
IDEのレビュー
ちょっと触った程度ですが感想を書いておきます。ここはもう少し使い込んだら更新します。
KDevelop
CMakeでビルドを管理します。この中では一番使いやすかったです。コード補完も優れています。KDEを使ってるならおすすめです。
QtCreator
コード補完も優れていて使いやすいです。Qtを使う場合qmakeというツールでビルドの設定するのですが、Qtを使わない場合CMakeも使えます。とはいえQtを使った開発での利用を第一に作られていると思うのでQtを使うならおすすめです。
Anjuta
たぶんGNOME用です。プロジェクトのテンプレートやウィザードが充実しています。ビルド設定が非常に複雑で、玄人向けだと感じました。エディタにはインデントに問題がありました。
ビルドのチュートリアルを見つけました。よくまとまっていて洗練されているので一読の価値あります。
Code::Blocks
GUIでビルド設定が出来ます。プロジェクトのテンプレートが充実してます。UIはやや古風な感じがします。ツールバーがアイコンとサイズがあってないのが気になります。
2020年12月時点で最新のバージョンは20.03ですが、Debian 10で提供されているバージョンは16.10とかなり古いです。このバージョンはシンボルブラウザというコードを解析して関数やクラスを視覚化してくれる機能があるのですが、すぐクラッシュしてしまい使い物になりませんでした。最新の20.03をインストールしてみると、このシンボルブラウザの機能は使えなくなってしまっていました。ちょっと残念です。
CodeLite
名前の通りライトな印象があります。ビルド設定はGUIから行えます。MakefileやCMakeを触る必要はないです。試用している最中に何度かフリーズしました。安定性にやや不安があります。もう一つ気になるのは、カラーテーマが色々用意されているのですが、テキストエディタの部分にしか反映されず、例えばダークなテーマを選ぶとサイドバーは白いままで非常に違和感があります。これが直ったら本当にライトなIDEとしていい感じになりそうです。
Geany
軽量でコンパクトなIDEです。限られた機能しかなく、できることは限られています。Makefileを書いて、ショートカットを叩いてmakeを走らせるのと、ショートカットを叩いてできたプログラムを実行するくらいです。これは上で使ったKateとあまり変わりない気もします。Makefileは一から自分で書かないといけません。
ソースコードが1つのファイルからなるプログラムだったらMakefileを書く必要もなく、何も設定せずにコンパイル、ビルド、実行出来ます。これは実験のために頻繁に使い捨てのコードを書く必要がある学習段階ではかなり使い勝手がいい思います。Makefileを手でかかないといけないのも、むしろよい訓練になっていいのではないかと思います。
コンパイルエラーがあった場合、その場所にジャンプする機能はあります。これは大変便利です。組み込みのターミナルもあります。
Geanyを使う
これから先はしばらくGeanyを使っていこうと思います。理由は自分自身も含めて学習用途に向いていると思うからです。
Geanyのインストール
インストールは簡単です。
sudo apt install geany
インストールされたか確認します。
geany --version
geany 1.33 (Apr 16 2018 以降に次を使用してビルドGTK 3.22.29, GLib 2.56.1)
起動するとこんな画面になります。
Hello Worldのコードを打ち込んで、保存します。場所は~/playground/helloworld_geany/hello.cpp
としました。保存画面はこんな感じになります:
ソースコードが保存できたので、次はそれをコンパイルします。メニューの「ビルド」を選択すると
- Compile F8
- Build F9
の2つが目に付きます。「Compile」の方を選択すると、リンクを行わず、現在編集しているソースコードのコンパイルのみを行います。結果、拡張子「.o」のオブジェクトファイルが生成されます。「Build」の方を選択すると、リンクまで行って実行ファイルが生成されます。今はF9を叩いてBuildの方を実行します。
コードにエラーがなければ「コンパイル完了」と表示されます。
出来たプログラムを実行するにはメニューから「ビルド」→「Execute」を選択するか、F5を叩きます。実行するとターミナルが立ち上がります。
なぜかGNOME端末が立ち上がりますが気にしないでおきます。
外部のターミナルを立ち上げるのではなく、Geanyに組み込みのターミナルで実行することも出来ます。メニューの「編集」→「設定」→「端末」→「VTEでプログラムを実行」にチェックを入れると、F5を叩けば、画面下部ペインの組み込み端末に結果が出ます。
実行した画面はこんな感じです。
ただ、組み込み端末で実行すると動作が不安定なのでやらないほうがよさそうです。
このようにただ一つのソースコードからなるプログラムをビルドするのはとても簡単です。
複数のソースコードからなるプログラムを書くようになったらMakefileを書いてビルドすることになります。できるとこまでGeanyで頑張ってみようと思います。