マイコン研究会の日記

大阪市立大学マイコン研究会のブログです。

初めての言語について

記事を書くのは初めての松井です。読みにくかったらごめんなさい。長くなってしまったので適宜端折って読んでください。

以前友人から、「初めて言語を勉強しようと思うんだけど、何が良いかな?」という質問をされました。ここでいう「言語」というのは「プログラミング言語」のことです。今現在、プログラミング言語の数はマイナーなものも合わせて200を超えています。しかし、実際によく使われる言語となるとある程度数は絞られてきます。しかし、プログラミングのプの字も知らない人にとって、言語ごとの特性を考えて選択することは難しいかもしれません。今回はいくつかの言語の紹介も兼ねて、初めてプログラミングをする人におすすめできる言語を考えていきます。

先に結論を述べてしまうと、初めての言語におすすめできるのはGoかHaskellです。

ここではコンパイラなどの処理系に関することは述べません。

注意点

ここで述べていることには、個人的な感覚も多く含まれていますので、万人に対して一概に正しいとは言えません。プログラミングについて理解するには、実際に自分の手で書いて動かしてみるのが一番です。ここで紹介した以外にも様々な言語が存在します。是非、Googleと格闘しながらいろいろなものを作ってみてください。

用語

いくつか聞き慣れない単語が出てきますので、それらの意味を簡単に説明します。

ハードウェア・ソフトウェア
ハードウェアは、実際のCPUやメモリなどのことを指します。ソフトウェアハードウェア上で動き何かを処理するものを指します。スマートフォンならば、本体がハードウェアアプリがソフトウェアです。
GUICUI
GUIとは"グラフィカルユーザーインターフェース"の略で、マウスなどを使って操作し画像やボタンを表示したりするものを言います。CUIとは"キャラクタユーザーインターフェース"の略で、主にキーボードのみで操作し、テキストのみで画面を構成するものを言います。
低級・高級
コンピューターの構成を「ハードウェア層とソフトウェア層」と定義したとき、よりハードウェアに近い方を低級、ソフトウェアに近い方を高級と呼びます。
メモリ・リソース管理
メモリ領域や、ファイルなどのリソースをプログラムで使用する場合、適切な確保・開放が必要になります。ここではそのような処理をまとめて管理と呼んでいます。
ガベージコレクション
メモリ管理の責任をプログラマが負っている場合、メモリ開放用の処理をわざわざ記述しなければならないため、コードが冗長になったり、うっかりミスによるバグが発生しやすくなります。ガベージコレクションは、そのような管理をガベージコレクタに任せることでコードの冗長化やバグの発生を軽減します。しかし、大抵の場合自動化のため処理速度が低下します。

C

電気情報工学科の方は一番最初に習うかもしれません、世界で最も情報量の多い言語と言っても過言ではないC言語です。C言語は大変歴史のある言語ですが、今でも使用例のとても多い言語で、多くの資産が残されています。手続き型言語と呼ばれ、コンピューターに行わせたい処理を順番に記述していきます。

低級な処理を高級に記述できることが売りで、処理速度やよりハードウェアに近い処理が必要な場面で好んで使用されます。一方、メモリやリソースの管理は言語側で面倒は見てくれないのでプログラマが責任を持って行わなければならず、怠った場合メモリ・リソースリークなどの重大な問題を引き起こす場合があります。

ネットや書籍での日本語の情報がとても多いため、初めてプログラミングというものに触れてみる分においてはおすすめできます。しかし古くから存在する言語なため、少し高度なことをしようとすると面倒さを感じたり、もっとモダンな機能がほしいと思うかもしれません。どちらかというとシステムプログラミングに向いています。

#include

int main() {

printf("Hello, world!");

return 0; // 正常終了させる(省略可能)

}

Java

Javaという言葉には定義が複数あり、プログラミング言語を指す場合と実行環境を指す場合があります。JavaC言語とは違い、機械語コンパイルされたものを直接実行するのではなく、Javaプラットフォームというものが間に挟まります。Javaプラットフォームとは、プラットフォームという名の通り、Java言語で記述されたプログラムの開発や実行をするための基盤となるソフトウェア郡のことを指します。そのため、Javaプラットフォームが動作する環境ならどこでも同一のソースコードで動作するという特徴があり、高い移植性を備えています。

Java言語はオブジェクト指向が特徴の言語で、C言語などのJava以前の様々な言語の良い点を受け継いで生まれました。オブジェクト指向とは、プログラミングを現実でものを作ることに当てはめて考える方法です。処理を行わせる際にオブジェクトを作り、それが何かしらの状態や動作を持っていると考えます。また、安全性を重視しているため、メモリ管理ではガベージコレクションを搭載しており、メモリ管理を行うコードを記述する必要がなく、例外という実行時に起こってしまったエラーを安全に処理する方法も提供しています。こういった機能は、プログラミング初学者にとってはとても心強いでしょう。

