web-dev-qa-db-ja.com

`main`がintやvoidではなくdoubleまたはStringを返せないのはなぜですか?

C、C++、Javaなどの多くの言語では、mainメソッド/関数の戻り値の型はvoidまたはintですが、doubleまたはString。その背後にある理由は何でしょうか?

ランタイムライブラリによってmainが呼び出され、int main()int main(int,char**)などの構文を期待しているため、これを実行できないことを少し知っています。それに。

だから私の質問は:なぜmainはそれが持っている型シグネチャを持ち、別のものではないのですか?

38
JAVA

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のみ)が簡単に不足する可能性があるため、おそらく整数を使用することにしました。

88
user40980

さて、それはcouldです。

たとえば、 プラン9 オペレーティングシステムで使用されるCの方言では、mainは通常void関数として宣言されますが、終了ステータスは呼び出し側に返されます。文字列ポインタをexits()関数に渡すことにより、環境を整えます。空の文字列は成功を示し、空でない文字列は何らかの失敗を示します。このcouldは、mainchar*結果を返すことで実装されました。

そして、floatまたはdoubleの終了ステータスでシステムを実装することは確かに可能です。

では、なぜintなのでしょうか。これは単なる慣例の問題であり、その下で実行されるオペレーティングシステムとプログラムが共通の慣習に従うことにはtremendousの値があります。

Unixの規則では、整数のステータスコードを使用し、0は成功を示し、0以外は失敗を示します(通常、成功する方法は1つしかありませんが、失敗する方法は複数あるためです)。その慣習がUnixから始まったかどうかはわかりません。私はそれが以前のオペレーティングシステムから来たのではないかと思います。

(a)浮動小数点サポートは普遍的ではないため、(b)浮動小数点値とエラー条件の間のマッピングを定義することがより難しいため、(c)異なるシステムが異なる浮動小数点を使用するため、浮動小数点はより難しい規則になりますポイント表現、および(d)プログラムの終了ステータスの丸めエラーを追跡する楽しさを想像してみてください。一方、整数はエラーコードの列挙に非常に適しています。

プラン9は前述したように文字列を使用しますが、メモリ管理や文字エンコーディングなどに複雑さを課します。プラン9が実装したとき、これは新しいアイデアであり、既存のものを置き換えませんでした広範な慣習。

(ちなみに、C++ではmainonlyintを返すことができ、C void mainはコンパイラが特にサポートしている場合にのみ許可されます。多くのコンパイラはvoid mainと書いても大声で不平を言いますが、それがwrongだと言ってもほんの少し誇張です。)

29
Keith Thompson

Mainメソッドによって返される値は「終了コード」です。これは、プログラムが期待どおりに終了したかどうかをテストするために、呼び出し元のアプリケーション(通常はbash)によって使用されます。整数を返すことは、OSレベルでそれを行う最も簡単な方法です。 Doubleはエラーコードには意味がなく、文字列はOSレベルで維持することが困難です(GCはありません)。

9
xeranic