Low Level Virtual Machine



Podobne dokumenty
Metody Realizacji Języków Programowania

1. Wprowadzenie do C/C++

1. Wprowadzenie do C/C++

Metody Realizacji Języków Programowania

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Proces tworzenia programu:

Wzorce projektowe strukturalne cz. 1

Wstęp do programowania

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Wprowadzenie do języka Java

Programowanie obiektowe zastosowanie języka Java SE

Zmienne, stałe i operatory

Bash i algorytmy. Elwira Wachowicz. 20 lutego

Microsoft IT Academy kurs programowania

1 Klasy. 1.1 Denicja klasy. 1.2 Skªadniki klasy.

Programowanie i struktury danych

Język ludzki kod maszynowy

Programowanie C# mgr in. Dariusz Ku. p. 119A

Programowanie obiektowe

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wstęp do Programowania, laboratorium 02

Podstawy programowania C. dr. Krystyna Łapin

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Programowanie w Internecie. Java

Programowanie niskopoziomowe

Tworzenie oprogramowania

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Uniwersytet Rzeszowski

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

PyPy's Approach to Virtual Machine Construction

Lekcja 9 - LICZBY LOSOWE, ZMIENNE

Podstawy programowania skrót z wykładów:

Kompilowanie programów

Systemy Operacyjne - Operacje na plikach

Podstawy Programowania.

Programowanie Proceduralne

Wstęp do programowania

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Optymalizacja R dlaczego warto przesi ± si na Linuxa?

Java EE produkcja oprogramowania

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Laboratorium z przedmiotu MED. Lab1 - wprowadzenie

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Arkusz zawiera informacje prawnie chronione do momentu rozpocz cia egzaminu.

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Środowisko Keil. Spis treści. Krzysztof Świentek. Systemy wbudowane. 1 Trochę teorii. 2 Keil

Podstawy Programowania

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

WYMAGANIA EDUKACYJNE I KRYTERIA OCENIANIA Z PRZEDMIOTU PROGRAMOWANIE APLIKACJI INTERNETOWYCH

Podstawy modelowania w j zyku UML

KOTLIN. Język programowania dla Androida

Technologie cyfrowe semestr letni 2018/2019

PARADYGMATY PROGRAMOWANIA Wykład 4

Here comes the sun. Wyk lad niesystematyczny. Marcin Makowski. 24 października Zak lad Chemii Teoretycznej UJ

Programowanie obiektowe

PL/SQL. Zaawansowane tematy PL/SQL

Język C - podstawowe informacje

Wstęp do programowania

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

wiczenie 1 Podstawy j zyka Java. Instrukcje warunkowe

Język C zajęcia nr 11. Funkcje

Podstawy programowania. Wykład 9 Preprocesor i modularna struktura programów. Krzysztof Banaś Podstawy programowania 1

Funkcje. Piotr Zierhoffer. 7 października Institute of Computer Science Poznań University of Technology

Java jako język programowania

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

Języki i techniki programowania Ćwiczenia 4 Wzorce

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Wzorce projektowe kreacyjne

Karty kryptograczne w ±rodowisku Linux

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Programowanie Systemów Wbudowanych

Programista gier, silników i innych takich

Kompozycja i dziedziczenie klas

Technologie cyfrowe semestr letni 2018/2019

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Programowanie obiektowe

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Laboratorium Programowania Kart Elektronicznych

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Lekcja 9 Liczby losowe, zmienne, staªe

2 Przygotował: mgr inż. Maciej Lasota

Praca Dyplomowa Magisterska

Język JAVA podstawy. wykład 1, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Kompilator języka C na procesor 8051 RC51 implementacja

Wykład 1

Wykład 9: Polimorfizm i klasy wirtualne

Wstęp do programowania. Wykład 1

RODOWISKO DEV-C++ Wymagania sprz towe (zalecane): - Microsoft Windows 2000, XP - 32 MB RAM MHz Intel compatible CPU, 200 MB free disk space

Zagadnienia programowania obiektowego

Podstawy programowania. Wprowadzenie

Programowanie obiektowe

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Transkrypt:

Wprowadzenie Low Level Virtual Machine J. Lamecki 14 czerwca 2011

Outline Wprowadzenie 1 Wprowadzenie Co to jest LLVM? Dlaczego moduªowy kompilator? Cechy LLVM 2 Format LLVM IR Bloki podstawowe SSA 3 U»yte narz dzia Przykªad generowania funkcji Kompilacja JIT Kompilacja AOT 4

Co to jest LLVM? Wprowadzenie Co to jest LLVM? Dlaczego moduªowy kompilator? Cechy LLVM Zestaw gotowych klocków umo»liwiaj cych konstrukcj kompilatora Low Level Virtual Machine - niskopoziomowa maszyna wirtualna LLVM posiada swój byte-code - posta po±redni pozwalaj c przedstawi w niej programy napisane w j zykach niskopoziomowych, takich jak j zyk C. Doª czone s tak»e moduªy pozwalaj ce na generowanie kodu maszynowego oraz optymalizacj postaci po±redniej.

