TL; DR
Javaでは、その理由public static void main(String[] args)
は
- ゴスリングが欲しかった
- Cの経験がある人(Javaではない)によって書かれたコード
- 実行中に使用者によって実行されるのPostScriptを上ニュース
C#の場合、推論はいわば推移的に類似しています。言語設計者は、Javaから来たプログラマーにとってプログラムエントリポイントの構文を使い慣れたものにしました。C#の建築家Anders Hejlsbergが言うように、
... C#での私たちのアプローチは、Javaプログラマーに代わるものを提供することです...
ロングバージョン
上に展開し、退屈な参照でバックアップされます。
javaターミネーターハスタラビスタベイビー!
VM仕様、2.17.1仮想マシンの起動
... Java仮想マシンに初期クラスを指定する方法はこの仕様の範囲を超えていますが、コマンドラインを使用するホスト環境では、クラスの完全修飾名を次のように指定するのが一般的ですコマンドライン引数と、メソッドmainの引数として提供される文字列として使用される後続のコマンドライン引数用 たとえば、SunのJava 2 SDK for Solarisを使用して、コマンドライン
java Terminator Hasta la vista Baby!
クラスのメインメソッドTerminator
(名前のないパッケージのクラス)を呼び出して、4つの文字列「Hasta」、「la」、「vista」、および「Baby!」を含む配列を渡すことにより、Java仮想マシンを起動します...
...参照:付録:衣服、ブーツ、バイクが必要です
- 私の解釈:
コマンドラインインターフェースの典型的なスクリプトのような使用を対象とした実行。
重要な脇道
...これにより、調査中に誤った痕跡が2つなくなるのを防ぎます。
VM仕様、1.2 Java仮想マシン
Java仮想マシンはJavaプログラミング言語を何も知りません...
前の章を勉強していると、上記のことに気づきました-1.1 役に立つと思った履歴(しかし役に立たなかった)
- 私の解釈:
実行はVM仕様のみによって管理され
、Java言語とは無関係であることを明示的に宣言します
=> JLSおよび関連するJava言語を無視します
ゴスリング:Cとスクリプト言語の妥協案...
上記に基づいて、JVM履歴を Webで検索し始めました。助けにならなかった、結果にゴミが多すぎる。
次に、Goslingについての伝説を思い出し、検索をGosling JVMの履歴に絞り込みました。
ユーレカ!JVM仕様はどのようになったか
JVM Languages Summit 2008の基調講演では、James Goslingが議論しています... Javaの作成... Cとスクリプト言語の妥協...
- 私の解釈:
作成の時点で、
Cとスクリプトが最も重要な影響と見なされているという明示的な宣言。
既にVM Spec 2.17.1のスクリプト作成にうなずいているように見えますが、
コマンドライン引数は十分に説明されてString[] args
いますがstatic
、main
まだ存在しないため、さらに掘り下げる必要があります...
これを入力する際に注意してください-C、スクリプティング、VM Spec 1.2をJava以外と接続する-私は何かおなじみのような気がします... オブジェクト指向はゆっくりと消えていきます。私の手を取り、動き続けてください。
キーノートスライドはオンラインで入手できます:20_Gosling_keynote.pdf。キーポイントのコピーに非常に便利です。
3ページ
Javaの先史時代
*私の思考を形作ったもの
9ページ
ニュース
*ネットワーク拡張ウィンドウシステム
*スクリプトに基づいたウィンドウシステム...
PostScript(!!)
16ページ
大きな(しかし静かな)目標:
どれくらい近くまで行けますか
「スクリプト」の感じ...
19ページ
元のコンセプト
*すべての建物についてでした
物事のネットワーク、
スクリプトによって編成
言語
*(Unixシェル、AppleScript、...)
20ページ
羊服のオオカミ
*開発者を作成するためのC構文
快適
ああ!Cの構文を詳しく見てみましょう。
「hello、world」の例...
main()
{
printf("hello, world\n");
}
... mainという名前の関数が定義されています。主な機能は、Cプログラムで特別な目的を果たします。ランタイム環境は、メイン関数を呼び出してプログラムの実行を開始します。
...メイン関数には実際には2つの引数がint argc
ありchar *argv[]
、それぞれ、コマンドライン引数を処理するために使用できます...
近づいていますか?賭けます。上記の引用の「メイン」リンクをたどる価値もあります。
主な機能は、プログラムが実行を開始する場所です。プログラムの機能の高レベルな編成を担当し、通常、プログラムの実行時に指定されたコマンド引数にアクセスできます。
- 私の解釈:
C開発者にとって快適であるためには、プログラムのエントリポイントはでなければなりませんmain
。
Javaは、クラスにあるように、任意の方法を必要とするためにも、Class.main
ある
それを取得ほど近い:静的呼び出し、単にクラス名とドットを、
無コンストラクタください- Cはそのような何も知りません。
これは
、Java からC#への簡単な移行の考え方を考慮して、C#にも一時的に適用さ
れます。
Java SEから来た人がJava ME MIDP用のHello Worldを書き込もうとしているStack Overflowの質問を検索してチェックすることを、読者はおなじみのプログラムエントリポイントは重要ではないと考えています。注意しないMIDPのエントリポイントが何を持っていmain
たりstatic
。
結論
上記に基づいて、私はそれを言うだろうstatic
、main
とString[] args
JavaとC#の作成の瞬間にプログラムのエントリポイントを定義するための最も合理的な選択肢でした。
付録:服、ブーツ、バイクが必要です
VM Spec 2.17.1を読むのはとても楽しかったです。
...コマンドライン
java Terminator Hasta la vista Baby!
クラスのメインメソッドTerminator
(名前のないパッケージのクラス)を呼び出し、4つの文字列「Hasta」、「la」、「vista」、「Baby!」を含む配列を渡すことにより、Java仮想マシンを起動します。
Terminator
ロード、リンク、および初期化プロセスの例として、仮想マシンが実行するために実行するステップの概要を説明します。これについては後のセクションでさらに説明します。
最初の試行...クラスTerminator
がロードされていないことを発見します...
Terminator
ロード後、mainを呼び出す前に初期化する必要があり、初期化する前に型(クラスまたはインターフェイス)を常にリンクする必要があります。リンク(§2.17.3)には、検証、準備、および(オプションで)解決が含まれます...
検証(§2.17.3)は、ロードされた表現Terminator
が整形式であることを確認します...
解決(§2.17.3)は、クラスからのシンボリック参照をチェックするプロセスTerminator
です...
Terminator
そうそう
からのシンボリック参照。