C言語入門-第1回-実行環境の準備編

# 1.はじめに
## 1-1. 記事の目的と対象者

この記事の目的は、C言語を初めて学ぶ人々がスムーズに学習を始められるように、開発環境の準備方法をわかりやすく解説することです。具体的には、以下の点を目指します：

+ C言語の開発環境を選定し、インストールする手順を詳細に説明する
+ 初めてのCプログラムを作成し、実行する方法を紹介する
+ 基本的なデバッグ方法を理解し、実践できるようにする

この記事の対象読者は、以下のような人々を想定しています：

+ プログラミング初心者：C言語を初めて学ぶ人や、他のプログラミング言語の経験が少ない人
+ 学生：学校の授業や課題でC言語を学ぶ必要がある学生
+ 趣味でプログラミングを学びたい人：趣味としてプログラミングを始めたいと考えている人

## 1-2. C言語の魅力と学ぶメリット
+ シンプルで明確な構文
C言語の構文はシンプルで明確なため、他のプログラミング言語を学ぶ際の基礎となります。多くの現代的なプログラミング言語（C++、Java、C#など）はC言語の構文を基にしているため、C言語を学ぶことで他の言語の習得が容易になります。
+ 広範な利用範囲
組み込みシステム、オペレーティングシステム、コンパイラ、ネットワークプログラミングなど、さまざまな分野で使用されています。
学術研究や産業界でも広く利用されており、学ぶことで多くの応用が可能です。
+ プログラミングの基礎を理解できる
メモリ管理、ポインタ、データ構造、アルゴリズムなど、プログラミングの基本概念を深く理解することができます。最近の言語では意識しないように設計されている部分まで掘り下げて自分で実装する必要があるため、必然的に他の言語では理解しづらい部分について実装レベルで理解することができます。
+ 他の言語の習得が容易になる
C言語を学ぶことで、C++、Java、Pythonなど、他の多くのプログラミング言語の習得が容易になります。
基本的なプログラミングの概念を理解しているため、新しい言語を学ぶ際のハードルが低くなります。

# 2.開発環境の選定
## 2-1.使用する開発環境
ことC言語での開発に関してはメモ帳(かvim)とコンパイラさえあれば正直困らない……のですが、やはりプログラミングをする上でのサポート機能が整っているに越したことはないので今回はVisual Studio Codeを使用してプログラムを開発します。下記のリンクからインストーラをダウンロードしインストールしてください。

https://code.visualstudio.com/download

コンパイル・実行環境についてはwslを使用してLinux OSを準備し、その上で実行していきます。WindowsであればVirtualBoxなどで仮想環境を構築するよりもお手軽に環境準備が行え、開発したソースコードのデータ移行などの手間も省けるためです。

# 3.実行環境の準備
# 3-1.wslでのサーバ準備
まずは「wslが使用できるか」どうかを確認していきましょう。デスクトップ左下の「検索」欄に「Windowsの機能」と入力し、「Windowsの機能の有効化または無効化」を立ち上げます。下記のウインドウが表示されるので、ここから①Linux用Windowsサブシステム②仮想マシンプラットフォームにチェックがついていることを確認します。チェックがついていなかった場合は、チェックしてOKボタンを押し、機能を有効化後再起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3887788/1d21b4d0-e525-df35-6663-27c10adfb1a9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3887788/126e0100-a4c9-a4d0-645a-4b8b0c8db2bd.png)

さて、wslが使用できることが確認できましたら、Ctrl+Rキーを押して、「powershell」と入力しOKボタンを押します。PowerShellが立ち上がったことを確認したら、下記を実行し、wslを1⇒2へバージョンアップしましょう。(1でもよいのですが、色々と制約がありますので、2を使っていきます。)

`>wsl --set-default-version 2`

コマンドが実行されたら、さっそくLinux端末を建てていきましょう。まずは、利用できる
Linuxディストリビューションの一覧を見ていきます。

```
>wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe --install <Distro>' を使用してインストールします。

NAME                            FRIENDLY NAME
Ubuntu                          Ubuntu
Debian                          Debian GNU/Linux
kali-linux                      Kali Linux Rolling
Ubuntu-18.04                    Ubuntu 18.04 LTS
Ubuntu-20.04                    Ubuntu 20.04 LTS
Ubuntu-22.04                    Ubuntu 22.04 LTS
Ubuntu-24.04                    Ubuntu 24.04 LTS
OracleLinux_7_9                 Oracle Linux 7.9
OracleLinux_8_7                 Oracle Linux 8.7
OracleLinux_9_1                 Oracle Linux 9.1
openSUSE-Leap-15.6              openSUSE Leap 15.6
SUSE-Linux-Enterprise-15-SP5    SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6
openSUSE-Tumbleweed             openSUSE Tumbleweed
>
```
はい、なにやらたくさん出てきました。今回は、例としてDebianを使用していきます。
下記コマンドを実行し、インストールを行っていきましょう。ユーザー名は「development」
パスワードは好きなものを入れてください。これが完了するとLinux端末が利用できる状態になります。
development@コンピュータ名$　という形でコマンド待機状態となるので、exitを入力しいったん抜けましょう。

