[ 前へ | 目次 | 次へ ]
Japanese English

main 関数

ここでは、プログラムの処理の大枠をまとめるのに便利な、main 関数を扱います。

スポンサーリンク


main 関数

関数には、自動で呼び出されるものもある

前回は、関数を定義して、それを自分で書いたプログラム内から呼び出して使いました。 一方で、自動で呼び出される関数も存在します。

具体的には、あらかじめ決められた、特別な名前・引数を持つ関数を定義しておくと、それが特定のタイミングで、自動で呼び出されます。 そういった関数はいくつか存在します。

プログラム実行時に呼び出される main 関数: 処理の大枠を記述

その典型例が、今回扱う「main関数」です。 これは、「プログラムが実行された際」に自動で呼び出される関数です。 つまり、プログラム内に main 関数を定義しておけば、必ず呼ばれます。 どのように使うかというと、通常、プログラムの処理の大枠を main 関数に記述します。

プログラムが長くなってくると、だんだん処理内容を把握するのが難しくなってきます。 そこで、処理を複数の関数に切り分けて、整理する事が有効です。そのように整理していくと、 それらの関数を呼び出す、一番外側の大枠の処理も、「何らかの関数」にまとめたくなりますよね。 それがまさに main 関数の役割です。

VCSSLでは、main 関数は必須ではない

VCSSLでは、関数の外側でもあらゆる処理を記述できるため、別に main 関数は必須ではありません。 処理の大枠を、プログラムの頭から(関数外領域に)ベタ書きするか、それとも main 関数にまとめるかは自由です。 短いプログラムでは前者の方が便利です。 逆に、関数がたくさん登場するような、長く複雑なプログラムでは、恐らく後者の方が可読性が高まります。

なお、C言語など、いくつかの言語では、main 関数の定義が必須になっています。

main 関数の形

VCSSLにおける main 関数の形は、2 通りあります。最も単純なのは、以下の形です:


void main() {
	// 関数内の処理
}
MainFormSimple.vcssl

もう一つは、以下のように文字列配列の引数を持つ形です:


void main(string args[]) {
	// 関数内の処理
}
MainFormArgs.vcssl

後者は、コマンドラインで活用するプログラムを作りたい場合に便利です。 プログラムを vcssl コマンドで実行した際、コマンドラインで引数を指定すると、それが上の main 関数の引数 args に渡されます。 例えば:

vcssl MyProgram.vcssl aaa bbb ccc

のように実行すると、main 関数の引数 args には要素数 3 の文字列配列が渡され、その中には "aaa", "bbb", "ccc" が格納されています。

main 関数の使用例

それでは、実際に main 関数を使ってみましょう。

まずは、main 関数を使用しない場合の例です:


int a = 2;
int b = 3;
int result = a * a - b * b + 10;
print(result);
CodeWithoutMain.vcssl

- 実行結果 -

5

プログラムの頭から、処理をベタ書きしているプログラムですね。処理内容がとても短くシンプルなので、これはこれで読みやすいです。

次に、上のプログラムの「 result = a * a - b * b + 10 」の計算を関数に切り出しつつ、処理の大枠を main 関数にまとめてみましょう:


void main() {
	int a = 2;
	int b = 3;
	int result = calc(a, b);
	println(result);
}

int calc(int a, int b) {
	return a * a - b * b + 10;
}
CodeWithMain.vcssl

- 実行結果 -

5

このように、処理が関数単位で整理されたプログラムになりました。 このプログラムが実行されると、まず main 関数が自動で呼び出されます。 そして、main 関数の中の処理で、calc 関数を呼び出しています。結果、先ほどと全く同じ処理になります。

このように関数単位で整理されたプログラムでは、人間が内容を把握する際に、以下のように読み進められます:

  • 1. まず main 関数の中を読み、処理の大枠を把握する
  • 2. main 関数の中で呼び出している関数の中を読み、細かい処理内容を把握する
  • 3. さらにその中で呼び出している関数の中を読み、さらに細かい処理内容を把握する

このように、「大枠から細部へ」の流れで掘り下げながら読めるため、長く複雑なプログラムになってくると、このような形で書く方が便利です。

関数外の処理と、main 関数の処理はどちらが先か?

最後に一つだけ、「奇妙なケース」についての補足説明をしておきましょう。

以下のように、「main 関数を定義しつつも、関数外のあちこちに処理が散らばっている」というプログラムを考えます:


// ここに処理A

void main() {
	// ここに main 関数の処理
}

// ここに処理B
OddFlow.vcssl

