Warum braucht Python keine main Funktion?

6 Antworten

Man braucht auch bei Assembler oder Basic keine Main-Funktion …

Es gibt unterschiedliche Programmiersprachen, die eben auch entsprechend unterschiedlich die Programmierprobleme lösen …


TeeTier  15.07.2015, 14:38

Naja, man braucht IMMER einen Einstiegspunkt. :)

Ob man diesen nun bei C/C++/ObjC "main" nennt, bei Java/C# "Klasse.[Mm]ain", bei Assembler (je nach Plattform) "__start", bei Basic "Dateianfang", oder bei Python eben ein "Main-Modul".

Da ein Computer oder ein Betriebssystem ja immer wissen muss, WO man denn nun mit der Code-Ausführung anfängt, wird es keine Programmiersprache ohne eine Main-Irgendwas geben können. Und sei es im einfachsten Falle wie bei Bash nur der Datei-Anfang. :)

wolfgang1956  15.07.2015, 17:22
@TeeTier

Naja, man braucht IMMER einen Einstiegspunkt.

Wo habe ich das Gegenteil behauptet? Ob das nun „main“ oder „Einstiegspunkt“ heißt, ist dein persönliches Vokabular. Ich habe eben geschrieben, dass jede Programmiersprache da ihre Lösung hat … :-)

Da ein Computer oder ein Betriebssystem ja immer wissen muss, WO man denn nun mit der Code-Ausführung anfängt,

Das behauptest du! Denke dran, dass die Programme nicht mehr wie zu CP/M-Zeiten an Offset xH100 beginnen, sondern sich frei im Speicher bewegen können. Da wird's denn schwer mit dem „WO“ … :-)

Man darf vieles wissen, manchmal muß man das Wissen aber auch zurückhalten können … :-)

TeeTier  16.07.2015, 08:19
@wolfgang1956

Dafür gibt es dann virtuelle Adressierung. Und die virtuelle Adresse ändert sich nicht, sondern ist statisch und im Header des Executable-Formats festgelegt.

Das hat jetzt aber auch nichts mehr mit Einstiegspunkten zu tun, für die sich der Linker interessiert. :)

wolfgang1956  16.07.2015, 10:59
@TeeTier

Das weiss ich.

Im Grunde ist das aber alles eine Geschmacksfrage und führt den Fragensteller nicht wirklich weiter.

Für ihn – nur für ihn!! – reicht das Wissen aus, das verschiedene Programmiersprachen die Frage, ob eine main-Funktion für den Programmstart wirklich notwendig ist, unterschiedlich lösen. Man muß nicht alles vom 100. ins 100.000. erläutern wollen …

Das Konzept einer "main"-Funktion entstammt der Programmiersprache C:

Man wollte dort keinen Unterschied zwischen "Hauptprogramm", "Prozeduren" und "Funktionen" machen (diese Einteilung gibt es z.B. in der Sprache Pascal, die älter ist als C), sondern alles einheitlich in "Funktionen" gliedern.

Dies hat den Vorteil, dass das Programmieren im gesamten Programm immer gleich ist - so kann man z.B. Lokalvariablen in der "main"-Funktion verwenden, was z.B. bei Pascal nicht geht.

Da jetzt aber alle Programmbestandteile in Funktionen sind, muss es irgendwo eine Funktion geben, bei der das Programm losläuft; bei C heißt diese Funktion nun mal "main".

Bei C++, C# und Java (diese drei Sprachen sind übrigens auch noch mit C verwandt) und einigen anderen Sprachen (die teilweise nicht mit C verwandt sind) hat man dieses Konzept dann übernommen. Bei Python eben nicht.


TeeTier  15.07.2015, 14:30

Doch, bei Python ist es auch so, nur leider haben sich viele Leute einen schlechten Stil angewöhnt, und führen das Modul-Konzept ad absurdum, wenn sie mitten in eine Python-Datei ihren Code reinknallen. :)

Wie in meiner Antwort beschrieben hat man in Python zwar keine Main-Funktion, dafür aber einen Main-If-Block. Das geht bei einfachen Skripten zwar oft auch ohne, aber bei komplexeren Programmen wird man dann mit einem Programmabsturz leben müssen, wenn man darauf verzichtet.

