スクリプト言語の比較しながらGoのお勉強 〜 Hello World編


前回からのおさらい

前回、環境構築編(MacOS)で各スクリプトを動かすための環境を作りました。
今回から実際にプログラムの動きを確認していきます。

Hello World

プログラムの勉強をするのに最初にやること。
それは間違いなく「Hello World」の文字を画面に映し出すことで、wikipediaによると、
Hello world

プログラミングできるコンピュータの開発以来、小さなテストプログラムは存在してきたが、テスト文言として「Hello, World!」を使う習慣はブライアン・カーニハンとデニス・リッチーによる著書「プログラミング言語C」(1978年)[2]のC言語バージョンから始まったと言われている。同著書のプログラム例はhello, world(大文字なし、感嘆符なし)を標準出力に出力する。この例はブライアン・カーニハンがまとめたベル研究所の内部資料「Programming in C: A Tutorial」(1974年)[3]を継承したものである。

へー、そうなんだ。

GoのHello World

ではまず、Goから。

hello.go
package main

import "fmt"

func main() {
  fmt.Printf("Hello Golang\n")
}

そして実行

$ go run hello.go 
Hello Golang

表示されました❗️

どこで拾ったかもわからないくらい、どこでも入手できる、オーソドックスなスクリプトのようです。
1行目のpackageは名前空間とのこと。簡単に言えば外部から参照する際の識別子みたいなものでしょうから、当面簡単なスクリプトを作っている間は気にしなくて良さそうですね。
3行目のimport。これは少々驚きでした。
文字列を標準出力に表示するだけの単純な処理なのに、組み込み関数に含まれていないというのは意外でした。
今後、Go触れることで、スクリプト言語Golangに対してのGoogleの設計思想が理解できてくることで、わかってくることなのでしょうね。
Goプログラミング言語仕様 - 組み込み関数
4行目はエントリポイント。main関数から処理が始まるようです。
5行目が標準出力への出力処理。
fmt パッケージPrintfの説明を読む限り、C言語でのprintf関数相当のものだそうで、format処理も含まれているということですね。
Hello Worldは単純な処理ですが、初めて触る言語に対しては色々と見えてくるものがあるのが不思議です。

それでは他の言語も見ていきましょう。

Python

Pythonでは組み込み関数にprint関数が実装されているため、そのまま出力処理を行えます。
組み込み関数

hello.py
print("Hello Python")

実行結果

$ python hello.py
Hello Python

Ruby

Rubyではどこからでも参照されるモジュールKernelにてprint関数は組み込まれています。
改行に関しての処理は文字列に含めず、putsを使う方が他の言語と同じ動作になるのかもしれません。
module Kernel

hello.rb
print "Hello Ruby\n"

実行結果

$ ruby hello.rb
Hello Ruby

Perl

Perlでは組み込み関数perlfuncにてprint関数は定義されています。
古いバージョンのドキュメントですが、perlfunc - Perl 組み込み関数

hello.pl
print "Hello Perl\n";

実行結果

$ perl hello.pl
Hello Perl

Bash

Bashの場合は組み込みコマンドで文字を出力しているわけではありません。
Bashで組み込みコマンドを一覧表示する方法
※bashvmで指定したbashでの組み込みコマンドの確認方法はわかりませんでした
外部コマンドのLinux系なら恐らく入っているであろうechoコマンドを使用して標準出力に出力しています。

hello.sh
echo "Hello Bash"

実行結果

$ bash hello.sh 
Hello Bash

はじめてGolangを触ってみた感想

やはり他のスクリプト言語と比べて、組み込み関数が極端に少ないということ。
返せば本体は身軽で、動かす環境次第でどのようなパーツを使うかを選別できるということかな。
この辺りは今後触って身を以て学んでいきます。
今後も使ったスクリプトは以下のGithubに残していきます。
https://github.com/kuroseets/my_stady_golang
ではでは。