少し行儀が悪い書き方ですが、しかしVCSSLでは文法的に可能です。さて、上の処理は、どういう順序で処理されるでしょうか?

このような場合の処理順序を明確化するため、VCSSLの main 関数は、「全ての関数外領域の処理が終わった後に呼び出される」というルールがあります。そのため、上の答えは:

  • 1. 処理A
  • 2. 処理B
  • 3. main 関数の処理

の順で実行されます。

プログラム上での見た目の順序と、実行の順序が一致しなくなるため、一見ややこしいルールに思えるかもしれません。 しかし、実用上はこのルールに基づく方が便利です。 例えば、main 関数よりも後方で宣言・初期化されている変数などを、main 関数内で使っても、初期化が済んでいる事が保証されます。 グローバル変数/定数の初期化時に、ちょっとした手続き計算を行いたい場合もよくありますが、それも安心して宣言文に続けて書けます。 そのため、このようなルールになっているのです。


この記事の著者

松井 文宏
[ RINEARN代表, 博士(理学), 応用情報技術者 ]
VCSSLやリニアングラフ3D、その他諸々を開発しています。ガイド類や記事も書いています。


スポンサーリンク



Japanese English
この階層の目次
RINEARN からのお知らせ
※ VCSSL は RINEARN が開発しています。

ExevalatorのVer.2.4をリリース—MCPをサポートし、AI用の計算ツールとしても使用可能に
2025-11-15 - 式計算ライブラリExevalatorのVer.2.4をリリースしました。今回から、AIとやり取りするためのプロトコルである「MCP」をサポートし、AI用の計算ツールとしても使用可能になりました!

Exevalatorの最新版Ver.2.3をリリース、新たにPythonで使用可能に
2025-11-04 - 式計算ライブラリExevalatorのVer.2.3をリリースしました。今回から、新たにPython製のプログラムでも使用可能になりました!AI用ツール開発需要などの背景も踏まえて、詳細をお知らせします。

Exevalatorをアップデート、エラーメッセージの日本語化が手軽に
2025-10-31 - 式計算ライブラリExevalatorのVer.2.2.2をリリースしました。今回から、エラーメッセージを手軽に日本語化できるようになりました。数件のバグ修正&微調整も作んでいます。詳細をお知らせします。

関数電卓RINPn(りんぷん)オンライン版の内部構造を解説
2025-10-22 - 先日登場した、関数電卓ソフトRINPn(りんぷん)のオンライン版の内部構造を解説します。オープンソースなので、自由に改造・流用して、自分だけのWeb電卓を作る事も可能!(かもしれない)

関数電卓RINPn(りんぷん)、どこでもすぐ使えるオンライン版が登場!
2025-10-21 - フリー関数電卓ソフトRINPn(りんぷん)に、Web上でどこでもすぐ使える「オンライン版」が新登場しました!PCだけでなく、スマホでも利用可能です。詳細をお知らせします!

VCSSLのサポートAIが登場!ただし実用品質にはChatGPT有料アカウント(Plus)での利用推奨
2025-08-19 - プログラミング言語VCSSLについての質問対応や、コーディング作業を手伝ってくれるAIさんが登場しました!使用までの流れや推奨事項を解説し、実際の回答例や生成コード例などもたくさん紹介します!

各ソフトやVCSSLの英語版ドキュメント整備がほぼ完了
2025-06-30 - RINEARNでは2年前から、AIの補助による英語版ドキュメントの大幅拡充計画を進めてきました。今回、主要ドキュメント&コンテンツの英訳がほぼ完了し、一応の目標水準に達しました。詳細をお知らせします。

VCSSLの最新版をリリース:外部プログラムとの連携機能を少し強化、他
2025-05-25 - VCSSL3.4.52をリリースしました。外部プログラム(C言語製の実行ファイル等)との連携機能を少し強化し、文字化け対策やOS判別などを可能にしました。他にも細かい機能追加があります。詳細をお知らせします。

VCSSLの最新版をリリース、Java24上での非互換な挙動を対処
2025-04-22 - VCSSL3.4.50をリリースしました。Java24環境上でのネットワークドライブ関連のファイルパス解決で、従来環境とは異なる挙動が生じていたのを解消しました。詳細をお知らせします。

リニアングラフやVCSSLの最新版をリリース、目盛りの位置や内容を自由に指定可能に!
2024-11-24 - リニアングラフ3D/2Dを更新し、自由な位置に、自由な表記内容の目盛りを描けるようになりました!併せて、Java言語やVCSSLでの、プログラム制御用APIも拡張しています。詳細をお知らせします。