Was ist eine Variable? Vom Maschinencode zum Quellcode

Поділитися
Вставка
  • Опубліковано 10 гру 2024
  • Vergleich von Maschinensprachen und Quellcode als Zeichentrick-Animation
    Was ist eine Variable?
    Wie werden Rechenorperationen und Variablenzuweisungen von Maschinencode in Programmiercode einer Hochsprache umgewandelt?
    Wie funktioniert ein Compiler?
    Wie werden ausführbare Dateien für unterschiedliche Prozessorarchitekturen aus Quellcode einer Programmiersprache generiert?
    Grundlegende Einführung in die Arbeitsweise von Prozessor und Compiler für Studierende der technischen Informatik und Einsteiger in die Programmierung, die die technischen Grundlagen genau verstehen wollen.
    Ein Teil des Java Basis Seminars von Boris Gedat.
    www.java-basics.de
    Impressum: www.boris-gedat...
    Imprint: www.boris-gedat...

КОМЕНТАРІ • 15

  • @alexanderwinterholler4628
    @alexanderwinterholler4628 3 роки тому +2

    Boris eine der besten Erklärungen die ich auf UA-cam gesehen hab. Auch das Video davor. Danke

    • @BorisGedat
      @BorisGedat  2 роки тому

      vielen Dank Alexander für dein Feedback. es motiviert mich weitere Videos dieser Art zu produzieren wenn ich merke, dass es Menschen gibt, denen diese Art von Videos gefallen und denen ich damit weiterhelfen kann. vielen Dank noch mal, weiterhin viel Spaß und Erfolg beim Lernen!

  • @svenwindpassinger2170
    @svenwindpassinger2170 Рік тому

    Erinnert mich stark an RPN Rechner
    LG
    Sven

  • @noahn12
    @noahn12 3 роки тому +3

    Perfekt!

  • @eb4416
    @eb4416 4 роки тому +3

    Bester Mann!

  • @weitdenken
    @weitdenken 4 роки тому +2

    Danke!

  • @barbarairena6714
    @barbarairena6714 5 років тому +1

    woher weiß man dass eine (Speicher-)adresse im Arbeitsspeicher frei ist und verwendet werden kann? Muss man - bevor man mit der Assembler-Programmierung beginnt- sich zunächst überlegen, wieviel Speicheradressen man benötigt und diese dann irgendwie "reservieren" . Und noch eine Frage: wenn man die Variablen bzw. den Speicherplatz nicht mehr benötigt, muss man den Speicherplatz dann mit einem eigenen Befehl wieder löschen/freigeben ? Ich habe gelesen dass es in manchen Programmiersprachen so genannte Garbage Collectoren gibt, in anderen ( zb C++) aber muss die Speicherverwaltung "manuell " durchgeführt werden....Danke im Voraus für Ihre Antwort!

    • @BorisGedat
      @BorisGedat  5 років тому +2

      Das Speichermanagement liegt beim Betriebssystem, welches das Programm lädt. Die Variablen, die ein Programm erzeugt, werden in einem eigens dafür reservierten Bereich dem sog. Stack wie in einem Stapel aufeinander gelegt. Um die Daten auf dem Stapel muss sich der Programmierer nicht kümmern, denn wenn ein Programm-Abschnitt (Funktion, Methode) abgelaufen ist, wird der Zeiger, der auf die Spitze des Stapels zeigt wieder zurückgesetzt. Es gibt aber auch Daten wie z.B. Objekte, die nicht verschwinden sollten, wenn eine Funktion beendet wurde. Diese werden in einem anderen Bereich im Arbeitsspeicher abgelegt, den man als Heap (Halde) bezeichnet. Wenn man eine Programmiersprache verwendet, bei der der Compiler selbstausführenden Code erzeugt, muss der Programmierer diesen Bereich am Heap selbst anfordern und entsprechend wieder freigeben, wenn das Programm die Daten auf dem Heap nicht mehr braucht. Bei Programmiersprachen wie Java, die durch einen Interpreter ausgeführt werden, muss sich der Programmierer nicht selbst um das Aufräumen am Heap kümmern, es gibt dafür sog. Garbage Collectoren des Interpreters, die automatisch erkennen, wenn im aktuellen Programm-Ablauf keine Referenzen auf Objekte auf dem Heap mehr existieren und diese Bereiche dann freigeben.

    • @barbarairena6714
      @barbarairena6714 5 років тому

      Boris Gedat vielen Dank für die ausführliche Antwort!!!!

    • @freecrac
      @freecrac 5 років тому +1

      Genauer gesagt wird der Speicher zu aller erst einmal vom Mainboard-Bios verwaltet und genau darüber läßt sich der freie Speicher auch für ein Betriebsystem ermitteln. wiki.osdev.org/Detecting_Memory_%28x86%29

    • @freecrac
      @freecrac 5 років тому +1

      Werte auf den Stack zu schieben ist in mancher Hinsicht nicht gerade die beste Idee. Weil Push- und Pop-Befehle vertrödeln auf älteren Rechnern vor dem Pentium 4 (x86-Architektur) noch viele Taktzyklen im Vergleich zu Mov- und Mov-Befehle beispielsweise mit einem Zugriff auf ein dafür reservierten Bereich vom Datensegment. Es entfällt das umständliche Herumhantieren mit einem Stackpointer, um in verschachtelten Sub-Routinen auf die Werte zugreifen zu können. Nach dem Pop sind die Werte auf dem Stack nicht mehr da und müßten für weitere Zugriffe erneut auf den Stack geschoben werden. Auf Werte aus einem reservierten Datenbereich kann beliebig oft zugegrifen werden, ohne das wir uns um den Stackpointer kümmern müssen. Einige Werte können wir auch einfach in den CPU-Registern an Subroutinen mit übergeben ohne einen Speicherzugriff. Bei Push und Pop haben wir immer einen Speicherzugriff auf den langsamen RAM.
      Ich habe hier mal eine kleine Test-Routine von Frank Kotler beigefügt, mit der es festgestellt werden kann, ob eine Push/Pop-Kombination, oder ob die Mov/Mov-Kombination schneller ausgeführt wird. Für Rechner vor Pentium 4 ersatzweise AMD-CPUs mit CPUID-Befehl verfügbar.
      > Frank Kotler
      >
      > ; nasm -f elf pushvsmov.asm -d_MOV (or "-d_PUSH")
      > ; ld -o pushvsmov pushvsmov.o
      >
      > global _start
      >
      > section .bss
      > eax_sav resd 1
      > ebx_sav resd 1
      > ecx_sav resd 1
      > edx_sav resd 1
      > esi_sav resd 1
      > edi_sav resd 1
      >
      > section .text
      > _start:
      > nop
      > xor eax, eax
      > cpuid
      > rdtsc
      > push edx
      > push eax
      > %ifdef _MOV
      > mov [eax_sav], eax
      > mov [ebx_sav], ebx
      > mov [ecx_sav], ecx
      > mov [edx_sav], edx
      > mov [esi_sav], esi
      > mov [edi_sav], edi
      >
      > mov edi, [edi_sav]
      > mov esi, [esi_sav]
      > mov edx, [edx_sav]
      > mov ecx, [ecx_sav]
      > mov ebx, [ebx_sav]
      > mov eax, [eax_sav]
      > %elifdef _PUSH
      > push eax
      > push ebx
      > push ecx
      > push edx
      > push esi
      > push edi
      >
      > pop edi
      > pop esi
      > pop edx
      > pop ecx
      > pop ebx
      > pop eax
      > %else
      > %error 'must define _MOV or _PUSH'
      > %endif
      >
      > xor eax, eax
      > cpuid
      > rdtsc
      > pop ebx
      > pop ecx
      > sub eax, ebx
      > sbb edx, ecx
      >
      > call showeaxd
      >
      > xor ebx, ebx
      > mov eax, 1
      > int 80h
      >
      > ;---------------------------------
      > showeaxd:
      > push eax
      > push ebx
      > push ecx
      > push edx
      > push esi
      >
      > sub esp, 10h
      > lea ecx, [esp + 12]
      > mov ebx, 10
      > xor esi, esi
      > mov byte [ecx], 0
      > .top:
      > dec ecx
      > xor edx, edx
      > div ebx
      > add dl, '0'
      > mov [ecx], dl
      > inc esi
      > or eax, eax
      > jnz .top
      >
      > mov edx, esi
      > mov ebx, 1
      > mov eax, 4
      > int 80h
      >
      > add esp, 10h
      >
      > pop esi
      > pop edx
      > pop ecx
      > pop ebx
      > pop eax
      > ret

  • @andreasgoas9275
    @andreasgoas9275 2 роки тому

    Hallo, kannst Du mir bitte helfen?
    Ich will wissen ob man einen Quellcod von einem Jahr zum Beispiel Speichern kann und danach durch ein Autobot auf 1Minute, danach 5 Minuten, 10 Min., 30 Min., 1h, 4 h, 1D, 1 Woche. Danach alles von neu....
    Ist das möglich???
    Dankeschön für die Rückmeldungen ;D