<sub class="descriptionSection">27-09-2024 06:38:pm // #Compiler // [[Programmierung]]</sub>
____
## Bytecode und Java
Obwohl Java nicht das konzept einer LLVM nutzt, kann man Java als den vorgänger zur LLVM sehen. In Java werden Programme nicht in Assembly compiled, sondern in eine "Intermediate Language" namens "Bytecode".
Dieser Bytecode kann dann von einer Java Virtual Machine auf **jeglicher** Plattform gelesen werden und somit sind Java Programme (solang nicht spezifisch auf eine Plattform zugeschnitten), plattform unabhängig.
![[Pasted image 20240927184121.png]]
> [!NOTE] Info
> Viele Betriebssysteme liefern entweder eine JVM mit (meistens JRE - Java Runtime Environment genannt) oder Entwicklern bundle diese mit dem Programm.
## LLVMs
LLVMs (Low Level Virtual Machines) nutzen ein relative gleiches Konzept, der einzige unterschied ist das LLVMs sogar sprachen unabhängig sind.
### 3 Stufen Model von LLVMs
LLVMs nutzen 3 Stufen um Programme zum laufen zu bekommen.
- LLVM Frotend
- Im LLVM frontend befinden sich sprachen wie Rust, C, C++, etc.
- Sie bieten das frontend zum Entwickler
- Die Sprachen können beliebig ausgetauscht werden
- Die Sprachen werden dann übersetzt in eine LLVM Intermediate Language übersetzt
- Diese IRs sehen meistens komplett anders aus als der Code aus dem sie entstanden sind
- LLVM Optimizer
- Im LLVM Optimizer werden der IR Code genommen und dann optimiert
- Der Optimizer übersetzt in das jeweilige LLVM Backend
- LLVM Backend
- Das Backend kann verglichen werden mit der JRE in Java, da diese die Ausführung des programms übernimmt
- Nimmt den IR Code von der Optimizer Schicht und übersetzt diesen in die jeweilige Assembly Sprache
Dieses Modell ist sehr effizient in der Ausführung und der DX (Developer Experience), da alles sehr modular aufgebaut ist.
Um z.B. eine neue Sprache einzuführen, muss nur das Frontend entwickelt werden.
![[Pasted image 20241105165127.png]]