paiza.ioでプログラミング(その3)C言語系のプログラミング言語

プログラミングのオンライン実行環境であるpaiza.ioを使っています。paiza.ioでは複数のプログラム言語を実行することが出来ます。そこでいくつかのプログラム言語を実行してみます。

以下の記事で書きまたが、プログラム言語にはそれぞれ特徴があって、いくつかの観点でグループ分けといったことも出来ます。何かの分野の開発をするにはある程度向いている言語があります。
構造化プログラミングと複数のプログラミング言語習得

こういった内容で複数のプログラム言語について考えるのにpaiza.ioは適しています。そこで今回はC言語、C++、Java、C#を試してみます。

特にどの言語が優れているとか、この言語だけ勉強すればいいということではないです。興味のある分野に適している言語や、比較的始めやすい言語から始めて、必要な場合は複数の言語をどんどん覚えることも出来るのではということです。

C言語から
まずはC言語からやってみます。Hello World的なプログラムは以下のように入力して実行出来ます。

ざっと思いつく特徴です。
コンパイラ言語で変数は定義して使用
段落(字下げ)は関係なく、セミコロンと中括弧が区切り
実行の単位は関数で、main関数から実行
ポインタ型があり実行時のメモリ空間に直接アクセス可能
文字列、ファイル、メモリ操作のは標準ライブラリ(標準関数)を利用
データのまとまりは構造体を定義して使用
リストや辞書等のデータ構造はないので自分で作成
オブジェクト指向は言語仕様には含まれない

これらの特徴について全てプログラムにして書けないので、以下は単純な関数の書き方です。自分で定義して作成した関数が、mykansuu()でprintf()は標準ライブラリです。

#include <stdio.h>

//自分の関数プロトタイプ宣言
int mykansuu(void);

//メイン関数
int main(void){
    // Your code here!
    printf("Hello Wordl!\n");
    
    //自分の関数を呼び出す
    mykansuu();
}

//自分の関数
int mykansuu(void)
{
    printf("自分の関数");
}

以下のように実行出来ました。

以下はポインタ型を使って実行時のメモリ空間のアドレスを使っている例です。

#include <stdio.h>

//メイン関数
int main(void){
   
   int a = 1; //int型の定義
   int *p = &a; //intのポインタ型へaのアドレスを代入
   
   printf("aの値=%d\n", a);
   printf("aのアドレス = %p\n", &a);
   printf("pの値(アドレス) = %p\n", p);
   
   *p = *p + 2; //処理的にはaに2を足すことと同じ
   printf("pの値(アドレス) = %p\n", p);
   
   printf("aの値=%d\n", a);
}

以下のように実行出来ました。

aの値が1から3に変化しています。但し、どこにも a=3 とは書いていません。その代わりにpという変数でメモリ空間上でaの値を変更しています。表示されているアドレスは常に同じで、変数aのアドレスです。そのアドレス上のint変数に2を足しているので a=3 になります。

そう言われてもよく分からないとなってしまうのが、このC言語のポインタの考え方です。全体的に難易度が高いというか習得するのに時間がかかると思います。

C言語が利用されている分野
今現在でC言語が利用されている分野は例えば以下があります。
LinuxのOS(カーネル)やデバイスドライバ
OSに近い通信系などのミドルウェア
マイコン系(組み込み系)やロボット系等

こういった分野なので、コンピュータを仕組みから勉強したいとか、デバイス(ハードウェア)を直接制御するプログラムを開発したいという方に向いています。

C++
次にC++です。以下のような特徴です。この特徴に尽きると思います。
C言語にオブジェクト指向を概念を追加した言語
C言語の仕様は基本的にはそのまま利用可

Hello Worldは以下のように描けます。

リストは以下のように標準で使えます。

#include <iostream>
#include <list>

using namespace std;
int main(void){
    
    typedef list<int> IntList; //int型のリストの型定義
    IntList lst; //int型のリスト

    //値を10個追加
    for (int i = 0; i < 10; ++i) {
        lst.push_back(i);
    }

    //サイズ(個数)の表示
    cout << lst.size() << endl;
    
    //要素の値の表示
    const IntList::const_iterator itEnd = lst.end();
    for (IntList::const_iterator it = lst.begin(); it != itEnd; ++it) {
        cout << *it << "\n";
    }
}

以下のように実行出来ました。

(特に何もしない)クラスを書いてみます。クラスの定義と実装は以下のように書くことが出来ます。通常はクラス単位でヘッダファイルとソースファイル別々に書きます。

#include <iostream>
using namespace std;

// Myクラスの定義
class MyClass
{
public:
    MyClass();
    ~MyClass();
    void hello(void);
};

// Myクラスの実装
MyClass::MyClass()
{
    
}

void MyClass::hello(void)
{
    cout << "Hello!" << endl;
}

MyClass::~MyClass()
{
    
}

//メイン関数
int main(void){
    MyClass myclass;
    
    myclass.hello();
}

以下のように実行出来ました。