Wprowadzenie Dlaczego moduªowy kompilator? Co to jest LLVM? Dlaczego moduªowy kompilator? Cechy LLVM Kompilatory s zªo»onymi i czasochªonnymi w tworzeniu programami Przykªad GCC - 5,7mln tys LOC LLVM - 670tys LOC Wiele elementów kompilatora jest niezale»ne od docelowej architektury, systemu operacyjnego i j zyka programowania Przykªad GCC - 35 architektur, > 15 j zyków LLVM - 13 architektur, > 10 j zyków

Wprowadzenie Dlaczego moduªowy kompilator? (cd.) Co to jest LLVM? Dlaczego moduªowy kompilator? Cechy LLVM Wiele zastosowa«wymaga generowania kodu maszynowego (cz sto JIT) Przykªad rodowiska wykonawcze j zyków skryptowych, graka 3D (shader'y) Ci gle powstaj nowe architektury Przykªad x86_64 (1999), XCore (2007), Blackn (2000), AVR32 (2006), LatticeMicro32 (2006), S+core (2005), ESi-RISC (2009)

Cechy LLVM Wprowadzenie Co to jest LLVM? Dlaczego moduªowy kompilator? Cechy LLVM Wsparcie 13 architektur sprz towych Wiele gotowych moduªów optymalizacji (z mo»liwo±ci ªatwego dodawania wªasnych oraz zale»no±ci mi dzy moduªami) Czytelna i prosta w zrozumieniu posta po±rednia (LLVM Intermediate Representation) Doskonaªa dokumentacja i wiele przykªadów Mo»liwo± wbudowania w swój program (biblioteka napisana w C++, licencja BSD) Elegancki mechanizm wykonywania zbudowanego kodu (JIT, jak niedost pne mo»e zawsze interpretowa )

Wprowadzenie Dodatkowe elementy Co to jest LLVM? Dlaczego moduªowy kompilator? Cechy LLVM Clang - kompilator C, C++ i Objective-C LLDB - debugger Klee - narz dzie symbolicznie ewaluuj ce kod (potra wykry wszystkie mo»liwe wyniki dziaªania programu) vmkit - maszyna wirtualna Java libc++, compiler-rt - biblioteki standardowe C++ oraz pomocnicze funkcje kompilatora (jak libgcc)

Format LLVM IR Wprowadzenie Format LLVM IR Bloki podstawowe SSA LLVM IR jest formatem opisuj cym moduª kompilacji (podobnie jak plik '.o'). binarna (.bc - bitcode) tekstowa (.ll) Obie formy s równowa»ne. LLVM zawiera narz dzia do konwersji mi dzy tymi formatami. Narz dzia LLVM oczekuj zazwyczaj bitcode. LLVM IR zawiera funkcje, zmienne globalne, staªe oraz deklaracje.

Bloki podstawowe Wprowadzenie Format LLVM IR Bloki podstawowe SSA LLVM IR zawiera funkcje które skªadaj si z jednego lub wi cej bloków podstawowych. Bloki podstawowe to jednostki kodu zawieraj ce instrukcje, które zawsze s zako«czone specjaln instrukcj (terminatorem) - przenosz c sterowanie do innego bloku (powrót z funkcji, skok do innego bloku, wyrzucenie wyj tku). Instrukcje w LLVM IR s statycznie silnie typowane

Wprowadzenie Przykªad bloku podstawowego Format LLVM IR Bloki podstawowe SSA C: #include <stdio.h> void wypisz_2_liczby(int n) { printf("%d %d\n",n,n+1); } LLVM IR: @.str = private constant [7 x i8] c"%d %d\0a\00" dene void @wypisz_2_liczby(i32 %n) nounwind { %1 = add nsw i32 %n, 1 %2 = tail call i32 (i8*,...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str, i64 0, i64 0), i32 %n, i32 %1) nounwind ret void }

SSA Wprowadzenie Format LLVM IR Bloki podstawowe SSA SSA (Single Static Assignment) to wªasno± postaci po±redniej polegaj ca na istnieniu dokªadnie jednego miejsca w kodzie gdzie dana zmienna jest ustawiana. Warto±ci zmiennych nie mog wi c by zmieniane. LLVM IR posiada wªasno± SSA Aby wykona tak konstrukcj jak p tla czy operator?: (x?y:z) niezb dna jest dodatkowa instrukcja - phi Instrukcja phi zwraca warto± zale»n od miejsca z którego przyszªo sterowanie do bloku podstawowego w którym instrukcja ta si znajduje.

Przykªad SSA Wprowadzenie Format LLVM IR Bloki podstawowe SSA void entry(int val) { if(val) tak(); else nie(); } %0: %1 = icmp eq i32 %val, 0 br i1 %1, label %3, label %2 T F %3: tail call void (...)* @nie() nounwind br label %4 %2: tail call void (...)* @tak() nounwind br label %4 %4: ret void CFG for entry function

Przykªad PHI Wprowadzenie Format LLVM IR Bloki podstawowe SSA int collatz(int n) { if(n==1) return 0; return collatz( (n%2)? (3*n+1) : (n/2) ) + 1; } %0: %1 = icmp eq i32 %n, 1 br i1 %1, label %14, label %2 %14: T ret i32 0 %8: %2: F %3 = and i32 %n, 1 %4 = icmp eq i32 %3, 0 br i1 %4, label %8, label %5 T %9 = sdiv i32 %n, 2 br label %10 %5: F %6 = mul nsw i32 %n, 3 %7 = add nsw i32 %6, 1 br label %10 %10: %11 = phi i32 [ %7, %5 ], [ %9, %8 ] %12 = tail call i32 @_collatz(i32 %11) nounwind %13 = add nsw i32 %12, 1 ret i32 %13 CFG for collatz function

U»yte narz dzia Wprowadzenie U»yte narz dzia Przykªad generowania funkcji Kompilacja JIT Kompilacja AOT py-llvm - wi zania LLVM do j zyka Python opt (cz ± LLVM) - optymalizacja kodu LLVM, dodatkowe przebiegi informacyjne llvm-ld (cz ± LLVM) - linker llvm-dis (cz ± LLVM) - disassembler (przej±cie z LLVM IR w formie binarnej do tekstowej)

Wprowadzenie Kod LLVM który chcemy uzyska U»yte narz dzia Przykªad generowania funkcji Kompilacja JIT Kompilacja AOT Jest to moduª zawieraj cy jedn funkcj (kwadratuj) przyjmuj c jeden argument typu double i zwracaj c kwadrat tego argumentu ; ModuleID = 'my_module' dene double @kwadratuj(double %x) { entry: %0 = fmul double %x, %x ret double %0 }

Wprowadzenie Kod tworz cy funkcj U»yte narz dzia Przykªad generowania funkcji Kompilacja JIT Kompilacja AOT # ªaduj biblioteki LLVM from llvm import * from llvm.core import * # utwórz moduª module = Module.new('my_module') # funkcja zwracaj ca kwadrat swojego argumentu # zwraca double, przyjmuje jeden double ty_double = Type.double() # typ double ty_func = Type.function(ty_double, [ty_double]) # typ funkcji func = module.add_function(ty_func, 'kwadratuj') func.args[0].name = 'x' # nazwa argumentu

Wprowadzenie Kod tworz cy funkcj (cd.) U»yte narz dzia Przykªad generowania funkcji Kompilacja JIT Kompilacja AOT # zbuduj blok podstawowy entry = func.append_basic_block('entry') builder = Builder.new(entry) # buduje instrukcje mno»enia pierwszego argumentu przez siebie v_kwadrat = builder.fmul(func.args[0], func.args[0]) # zwraca wynik w zmiennej zawieraj cej wynik mno»enia builder.ret(v_kwadrat) # wypisz tekstow reprezentacj moduªu print module Wynikiem wykonania programu jest kod LLVM IR przedstawiony na wcze±niejszym slajdzie

Wprowadzenie Kompilacja just-in-time U»yte narz dzia Przykªad generowania funkcji Kompilacja JIT Kompilacja AOT from llvm.ee import * # utwórz obiekt kompiluj cy JIT moduª ee = ExecutionEngine.new(func.module) for i in xrange(0,10): # dla i=0,1,..,9 # opakuj argument arg = GenericValue.real(ty_double, oat(i)) # uruchom funkcj, odpakuj wynik rv = ee.run_function(func, [arg]).as_real(ty_double) # wypisz wynik print 'i=', i, ' i*i=', rv Program ten pokazuje jak ªatwo mo»na wygenerowa kod maszynowy i uruchomi go wewn trz swojego programu

Wprowadzenie Kompilacja ahead-of-time U»yte narz dzia Przykªad generowania funkcji Kompilacja JIT Kompilacja AOT Poprzedni przykªad mo»na rozszerzy o zapis moduªu do pliku: # zapisz bitcode do pliku with le('przyklad-kwadrator.o','wb') as fbc: module.to_bitcode(fbc) Kod wygenerowany w LLVM mo»na tak»e skompilowa do wolno stoj cej formy (natywnego pliku wykonywalnego). Aby skompilowa pliki LLVM IR modul1.o i modul2.o do kodu wynikowego program.exe wystarczy polecenie: llvm-ld -native -o program.exe modul1.o modul2.o

Wprowadzenie Kompilatory s coraz cz ±ciej fragmentem wi kszych zastosowa«tworzenie kompilowanych j zyków programowania jest do± proste przy u»yciu odpowiednich narz dzi A przede wszystkim: Fakt Nie ma czego si ba!

Appendix Dalsze informacje Dalsze informacje Strona gªówna projektu http://llvm.org/ LLVM and Clang: Advancing Compiler Technology http://llvm.org/pubs/2011-02-fosdem- LLVMAndClang.html Kaleidoscope: Implementing a Language with LLVM http://llvm.org/docs/tutorial/