コンピュータが登場して2023年現在までの間に、IT業界にはたくさんのプログラミング言語が誕生してきました。
このコンテンツでは、そういった数多くあるプログラミング言語の特徴と学習レベル別のおすすめをご紹介します。

先に結論だけ話しておくと、プログラミング言語は好みの問題なので直感で選んでもまったく問題ありません。むしろ自分が愛せる言語を探してください。流行り廃れよりも楽しくプログラミングできることが何よりも大切です。

「学習を始めたばかりでどのプログラミング言語を選べばいいかわからない」という人や「プログラミングには慣れたけど、勢いのある言語や用途を絞った言語を学んでみたい」といった人の参考になれば幸いです。

かなり長めのコンテンツとなるため、目次をクリック or タップで見たいプログラミング言語まで飛ばすことをおすすめします。

プログラミング初心者におすすめのプログラミング言語

HTML/CSS

いわゆるマークアップ言語と呼ばれるHTMLとCSSです。「プログラミング言語ではないからプログラミング言語と共に紹介すべきではない」とおっしゃる人もいますが、そのあたりの議論は好ましくないので省略します。

役割としては、HTMLはWebページの見た目の構造を定義してあげるもので、CSSはWebページの見た目の装飾をしてあげるための言語です。 たとえば「ここからここまでは文章の段落です」と示してあげたいときは p タグというHTMLを書きます。「この文章のテキストの色は青です」と示してあげたいときはCSSで color: blue を書きます。

とにかく早く「書いたものによって動く」を体験したい方はぜひ触ってみてください。HTML、CSSともに、インターネットに多くの日本語の情報があるので勉強には困りません。

HTML/CSSサンプルコード
html
<!DOCTYPE html>
<html>
  <head>
    <title>シンプルなWebサイト</title>
    <style>
      header {
          background-color: #f8f9fa;
          padding: 20px;
          text-align: center;
      }
      nav ul {
          list-style-type: none;
          padding: 0;
      }
      nav ul li {
          display: inline;
          margin-right: 10px;
      }
      main {
          margin: 15px;
          padding: 10px;
          background-color: #eee;
      }
      footer {
          background-color: #f8f9fa;
          text-align: center;
          padding: 10px;
          position: fixed;
          width: 100%;
          bottom: 0;
      }
    </style>
  </head>
  <body>
    <header>
      <h1>サンプルサイトへようこそ!</h1>
    </header>

    <nav>
      <ul>
        <li><a href="#">Home</a></li>
        <li><a href="#">About</a></li>
        <li><a href="#">Contact</a></li>
      </ul>
    </nav>

    <main>
      <h2>我々について</h2>
      <p>これはシンプルなWebサイトです。</p>
    </main>

    <footer>
      <p>Copyright &copy; 2023. All rights reserved.</p>
    </footer>
  </body>
</html>

PHP

PHPは代表的なWebプログラミング言語です。Web以外で使うことも可能ですが、Webに特化していると思ってOKです。

一般的な「データベースにデータを保存したりデータを取り出して表示する」といったことはもちろん、モジュールと呼ばれる拡張機能を使えば画像の加工なども可能です。

WordPressという世界で最も有名なブログシステムのベースとして使われているプログラミング言語でもあります。比較的勉強がカンタンなプログラミング言語なので初心者におすすめできます。

PHPサンプルコード
php
<?php
class Database {
    private $host = "localhost";
    private $db_name = "test_db";
    private $username = "root";
    private $password = "";
    public $conn;

    public function dbConnection() {
        $this->conn = null;
        try {
            $this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $exception) {
            echo "接続エラー: " . $exception->getMessage();
        }
        return $this->conn;
    }

    public function fetchData($query) {
        $stmt = $this->conn->prepare($query);
        $stmt->execute();
        return $stmt;
    }
}

$db = new Database();
$conn = $db->dbConnection();

$query = "SELECT * FROM my_table";
$data = $db->fetchData($query);

while ($r = $data->fetch(PDO::FETCH_ASSOC)) {
    extract($r);
    echo "{$id}: {$name}\n";
}

?>

JavaScript/TypeScript

JavaScriptもPHPと同じく、Webに特化した言語でした。「でした」と過去形なのは、昨今さまざまなプラットフォームで使われることが増えたためです。

TypeScriptを並列に書いていますが、マイクロソフト社が開発したJavaScriptの拡張版です。コードを書くにあたって、より便利な機能が豊富なので、最近ではTypeScriptの案件がかなり増えてきました。

フレームワークとしてはReact.jsやVue.jsなどが有名で、実行環境ではNode.jsが有名です。こういったフレームワークや実行環境とセットで勉強することでより深く習得ができます。

JS/TSサンプルコード
typescript
class Counter {
    private count: number;

    constructor(initialCount: number = 0) {
        this.count = initialCount;
    }

    increment() {
        this.count++;
        console.log(`Count after increment: ${this.count}`);
    }

    decrement = () => {
        this.count--;
        console.log(`Count after decrement: ${this.count}`);
    }

    getCurrentCount() {
        return this.count;
    }
}

let counter = new Counter(10);

counter.increment();
counter.decrement();
console.log(`Current Count: ${counter.getCurrentCount()}`);

Python

機械学習やAI、データ分析などのツールとして有名なPythonです。もはや説明不要かと思われるほど有名になりました。

とにかく書きやすい、読みやすいことが特徴として挙げられます。それだけでなく、ライブラリと呼ばれる拡張パッケージが豊富で、ちょっとしたツールからガッツリした業務基盤までカバーできるほどの力があります。

初期のInstagramやDropboxといった有名サービスでも使われていたことで知られています。ほとんどのパソコンに最初からインストールされているため、とりあえず触ってみる、といったときのハードルも低くておすすめです。

Pythonサンプルコード
python
class BankAccount:
    def __init__(self, name, balance=0.0):
        self.name = name
        self.balance = balance

    def deposit(self, amount):
        self.balance += amount
        return self.balance

    def withdraw(self, amount):
        if amount > self.balance:
            print("残高不足")
        else:
            self.balance -= amount
        return self.balance

    def check_balance(self):
        return self.balance

taro_account = BankAccount("太郎", 500)