Javaも歴史ある言語のためネットや書籍に情報が多くあり、実際に書き始めるための環境も整えやすいです。また、大学でJavaを教える講義もありますので、そちらを受講してみるというのも良いでしょう。しかし、Javaという言語は大きな企業で大規模なチームを作って開発を行う際に適していると言われるように、少し堅い言語です。そのため、言語の仕様に保守的な思想が現れており、同じことをしようと思っても他の言語と比べてコードが長くなってしまったり、今時の便利な機能が無いということが良くあります。よって、プログラミングという感覚を学ぶ上では、あまりおすすめしませんオブジェクト指向というもの自体が初学者にとっては難しいということも理由の一つです。

public class HelloWorld {

public static void main (String[] args) {

System.out.println("Hello, world!");

}

}

C#

C#はCやJavaに比べると比較的新しい2000年代生まれの言語で、Microsoftによって作られました。文法的にはCやJavaとよく似ていると言われます。また、Microsoftが推し進める.NET Framework上で動作するため、Javaと同じような特徴も兼ね備えています。できるだけプログラマが思ったとおりに書けるよう設計されています。

開発元がMicrosoftのため、Windowsとの相性がとても良い言語です。Windowsで動くGUIを使用するアプリケーションを作りたい場合はC#が最も良い選択肢となるでしょう。JavaやCの良いところを受け継ぎ、欠点を克服した言語と言えます。型推論や自動実装プロパティ、ラムダ式などの便利な機能も随時追加されており、この先ずっと使っていけるような言語です。最近はASP.NETというWeb方面に強いMicrosoft謹製のフレームワークや、XamarinというiOSAndroidでもC#でアプリを作れるようなプラットフォームも登場しており、様々な分野への進出を狙っています。.NET CoreやASP.NET5の登場により、さらにマルチプラットフォームに強くなりました。

C#そのものはマルチプラットフォームであり、Windows以外でも動作します。しかし、Windows以外のOSではフル機能の.NET Frameworkは使えないため、各プラットフォームごとに個別の対応が必要となります。LinuxOSXではMonoが.NET Frameworkの代わりとなります。また、オブジェクト指向の雰囲気が強いため、そのあたりには慣れが必要です。しかし、Javaと比べればC#の方が随分と書きやすくなっています。Cと同じように手続き型のように書くこともできないことはないです。

言語の開発元から強力な統合開発環境であるVisualStudio Communityが無償で配布されているため、これ一つインストールすれば完璧な環境を整えることができます。また、ネットや書籍にも情報が多いので、とても学習しやすい言語です。そういった点を考えると、C#は初心者におすすめの言語だと言えます。注意点として、VisualStudioは少々"重たい"ソフトウェアなので、多少強めのマシンパワーが必要になります。少なくとも、生協で販売されているようなPCではストレスを感じるでしょう。

/* ここではVisual Studioデフォルトの書式に従います。 */

using System; // System名前空間を読み込む

namespace HelloWorld

{

class Hello

{

static void Main(string args[])

{

Console.WriteLine("Hello, world!");

}

}

}

Python

Pythonは、Cなどとは違いインタプリタ言語と呼ばれます。このような言語には、コンパイルする必要がないという特徴があります。そのため、ソースコードを書いたら即座に実行することができます。また、動的型付けという大きな特性を持っています。動的型付けとは、実際にプログラムが実行されるまで型がわからないということで、逆は静的型付けと言います。長くなってしまうのでここでは詳しく説明しませんが、この特徴は大きく好みが別れる点になります。僕は静的型付け言語ばかり使っていたため、今となっては動的な型システムをなかなか使いこなせません。

Pythonは「やり方は一つ」という哲学に基づいており、同じ処理を行うものは誰が書いても大体同じようなコードになります。また、C言語と違い、コードのブロックをインデントで厳密に区別します。C言語は"{}"で覆っていればそれでブロックとなるため、実は改行などはあくまで読みやすくするためのものでしかありません。そのため、Pythonソースコードは自然と読みやすいものになります。

有名な言語なので、多くの書籍が刊行されておりネット上にもたくさん情報があります。簡単なコードであればすぐに書けるでしょう。また、テキストエディタと実行ファイルさえあればすぐに書き始められます。命令型や手続き型、オブジェクト指向や関数型など、さまざまな形式で書くことができます。しかし、こういった言語の特徴として、一見簡単で初心者向けに見えても実は奥が深く躓きやすいポイントが多いという点があります。こればっかりは実際に触ってみないとわかりません。公式のドキュメントも含めて、たくさんの入門用ページがあります。まずはそこから始めてみても良いでしょう。

