わたしが使えるプログラミング言語と、使えるようになりたい言語を紹介します。ある技術者の事例として読んでいただければと思います。
使えるプログラミング言語
そもそも「使える」とは、以下とします。「使える」というより「習熟している」と読み替えた方がよいかもしれません。
- 言語仕様を、おおむね理解できている。
現在、多くのプログラミング言語は、仕様が大型化しています。「すべて理解できている」とすると、ここに記すのが厳しくなると考えています。 - 代表的なライブラリ機能を把握している。多くのライブラリ機能を補助的なリファレンスを参照して使うことができる。
- その言語らしい書き方が理解できている。
- その言語の弱点も把握していて、リスクが高い書き方を回避することができる。
下の2つは、厳しく感じる人がいるかもしれません。特定プログラミング言語に「習熟する」ことの私の目標と考えています。
わたしが「使える」と考えているプログラミング言語は、以下の3つです。
C 言語
C は、学生時代にアルバイトしていた企業で覚えました。このときは、ISO(ANSI)規格化される前です。20年ほど昔に組込み製品の開発者になってから、変わらず製品コードを C で書いています。ですから、30年以上 C を使っています。
長く使っていますので、文法はほぼすべて把握しています。現行の組込み製品では、標準ライブラリを使うことは少ないです。一方、使い始めたころは、Web の CGI も C で書いていました。その経験があるため、標準ライブラリの機能の多くを把握しています。まぁ C の標準ライブラリは、規模がそれほど大きくないですが。
C は、リソースが少なく性能が高い実行オブジェクトを生成することができます。しかし、現在の感覚では、文法面でリスクが多い言語です。C を安全に使うためのコーディングガイドライン MISRA-C や CERT-C などが提案されています。それらのガイドラインも、ある程度把握してプログラミングを楽しんでいます。
C++
C++は、IT技術者として、4年ほど勤務していた企業で覚えました。そのころは、C++98/C++03 でした。現在、わたしが担当している製品にも C++ が導入されつつあります。その規格バージョンは、C++11/C++14 で Modern C++ と呼ばれています。
C++ は、言語仕様自体が巨大で、そのすべてを把握していると言うことは難しいです。よく使う機能は理解できています。
C++ を使うのであれば、STL(Standard Templete Library)も使うと、威力が増します。事実、string や vector は、ライブラリ扱いですが、組込まれた言語仕様のように使われています。代表的なライブラリについては把握しています。
C++ は、いろいろな言語要素を取り入れています。そのため、C++らしい書き方を規定しにくいです。わたしは、STL とクラスを自然に使えていれば、C++ の威力を使いこなせていると考えています。
awk
多くの人にとって、マイナーなプログラミング言語だと思います。コンパクトな言語仕様を持つ、必要なことを簡単に実現できるプログラミング言語です。
C を覚えた後で、覚えました。当時の計算機の環境では、ひとつのプログラムですべての処理をするのが難しかったです。Unix 流の、「機能を分割して、それぞれの機能は単機能を処理するプログラムで処理する」という考えは有効でした。この事例は、Project Euler の問題を解く場合で説明しました(この例では、awk を使っていませんが)。現在は、プログラム言語の表現能力も計算機能力も上がっていますので、ひとつのプログラムで処理する傾向は強くなったと考えています。
awk は、少し前であれば Perl、現在であれば、Python や Ruby などのスクリプト言語に役割を譲ったと考える人もいます。ただし、POSIX で標準化されているため、特別なインストールをしなくても使える可能性が高いプログラミング言語です。
もちろん awk も言語仕様としては進化しています。特に GNU の awk 実装である gawk は、いまでもバージョンアップされています。
もっと使えるようになりたいプログラミング言語
例を示します。Project Euler 問題13で50桁の数字100個を加えるという問題を紹介しました。Python と Ruby と C(+GMPライブラリ)でのプログラムです。
"""Project Euler Problem013"""
problem = [int(input()) for i in range(100)]
print("Problem013: " + str(sum(problem))[0:10])
# Project Euler Problem013
problem = readlines.map(&:to_i)
puts "Problem013: " + problem.inject(:+).to_s.slice(0, 10)
#include <stdio.h>
#include <gmp.h> /* big integer */
int main(void)
{
int i;
mpz_t n; /* big integer n */
mpz_t sum; /* big integer sum */
char buffer[100];
mpz_init(n); /* n = 0 */
mpz_init(sum); /* sum = 0 */
for (i = 0; i < 100; ++i) {
gmp_scanf("%Zd", n); /* read n */
mpz_add(sum, sum, n); /* sum = sum + n */
}
gmp_sprintf(buffer, "%Zd", sum); /* convert sum to string */
printf("Problem013: %.10s\n", buffer);
mpz_clear(n); /* free n */
mpz_clear(sum); /* free sum */
return 0;
}
どうみても、特殊なライブラリを使っている C 版より、Python と Ruby のプログラムの方がすっきりと実現したいことが表現できています。
しかし、わたしは、C 版が一番速くプログラミングできました。GMP は、もともと使っていました。GMP のリファレンスを流し見しながらプログラムを作りました。もちろん一度で動作しました。
Python も Ruby も、手間がかかりました。検索して、少し試しながらを繰り返して作りました。言語の表現能力が大きいため、最終的にすっきり表現できたつもりです。ただし、Python らしい、Ruby らしいプログラムかは、自信がありません。
Python
Projetct Euler の問題を解く中で、流行る理由が分かりました。良いところは以下です。
- 整数の長さに制約がないなど、プログラムがしやすい仕様を実現しています。
- 言語が広く使われているため、検索で情報が得やすい。
- ライブラリも充実しています。
制御仕様や演算子も C と近いと思えました。まずは Python の習熟度を上げていきたいと考えています。
Ruby
書きやすさを優先した言語仕様は、Elixir など有望な多くの言語に影響を与えています。
Ruby は、Python より先に使うことを検討したことがあります。ただし、いろいろ他のことを優先していて、結局、いまだに習熟しているとはいえない状況が続いています(残念です)。Python がここまで流行っていなければ、Ruby を習熟したかったのですが、まずは Python の習熟を優先することにします。
これからプログラミングを楽しむ中で、どこかで「使える」ようになりたいプログラミング言語です。
PARI/GP
見慣れない言語と考える人は多いでしょうか。わたしの、お気に入りの言語として紹介します。
PARI/GP には、日本語のインデックスページがあります。ここでは、「PARI/GP は幅広く使われている計算機代数システム」と記載されています。用語について引用します。
- PARI は高速計算が可能なCライブラリです。
- gp はPARI関数を利用できる、便利なインタラクティブシェルです。
- GP はgpのスクリプト言語の名前です。
わたしは、言語 GP を使いこなすというより、gp という環境を電卓代わりに使っています。この計算環境は、機能が豊富で、速く動作します。
必要に応じて、gp を使っていますが、スクリプト言語 GP も機会があれば、習熟度を挙げたいと考えています。
使えるようになりたいプログラミング言語
いまの時点で、ほとんど使っていない言語を紹介します。ブログで紹介することが、わたしの動機付けにつながると考えています。
Julia
科学技術計算や数値解析の対応が得意と語られることが多い言語です。動的型付けですが、実行効率の低下は少ない、と言われています。Post Python という言語があるかは分かりませんが、もしあるとすれば、実行効率が高い Python を世間が求める可能性があり、その候補のひとつではないかと考えています。
Nim
Nim は、メタプログラミングを意識したプログラミング言語です。C++ のテンプレートを強力にしたという理解をしています(この理解は浅いかもしれません)。
面白い立ち位置のプログラミング言語として、しばらくウォッチしようと考えています。
最後に
自分が使えるプログラミング言語について、まとめました。
この記事では、Project Euler の問題を紹介することが多かったですが、Python の習熟度を上げるために以下の記事も書くことにします。
- AtCoder の問題を Python で解いてみる。
- AIZU ONLINE JUDGE のコースを Python で解いてみる。
やはり、プログラミング言語の習熟度を上げるには、その言語を使うことが一番だと考えています。