LLVM

LLVM

Information
Udviklet af LLVM Developer Group , University of Illinois , Apple , Google
Første version 24. oktober 2003
Sidste version 12.0.0 (14. april 2021)
Depositum github.com/llvm/llvm-project
Skrevet i C ++ , C og samler
Operativ system Multiplatform
Sprog engelsk
Type Kompilator
Licens NCSA / University of Illinois Open Source License og Apache License
Internet side llvm.org

LLVM (tidligere kaldet Low Level Virtual Machine på fransk: "low level virtual machine") er en kompilatorinfrastruktur designet til kodeoptimering ved kompilering, linkredigering , selv ved runtime eller under "Dead time" af et program, uanset det originale sprog .

Egenskaber

LLVM gør det muligt at oprette en virtuel maskine til sprog svarende til Java og dens JVM , en kodegenerator til en bestemt hardwarearkitektur og kompileringsoptimeringsmaskiner uafhængigt af enhver platform og ethvert sprog. LLVM er uafhængig af sprog og arkitekturer: det er ansvarligt for at oprette linket til et sprogspecifikt modul og til en kodegenerator for en bestemt maskine. Det understøtter interprocedurel optimering (IPO) på højt niveau, tilbyder statiske compilers eller on the fly (JIT) og mange komponenter i forskellige udviklingsfaser (f.eks. Bytecode Java-grænseflader CIL af Microsoft. NET , en Python- grænseflade , registerallokering ved graffarvning osv.). On-the-fly kompilatoren er i stand til at optimere unødvendige statiske grene, mens et program kører, og det er derfor meget nyttigt i tilfælde, hvor programmet har flere muligheder: hvoraf de fleste let kan diagnosticeres som unødvendige uanset miljøet. Det er af denne grund, at for eksempel denne infrastruktur bruges i rørledningen til visse OpenGL- implementeringer og især under Linux eller BSD med LLVMpipe inden for Gallium3D- modulet i Mesa 3D såvel som i Mac OS X 10.5 ( Leopard ) at yde support til manglende hardware.

Samling

Indtil version 2.9 tilbød LLVM C / C ++ og ObjectiveC kompilering via LLVM-GCC. Siden da erstatter DragonEgg LLVM-GCC for via et gcc- plugin at tilbyde en komplet samling af sprogene Ada, C, C ++, Fortran og delvist af Go, Java, Objective-C og Objective-C ++. Det er vigtigt, at LLVM tilbyder en C, C ++, Objective-C og Objective-C ++ compiler kaldet Clang . I sin version 3.0 er understøttelsen af ​​sprogene C og C ++ næsten komplet, kun få GCC-udvidelser understøttes endnu ikke. Således kompilerer 4% af dem næsten 33.000 pakker i Debian-arkivet ikke med Clang.

Rørledning

LLVM har en meget enkel pipeline. Kildefilerne (f.eks. C ++ - filer) oversættes til et mellemliggende sprog, kaldet LLVM-IR ( står for LLVM Intermediate Representation ). Derefter foretages flere analyser og transformationer på denne mellemliggende repræsentation. Det er også på dette niveau, at visse udvidelser griber ind, som f.eks. Polly . Endelig, som et sidste trin, genereres maskinkoden i henhold til den mellemliggende repræsentation.

Kodepræsentation

LLVM tilbyder et sæt instruktioner uafhængigt af ethvert sprog og ethvert system. De fleste af instruktionerne har samme form som treadressekoden . Hver instruktion har også en simpel statisk tildelingsformular ( SSA- formular ), hvilket betyder, at hver variabel (kaldet et indtastet register ) kun tildeles en gang og derefter fryses: dette gør det muligt at forenkle analysen af ​​afhængigheder blandt variablerne.

Alle former for typekonvertering , fra bundtvingning til nedadgående tvang af et objekt skal udføres ved hjælp af eksplicit instruktion cast. LLVM har grundlæggende typer som heltal i fast størrelse og nøjagtigt fem afledte typer, nemlig: markører , arrays , vektorer, strukturer og funktioner . En type fra et konkret sprog kan repræsenteres af en kombination af disse typer i LLVM. For eksempel kan en klasse i C ++ repræsenteres af en kombination af strukturer, funktioner og arrays af funktionsmarkører.

Noter og referencer

  1. Chris Lattner , “  LLVM 1.0-udgivelsen er endelig tilgængelig!  "
  2. Udgivelse 12.0.0  " ,14. april 2021(adgang 15. april 2021 )
  3. (in) Versionoplysninger 2.9 .
  4. (in) Genopbygning af Debian-arkivet med clang .

Udgivelsen af ​​version 3.3: (en) Michael Larabel, LLVM 3.3 Officially Released  " , Phoronix,18. juni 2013

eksterne links