Für Python ist der Einsprungpunkt nun mal das Main-Modul, und die einzige Möglichkeit das zu erkennen, ist mit einer If-Abfrage.

Wenn man auf Main-Funktionen steht, kann man auch folgendes schreiben:

import sys
# Classes, Functions, Constants, ... go here
def main:
print('Hello, world!')
sys.exit(0)
if __name__ == '__main__':
main()

Das wäre dann Plattformübergreifend sicher. Alles andere definitiv nicht! :)

NoHumanBeing  19.02.2017, 13:05
@TeeTier

Exakt.

Dennoch ist dies kein Einsprungpunkt. Das Programm läuft ganz normal "von oben nach unten". Es wird lediglich abgefragt, ob die Codedatei explizit vom Interpreter aufgerufen (anstatt lediglich inkludiert) wurde, daher auch die Verwendung von "if" und nicht "def".

Von Python hab ich keine Ahnung, aber C(++, C#), VB .NET sind alle "ereignisorientiert" - diese werden also nur bei Bedarf ausgeführt (call, event etc.). Es sind eben fest vorgeschriebene Abläufe ohne die der Compiler etc. nichts anfangen kann.

Denke aber, dass das so in etwa wie in PHP ist, also total durcheinander und alles andere als übersichtlich, also das er quasi alles liest und einfach ausführt.

Für eine genauere Antwort muss dir aber ein Python'ler helfen :)


NoHumanBeing  14.07.2015, 22:25

C(++, C#), VB .NET sind alle "ereignisorientiert" - diese werden also nur bei Bedarf ausgeführt (call, event etc.)

Nein. Dein GUI-Toolkit ist vielleicht "ereignisorientiert". Schreib mal ne "normale" (Konsolen-)Anwendung in einer der genannten Sprachen und zeige mir, wo da "bei Bedarf" und "bei Ereignissen" was ausgeführt wird.

robert1234542X  15.07.2015, 15:34
@NoHumanBeing

Du kannst mir ja gerne zeigen, wie eine "normale" (Konsolen)Anwendung ohne main funktioniert?

Und alle anderen Funktionen / Prozeduren werden nur aufgerufen, wenn du diese "rufst".

Du kannst ja gern mal ne' Funktion schreiben und debuggen, wirste' sehen, dass ohne Aufruf nix funktioniert.

Ohne Aufruf der Funktion / Prozedur funktioniert nichts, abgesehen von denen, nennen wir es Standardfunktionen, wie z.B. main

NoHumanBeing  19.02.2017, 13:03
@robert1234542X

Ich habe auch nirgendwo behauptet, dass es ohne Main-Funktion funktioniert. Ich habe nur gesagt, dass die Sprachen nicht per se ereignisorientiert sind.

Hallo!

Phyton ist eine interpretierte Sprache (Skript-Sprache), ich kenne zwar eher Perl, aber da ist es genauso.

Beispiel: Der C-Sourcecode wird kompiliert und gelinkt, dann hast du eine exe-Datei, diese exe-Datei beinhaltet Maschinenlesbaren Kode, der Prozessor kann direkt damit arbeiten.

Also der ganze Sourcecode wird auf einmal übersetzt -- und die EXE läuft ohne Interpreter

Phyton wird interpretiert (solange du in der Entwicklngsumgebung bist).

Kommt ein Befehl, wird dieser vom Interpreter in maschinenlesbaren Code übersetzt, kommt der nächste Befehl, wird dieser auch wieder vom Interpreter Übersetzt usw.

Gruß


martin7812  15.07.2015, 08:13

Viele compilerbasierte Sprachen haben ebenfalls keine "Main-Function".

Andererseits gibt es Interpretersprachen, die so etwas haben...

Weil die Designer der Sprache sich das so gedacht haben.

Python ist eher für "schnelle Lösungen", als für komplexe Anwendungen.

Es ist "sourcecode-interpretiert" (kein Bytecode-Compilat, kein Maschinencode-Compilat), dynamisch typisiert, etc. Eher was für's "rapid prototyping", als für die große, umfangreiche, durchdesignte Unternehmensanwendung mit hunderttausend LOC. Das fängt eben schon damit an, dass man nicht so viel "Boilerplate-Code" schreiben muss, wie in anderen Sprachen, die auf die Entwicklung umfangreicherer/komplexerer Anwendungen (in größeren Teams) ausgelegt sind.