Es gibt eine Menge dummer und nicht sehr respektvoller Antworten hier auf eine berechtigte Frage.
C kam nicht von nirgends . Sein unmittelbarer Vorfahre ist B, geschrieben von Ken Thompson. Hier ist ein Link zum B-Handbuch . Die grundlegende Struktur eines B-Programms ist
main (); exit ();
main () wird vom Programmierer bereitgestellt und exit () wird von der Bibliothek bereitgestellt. Dies scheint der erste Auftritt von main () zu sein, da der Vorgänger von B, BCPL, kein solches Konzept hat. Ich nehme an, du müsstest Ken Thompson fragen, warum es hauptsächlich und nicht etwas anderes ist.
Beachten Sie auch, dass der Name main
zwar eine Art Konvention ist, Sie aber Ihre Eintragsfunktion beliebig benennen können, solange Sie dem Linker mitteilen, was der Einstiegspunkt eigentlich ist. Sehen Sie dieses Snippet von man ld
:
Auch FWIW, ld
s erste Wahl des Einstiegspunktes ist (manchmal) tatsächlich eine Funktion genannt _start
(aber ich denke, es ist wirklich ein plattformabhängiger Wert).
Und seht diesen Mailing-Post , der ld
etwas mehr erklärt. % -e
-Option:
-e
gibt einen Ersatz für_start
, nichtmain()
. Du musst wissen wie die Systemlaufzeit Argumente an ein Programm übergibt und dupliziert einige der Funktionen von crt [01in] .o und crt {begin, end} .o zu callen main.
Ich kann nicht finden, wo es in der GCC-Manpage dokumentiert ist, aber Sie können auch -e
an gcc übergeben, um den Einstiegspunkt anzugeben; Allerdings ist es eine ziemlich komplizierte Aufgabe, wenn Sie die Magie von C's main
umgehen.
Weil C das getan hat, hat C ++ es beibehalten, um kompatibel zu sein, und Java hat es getan, um den Übergang von C ++ zu erleichtern. In den Anfängen von Java stellten Arbeitgeber oft Leute ein, die C ++ - Erfahrung hatten, weil es so ähnlich war. Nicht wie heute, wo der neue Typ mehr Java-Erfahrung haben soll als Gosling.
Und vergessen wir nicht, dass PL / 1 "procedure options main" für den gleichen Zweck verwendet hat. (Man, das sind einige Speicherzellen, die seit einer Weile nicht mehr berührt wurden!)
Oder, um stumpfer zu sein, warum fahren wir auf der Seite der Straße, die wir tun?
Antwort: Wir mussten etwas auswählen.
Es ist nicht immer main ().
Java Applets verwenden init () und start () für den externen Aufrufer, um sich einzuloggen.
Servlets werden über die Methoden init () und service () gestartet.
(Der Dienst wird an die bekannteren doGet- und doPost-Methoden gesendet)
Zugegeben, diese Ausnahmen beruhen auf einem anderen Container als dem Betriebssystem, um die Methoden aufzurufen.
Sie sind so nah an einige Fragen gekommen, die fast interessant wären ...
main
Teil der Sprache oder der Bibliothek? main()
? main()
verwendete? main()
? main()
in etwas Cooles ändern? Schnelle Antworten:
Ich persönlich denke, dass die Antwort auf die Fragen 2a und 2b am wichtigsten ist. Wenn Sie wirklich jedes C / C ++ / Java-Programm in der Welt brechen wollen, um zu reparieren, was Sie glauben, sind fehlerhafte Ästhetik eines einzelnen Funktionsnamens, würde ich Sie fragen müssen, wenn Sie Ihre Prioritäten in Ordnung haben ....; -)
Die Sprachdesigner mussten "einige" Namen und main () wie die Main-Funktion wählen, da hier die Ausführung beginnt:)
Sie müssen es etwas nennen. Und ich kann mir keinen besseren Namen vorstellen, da hier der Hauptprogrammablauf beginnt.
Es gibt keine gemeinsame Struktur, außer vielleicht die Fähigkeit, Argumente zu nehmen. Es sollte auch keine gemeinsame Struktur geben, da der Sinn eines Programms darin liegt, das zu tun, was der Programmierer will. Ie., alles.
Nun, es muss entweder einen festen Namen haben, oder Sie müssen dem Programmierer eine Möglichkeit geben, den Namen anzugeben.
Wenn der Programmierer den Namen auswählen könnte, müsste es eine zusätzliche Anweisung oder ein Feature in der Sprache geben, nur um das zu handhaben. Und was wäre gewonnen? Es würde uns wohl schlechter gehen: Wenn Sie diese Funktion dann finden möchten, müssen Sie zuerst nach dem suchen, was das heißt, dann müssten Sie nach der Funktion selbst suchen, also wären es zwei Schritte statt eins.
Da es einen festen Namen haben wird, musste sich jemand aussuchen, wie dieser Name lauten würde. Man könnte an viele Kandidaten denken: "start", "run", was auch immer. Ich bezweifle, dass es einen zwingenden Grund gab, warum "main" gewählt wurde. Jemand musste etwas aussuchen, das war so gut wie alles andere.
Manchmal ist es besser, etwas nicht zu ändern, nur um es zu ändern.
Leider kann ich (noch) nicht direkt kommentieren, also muss ich eine vollständige Antwort geben, ohne eine Antwort auf Ihre Frage zu kennen.
Aber ich möchte allen, die sagen, was anderes als main () sollte es trotzdem werden? darauf hinweisen, dass es in der Tat keine Notwendigkeit für eine benannte Funktion gibt überhaupt. Es hätte gut sein können {}
mit der Konvention, dass Code innerhalb dieser anonymen Klammern die Hauptfunktion ist und das war es. (Es bedeutet also nicht nur int
, wenn der Rückgabetyp fehlt, sondern auch main()
, wenn der Funktionsname fehlt.)
Weil es so gut ist wie jedes andere. Der andere Weg besteht darin, einen unbenannten Block zu verwenden, wie in Pascal und seinen Ableitungen oder in den meisten Skriptsprachen, wo die "Hauptfunktion" (falls erlaubt, sie zu nennen) nur der Anfang der Datei ist. Dann müssen Sie sich darum kümmern, woher Sie die Programmargumente (eine Bibliothek oder eine globale Variable) erhalten, und Sie können fragen, warum sie args
anstelle von arguments
oder argv
oder param
usw. gewählt haben.
Mit freundlichen Grüßen, ich hätte nie gedacht, dass sich irgendjemand für diese fast irrelevante Konventionalität interessieren würde xD
Wenn Sie ein eingebettetes System entwickeln, sehen Sie möglicherweise andere Namen.
ECos verwendet
%Vor%(oder main (), je nach Einstellung).
Ein Linux-Kernelmodul verwendet eine Funktion, die mit __init markiert ist (obwohl das nicht dasselbe ist, da Module normalerweise ereignisgesteuert sind).
weil C, C ++ und Java einen Weg brauchten, um zu wissen, wo die Hauptfunktion ist ...
jedoch erlauben viele andere Sprachen, dass es so benannt wird, wie Sie möchten, und Sie können dem Compiler mitteilen, welche Funktion der Einstiegspunkt ist (Compileroption, Pragma, spezielle Anweisung ...).