LLVM | |
---|---|
Tyyppi | kääntäjä |
Kehittäjä | Vikram Adwe [d] ja Chris Lattner [d] |
Sisään kirjoitettu | C++ [3] , C [4] ja assembly-kieli [4] |
Käyttöjärjestelmä | cross-platform |
Ensimmäinen painos | 24. lokakuuta 2003 [1] |
uusin versio |
|
Lisenssi | University of Illinois avoin lisenssi [d] [5]jaApache License 2.0[6] |
Verkkosivusto | llvm.org_ _ |
Mediatiedostot Wikimedia Commonsissa |
LLVM (aiemmin Low Level Virtual Machine [7] ) on ohjelmistoinfrastruktuuriprojekti kääntäjien ja niihin liittyvien apuohjelmien luomiseen . Se koostuu joukosta kääntäjiä korkean tason kielistä (ns. "frontends"), järjestelmästä optimointia, tulkintaa ja konekoodiksi kääntämistä varten. Infrastruktuuri perustuu RISC -tyyppiseen alustariippumattomaan konekäskykoodausjärjestelmään ( LLVM IR bytecode ), joka on korkean tason kokoaja, jolla eri muunnokset toimivat.
Se on kirjoitettu C++-kielellä, ja se tarjoaa optimointeja käännös-, linkitys- ja suoritusvaiheissa. Aluksi C- ja C++- kielien kääntäjät toteutettiin projektissa Clang -käyttöliittymällä , myöhemmin käyttöliittymät ilmestyivät useille kielille, mukaan lukien: ActionScript , Ada , C # [8] , Common Lisp , Crystal , CUDA , D , Delphi , Dylan, Fortran , Graafinen G-ohjelmointikieli, Halide , Haskell , Java (tavukoodi), JavaScript , Julia , Kotlin , Lua , Objective-C , OpenGL -varjostuskieli , Ruby , Rust , Scala , Swift , Xojo .
LLVM voi tuottaa alkuperäistä koodia useille arkkitehtuureille, mukaan lukien ARM , x86 , x86-64 , PowerPC , MIPS , SPARC , RISC-V ja muille (mukaan lukien Nvidian ja AMD : n grafiikkasuorittimet ).
Joissakin projekteissa on omat LLVM-kääntäjänsä (esim. GCC:n LLVM-versio), toisissa käytetään LLVM-kehystä [9] , kuten Glasgow Haskell Compiler .
Kehitys aloitettiin vuonna 2000 Illinoisin yliopistossa . 2010-luvun puoliväliin mennessä LLVM oli yleistynyt alalla: sitä käyttivät muun muassa Adobe , Apple ja Google . Erityisesti Mac OS X 10.5 : n OpenGL - alijärjestelmä perustuu LLVM:ään, ja iPhone SDK käyttää GCC - esiprosessoria (etuosaa) LLVM-taustajärjestelmän kanssa. Apple ja Google ovat yksi projektin pääsponsoreista, ja yksi pääkehittäjistä, Chris Lattner, on työskennellyt Applella 11 vuotta (vuodesta 2017 - Tesla Motorsilla [10] , vuodesta 2020 - prosessorien kehittäjänä ja mikro-ohjaimet, jotka perustuvat RISC-V- arkkitehtuuriin SiFive [11] ).
LLVM perustuu välimuotoiseen koodiesitykseen ( Intermediate Representation, IR ), joka voidaan muuntaa kääntämisen, linkityksen ja suorituksen aikana. Tästä esityksestä luodaan optimoitu konekoodi useille alustoille, sekä staattisesti että dynaamisesti ( JIT-kokoelma ). LLVM 9.0.0 tukee staattisen koodin luomista x86- , x86-64- , ARM- , PowerPC- , SPARC- , MIPS- , RISC-V- , Qualcomm Hexagon-, NVPTX-, SystemZ- ja Xcore-järjestelmille. JIT-käännös (konekoodin generointi ajon aikana) on tuettu x86-, x86_64-, PowerPC-, MIPS-, SystemZ- ja osittain ARM [12] -arkkitehtuureille .
LLVM on kirjoitettu C++ :lla ja se on siirretty useimpiin Unix-kaltaisiin järjestelmiin ja Windowsiin . Järjestelmä on modulaarinen, sen yksittäiset moduulit voidaan rakentaa erilaisiin ohjelmistojärjestelmiin, sitä voidaan laajentaa lisämuunnosalgoritmeilla ja koodigeneraattoreilla uusille laitteistoalustoille.
LLVM sisältää API- kääreen OCamlille .
LLVM tukee seuraavia alustoja:
Käyttöjärjestelmä | Arkkitehtuuri | Kääntäjä |
---|---|---|
Linux | x86 / AMD64 | GCC , Clang |
FreeBSD | x86 / AMD64 | GCC , Clang |
OpenBSD | x86 / AMD64 | GCC , Clang |
Mac-käyttöjärjestelmän kymmenes versio | PowerPC | GCC |
Mac-käyttöjärjestelmän kymmenes versio | x86 / AMD64 | GCC , Clang |
Solaris | UltraSPARC | GCC |
Cygwin / Win32 | x86 | GCC 3.4.X, Binutils 2.15 |
MinGW / Win32 | x86 | GCC 3.4.X, Binutils 2.15 |
LLVM:llä on osittainen tuki seuraaville alustoille:
Käyttöjärjestelmä | Arkkitehtuuri | Kääntäjä |
---|---|---|
AIX | PowerPC | GCC |
Linux | PowerPC | GCC |
Amiga OS | m68k , PowerPC | GCC |
Windows | x86 | MSVC |
Satunnaisen bittimäärän kokonaisluvut | purin syvyyttä |
|
| ||
Liukulukuluvut | float , double , alustakohtaiset tyypit (esim. x86_fp80 ) | |
tyhjä arvo | mitätön |
Osoittimet | tyyppi* | i32* - osoitin 32-bittiseen kokonaislukuun |
Taulukot | [elementtien lukumäärä x tyyppi] |
|
rakenteet | { i32, i32, tupla } | |
Vektori on erityinen tyyppi SIMD - toimintojen yksinkertaistamiseksi.
Vektori koostuu 2 n primitiivityypin arvosta - kokonaisluku tai liukuluku. |
<elementtien lukumäärä x tyyppi> | < 4 x float > - XMM -vektori |
Toiminnot |
|
Tyyppijärjestelmä tukee superpositiota/nestoutumista, eli voit käyttää moniulotteisia taulukoita, rakennetaulukoita, osoittimia rakenteisiin ja funktioihin jne.
Suurin osa LLVM:n ohjeista ottaa kaksi argumenttia (operandi) ja palauttaa yhden arvon (kolme osoitekoodia). Arvot määritellään tekstitunnisteella. Paikallisten arvojen etuliitteenä %on , ja yleisten arvojen eteen on lisätty @. Paikallisia arvoja kutsutaan myös rekistereiksi, ja LLVM:ää kutsutaan myös virtuaalikoneeksi, jossa on ääretön määrä rekistereitä. Esimerkki:
%sum = lisää i32 %n, 5 %diff = sub double %a, %b %z = lisää <4 x float> %v1, %v2 ; alkuaineittainen lisäys %cond = icmp eq %x, %y ; Kokonaislukuvertailu. Tulos on tyyppiä i1. %success = soita i32:lle @puts(i8* %str)Operandien tyyppi on aina määritelty eksplisiittisesti ja se määrittää yksiselitteisesti tuloksen tyypin. Aritmeettisten käskyjen operandien tulee olla samaa tyyppiä, mutta itse käskyt ovat "ylikuormitettuja" kaikille numeerisille tyypeille ja vektoreille.
LLVM tukee kaikkia aritmeettisia operaatioita, bittikohtaisia loogisia operaatioita ja siirtotoimintoja sekä erityisiä ohjeita vektorien kanssa työskentelemiseen.
LLVM IR on vahvasti kirjoitettu, joten on cast-operaatioita, jotka on koodattu eksplisiittisesti erityisillä ohjeilla. 9 käskyn sarja kattaa kaikki mahdolliset heitot eri numeeristen tyyppien välillä: kokonaisluku ja liukuluku, etumerkillinen ja etumerkitön, eri bittipituus jne. Lisäksi on ohjeet kokonaislukujen ja osoittimien muuntamiseen sekä yleiskäsky tyypille valu bitcast(vastaa tällaisten muunnosten oikeellisuudesta on ohjelmoijalla).
Rekisteriarvojen lisäksi LLVM:ssä on myös muistinkäsittely. Muistissa olevat arvot osoitetaan kirjoitetuilla osoittimilla . Voit käyttää muistia kahdella ohjeella: loadja store. Esimerkiksi:
%x = kuorma i32* %x.ptr ; lataa i32-tyypin arvo %x.ptr-osoittimeen %tmp = lisää i32 %x, 5 ; lisää 5 Store i32 %tmp, i32* %x.ptr ; ja laita takaisinKäsky mallockäännetään samannimisen järjestelmäfunktion kutsuksi ja varaa muistia kasaan palauttaen arvon - tietyn tyyppisen osoittimen . Sen mukana tulee ohjeet free.
%struct.ptr = malloc { double, double } %merkkijono = malloc i8, i32 %pituus %array = malloc [16 x i32] ilmainen i8* %stringOhje allocavaraa pinoon muistia.
%x.ptr = alloca double ; %x.ptr on tyyppiä double* %array = alloca float, i32 8 ; %array on tyyppiä float*, ei [8 x float]!Varattu muisti allocavapautetaan automaattisesti, kun toiminto poistuu käskyjen rettai avulla unwind.
Laskettaessa taulukoiden, rakenteiden jne. elementtien osoitteet oikealla kirjoituksella käytetään käskyä getelementptr.
%array = alloca i32, i32 %koko %ptr = getelementptr i32* %array, i32 %index ; tyypin i32 arvo*getelementptrlaskee vain osoitteen, mutta ei käytä muistia. Käsky hyväksyy mielivaltaisen määrän indeksejä ja voi purkaa minkä tahansa sisäkkäisten rakenteiden viittauksen.
Siellä on myös ohjeet extractvalueja insertvalue. Ne eroavat siitä getelementptr, että ne eivät vie osoitinta aggregoituun tietotyyppiin (taulukko tai rakenne), vaan itse tämän tyypin arvoon. extractvaluepalauttaa alielementin vastaavan arvon, mutta insertvalueluo uuden aggregaattityypin arvon.
%n = erotusarvo { i32, [4 x i8*] } %s, 0 %tmp = lisää i32 %n, 1 %s.1 = lisäysarvo { i32, [4 x i8*] } %s, i32 %tmp, 0Ilmainen ja avoimen lähdekoodin ohjelmisto | |
---|---|
Pääasia |
|
Yhteisö |
|
Organisaatiot | |
Lisenssit | |
Ongelmia | |
muu |
|
|