C、C++、Javaなどの多くの言語では、main
メソッド/関数の戻り値の型はvoid
またはint
ですが、double
またはString
。その背後にある理由は何でしょうか?
ランタイムライブラリによってmain
が呼び出され、int main()
やint main(int,char**)
などの構文を期待しているため、これを実行できないことを少し知っています。それに。
だから私の質問は:なぜmain
はそれが持っている型シグネチャを持ち、別のものではないのですか?
main
の戻り値は、単一の一貫した方法でオペレーティングシステム(anyオペレーティングシステム)に渡されます。オペレーティングシステムが知る必要のある情報は、「プログラムは正常に終了しましたか、それともエラーが発生しましたか?」です。
これが文字列の場合、異なる言語では応答が難しくなります。 Pascal文字列(最初のバイトは長さ)とFORTRAN文字列(固定、ある値に埋め込まれる)およびC文字列(ヌル終了)の内部はすべて異なります。これにより、オペレーティングシステムに一貫した値を返すことが困難になります。これが解決されたとしたら、OSがプログラムについて持っていた質問にどのように答えますか?文字列の比較にはエラー( "成功"と "成功")が伴い、エラーは人間にとってはより役立つかもしれませんが、オペレーティングシステムまたは別のプログラム(シェル)が処理するのはより困難です。文字列自体にも大きな違いがありました- [〜#〜] ebcdic [〜#〜] (そのすべてのコードページで)とASCIIです。
浮動小数点数と倍精度浮動小数点数は、OS(およびシェル)にデータをやり取りするために整数を超える追加の値を提供しません。ほとんどの場合、コンピュータのこれらの部分はどちらも浮動小数点数を扱いません。また、倍精度浮動小数点数は列挙できないため、比較が困難になります。列挙可能ではなく、エラーの内容を報告します(成功のために特定の値を選択した場合)。繰り返しますが、浮動小数点は一貫していません。8ビットマシンの浮動小数点は、16ビットおよび32ビットマシンの浮動小数点と異なりました(そして、これらは単なる「通常の」浮動小数点です-IBM内でも、浮動小数点は標準化されていませんでした。 1980年代までは同じメーカーのマシン間)。そして、10進数と2進数のコンピュータがあります。浮動小数点値は一貫しておらず、意味のあるデータが返されません。
これにより、オプションとしてバイトと整数が残ります。確立された「0」という規則は成功であり、それ以外はエラーでした。整数は、エラーを報告するためのバイトよりも多くの余地を与えます。列挙(1の戻りはXYZを意味し、2の戻りはABCを意味し、3の戻りはDEFを意味するなど)またはフラグとして使用できます(0x0001
はこれが失敗したことを意味し、0x0002
は失敗したことを意味し、0x0003
は、これと失敗の両方を意味します)。これを1バイトに制限すると、フラグ(8のみ)が簡単に不足する可能性があるため、おそらく整数を使用することにしました。
さて、それはcouldです。
たとえば、 プラン9 オペレーティングシステムで使用されるCの方言では、main
は通常void
関数として宣言されますが、終了ステータスは呼び出し側に返されます。文字列ポインタをexits()
関数に渡すことにより、環境を整えます。空の文字列は成功を示し、空でない文字列は何らかの失敗を示します。このcouldは、main
がchar*
結果を返すことで実装されました。
そして、float
またはdouble
の終了ステータスでシステムを実装することは確かに可能です。
では、なぜint
なのでしょうか。これは単なる慣例の問題であり、その下で実行されるオペレーティングシステムとプログラムが共通の慣習に従うことにはtremendousの値があります。
Unixの規則では、整数のステータスコードを使用し、0は成功を示し、0以外は失敗を示します(通常、成功する方法は1つしかありませんが、失敗する方法は複数あるためです)。その慣習がUnixから始まったかどうかはわかりません。私はそれが以前のオペレーティングシステムから来たのではないかと思います。
(a)浮動小数点サポートは普遍的ではないため、(b)浮動小数点値とエラー条件の間のマッピングを定義することがより難しいため、(c)異なるシステムが異なる浮動小数点を使用するため、浮動小数点はより難しい規則になりますポイント表現、および(d)プログラムの終了ステータスの丸めエラーを追跡する楽しさを想像してみてください。一方、整数はエラーコードの列挙に非常に適しています。
プラン9は前述したように文字列を使用しますが、メモリ管理や文字エンコーディングなどに複雑さを課します。プラン9が実装したとき、これは新しいアイデアであり、既存のものを置き換えませんでした広範な慣習。
(ちなみに、C++ではmain
はonlyがint
を返すことができ、C void main
はコンパイラが特にサポートしている場合にのみ許可されます。多くのコンパイラはvoid main
と書いても大声で不平を言いますが、それがwrongだと言ってもほんの少し誇張です。)
Mainメソッドによって返される値は「終了コード」です。これは、プログラムが期待どおりに終了したかどうかをテストするために、呼び出し元のアプリケーション(通常はbash)によって使用されます。整数を返すことは、OSレベルでそれを行う最も簡単な方法です。 Doubleはエラーコードには意味がなく、文字列はOSレベルで維持することが困難です(GCはありません)。