LLVM

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] ).

Ominaisuudet

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 .

Alustat

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

Tietotyypit

Yksinkertaiset tyypit

Satunnaisen bittimäärän kokonaisluvut purin syvyyttä
  • i1 - looginen arvo - 0 tai 1
  • i32 - 32-bittinen kokonaisluku
  • i17
  • i256
  • Natiivikoodin luomista erittäin suurille bittityypeille ei tueta. Mutta keskitason edustukselle ei ole rajoituksia.
  • Numeroiden katsotaan olevan kahden komplementissa. Tyyppitasolla ei tehdä eroa etumerkittyjen ja etumerkittömien kokonaislukujen välillä: missä sillä on merkitystä, niitä käsitellään eri ohjeilla.
Liukulukuluvut float , double , alustakohtaiset tyypit (esim. x86_fp80 )
tyhjä arvo mitätön

Johdetut tyypit

Osoittimet tyyppi* i32* - osoitin 32-bittiseen kokonaislukuun
Taulukot [elementtien lukumäärä x tyyppi]
  • [10 x i32]
  • [8 x tupla]
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
  • i32 (i32, i32)
  • kellua ({ float, float }, { float, float })

Tyyppijärjestelmä tukee superpositiota/nestoutumista, eli voit käyttää moniulotteisia taulukoita, rakennetaulukoita, osoittimia rakenteisiin ja funktioihin jne.

Toiminnot

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).

Muisti

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 takaisin

Kä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* %string

Ohje 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.

Toiminnot osoittimilla

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, 0

Muistiinpanot

  1. Lattner K. LLVM 1.0 -julkaisu on vihdoin saatavilla!
  2. LLVM 15.0.4 Julkaistu – 2022.
  3. Llvm Open Source -projekti Open Hubissa: Kielisivu - 2006.
  4. 1 2 Llvm Open Source -projekti Open Hubissa: Kielet-  sivu
  5. Lisenssi  _
  6. http://releases.llvm.org/9.0.0/LICENSE.TXT - 2019.
  7. LLVMdev: LLVM:n nimi arkistoitu 3. marraskuuta 2016 Wayback Machinessa , Chris Lattner (Apple), 2011-12-21 "LLVM" ei ole virallisesti enää lyhenne. Myös lyhenne, jota se kerran laajensi, oli hämmentävä ja sopimaton melkein ensimmäisestä päivästä lähtien.
  8. LLILC . Haettu 14. huhtikuuta 2015. Arkistoitu alkuperäisestä 19. toukokuuta 2019.
  9. LLVM:llä rakennetut  projektit . llvm. Haettu 24. toukokuuta 2018. Arkistoitu alkuperäisestä 24. toukokuuta 2018.
  10. Tervetuloa Chris Lattner | Tesla . Haettu 11. tammikuuta 2017. Arkistoitu alkuperäisestä 11. tammikuuta 2017.
  11. LLVM:n perustaja liittyy SiFiveen . Haettu 28. tammikuuta 2020. Arkistoitu alkuperäisestä 28. tammikuuta 2020.
  12. LLVM Target-Independent Code Generator arkistoitu 1. toukokuuta 2021 Wayback Machine Target Feature Matrix -osiossa 

Kirjallisuus

Linkit