```
>wsl --install -d Debian
インストール中: Debian GNU/Linux
Debian GNU/Linux がインストールされました。
Debian GNU/Linux を起動しています...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: development
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
development@DESKTOP-BDQ039R:~$ exit
logout
この操作を正しく終了しました。
>
```

# 3-2.コンパイラの準備
ようこそ、Linuxの世界へ！ということで先ほど一度Linuxから抜けたかと思いますが、もう一度Linuxへログインしていきます。下記コマンドを実行すると、先ほど作成したユーザ(development)でログインした状態になります。
`wsl ~ -d Debian`

デフォルトの状態ではコンパイラが入っていないかと思いますので、さっそく、コンパイラをダウンロードしていきます。以下手順を実行しリポジトリをアップデートし、たのち、apt installを使用して、gccをインストールします。この、「gcc」がLinux用のコンパイラとなります。
```
development@DESKTOP-BDQ039R:~$ sudo apt-get update
[sudo] password for development:[先ほど設定したパスワードを入力してEnter]
Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:2 http://security.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:4 http://security.debian.org/debian-security bookworm-security/main amd64 Packages [181 kB]
Get:5 http://security.debian.org/debian-security bookworm-security/main Translation-en [109 kB]
Get:6 http://deb.debian.org/debian bookworm/main amd64 Packages [8,787 kB]
Get:7 http://ftp.debian.org/debian bookworm-backports InRelease [59.0 kB]
Get:8 http://ftp.debian.org/debian bookworm-backports/main amd64 Packages [239 kB]
Get:9 http://ftp.debian.org/debian bookworm-backports/main Translation-en [201 kB]
Get:10 http://deb.debian.org/debian bookworm/main Translation-en [6,109 kB]
Get:11 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [2,468 B]
Get:12 http://deb.debian.org/debian bookworm-updates/main Translation-en [2,928 B]
Fetched 15.9 MB in 2s (7,331 kB/s)
Reading package lists... Done
N: Repository 'http://deb.debian.org/debian bookworm InRelease' changed its 'Version' value from '12.5' to '12.7'
development@DESKTOP-BDQ039R:~$sudo apt install -y gcc
……(終了するまで待機)……
development@DESKTOP-BDQ039R:~$
```
## 3-3.プログラムの準備
さて、コンパイラのインストールが完了したら今度はプログラムの準備です。
Linux上からデスクトップ領域へ移動して、サンプルプログラムを作りましょう。
```
$ cd /mnt/c/Users/[Windowsユーザ名]/Desktop;pwd
/mnt/c/Users/[Windowsユーザ名]/Desktop
$ mkdir ClangExamples
$ cd ClangExamples;pwd
$ /mnt/c/Users/[Windowsユーザ名]/Desktop/ClangExamples
```
上記を実行すると、WindowsPCのデスクトップ上に「ClangExamples」なるフォルダが出来ていることが確認できたかと思います。(そう、これがwslを使用するメリットなのです……。Windows側のディスクが最初からマウントされているので、Windows側でプログラムを作成して、Linux上で操作できます……！)

さて、ここまで出来ましたらVisualStudioCodeを開いていきます。(LinuxにログインしているPowershellは後で使うので閉じないでください。)
そして、ファイル>新しいファイル　からプログラムを新規作成していきましょう。
上部の入力欄に入力を促されますので、Example1-1.cと入力し、エンターキーを押します。
すると、「ファイルの作成」という画面が立ち上がりますので、デスクトップから先ほど作成したClangExamplesを選択し、ファイルを作成します。(C言語の拡張機能のインストールを促されます。C言語をVSCode上で解釈するためのものなので、インストールしましょう。左側メニューの一番下にあるアイコンから、予めインストールしておくとこのインストールを促す手間が省けます。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3887788/8332e1c7-21d2-9ec8-88c2-41f92ff1bb47.png)


# 3-4.プログラム作成
さて、皆様のVsCodeの画面上にはExample1-1.cが開かれた状態になっておりますでしょうか？
ここまで準備が出来ましたらさっそくサンプルプログラムを書いていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3887788/9652e448-a426-5001-cdb6-e0a565b9980e.png)

記載するプログラムは下記のとおりです。説明は後程行っていきます。
下記のプログラムを記述し終わったら、保存し、PowerShellで開いていたLinux環境へ戻ります。
```Example1-1.c
/*ライブラリのインクルード*/
#include<stdio.h>

/*メイン関数*/
int main(void){

    /*文字列の出力*/
    printf("Hello! Adorable Hedgehog is Here!!\r\n");

    /*関数の設定戻り値*/
    return 0;
}
```
まずは、pwdでClangExamplesディレクトリに今いることを確認します。
そして、作成したプログラムが存在することを、ls -ltr|grep "Example1-1.c"コマンドで
確認します。
```
$ pwd
/mnt/c/Users/[Windowsユーザ名]/Desktop/ClangExamples
$ ls - ltr|grep "Example1-1.c"
-rwxrwxrwx 1 development development 234 Sep 17 14:52 Example1-1.c
```
プログラムが存在することを確認できましたら、コンパイルし、さっそく実行しましょう。