以上の点を考えると、入門用の言語としておすすめできます。Pythonに慣れると他のコンパイラ型言語や静的型付け言語を学習するときに違和感を感じるかもしれません。他の言語でプログラミング自体に慣れてから触るとまた違った世界が見れるかもしれませんね。注意点としては、今から始めるならPython2ではなくPython3から始めたほうが良いです。

print("Hello, world!")

Ruby

RubyPythonと同じインタプリタ言語です。日本生まれのプログラミング言語で、海外で有名なPythonと対を成すような存在です。ドキュメントやネット上のページにも日本語の情報が多いです。

コンパイル不要という点ではPythonと似ていますが、その文法は全く違います。Pythonが「やり方は一つ」をモットーとしていたのに対し、Rubyは「多様性は善」という立場をとっており、プログラミングが楽しいものであることを目標としているようです。しかし、実際にRubyのプログラミングを楽しめるのは、ある程度慣れている人だけでしょう。Rubyのその独特な世界に飛び込むのは、プログラミング初学者にはいささか荷が重いと言えます。

僕はRubyを詳しく触ったことがないため、少ししか書けません。深く触ったことのある方はいろいろと指摘していただけると幸いです。

puts "Hello, world!"

Go

Go言語は2009年に生まれたとても新しい言語です。Googleが主導になって開発しており、貢献者の中にはC言語UTF-8の開発者も含まれています。そのため、Go言語の見た目はC言語に似ています。言うなれば、次世代のC言語といった感じです。処理速度も早く、実際にGoogleの様々な現場で使用されています。

Goは手続き型言語で、特に何か驚くべき新機能が搭載されているわけではありませんが、プログラマーがストレスなく様々なことをできるように設計されており、とても書きやすい言語です。ガベージコレクションを搭載しているのでメモリ管理を考慮する必要がなく、goroutineとchannelによって並列処理もとても気軽にできるようになっています。また、標準パッケージが多く揃っているため様々な処理を簡単に記述できます。覚えるべきことも少ないため、とても学習しやすいです。

Go Playgroundというものが用意されているため、特別な環境を用意しなくともブラウザさえあればすぐに試し書きすることができます。また、公式でA Tour of Goというツアー形式でGo言語を学ぶことができるものが用意されており、ここを一通りこなせばもうGo言語はマスターしたと言っても良いほどに簡単です。公式の日本語のドキュメントはまだあまり揃っていませんが、コード例などが載っているため英語でもあまり困ることはないはずです。

以上の理由から、Go言語はプログラミング初心者にはとてもおすすめできる言語です。Webでもシステムでも使える汎用性を持っているため、これ一つで様々なことができるようになるはずです。

package main

import "fmt"

func main() {

fmt.Println("Hello, world!")

}

Rust

ゲームのRUSTではありません。

Rust言語もGo言語と同じくとても新しい言語で、2010年に生まれました。ブラウザのFirefoxを作っているMozillaの主導で開発されており、安全で高速かつ高度な抽象化を可能にすることを目標として設計されています。公式にシステムプログラミング言語を謳っています。

先に言ってしまうと、Rustは初心者にとっては難しめの言語です。しかし、ガベージコレクションなしで安全なメモリ・リソース管理を実現していたり、安全なマクロによって高度に拡張可能であったりと驚くべき点がたくさんあります。

先に他の言語でプログラミングについてある程度学んでから触ってみるととても面白いでしょう。

fn main() {

println!("Hello, world!");

}

Haskell

この言語は今まで紹介してきた言語とは全く異なる純関数型言語で、数学のような感覚を覚える言語です。今までの言語は命令型プログラミングと言われ、コンピュータにああしろこうしろと命令することで動作します。しかし、Haskellは命令するのではなく、これはこうあれはこう、左辺と右辺は常に等しいと宣言していくことによって動作します。

まだ僕も学習中なので、あまり詳しく紹介することはできないのですが、よく想像されるようなプログラミングとは別世界のものであることを体感できます。また、Haskellは書籍やネットに情報も多く、学習材料には困らないでしょう。簡単なことと難しいことが入れ替わったような感じで、表示やファイル操作などの普通の言語ではなんでもないようなことが難しく、探索や構文解析などの難しいことが簡単にできます。

よくあるプログラミングとは一味違った世界から学びたいという場合、Haskellおすすめできます。僕のような命令型言語をやってきた人はその概念の違いから少し苦労するのですが、そういったものを知らない状態からのスタートなら、もっと学習しやすいはずです。ただ、関数型言語から命令型言語を学ぶのはそれほど苦労しません。そういう意味では初学者にアドバンテージのある言語と言えます。

main :: IO ()

main = putStrLn "Hello, world!"

最後に

長々と書きましたが、結局の所どの言語が自分に合うかは個人差が大きいです。いろいろな言語を試してみてくださいね。