taro_account.deposit(200)
print(f"預かり後残高: {taro_account.check_balance()}")

taro_account.withdraw(100)
print(f"引き出し後残高: {taro_account.check_balance()}")

taro_account.withdraw(700)

Ruby

日本国産プログラミング言語の中で最も有名なものがRubyです。一昔はよくPythonと比較されがちでしたが、Perlというかつて広く使われていたプログラミング言語の後継という立ち位置で開発されました。

Rubyも読みやすさと書きやすさは、プログラミング言語の中では随一なためとても人気が高く、日本語の情報も手に入りやすいです。

また、Ruby On RailsというWebフレームワークはWeb開発の現場でもよく使われています。freeeというクラウド会計システムをつくっている上場企業でも現役で使われているので、まだまだ学ぶ価値は高いと言えると思います。

Rubyサンプルコード
ruby
class Item
  attr_accessor :name, :price

  def initialize(name, price)
    @name = name
    @price = price
  end
end

class ShoppingCart
  def initialize
    @items = []
  end

  def add_item(item)
    @items << item
  end

  def remove_item(item_name)
    @items.reject! { |item| item.name == item_name }
  end

  def total_cost
    @items.sum { |item| item.price }
  end

  def display_items
    @items.each { |item| puts "Item: #{item.name}, Price: #{item.price}" }
  end
end

item1 = Item.new("本", 1000)
item2 = Item.new("Tシャツ", 1500)
item3 = Item.new("ジーパン", 3000)

cart = ShoppingCart.new
cart.add_item(item1)
cart.add_item(item2)
cart.add_item(item3)

puts "ショッピングカート内の商品:"
cart.display_items

puts "合計額: #{cart.total_cost}"

cart.remove_item("Tシャツ")
puts "削除後のショッピングカート内の商品:"
cart.display_items
puts "削除後の合計額: #{cart.total_cost}"

Java

「どのプログラミング言語を学べばいいの?」という質問に対して、頻繁に名前が挙がるJavaです。先に話したJavaScriptと名前が似ていますが、まったく違うプログラミング言語です。

歴史の深さ、使われているシステムの多さ、機能の豊かさ、どれをとっても非常に高い位置にあるため、Javaはパソコンを触り続ける限り、必ずどこかで出会います。 その信頼性から、業務用システムに使われることが多く、ライブラリとフレームワークも豊富です。

Eclipseに代表されるIDEという統合開発環境を使えば、比較的お手軽に学習を始めることができます。フレームワークについては、SpringやStruts、Play Frameworkなどかなり種類がありますが、どのフレームワークもそれぞれ特徴があるので案件に合わせて選びましょう。

Javaサンプルコード
java
import java.util.ArrayList;
import java.util.List;

class Book {
    private String title;
    private String author;

    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

    @Override
    public String toString() {
        return "タイトル: " + this.title + ", 著者名: " + this.author;
    }
}

class Library {
    private List<Book> books;

    public Library() {
        this.books = new ArrayList<Book>();
    }

    public void addBook(Book book) {
        this.books.add(book);
    }

    public void removeBook(String title) {
        this.books.removeIf(book -> book.getTitle().equals(title));
    }

    public void listBooks() {
        for (Book book : this.books) {
            System.out.println(book);
        }
    }
}

public class Main {

    public static void main(String[] args) {
        Library library = new Library();

        Book book1 = new Book("Effective Java", "Joshua Bloch");
        Book book2 = new Book("Javaパフォーマンス", "Scott Oaks");
        library.addBook(book1);
        library.addBook(book2);

        System.out.println("ライブラリ内の書籍:");
        library.listBooks();

        library.removeBook("Effective Java");
        System.out.println("削除後のライブラリ:");
        library.listBooks();
    }
}

SQL

SQLは、データを保存するソフトウェアであるデータベースを操作することに特化したプログラミング言語です。SQLイコールデータベースに命令をするもの、という覚え方でOKです。

他のプログラミング言語と比べると、独特な書き方ではあるけれども、データベース内におけるデータの関係性をしっかり理解できていればとても使いやすい言語です。 他のプログラミング言語を使っていてもSQLにふれる機会は多々あります。

データベースエンジニアを目指す人やデータ分析を生業とするデータサイエンティストを目指す人は、最初から勉強しておくことをおすすめします。 機械学習などで使うデータの加工や整理といった作業はSQLだけでも完結できることも多いので、何かとよく使うことになります。