何と言いますか、難し過ぎます。C言語のポインタの概念もそのままで、オブジェクト指向の概念があり、習得するのは相当時間が必要です。私自身は実際に開発実務で使ったことがありますが、今後はわざわざC++で開発したいとは思いません。一般的に現在では他の選択肢(C#、Java等)があればそちらを使います。(今現在、paizaラーニングにもC++はないようです。)

C++が利用されている分野
C言語とほぼ同じだと思います。マイコン系等では私は今でも利用しています。やはりこの分野であれば、C言語だけでなく、C++も必要な場合があるのでこの分野に興味があれば、基本的なクラスの書き方、使い方等は習得した方がいいと思います。

次にJava
次にJavaです。以下のような特徴があります。(※より詳細が必要な場合は別途調べてみて下さい。)
オブジェクト指向言語
中間言語方式
書き方はC言語、C++と似ている
C言語、C++のようなポインタはない
(ポインタは隠れている)

Hello Worldから書きます。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        System.out.println("Hello World!");
    }
}

以下のように実行出来ました。

paiza.ioのJavaのスケルトンほぼそのままです。

(特に何もしない)クラスを書いてみます。MyClass.javaに以下を作成します。クラス名とファイル名が一致していないとエラーになります。ファイル名の修正方法は、前回に書きました。

public class MyClass
{
    public MyClass()
    {
        
    }
    
    public void hello()
    {
        System.out.println("Hello MyClass!");
    }
}

以下のように実行出来ました。

リストを使ってみます。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
         
        //リスト整数
        List<Integer> intList = new ArrayList<Integer>();

        //0から9までを追加
        for(int i=0; i<10; i++)
        {
            intList.add(i);
        }
        
        //一括で表示する
        System.out.println(intList);
    }
}

以下のように実行出来ました。C++よりはまだ簡単というか分かりやすいと思いますが、いかがでしょうか。

Javaが利用されている分野
私は以下が思い付きますが、もっと幅広い分野で利用されていると思います。
Javaの開発環境
企業内システム、官公庁、自治体のシステム
一般消費者も利用するWeb系システム
Androidアプリ

今現在では企業システムを考えると設計出来るかどうかも含めてJavaのニーズは高いです。但しですが、OracleのJava SEのサポート有償化の件もあるのか、Javaに対しての後継となりそうな言語も出てきています。

サポート有償化に関してはややこしいと感じるのと自分自身には特に問題がないということでよく理解出来ていませんが、paiza.ioの環境はpaiza.IO利用ガイドを見ると今現在では以下です。
openjdk version “13.0.1” 2019-10-15
これは無償版で、個人でAndroidアプリ開発する場合等でもこの無償版が使えるので開発が出来ます。Androidアプリ開発をやってみたいと思ったらJavaを勉強するのもいいかと思います。

最後にC#
最後にC#です。C#の特徴は以下です。(※より詳細が必要な場合は別途調べてみて下さい。)
マイクロソフトが開発したプログラミング言語(オブジェクト指向言語)
名前の通りC言語系の書き方のスタイル
.NET系のフレームワーク(.NET Frameowrk、.NET Core等)上で動作する
Windowsプラットフォーム以外でも動作する

paiza.IO利用ガイドを見ると今現在では以下です。とにかくLinux系のOS上でMono(.NET Framework互換の環境)で動作しているということです。
Mono JIT compiler version 4.6.2 (Debian 4.6.2.7+dfsg-1ubuntu1)

C#でのHello Worldは以下です。

paiza.ioのC#スケルトンそのままです。ですので、”Hello C#”です。

以下は1から10までの整数から偶数を抽出するプログラムです。

using System.Linq;

public class Hello{
    public static void Main(){
        // Your code here!
        int[] vars = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
      
        var query = vars.Where(x => x % 2 == 0);
        foreach(var i in query)
        {
            System.Console.WriteLine(i);
        }
    }
}

以下のように実行出来ました。偶数を抽出するためにLinq(統合言語クエリ (Linq: Language-Integrated Query))を使っています。私自身が最近ではC#を最も利用していて、このLinqもよく使っているので書いてみました。

C#が利用されている分野
C#はマイクロソフトが開発したオブジェクト指向言語ですので、Windowsプラットフォーム全般で稼働するアプリケーションでよく利用されています。あと思いつくのが、ゲームエンジンのUnityです。UnityがC#をサポートしているのでゲームも開発出来るということです。(残念ながら私自身はUnityも含めてゲーム全般の実績はありません。)

何と言ってもWindowsプラットフォームでの開発を考えるであれば、C#を学習することは有効だと思います。

全体的なまとめとして
C言語、C++、Java、C#を順番にpaiza.ioで実行してみました。これらは代表的なC言語系ですが、習得するには時間がかかります。ですが、これらで開発出来るようになれば開発エンジニアとしては仕事の幅も広がると思います。もし、自由に選択出来るのであれば、個人的には最初はPythonを勉強するのがいいとは思いますが、paiza.ioであればすぐに実行出きるのでいろいろと試してみてください。