全15種のプログラミング言語でHello, worldした動画を公開!
こんにちは!
プログラミングが三度の飯より好きだけど、週末に趣味のプログラミングしてても、飯はちゃんと1日三食食べる、しずかなかずしです。
突然ですが、私は仕事でソフト開発の現場におります。しかし、周りで聞いてみても、意外と自宅でデスクトップパソコンを使っている人は少ないようです。まして、職場ではよく見かける、LinuxのOS、Ubuntuを自宅のパソコンでも使っているよ、という人は稀有な存在です。
みなさん、仕事とプライベートはきっちり分けている、ワーク・ライフ・バランスがしっかりした人ばかり、ということですね。
さて、その自宅のUbuntuパソコンは3年くらい前から使い始めたのですが、古いディレクトリの中を色々と調べていたところ、ブログをはじめたころに、ブログのネタのつもりで作っていた、おもしろ動画を発見。
ちょっと古い動画なのですが、まだどこにも公開していなかったので、本日は、一挙公開します。
プログラミング言語の最初はなぜかHello, world
プログラミング言語を習いたての時に、まずは「Hello, world!」を表示してみましょう、という課題に取り込む経験はありませんか?
私が最初に学んだプログラミング言語は、確か「BASIC」言語だったかと思いますが、その頃にHello, world!を表示した記憶がありません。しかし、最近のプログラミング言語の初心者の学習は、きっとHello, world!から始めるのではないでしょうか?
なぜその文化が現れたのか。
一説には、「C言語」解説書で有名なカーニハン・リッチーの「プログラミング言語C」という人もいます。
だとすると、私が大学時代にこの本に巡り合うまで、少なくともプログラムでHello, world!を記述することはなかったでしよう。子供の頃にBASIC言語でhello, worldをやったことがなかったのは間違いありませんね。2020年現在では、初めてのプログラミングといえば、Hello, world!今や、一般常識ですね。
それでは、なぜ、カーニハン・リッチーは、最初にHello, world!をやったのでしょう?
とにかくプログラムを動作させて、実際に動作していることを確認するのが簡単だから、ではないかと私は考えます。一般的にコンピューターの「プログラム」は、コンピューターの画面上に何も表示させることなく動作します。
例えば、こんな経験ありませんか?スマホで新しいアプリをインストールしたんだけど、インストールしたアプリが見た目上動作しているのではないのに、「裏」で何かが動いているために?バッテリーの消費が早くなった、みたいなケースです。ユーザにはプログラムの動作過程は見えないのですが何かがCPUの処理をさせているために、その分、意図せずバッテリー消費に使われてしまっている。こんなことが起こります。
プログラムは見えないところで処理をしている。この事実は、プログラミング初心者にとっては困りものです。自分が書いたプログラムが本当に動作しているのかわからないからです。これでは困るので、少なくともプログラムに「何か」出力させて、プログラムが動作していることを目でみて確認できるような状況を作れないか?その結果考案された(大げさ?)のが、Hello, world!を標準出力(コンソール)にテキストとして表示するプログラムというわけです。
異なるプログラムでも結果(Hello, world!)は一緒!
ご存知のように、プログラミングと一言で言っても、世の中にはさまざまなプログラミング言語が存在します。さながら、英語や日本語、中国語といった日常生活で使う自然言語のようでもあります。
「Hello」と「こんにちは」と「你好」とあいさつの仕方が異なる自然言語とは違って、プログラミング言語の場合は、Hello, worldはいつもHello, world。しかし、あいさつ文「hello, world!」という全く同じ表示をするプログラムでも、プログラムは言語毎に全く異なるのです。
つまり、あるプログラミング言語で文字列を表示させるのに「print文」を使うが、他の言語では「echo文」を使う、といった具合です。
例えば、Perlという言語をつかった以下の文章
print "hello, world!\n"
と、bashというシェルのシェルスクリプトの以下の文章
echo "hello, world!\n"
そして、C言語になると、もっと全然違った文章(プログラム)を記述する必要があります。
#include <stdio.h>
void main()
{
printf("hello, world!\n");
}
プログラム言語によって記述方法が異なりますが、これら全く異なる文に対する出力結果は、1行で「hello, world!」が表示されることはかわりありません。プログラム自体は全く違いますが、驚くことに出力結果は一字一句違いがない!
言い換えると、コンピューターになにか仕事をさせるために言語の違いは関係ない、ということです。どの言語を使っても同じ処理をさせることは可能です。ただし、言語仕様(文法)がそれぞれ異なるので、この言語はこういう処理は書きやすい、とか、こういう機能は作りやすい、といった向き・不向きが出てきます。プログラム言語のバリエーションは、プログラマーの生産性(機能の作りやすさ)によって増えている、と言っても過言ではありません。
これがプログラミング言語の面白いところです。
全15言語でhello,worldを表示する動画
ならば、そこらへんのめぼしいプログラミング言語の数々を使って、hello, world!を画面に表示させるとどうなるか??
ということで作ってみたのが、こちらの動画です。
この動画は、
- Linuxの’cat’コマンドを実行してプログラムを表示
- コンパイルが必要な場合はコンパイラーを実行
- プログラムを実行→hello, world!が表示
というサイクルを全15言語で繰り返す行うものです。
'cat’とはファイルの中身を表示する有名なコマンドですが、これを使ってまずは、プログラムのソースコードを表示します。3で実行する前に、コンパイル言語の場合は、2を実行しています。
コンパイルとは、プログラムのソースコードから実行形式のコード(ファイル)を生成する事。コンパイラーは実行形式のファイル生成を行うためのプログラムのことです。
プログラムや実行手順は全く異なるのに、出力は(最後のおかしなのを除き…)全て一字一句違わぬ「hello, world!」。
このシュールな感じを是非お楽しみ下さい!
解説:プログラミング言語
動画に登場するプログラムは、Githubで公開中です。
実行しているのは、Ubuntu (18.04 LTS版) です。
動画で実行したプログラムの順番で、プログラミング言語の解説を加えていきます。
Python
hello_world.pyにプログラムを記載しました。
Pythonはインタープリター言語なので、そのまま実行できます。
print("hello, world!")
Javascript (nodejs)
hello_world.jsにプログラムを記載しました。
Javascriptはブラウザで動作するプログラミング言語として有名ですが、ここでは、サーバーサイドで用いられるnodejsを使っています。
console.info('hello, world!');
PHP
hello_world.phpにプログラムを記載しました。
PHPは、ブログのCMS(Contents Management System)としてお馴染みのWordPressに使われているサーバサイドのプログラミング言語として有名です。インタープリター言語なので、PHPのプログラムでそのまま実行できます。
<?php
print("hello, world!\n");
Ruby
hello_world.rbにプログラムを記載しました。
Rubyもサーバサイドのプログラミング言語として有名です。インタープリター言語なので、Rubyのプログラムでそのまま実行できます。
puts "hello, world!"
Perl
hello_world.plにプログラムを記載しました。
かつては、大いに流行ったスクリプト言語ですが、最近はあまり聞かなくなった気がします。インタープリター言語なので、Perlのプログラムでそのまま実行できます。
print "hello, world!\n"
Swift
hello_world.swiftにプログラムを記載しました。
Swiftは、Appleが開発したプログラミング言語で、iOSやMacで動作するプログラムを記載する為に開発されました。オープンソースのプログラミング言語のため、私のUbuntu(Linux)でも実行することができます。
「コンパイラ」もあるようですが、そのまま実行できます。
ちなみに、「コンパイル言語」とはプログラムを実行するために、一旦「コンパイラ」と呼ばれるプログラムで、実行コードに変更した上で、実行専用のオブジェクトファイルを生成してから実行するような言語のことです。
print("hello, world!")
Bash Shell
hello_world.shにプログラムを記載しました。
'bash’というのは、linuxなどの「ターミナル」アプリのコマンドラインの処理を実行しているプログラム(「シェル」と呼ばれる)です。
コマンドの羅列をファイルに記載することで、プログラミング言語のように実行することができます。こういった形のファイルを「シェル・スクリプト」と呼んだりしますね。
一種のインタープリター言語なので、そのまま実行できます。
echo "hello, world!"
R言語
hello_world.Rにプログラムを記載しました。
R言語は統計とかデータ解析に使用されるプログラミング言語です。仕事では全く使ったことがない得体の知れない(失礼)言語です。数年前に新人で入ってきた新人類が操っていて、そんなものあるのだ、と初めて知った言語でした。インタープリター言語なので、そのまま実行できます。
cat('hello, world!\n')
C言語
hello_world.cにプログラムを記述しました。
泣く子もだまる「C言語」はコンパイラ言語の代表格ですね。私が仕事でプログラミングを始めた当初は、Cやこの後に登場するC++の全盛期でした。
最近のプログラミング言語では考えられないかも知れませんが、プログラムが使用するメモリーを自分で明示的に割り当てて、自分で開放する必要があります。その為、メモリー開放漏れ(メモリー・リーク)としょっちゅう戦うことになります。
コンパイラ言語なので、一旦、コンパイルして、デフォルトで出力される実行形式のファイル「a.out」を実行しています。
#include <stdio.h>
void main()
{
printf("hello, world!\n");
}
C++
hello_world.cppにプログラムを記述しました。
C++(シー・プラスプラス)はC言語を「オブジェクト指向言語」に拡張したものです。誤解を恐れずに言ってしまうと「クラス」が使えるC言語です。(怒られそうな表現…)
プログラムをみるとわかりますが、色々手間がかかる言語仕様です。C言語同様、コンパイラで実行形式に変換する必要があります。しかも、hello, worldを出力するライブラリが必要になるので、gccというコンパイラで実行形式を出力する際に「-lstdc++」のように、C++の「標準ライブラリ」なるものをリンクする必要があるのです…(めんどくさい)
#include <iostream>
using namespace std;
int main()
{
cout << "hello, world!" << endl;
return 0;
}
Go言語
hello_world.goにプログラムを記述しました。
Go言語は、C言語を「安全」にしたようなプログラミング言語です。上記のC言語のメモリー・リークの説明で言ったように、プログラマー任せに自由になっている部分をGo言語の仕様で制約を設けています。「安全」という意味は、このような制約によりバグを産みにくくしているという意味です。
コンパイラ言語ですが、コンパイラプログラム自体がプログラマーに「やさしい」ので、実行形式のファイルを生成することなく「go run hello_world.go」のようにソースコードをいきなり実行できます。
package main
import "fmt"
func main() {
fmt.Printf("hello, world!\n")
}
Java
hello_world.javaにプログラムを記述しました。
Javaは古い言語です。スマートフォンのAndroid OSでアプリケーションを記載する時に使われるので、産まれは古いですが現役のプログラミング言語と言えます。
コンパイラ言語ですが、C言語と異なり、実行形式は、CPUやコンピュターのアーキテクチャによらず、どんなOSでも実行可能というのが登場当時のウリでした。ただし、実行のためにはVM(Virtual Machine)というプログラムが必要です。実行形式のファイル生成するのがコンパイラ(“javac"というプログラム)で、生成されたファイルを読み込んで実行するのがVM(“java"というプログラム)という関係になっています。
public class hello_world {
public static void main(String[] args) {
System.out.println("hello, world!");
}
}
C#
hello_world.csにプログラムを記述しました。
C#(シー・シャープ)は、元々はマイクロソフトがWindows OS用に開発したプログラミング言語でした。Java風の言語仕様でJavaをやっていれば言語仕様自体は理解しやすいかも知れません。
.NETとよばれる実行環境(JavaでいうところのVM)が必要で、Windows updateなどでちょくちょく見かける方も多いかも知れません。言語仕様自体はオープンなので、Ubuntuで実行可能な、monoと呼ばれるマルチプラットフォームのVMで実行しました。
using System;
namespace hello_world
{
class hello_world
{
static void Main()
{
Console.WriteLine("hello, world!");
}
}
}
Visual Basic
hello_world.vbにプログラムを記述しました。
Visual BasicもC#同様マイクロソフトが開発したプログラミング言語です。当初のVisual Basicは 2000年初期に.NETがリリースされる以前は独自の言語仕様と実行環境がWindows向けに存在していました。
.NET以降は、C#とVisual Basicはプログラミング言語としては別物なのですが、コンパイルした結果の実行形式のファイルが共通になりました。つまり、別々のプログラミング言語から生成される実行ファイルが、同じVM(.NET framework)で実行可能となります。
したがって、上記の動画でも、コンパイルした後の.exeはC#もVisual Basicも同じ、monoという実行プログラムを使って実行しています。
Imports System
Module hello_world
Sub Main(args As String())
Console.WriteLine("hello, world!")
End Sub
End Module
HTML
hello_world.htmlにプログラムを記述しました。
HTMLは、上記で扱っているような他のプログラミング言語とは違って、狭義にはプログラミング言語とは言えないでしょう。動作処理を記述するのではなく、「文書」を記載するための記述言語(マークアップ言語)です。
ですが、ちょっと毛色の違ったものということで、最後に加えてみました。
<html>
<body onload='alert("hello, world!")'>
</body>
</html>
最後に
以上、なんでプログラミング言語をHello, world!から始めるのか?の説明や経緯、そして、実際にHello, world!を実行するプログラムを、動画を交えて紹介しました!
この記事を読んで、Hello, world!をやることの意図を理解して、プログラミングの次のステップに進められれば嬉しいです!
(あ…Androidの開発で使われるKotlinを入れるべきでした…)