```
$ gcc ./Example1-1.c -o Example1-1
$ ls -ltr|grep Example1-1
-rwxrwxrwx 1 development development   234 Sep 17 14:52 Example1-1.c
-rwxrwxrwx 1 development development 15960 Sep 17 15:03 Example1-1
$ ./Example1-1
Hello! Adorable Hedgehog is Here!!
$ echo $?
0
```

実行結果として、Hello! Adorable Hedgehog is Here!!が出力されれば、成功です。

# 3-5.プログラムの解説
さて、プログラム

`#include<stdio.h>`
まずは上記の行ですが、
プログラムとは「コンピュータの機能を利用するためのライブラリ群」から使いたい機能を記述する
ことをいいます。具体的には下記のprintfという機能はこのstdio.hから提供されているものです。
つまり、#includeとは、<>内に記述したライブラリ(通常ヘッダファイルといいます)を使用することを
宣言するものです。もし、「おまじない」と習った人が居たら、忘れましょう。これは意味のある記述なのです。
`printf("Hello! Adorable Hedgehog is Here!!\r\n");`

では、下記のプログラム本体の中身について見ていきましょう。
```
int main(void){
    `printf("Hello! Adorable Hedgehog is Here!!\r\n");`
    return 0;
}
```
まずは前提知識として、function(){………}このような形で、記述された範囲のことを「関数」と呼びます。まさに数学の関数F(x)と同じで、()内の変数に対して、値が定まる機能についての記述が「関数」となります。C言語の記述は基本的にこの「関数」についての中身を設定することで実装をしていきます。

とりわけ、このプログラムでの関数は「main関数」と呼ばれ、一番最初に呼び出される関数になっています。
ここでは()内が「void(空)」となっていますから、つまり変数(引数)のない関数である、という意味になります。

そして、関数、と呼ぶからには結果として何か「値」が出力されるはずです。
そう、その関数の「結果」を返すのが「return 0」という記述なのです。※printfで出力される文字と誤解されがちですが、実は違います。
この「結果」のことを「戻り値」と呼びます(また別途説明します)。
戻り値を使用して、別なプログラムなどに対して「関数の計算結果を引き渡す」わけです。
ですので、例えば、試しに戻り値を100に変更すると、、、
```Example1-1.c
/*ライブラリのインクルード*/
#include<stdio.h>

/*メイン関数*/
int main(void){

    /*文字列の出力*/
    printf("Hello! Adorable Hedgehog is Here!!\r\n");

    /*関数の設定戻り値*/
    return 100;
}
```
実行後のecho $?の値が変わったことが分かるかと思います。echo $?というコマンドは、前回実行したプログラムから出力された「戻り値」を確認するためのものであるため、returnの設計によって関数が出す値が変わってくることが分かるかと思います。
```
$ gcc ./Example1-1.c -o Example1-1
$ ./Example1-1
Hello! Adorable Hedgehog is Here!!
$ echo $?
100
```
# 3-6.実はprintfも……
もしや、お気づきの方もいるかもしれませんが、printfも「関数」なのです。
内容はまだ理解しなくても大丈夫ですが、下記を実験的に実行してみます。
```Ecample1-1.c
/*ライブラリのインクルード*/
#include<stdio.h>

/*メイン関数*/
int main(void){

    /*変数の設定*/
    int number=0;
    /*文字列の出力*/
    number=printf("Hello! Adorable Hedgehog is Here!!\r\n");
    /*numberがprintfから受け取った値を出力*/
    printf("%d\r\n",number);
    /*関数の設定戻り値*/
    return 100;
}

```
コンパイルして実行すると、結果はこの通り。36という値がかえってきました。
これはどういうことかというと、printfという関数は、変数として「文字」を受け取ると、
処理としては出力をし、計算結果としては、出力した「文字数」を出力する関数なのです。
このように、関数名()という記述は基本的に「関数」であると覚えてください。※戻り値がない場合もあるのですが、別な機会に説明しますので割愛。
```
$ gcc ./Example1-1.c -o Example1-1
$ ./Example1-1
Hello! Adorable Hedgehog is Here!!
36
$
```
# 4.まとめ
さて、皆さん本日は下記について解説をさせていただきました。
是非、プログラム内容を変えて実行したりしてみて、どのような違いが出るか、試してみてください。
デバッグについても触れようかと思いましたが、まだプログラムがシンプルなため、そこまでは考えないこととします。

+ wslでのコンパイル環境準備について
+ プログラムのコンパイルについて
+ シンプルなプログラムの記述方法について
+ 関数・戻り値について

# 5.次回予告
次回は、プログラミングの基礎中の基礎である「変数とデータ型」について学びます。変数とは何か、どのように使うのか、そしてC言語で利用できるさまざまなデータ型について詳しく解説します。これを理解することで、より複雑なプログラムを作成するための土台が築けます。

次回もお楽しみに！一緒にC言語の世界を深く掘り下げていきましょう。