SQLサンプルコード
sql
CREATE TABLE authors (
    author_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

CREATE TABLE books (
    book_id INT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    author_id INT,
    price INT NOT NULL,
    publish_date DATE NOT NULL,
    FOREIGN KEY (author_id) REFERENCES authors(author_id)
);

CREATE TABLE sales (
    sale_id INT PRIMARY KEY,
    book_id INT,
    sale_date DATE NOT NULL,
    quantity INT NOT NULL,
    FOREIGN KEY (book_id) REFERENCES books(book_id)
);

INSERT INTO authors VALUES (1, '太宰治');
INSERT INTO authors VALUES (2, '三島由紀夫');

INSERT INTO books VALUES (1, '斜陽', 1, 1000, '1947-12-15');
INSERT INTO books VALUES (2, '金閣寺', 2, 800, '1956-10-30');

INSERT INTO sales VALUES (1, 1, '2023-08-05', 5);
INSERT INTO sales VALUES (2, 2, '2023-08-06', 7);

WITH AuthorEarnings AS (
    SELECT
        a.name AS author_name,
        SUM(b.price * s.quantity) AS total_earnings
    FROM authors a
    JOIN books b ON a.author_id = b.author_id
    JOIN sales s ON b.book_id = s.book_id
    GROUP BY a.name
)

SELECT author_name, total_earnings
FROM AuthorEarnings
WHERE total_earnings > 50; -- Filtering authors who earned more than 50

SELECT title
FROM books
WHERE book_id NOT IN (SELECT DISTINCT book_id FROM sales);

Swift

SwitftはApple社がつくり、MacOSやiPhoneなどに搭載されているiOSのためにつくられたプログラミング言語です。iOSアプリを開発する際には、別の言語で開発したとしても最終的にSwiftに変換します。

少し前までObjective-Cという言語を使っていましたが、より書きやすく読みやすいSwiftの登場でMacアプリ、iOSアプリの開発がグッとラクになりました。 日本語の情報も大量に探すことができるので、iPhoneを使っていて自分でアプリを作ってみたい!という人は楽しく学習できるプログラミング言語です。

Switftサンプルコード
swift
import Foundation

enum MovieGenre: String {
    case action, drama, comedy, horror
}

enum BookingError: Error {
    case insufficientSeats, invalidSeatSelection
}

protocol Bookable {
    var availableSeats: Int { get set }
    func book(seats: Int) throws
}

class Movie {
    let title: String
    let genre: MovieGenre
    var screenings: [Screening] = []

    init(title: String, genre: MovieGenre) {
        self.title = title
        self.genre = genre
    }

    func addScreening(screening: Screening) {
        screenings.append(screening)
    }
}

class Screening: Bookable {
    let startTime: Date
    var availableSeats: Int

    init(startTime: Date, availableSeats: Int) {
        self.startTime = startTime
        self.availableSeats = availableSeats
    }

    func book(seats: Int) throws {
        guard seats > 0 else {
            throw BookingError.invalidSeatSelection
        }

        guard seats <= availableSeats else {
            throw BookingError.insufficientSeats
        }

        availableSeats -= seats
    }
}

extension Movie: CustomStringConvertible {
    var description: String {
        return "\(title) - \(genre.rawValue.capitalized)"
    }
}

let movie = Movie(title: "Always 三丁目の夕日", genre: .action)
let screening = Screening(startTime: Date(), availableSeats: 5)
movie.addScreening(screening: screening)

let bookSeats: (Int) -> Void = { seats in
    do {
        try screening.book(seats: seats)
        print("\(movie)の予約が完了しました。 席\(seats)")
    } catch BookingError.insufficientSeats {
        print("席に空きがありません。")
    } catch BookingError.invalidSeatSelection {
        print("指定した席が不正です。")
    } catch {
        print("予期しないエラーが発生しました。")
    }
}

bookSeats(3)
bookSeats(4)

Kotlin

Kotlinは、先に話したScalaと同じくJavaの環境上で動くプログラミング言語の一つです。Googleが正式に認定したことにより、KotlinイコールAndroidアプリ開発、というのが主流になっているため、主にAndroidアプリ開発で利用されると思ってOKです。

AndroidStudioというAndroidアプリ開発環境を使うことによって、気軽に開発を開始できることも大きなメリットです。 言語としては、やや特徴があるものの、さまざまなプログラミング言語の使いやすい機能が一通り揃えられていて、かなり高機能になっています。 かわいらしい名前ですが、コトリン島というバルト海にある島の名前が由来となっています。

Kotlinサンプルコード
kotlin
data class Book(val id: Int, val title: String, val author: String)

sealed class LibraryResponse {
    data class Success(val books: List<Book>) : LibraryResponse()
    object Empty : LibraryResponse()
    data class Error(val message: String) : LibraryResponse()
}

class Library {
    private val books: MutableList<Book> = mutableListOf()

    fun addBook(book: Book) {
        books.add(book)
    }

    fun findBooksByAuthor(author: String): LibraryResponse {
        val foundBooks = books.filter { it.author == author }
        return when {
            foundBooks.isEmpty() -> LibraryResponse.Empty
            else -> LibraryResponse.Success(foundBooks)
        }
    }
}

fun LibraryResponse.print() = when (this) {
    is LibraryResponse.Success -> this.books.forEach { println(it) }
    LibraryResponse.Empty -> println("本が見つかりません。")
    is LibraryResponse.Error -> println("エラー: ${this.message}")
}

fun main() {
    val library = Library()

    library.addBook(Book(1, "斜陽", "太宰治"))
    library.addBook(Book(2, "金閣寺", "三島由紀夫"))
    library.addBook(Book(3, "Java Essentials", "Jane Smith"))

    val response: LibraryResponse = library.findBooksByAuthor("太宰治")

    response.print()
}

中級者におすすめのプログラミング言語

Scala

先に話したJavaとの親和性が高く、連携が簡単なScalaです。Javaと比べて、書き方がいまどきっぽい雰囲気なため、JavaからScalaに移行する企業も多く見受けられます。

信頼性と書きやすさ、さらに頻繁に新機能がリリースされるということもあり、これからの成長性が期待されるプログラミング言語の1つです。「おかたく強い言語」と「軽めのわかりやすい言語」のハイブリッドなイメージです。

なお、JavaのPlay FrameworkはScalaにも対応しているため、Javaを勉強した次に学ぶ言語としてもおすすめできます。

Scalaサンプルコード
scala
case class Student(name: String, score: Int)

object StudentRanker {
  def topNStudents(students: List[Student], n: Int, threshold: Int): List[Student] = {
    students
      .filter(_.score >= threshold)
      .sortWith(_.score > _.score)
      .take(n)
  }
}

object Main extends App {
  val students = List(
    Student("太郎", 90),
    Student("花子", 85),
    Student("健", 92),
    Student("理恵", 88),
    Student("スティーブ", 78)
  )

  val topStudents = StudentRanker.topNStudents(students, 3, 80)
  topStudents.foreach(student => println(s"${student.name}: ${student.score}"))
}

Go言語

Googleが開発したことで有名なGo言語です。Golangという呼び方をすることも多いです。 シンプルな書き味と実行速度が売りなこともあって、Web界隈のみならず、ドローン制御などさまざまなシーンで利用されています。

日本での利用者もかなり増えたおかげで、情報の手に入れやすさも二重丸です。 ただし、シンプルといってもポインタやアドレスといったプログラミング初心者にはやや難しい概念も使われているため、初心者におすすめできるかといったらそんなことないです。

習得すればさまざまな企業や案件に携われる幅が広がることは間違いないので、他のプログラミング言語を勉強して基礎ができた後に学ぶのがおすすめです。

Go言語のサンプルコード
go
package main

import (
	"errors"
	"fmt"
	"time"
)

type Task struct {
	ID      int
	Duration time.Duration
}

type Processor interface {
	Process(task Task) error
}

type SimpleProcessor struct{}

func (sp *SimpleProcessor) Process(task Task) error {
	if task.Duration <= 0 {
		return errors.New("不正な値です")
	}
	time.Sleep(task.Duration)
	fmt.Printf("進行中タスク %d\n", task.ID)
	return nil
}

func worker(taskCh <-chan Task, processor Processor, doneCh chan<- error) {
	for task := range taskCh {
		err := processor.Process(task)
		doneCh <- err
	}
}

func main() {
	tasks := []Task{
		{ID: 1, Duration: 1 * time.Second},
		{ID: 2, Duration: 2 * time.Second},
		{ID: 3, Duration: 1 * time.Second},
	}

	taskCh := make(chan Task, len(tasks))
	doneCh := make(chan error, len(tasks))
	processor := &SimpleProcessor{}

	for i := 0; i < 2; i++ {
		go worker(taskCh, processor, doneCh)
	}

	for _, task := range tasks {
		taskCh <- task
	}
	close(taskCh)

	for i := 0; i < len(tasks); i++ {
		err := <-doneCh
		if err != nil {
			fmt.Printf("エラー: %v\n", err)
		}
	}
}

Rust

RustはGo言語と並んで最近人気がうなぎのぼりのプログラミング言語です。高い性能を持ちつつ高速で動作する上、システムプログラミングというコンピュータに直接命令するプログラムを書くのにも適しています。 この特徴が、C言語やC++に代わるプログラミング言語といわれるゆえんです。

また、組み込み系といわれる、一言で言えば機械やデバイスなどのいわゆるハードウェアに搭載するソフトウェアにも使われることが増えています。 インターネットと物理的なモノをつなぐIoTに興味ある人にはおすすめできる言語です。

Rustサンプルコード
rust
use std::collections::HashMap;
use std::sync::{Mutex, Arc};
use std::thread;

struct Cache<K, V> {
    data: Mutex<HashMap<K, V>>,
}

impl<K, V> Cache<K, V> where K: std::cmp::Eq + std::hash::Hash + Copy, V: Copy {
    fn new() -> Self {
        Cache {
            data: Mutex::new(HashMap::new()),
        }
    }

    fn get(&self, key: K) -> Option<V> {
        let map = self.data.lock().unwrap();
        map.get(&key).cloned()
    }

    fn set(&self, key: K, value: V) {
        let mut map = self.data.lock().unwrap();
        map.insert(key, value);
    }
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let cache = Arc::new(Cache::<i32, i32>::new());

    let mut handles = vec![];

    for i in 0..5 {
        let thread_cache = cache.clone();
        let handle = thread::spawn(move || {
            thread_cache.set(i, i * i);
            println!("Thread {}: Stored {} -> {}", i, i, i*i);
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    for i in 0..5 {
        if let Some(value) = cache.get(i) {
            println!("Main thread: Retrieved {} -> {}", i, value);
        }
    }

    Ok(())
}

C言語、C++

C言語とC++は、説明不要かと思えるほどプログラミング言語の代名詞的存在です。 C++はC言語を拡張したプログラミング言語で、より高機能ながらもより難解さが増しています。

コンピュータが生まれてから、かなり初期に生まれたプログラミング言語ですが、プログラミングを学ぼうとして最初に学ぶにはどちらも適していません。 かなり理解が難しいです。 ある程度、プログラムがなぜ動いているか、を他のプログラミング言語を学んでいる最中に少しずつ吸収した後に勉強することをおすすめします。 C言語から始めて挫折する人は多いです。

処理の速さはもちろんのこと、コンピュータに関して表現できないことがないと言い切れるほど汎用化されたプログラミング言語なので、深くプログラミング力をつけたい人はぜひ勉強してみてください。

C++サンプルコード
cpp
#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>

class Animal {
public:
    Animal(const std::string& name) : name(name) {}
    virtual ~Animal() = default;

    virtual void speak() const = 0;

    const std::string& getName() const { return name; }

private:
    std::string name;
};

class Dog : public Animal {
public:
    Dog(const std::string& name) : Animal(name) {}

    void speak() const override {
        std::cout << getName() << " ワンワン!" << std::endl;
    }
};

class Cat : public Animal {
public:
    Cat(const std::string& name) : Animal(name) {}

    void speak() const override {
        std::cout << getName() << " ニャアアアン!" << std::endl;
    }
};

class Zoo {
public:
    void addAnimal(std::unique_ptr<Animal> animal) {
        animals.push_back(std::move(animal));
    }

    void removeAnimal(const std::string& name) {
        animals.erase(std::remove_if(animals.begin(), animals.end(),
                                     [&](const std::unique_ptr<Animal>& animal) {
                                         return animal->getName() == name;
                                     }),
                      animals.end());
    }

    void listAnimals() const {
        for (const auto& animal : animals) {
            animal->speak();
        }
    }

private:
    std::vector<std::unique_ptr<Animal>> animals;
};

int main() {
    Zoo zoo;
    zoo.addAnimal(std::make_unique<Dog>("コロ"));
    zoo.addAnimal(std::make_unique<Cat>("たま"));

    std::cout << "動物園の動物:" << std::endl;
    zoo.listAnimals();

    std::cout << "コロ削除..." << std::endl;
    zoo.removeAnimal("コロ");

    std::cout << "削除後の動物園:" << std::endl;
    zoo.listAnimals();

    return 0;
}

C#

Javaと似ているといわれるC#ですが、実際はところどころ違う部分があるので学ぶときに混同しないように気をつけたいプログラミング言語です。 ゲームを作る際に使われるゲームエンジンのUnityを使った案件では、かなりの確率でC#が採用されています。 他にもスマートフォンアプリ開発で使うXamarinという環境でも使われています。

Visual Studioという統合開発環境で開発することで、かなり書きやすくなり生産性を高めることができます。 C++ に影響は受けているものの、学習の難易度ではC#のほうが学びやすいというメリットがあるので、初心者にもおすすめできるプログラミング言語です。

C#サンプルコード
csharp
using System;
using System.Collections.Generic;
using System.Linq;

public abstract class Book
{
    public string Title { get; }
    public decimal Price { get; }

    protected Book(string title, decimal price)
    {
        Title = title;
        Price = price;
    }

    public abstract void Display();
}

public class Fiction : Book
{
    public Fiction(string title, int price) : base(title, price) { }

    public override void Display()
    {
        Console.WriteLine($"フィクション: {Title} - ${Price}");
    }
}

public class NonFiction : Book
{
    public NonFiction(string title, int price) : base(title, price) { }

    public override void Display()
    {
        Console.WriteLine($"ノンフィクション Book: {Title} - ${Price}");
    }
}

public interface ISellable
{
    event EventHandler<Book> OnSale;
    void Sell(Book book);
}

public class BookStore : ISellable
{
    private readonly List<Book> _books = new List<Book>();

    public event EventHandler<Book> OnSale;

    public void AddBook(Book book)
    {
        _books.Add(book);
    }

    public void Sell(Book book)
    {
        _books.Remove(book);
        OnSale?.Invoke(this, book);
    }

    public IEnumerable<Book> GetBooksUnderPrice(int price)
    {
        return _books.Where(b => b.Price < price);
    }
}

public class Program
{
    public static void Main()
    {
        var store = new BookStore();

        store.OnSale += (sender, book) =>
        {
            Console.WriteLine($"{book.Title}が販売中です");
        };

        var book1 = new Fiction("勇者の大冒険", 1000);
        var book2 = new NonFiction("戦後日本", 1200);

        store.AddBook(book1);
        store.AddBook(book2);

        Console.WriteLine("1100円以下の書籍:");
        foreach (var book in store.GetBooksUnderPrice(1100))
        {
            book.Display();
        }

        store.Sell(book1);
    }
}

Dart

DartはGo言語と同じくGoogle社が開発したプログラミング言語です。ウェブアプリやモバイルアプリのフロントエンドという、ユーザーが触れることのできる部分を開発する際に主に利用されます。 DartそのものがJavaScriptやモバイルアプリのソースコードへ変換できるようになっているため、一つの言語でマルチプラットフォーム開発できるようになっています。

Flutterという開発キットと一緒に開発に使われることがほとんどで、Flutterを使うことでより多くの機能を手軽にアプリに組み込むがことができます。 最近新しく開発されたスマホアプリでFlutterが使われているものがかなり増えたこともあり、スキルとして習得しておきたいものの一つです。

Dartサンプルコード
dart
class Task {
  final String title;
  bool isCompleted = false;

  Task(this.title);

  void toggleCompletion() {
    isCompleted = !isCompleted;
  }

  @override
  String toString() => isCompleted ? '[x] $title' : '[ ] $title';
}

abstract class TaskManager {
  void addTask(String title);
  void toggleTaskCompletion(String title);
  void showTasks();
}

mixin Persistence {
  List<Task> savedTasks = [];

  void save(Task task) {
    savedTasks.add(task);
  }
}

class SimpleTaskManager with Persistence implements TaskManager {
  final List<Task> _tasks = [];

  SimpleTaskManager();

  factory SimpleTaskManager.fromSavedTasks(List<Task> savedTasks) {
    var manager = SimpleTaskManager();
    manager._tasks.addAll(savedTasks);
    return manager;
  }

  @override
  void addTask(String title) {
    var task = Task(title);
    _tasks.add(task);
    save(task);
  }

  @override
  void toggleTaskCompletion(String title) {
    var task = _tasks.firstWhere((t) => t.title == title);
    task.toggleCompletion();
  }

  @override
  void showTasks() {
    _tasks.forEach((task) {
      print(task);
    });
  }
}

Future<void> main() async {
  var manager = SimpleTaskManager.fromSavedTasks([Task('Dart学習')]);
  manager.addTask('Start a Flutter project');
  await Future.delayed(Duration(seconds: 2));
  manager.toggleTaskCompletion('Dart学習');
  manager.showTasks();
}

R言語

R言語は統計解析と視覚化に特化したプログラミング言語です。統計学を仕事で使っていたり、学んでいたりする人にはうってつけのツールとなっています。 R Studioという開発環境を使うことで、コードを書いてからグラフ化するまでを手軽にできることも特徴です。

よく「Pythonでいいじゃん」と言われたりしますが、Pythonの実行環境よりハードルが低いこと、さくっと手軽にグラフ化までを実行できることなど、利点も多くあります。 その代わり、ほぼ統計とその視覚化以外に対する汎用性が低いこと、言語としてPythonよりコードが複雑化しやすいことなどデメリットも存在しています。

ガツガツ統計解析して結果を示さなくてはいけない、といった現場で使われています。 案件や使っている会社の数が少ないため、扱うエンジニアの数こそ相対的に少なくなっていますが、データサイエンティストを目指す人には特におすすめできる言語です。

R言語サンプルコード
r
library(ggplot2)
library(dplyr)

set.seed(123)
data <- data.frame(
  x = rnorm(100, mean = 50, sd = 10),
  y = rnorm(100, mean = 50, sd = 10)
)

data$z <- with(data, x + y + rnorm(100, mean = 0, sd = 5))

filtered_data <- data %>%
  filter(x > 40 & y < 60)

model <- lm(z ~ x + y, data = filtered_data)

print(summary(model))

ggplot(data = filtered_data, aes(x = x, y = z)) +
  geom_point(aes(color = y)) +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  theme_minimal()

上級者を目指す人におすすめのプログラミング言語

Erlang

Erlangは多くの通信の基盤となる分散システムを構築する並行処理を得意とする信頼性の高いプログラミング言語です。はじめに言っておくと、学習はかなり難解です。 大規模な通信が発生するシステムだとその恩恵をフルに使うことができますが、個人開発や独学では何ができるのか、を理解するところからハードルが高めです。

主な使い所として、ゲームの通信基盤部分に使われています。 データや通信の流れを一通り理解したあとに学べば、少なくとも利点を理解できる、といったレベルなので、ある程度の経験を経てから学習しましょう。

Erlangサンプルコード(サーバ)
erlang
-module(my_server).
-export([start/0, loop/1]).

start() ->
    Pid = spawn(?MODULE, loop, [0]),
    register(my_server_pid, Pid).

loop(Count) ->
    receive
        increment ->
            NewCount = Count + 1,
            loop(NewCount);
        get_count ->
            {SenderPid, Ref} = get_from(),
            SenderPid ! {Ref, Count},
            loop(Count);
        stop ->
            ok
    end.

get_from() ->
    receive
        {FromPid, Ref} ->
            {FromPid, Ref}
    end.
Erlangサンプルコード(クライアント)
erlang
-module(my_client).
-export([get_count/0, increment/0, stop_server/0]).

get_count() ->
    Ref = make_ref(),
    my_server_pid ! {get_count, {self(), Ref}},
    receive
        {Ref, Count} ->
            Count
    after
        5000 ->
            timeout
    end.

increment() ->
    my_server_pid ! increment.

stop_server() ->
    my_server_pid ! stop.

Elixir

ElixirはErlangの環境上で実行できるプログラミング言語です。Erlangをより親しみやすいものにしてくれます。 書き方としても日本人には馴染み深いRubyと似ているため、Erlang単体で学ぶよりもグッとハードルが下がります。 ただし、環境自体がErlangのため、Erlangをまったく知らない、という状況だとエラーが起こったときに困ります。Erlangに対する知識がほぼ必須なプログラミング言語といって良いでしょう。

使い所として、ネットワークサーバを構築する際には有用です。 初学者の方にとって最初に選ぶプログラミング言語になることはほぼないと思いますが、こういった用途が明確なプログラミング言語もあると覚えておいて損はありません。

Elixirサンプルコード
elixir
defmodule CounterServer do
  use GenServer

  def start_link(initial_count \\ 0) do
    GenServer.start_link(__MODULE__, initial_count, name: :counter)
  end

  def increment do
    GenServer.call(:counter, :increment)
  end

  def get_count do
    GenServer.call(:counter, :get_count)
  end

  def reset do
    GenServer.call(:counter, :reset)
  end

  def init(initial_count) do
    {:ok, initial_count}
  end

  def handle_call(:get_count, _from, count) do
    {:reply, count, count}
  end

  def handle_call(:increment, _from, count) do
    {:reply, :ok, count + 1}
  end

  def handle_call(:reset, _from, _count) do
    {:reply, :ok, 0}
  end
end

{:ok, pid} = CounterServer.start_link(5)
IO.puts(CounterServer.get_count())
CounterServer.increment()
IO.puts(CounterServer.get_count())
CounterServer.reset()
IO.puts(CounterServer.get_count())

Common Lisp

存在だけ知っておいてほしいプログラミング言語のLispです。Common Lispと書いているのは、Lispというプログラミング言語はさまざまな仕様があり、「これがLispです」と名言すると誰かに怒られそうだからという理由です。

書き方が独特なプログラミング言語を挙げろ、と言われたらまっさきに候補にあがります。カッコで表現する部分が多いのでコードを読みづらいです。

なぜLispを紹介しているか、それは僕がEmacsというエディタを使ってプログラミングしているからに他なりません。 EmacsではEmacs Lispによってカスタマイズができるようになっており、Lispに触れる機会があったり、著名な『ハッカーと画家』を書いたポール・グレアム氏のおかげで「言語としてレベル高い」というのを感覚的に理解できたからということがあります。

Common Lispサンプルコード
lisp
(defpackage :simple-animals
  (:use :common-lisp)
  (:export :make-dog :make-cat :speak))

(in-package :simple-animals)

(defclass animal ()
  ((name :initarg :name
         :accessor animal-name)))

(defclass dog (animal) ())
(defclass cat (animal) ())

(defgeneric speak (animal)
  (:documentation "動物の鳴き声"))

(defmethod speak ((animal animal))
  "私は動物です")

(defmethod speak ((animal dog))
  (format nil "わんわん!私は犬です" (animal-name animal)))

(defmethod speak ((animal cat))
  (format nil "ニャアアアン!私は猫です" (animal-name animal)))

(defun make-dog (name)
  (make-instance 'dog :name name))

(defun make-cat (name)
  (make-instance 'cat :name name))

(let ((koro (make-dog "コロ"))
      (tama (make-cat "たま")))
  (format t "~A~%" (speak koro))
  (format t "~A~%" (speak tama)))

Clojure/ClojureScript

Clojureは先に話したLisp系プログラミング言語の一つです。並行処理を得意とするという点ではErlangとも比較されることがあります。 データは常に流れており、その状態を保持したり破棄したり更新したりといったことをしながら処理を進めていきます。 しかもそれが同時に複数発生しているわけです。 そういったデータの状態を流れとともに複数管理するのに適したプログラミング言語だと思ってください。

そういった高機能なClojureでアプリケーションをつくるのに最適化したものがClojureScriptです。ClojureでWebアプリを開発するのが容易になるというイメージでOKです。 JavaScriptへの変換を経由するため、最初からJavaScriptかTypeScriptでいいじゃんと思うかもしれませんが、Clojureを手軽に試す上で有用です。

Clojureサンプルコード
clojure
(ns simple-todo.core
  (:require [clojure.string :as str]))

(defn create-todo [id title]
  {:id id, :title title, :completed false})

(defn toggle-todo [todo]
  (update todo :completed not))

(defmulti print-todo :completed)

(defmethod print-todo false [todo]
  (str "TODO [" (:id todo) "]: " (:title todo)))

(defmethod print-todo true [todo]
  (str "DONE [" (:id todo) "]: " (:title todo)))

(defn process-todos [todos command args]
  (cond
    (= command "list") (mapv print-todo todos)
    (= command "toggle") (assoc todos (first args) (toggle-todo (todos (first args))))
    :else todos))

(defn -main [& args]
  (let [todos (atom {1 (create-todo 1 "Clujure学習")
                    2 (create-todo 2 "Clojureアプリ実装")})
        command (first args)
        command-args (rest args)]
    (swap! todos process-todos command command-args)
    (doseq [todo (vals @todos)]
      (println (print-todo todo)))))

(-main "toggle" 1)

Haskell

特徴的なプログラミング言語の1つであるHaskellは遅延評価を基本としています。遅延評価とは、「結果が必要になるときまで計算しない」というもので、大量のデータを扱うときに役立ちます。

主にデータ分析や研究といった分野で使われている言語ですが、金融業界やセキュリティ業界での利用実績も多いです。しかしながら一般的なエンジニアが真っ先に習得する、という対象としては適していません。 ただ、多くのプログラミング言語で取り入れられているオブジェクト指向という考え方と対比している純粋関数型言語という特徴があるため、「関数型言語とはなんぞや?」という勉強をするときにHaskellを触ってみるというのはおすすめです。

Haskellサンプルコード
haskell
module Main where

import Data.Maybe (fromJust)
import qualified Data.Map as Map

data Expr
    = Add Expr Expr
    | Subtract Expr Expr
    | Multiply Expr Expr
    | Variable String
    | Const Int
    deriving Show

type Environment = Map.Map String Int

eval :: Environment -> Expr -> Int
eval _ (Const x) = x
eval env (Variable x) = fromJust (Map.lookup x env)
eval env (Add x y) = eval env x + eval env y
eval env (Subtract x y) = eval env x - eval env y
eval env (Multiply x y) = eval env x * eval env y

simplify :: Expr -> Expr
simplify (Add (Const 0) x) = simplify x
simplify (Add x (Const 0)) = simplify x
simplify (Multiply (Const 1) x) = simplify x
simplify (Multiply x (Const 1)) = simplify x
simplify (Multiply (Const 0) _) = Const 0
simplify (Multiply _ (Const 0)) = Const 0
simplify x = x

main :: IO ()
main = do
    let expr = Add (Multiply (Variable "x") (Const 1)) (Const 0)
    let env = Map.fromList [("x", 5)]
    putStrLn $ "Original expression: " ++ show expr
    let simpExpr = simplify expr
    putStrLn $ "Simplified expression: " ++ show simpExpr
    putStrLn $ "Evaluated expression: " ++ show (eval env simpExpr)

D言語

C言語に続くD言語は、C言語とコードの互換性はないものの、C言語の良いところを踏襲したシステムプログラミング向けプログラミング言語です。Javaと比較的似た書き方ができるため、C言語よりも学習コストは低いです。

C言語でつくりたいものがあるときに、代わりにD言語を使う、という候補として挙げられます。かなり表現方法が幅広く、先に説明したオブジェクト指向や純粋関数型、さらには手続き型などなど、マルチパラダイムプログラミング言語として知られています。

動作も速く、表現方法も豊か、さらには保守性にも優れているというメリットがたくさんあります。しかし、その分コンピュータに対して多くの知識を持っていればベストな選択をしつつプログラミングできる、ということでもあるので、経験を積んでから学習することをおすすめします。

D言語サンプルコード
d
import std.stdio;
import std.algorithm;
import std.range;
import std.container;

class Employee {
    string name;
    int age;
    double salary;

    this(string name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    override string toString() {
        return "Employee(" ~ name ~ ", " ~ age.to!string ~ ", " ~ salary.to!string ~ ")";
    }
}

double averageSalary(Employee[] employees) {
    return employees.map!(e => e.salary).sum / employees.length;
}

Employee oldestEmployee(Employee[] employees) {
    return employees.maxElement!"a.age > b.age";
}

void main() {
    Employee taro = new Employee("太郎", 30, 300000);
    Employee hanako = new Employee("花子", 40, 550000);
    Employee steve = new Employee("スティーブ", 35, 22000);

    Employee[] employees = [taro, hanako, steve];

    writeln("平均給与: ", averageSalary(employees));
    writeln("最高年齢従業員: ", oldestEmployee(employees));
}

Fortran

Fortranは今日紹介した中のものと比べても、1954年生まれと、とても歴史が長いプログラミング言語です。とにかく実行速度が速く、スーパーコンピュータなどの計算機科学と呼ばれる分野で使われています。

他にも宇宙分野などの計算量の多い科学系でも使用されることも多いです。といっても、言語仕様自体はそこまで難解というわけではなく、かなり読みやすい言語となっています。

大規模シミュレーションする人には向いていますが、初心者向けとは言い難いです。

Fortranサンプルコード
text
MODULE math_operations
  IMPLICIT NONE
  CONTAINS

  FUNCTION factorial(n) RESULT(fact)
    INTEGER, INTENT(IN) :: n
    INTEGER :: fact, i

    fact = 1
    DO i = 1, n
      fact = fact * i
    END DO
  END FUNCTION factorial

  FUNCTION fibonacci(n) RESULT(fibo)
    INTEGER, INTENT(IN) :: n
    INTEGER :: fibo, a, b, i

    IF (n <= 1) THEN
      fibo = n
      RETURN
    END IF

    a = 0
    b = 1
    DO i = 2, n
      fibo = a + b
      a = b
      b = fibo
    END DO
  END FUNCTION fibonacci

END MODULE math_operations

PROGRAM main_program
  USE math_operations
  IMPLICIT NONE
  INTEGER :: num

  WRITE(*,*) "Enter a number:"
  READ(*,*) num

  WRITE(*,*) num, "の階乗は", factorial(num)
  WRITE(*,*) num, "のフィボナッチ数は", fibonacci(num)

END PROGRAM main_program

Lua

Luaはスクリプト言語という簡略化されたプログラミング言語の中でも動作が速い言語です。もともとはC言語に組み込む前提で開発されたと言われています。 あまり馴染みが深くないプログラミング言語であるものの、ゲーム開発の現場でも使われることも決して少なくありません。

また、昨今のWebサーバとしてよく使われるNginxというソフトウェアの拡張をLuaで実装できるということもあるので、知らずにおくのはもったいない言語です。

書き方も比較的優しくわかりやすいほうなので、学習ハードルは低い印象があります。

Luaサンプルコード
lua
local Shop = {}
Shop.__index = Shop

function Shop.new(name, items)
    local self = setmetatable({}, Shop)
    self.name = name
    self.items = items or {}
    return self
end

function Shop:addItem(name, price)
    self.items[name] = price
end

function Shop:getPrice(itemName)
    return self.items[itemName]
end

function Shop:purchase(itemName, money)
    local price = self:getPrice(itemName)
    if price and money >= price then
        return true, money - price
    else
        return false, money
    end
end

local myShop = Shop.new("サンプルショップ")
myShop:addItem("りんご", 10)
myShop:addItem("バナナ", 5)

print(myShop.name .. "へようこそ!")
local item = "りんご"
local money = 15
local success, remaining = myShop:purchase(item, money)
if success then
    print("購入 " .. item .. ". 残額: " .. remaining)
else
    print("お金が不足しています " .. item)
end

Hack

Hackは一言でいえばPHPより高機能で速いPHPです。PHPと互換性があるため、PHPから学習を始めたエンジニアにとっては、もう一歩前へ進むのに適しているといえます。 HHVMという実行環境が必要だったり、PHPにはない機能が使えたりするので、学ぶことでプログラミングをより深く知ることが可能です。

ただ、案件として「Hackを使っています」というものを僕は見たことがないため、現場で使うことがあるかはわかりません。 PHPを使われている現場において、処理速度を求められる部分だけHackとHHVMで実行させる、なんて使い方ができると重宝します。

Hackサンプルコード
php
<?hh // strict

class Product {
  private string $name;
  private int $price;

  public function __construct(string $name, int $price) {
    $this->name = $name;
    $this->price = $price;
  }

  public function getName(): string {
    return $this->name;
  }

  public function getPrice(): int {
    return $this->price;
  }
}

class ShoppingCart {
  private vec<Product> $products = vec[];

  public function addProduct(Product $product): void {
    $this->products[] = $product;
  }

  public function getTotalPrice(): int {
    return vec_reduce(
      $this->products,
      ($acc, $product) ==> $acc + $product->getPrice(),
      0.0
    );
  }
}

function main(): void {
  $cart = new ShoppingCart();
  $cart->addProduct(new Product("シャツ", 1000));
  $cart->addProduct(new Product("パンツ", 2000));

  printf("ショッピングカート内の合計額: %.2f\n", $cart->getTotalPrice());
}

main();

Perl

PerlもCommon Lispと同じく、歴史が長いプログラミング言語の一つです。10年ほど前はまだ現役で使われている現場がありましたが、現在では別のプログラミング言語に置き換えられて見なくなりました。

インターネット黎明期に隆盛を誇ったCGIというWebサイトにおける画期的な仕組みとともに語られることが多いです。しかしPerlもCGIも、より高機能になった技術がどんどん出てきてしまったため、今ではめっきり目にすることはなくなりました。

決して今から勉強すべきプログラミング言語ではありませんが、我々のインターネット社会の発展を支えた大きな存在として覚えておいてほしい言語です。

Perlサンプルコード
perl
package Animal;
use strict;
use warnings;

sub new {
    my ($class, $name) = @_;
    my $self = { name => $name };
    bless $self, $class;
    return $self;
}

sub speak {
    my $self = shift;
    return $self->{name} . "という名前の動物です。";
}

package Cat;
use base 'Animal';

sub speak {
    my $self = shift;
    return "ニャアアアン!私は" . $self->{name};
}

package Dog;
use base 'Animal';

sub speak {
    my $self = shift;
    return "わんわん!私は" . $self->{name};
}

package main;
use strict;
use warnings;

my $dog = Dog->new("コロ");
my $cat = Cat->new("たま");
print $dog->speak() . "\n";
print $cat->speak() . "\n";

Nim

最後にご紹介したいプログラミング言語がNimです。現役エンジニアでも名前すら知らない、という人が多いのですが、今のところ僕としては最高だと思っているプログラミング言語です。 書き方がキレイかつシンプルなのにも関わらず、表現力が豊富で動作も高速、しかも高機能です。

書き方についてはPythonっぽく、C言語並みに様々な環境へ適応して実行でき、さらにGoやRustレベルで高速にもなります。 なぜ流行っていないのか、わりと真剣にわかりません。

ということでこの動画を見た人で、すでにエンジニアやっていて「新しく何か学びたいな」と思っている場合は迷わずNimを選んでみましょう。 Go言語やRust、TypeScriptを学んで案件の幅を増やす、それも悪くない選択肢ですが、楽しくコード書けるよ!感動するよ!ということでNimを推します。 僕もまだまだNimの学習を進めているところですが、久しぶりに子供のような気持ちで触れています。

Nimサンプルコード
nim
import tables, strutils

type
  Fruit = object
    name: string
    price: int

proc newFruit(name: string, price: int): Fruit =
  result.name = name
  result.price = price

proc `$`(fruit: Fruit): string =
  return fruit.name & ": $" & $fruit.price

var
  fruitBasket: Table[string, Fruit]

fruitBasket.initTable
fruitBasket["apple"] = newFruit("apple", 100)
fruitBasket["banana"] = newFruit("banana", 120)

proc addFruit(name: string, price: int) =
  fruitBasket[name] = newFruit(name, price)

proc getFruit(name: string): Fruit =
  return fruitBasket[name]

proc totalPrice(): int =
  var total = 0.0
  for _, fruit in fruitBasket:
    total += fruit.price
  return total

addFruit("cherry", 0.7)

echo "Fruits in the basket: "
for key, fruit in fruitBasket:
  echo fruit

echo "\n合計額: $", totalPrice()

個人的なおすすめ

ここまで一気にプログラミング言語を紹介してきましたが、個人的に僕がおすすめする言語は以下となります。

3位、Go言語/Rust/TypeScript。3つですが同率3位だと思ってください。どれ選んでも幸せになれます。仕事もあります。プログラミング言語としても非常に優秀です。
2位、Python。これはゆるぎようのない2位です。たぶん自分が勧めるプログラミング言語でずっと上位です。とにかく汎用性があって使いやすい上にコード書いていて楽しい。仕事でもよく使います。
1位、Nim。この時点で現役エンジニアの方には「案件ないもん勧めんな」って言われそうですが、やはり最後に紹介したNimをどうしても勧めたくなってしまいます。しばらくは個人的に学習を進めていきたいと思っています。もっと深く知ったらもっと好きになれそうなタイプです。

最終的に言語は好きなもの選べばいい、という話になります。おすすめを紹介しておいて突き放すような言い方ですが、こればかりは相性です。
言語というのはツールの粋を出ません。

日本語であろうと英語であろうと、「伝える」手段の一つなわけです。
プログラミング言語はコンピュータと対話するための手段なのです。伝え方や方言といったそれぞれのルールが存在していますが、結局より多くの表現方法を知っていれば洗練されていくという点では同じです。

他にも世の中にはたくさんの言語があるので、楽しく書けるプログラミング言語を見つけて、楽しく書きまくってみてくださいね!