Fragen Programmieren



  • Hallo, habe ein paar Fragen. Es wäre nett, wenn jemand diese beantworten könnte.

    1. Wenn man z.B. eine If Bedingung hat. Wie oft prüft das Programm diese in einer Sekunde?
    2. Wie wird Assembler Code ausgeführt? Durch eine exe?
    2 Wieso ist Assembler effizienter als eine Hochsprache? Wenn ich 5 + 6 rechne müsste es doch gleich schnell sein?

    Tori



  • LOL.

    1. Kommt auf die Bedingung drauf an, Branch Prediction usw... Und natürlich auf den Rechner. Grundsätzlich sollten paar hundert Millionen mal und mehr drin sein.
    2. Durch den Prozessor.
    3. Ist es nicht (oder nicht unbedingt). Hochsprachen werden auch in Maschinencode übersetzt. Aber durch die höhere Abstraktionsebene kann der Compiler üblicherweise nicht genau erkennen, was der Programmierer eigentlich machen wollte und macht vielleicht etwas mehr oder etwas schlechteren Code, als ein sehr guter Assembler Programmierer von Hand geschrieben hätte. Andererseits können Compiler auch vieles effizienter optimieren, was man selber so nicht geschrieben oder gar nicht erst erkannt hätte.

    Nochmal LOL.



  • 1. Hatte gedacht, es gäbe etwas, was sagt z.B. die Bedingung wird so und so oft ausgeführt. Weil dann müsste die CPU ja 100% ausgelastet sein, wenn sie es so oft prüft, wie sie kann.

    2. Ich meinte, wenn man mit c++ ein Programm compiliert, hat man eine exe.
    Also bei Assembler dann auch?



  • tori1117 schrieb:

    1. Hatte gedacht, es gäbe etwas, was sagt z.B. die Bedingung wird so und so oft ausgeführt. Weil dann müsste die CPU ja 100% ausgelastet sein, wenn sie es so oft prüft, wie sie kann.

    Gut kombiniert, Dr. Watson. Stellt das ein Problem da?

    tori1117 schrieb:

    2. Ich meinte, wenn man mit c++ ein Programm compiliert, hat man eine exe.
    Also bei Assembler dann auch?

    Man schreibt Programme in C++ und kompiliert sie mit einem Compiler. Und rausfallen tut dann in der Regel auch nicht eine EXE, sondern eine Objektdatei, die muss dann noch gelinkt werden mit dem Linker (zumindest war das so, als ich C++ gelernt habe, aber die neusten Standards haben da eventuell was gedeichselt - auf diese Aussage würde ich mich nicht festnageln lassen).

    Und sobald der Linker fertig gelinkt hat, kann daraus eine EXE fallen. Muss nicht. Kommt auf die Linkereinstellungen an. Da kann auch eine DLL, oder ein ELF-Binary oder ein Shared Object rausfallen. Das hängt von der Zielplattform und dem Zielformat ab. Kannst du in der Regel dem Linker sagen, was er machen soll, wie du lustig bist.

    Mit den Assemblern, die ich verwendet habe, war das nicht viel anders. Man schreibt den Code in seine Datei, sagt dem Assembler, er soll mal assemblen, und raus kommt dann eine Objektdatei. Die muss man noch linken. In eine EXE, klar, wieso nicht. Und dann kannst du diese ausführen.

    Ob das Programm in C++ oder Assembler geschrieben wurde, siehst du auf den ersten Blick gar nicht. Auf den zweiten Blick kannst du dir allerdings mal die Symbole, die von C++-Programmen so importiert werden, anschauen, die verraten sich in der Regel immer recht schön. Bei C wird das dann schon ein bisschen schwieriger, die auseinanderzuhalten.

    Und schlussendlich kannst du auch noch bei einigen Compilern Inline-Assembly verwenden. Da hast du dann deinen Hochsprachencode, aber einen bestimmten Block gibst du an, dass sich darum der Assembler kümmern soll. Oder mehrere. Halt auch, wie du lustig bist.



  • tori1117 schrieb:

    Hallo, habe ein paar Fragen. Es wäre nett, wenn jemand diese beantworten könnte.

    Ich mach's mal ganz unkompliziert, im Gegensatz zu den anderen hier (scheint wohl eine Art Sport zu sein, Noobs zu verwirren, oder sich selbst als den ultrageilen Computerfachmann darzustellen).

    tori1117 schrieb:

    1. Wenn man z.B. eine If Bedingung hat. Wie oft prüft das Programm diese in einer Sekunde?

    Das kommt darauf an, wie oft (pro Sekunde) der Instruction Counter* auf das "if" trifft. Das unterliegt zu fast 100% dem Einfluss des Programmierers.

    tori1117 schrieb:

    2. Wie wird Assembler Code ausgeführt? Durch eine exe?

    Nein, durch die CPU. Sie holt sich einen Befehl aus dem Speicher und führt ihn aus, danach den nächsten Befehl, usw. Siehe auch: https://de.wikipedia.org/wiki/Von-Neumann-Architektur

    tori1117 schrieb:

    2 Wieso ist Assembler effizienter als eine Hochsprache? Wenn ich 5 + 6 rechne müsste es doch gleich schnell sein?

    Assembler (genau genommen Maschinensprache) ist gewissermaßen die "Muttersprache" einer CPU. Hochsprachen sind letztlich nur Übersetzungen, weshalb diese immer mit Mängeln, hinsichtlich der Ausführungsgeschwindigkeit, behaftet sind.

    😉 Ein Register der CPU, das pro Befehl um die Befehlslänge fortschreitet, oder durch Sprungbefehle neu gesetzt wird.



  • Also nochmal zum Thema Assembler:
    Assemblercode ist etwas anderes wie Maschinencode, auch Assemblercode
    muss übersetzt werden, das nennt man assemblieren.
    Maschinencode besteht praktisch nur aus Hexadezimalen Zahlen. Mit einem
    Assembler Code zu erstellen macht nur noch im Ausnahmefall Sinn:
    Du bist in einer Firma die einen neuen Prozessor verwendet der nur so
    programmiert werden kann, oder es gibt Hardware-Features die besser mit
    Maschinencode nutzbar sind. IdR ist die Programmiersprache C aber hardwarenah
    genug.

    hth Herbert



  • Maschinencode besteht eigentlich aus Bitketten wie 0100100010110100111010011111000000... hex ist nur eine Darstellungsart, wie dec oder oct.


Log in to reply