Metody Realizacji Języków Programowania

Podobne dokumenty
Metody Realizacji Języków Programowania

PROGRAMOWANIE DYNAMICZNE

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

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

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

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

Wykład 4: Klasy i Metody

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

Tworzenie aplikacji w języku Java

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

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

Programowanie Obiektowe i C++

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Programowanie obiektowe

kiedy znowu uzyska sterowanie, to podejmuje obliczenie od miejsca, w którym poprzednio przerwała, i z dotychczasowymi wartościami zmiennych,

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Język programowania: Lista instrukcji (IL Instruction List)

Podstawowe części projektu w Javie

JAVA W SUPER EXPRESOWEJ PIGUŁCE

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Metody Realizacji Języków Programowania

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

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Wykład 5: Więcej o Klasach i Metodach

Programowanie Niskopoziomowe

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Materiały do zajęć VII

Język ludzki kod maszynowy

Podstawy programowania obiektowego

KOTLIN. Język programowania dla Androida

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Microsoft IT Academy kurs programowania

Programowanie Obiektowe i C++

Podstawy programowania w języku C

Programowanie obiektowe

Projektowanie klas c.d. Projektowanie klas przykład

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Programowanie obiektowe

Weryfikacja Bajtkodu Javy

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Podstawy Programowania C++

Java Język programowania

Zaawansowane programowanie w języku C++ Klasy w C++

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe zastosowanie języka Java SE

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

Java EE produkcja oprogramowania

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie w Internecie. Java

Programowanie 2. Język C++. Wykład 3.

Zmienne, stałe i operatory

Programowanie obiektowe

Metody Realizacji Języków Programowania

Język C++ zajęcia nr 2

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Definicje klas i obiektów. Tomasz Borzyszkowski

Podejście obiektowe. Tablice obiektów Przykład 1 metody i atrybuty statyczne oraz niestatyczne

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

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

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Low Level Virtual Machine

Szablony funkcji i szablony klas

Wstęp do programowania

Wykład 8: klasy cz. 4

Wykład 3 Składnia języka C# (cz. 2)

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Java EE produkcja oprogramowania

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

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

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie w elektronice: Podstawy C

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Programowanie Obiektowe i C++

Projektowanie aplikacji internetowych laboratorium

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Spis treści. 1 Java T M

Programowanie obiektowe

Programowanie obiektowe

Tablice, funkcje - wprowadzenie

Początki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8

Wprowadzenie do języka Java

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Transkrypt:

Metody Realizacji Języków Programowania Maszyny wirtualne: JVM, LLVM Marcin Benke MIM UW 20 grudnia 2010 Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 1 / 35

Maszyna wirtualna Javy 1 Maszyna abstrakcyjna pozwala wykonywać programy, standaryzowany opis Tim Lindholm, Frank Yellin The Java Virtual Machine Specification wiele implementacji, 2 Wykonywanie programów niskopoziomowych 3 Zapewnia przenośność 4 Zapewnia pewne mechanizmy bezpieczenstwa Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 2 / 35

Maszyna wirtualna Javy Typy danych Typy bazowe: całkowite (int, etc.), zmiennoprzecinkowe (float, double) Referencje do obiektów (zbędne w podstawowej wersji Javalette) Obszary danych Zmienne lokalne i parametry sa przechowywane na stosie. Stos służy też do obliczeń. Obiekty (w tym tablice) przechowywane na stercie. Nie potrzeba jej używać w Javalette. Stałe zmiennoprzecinkowe i napisowe przechowywane w obszarze stałych nie musimy się tym przejmować jeśli używamy Jasmina. Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 3 / 35

Stos JVM Stos jest ciagiem ramek. Każda instancja metody ma swoja ramkę. Różne postaci wywołania: invokestatic dla metod statycznych (dla funkcji Javalette) invokevirtual dla metod obiektowych invokenonvirtual np. dla konstruktorów JVM zajmuje się kwestiami porzadkowymi, jak: alokacja i zwalnianie ramek przekazywanie parametrów dostarczanie wyników Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 4 / 35

Struktura ramki stosu Ramka zawiera zmienne lokalne (w tym parametry) i stos operandów (dla obliczeń). Rozmiary tych obszarów musza być znane podczas kompilacji. Obszar zmiennych lokalnych Tablica słów przechowujaca argumenty i zmienne lokalne double zajmuja po dwa słowa, int jedno. Dla metod instancyjnych pod indeksem 0 jest this, dla statycznych pierwszy argument. Stos operandów Element mieści wartość dowolnego typu. Przed wywołaniem kładziemy argumenty na stosie, po powrocie wynik tamże. Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 5 / 35

Przykład programu prosta klasa class Simple { public static void main(string argv[]) { for (int i=1;i<=10;i++){ System.out.println(i); } } } Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 6 / 35

Przykład programu prosta klasa Method Simple() 0 aload_0 1 invokespecial #1 <Method java.lang.object()> 4 return Method void main(java.lang.string[]) 0 iconst_1 1 istore_1 2 goto 15 5 getstatic #2 <Field java.io.printstream out> 8 iload_1 9 invokevirtual #3 <Method void println(int)> 12 iinc 1 1 15 iload_1 16 bipush 10 18 if_icmple 5 21 return Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 7 / 35

Działanie maszyny Potrzebna klasa jest ładowana do pamięci weryfikacja przygotowanie rozwiazywanie nazw Następnie wykonywana jest inicjalizacja klasy Wykonuje kolejne instrukcje Instrukcje operuja na stosie operacji Metody sa wywoływane na stosie wywołań Przy wykonywaniu sprawdzane sa rózne własności Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 8 / 35

Wykonanie instrukcje Maszyna stosowa Load n załaduj n-ta zmienna lokalna (także parametry) Store n zapisz wartość ze stosu do zmiennej lokalnej Push val wstaw stała na stos Add, Sub, Mul, Div Ldc stała Getfield vname cname Getstatic vname cname Putfield vname cname operacje arytmetyczne załaduj stała z tablicy stałych pobierz pole z obiektu pobierz pole z klasy ustaw pole obiektu Instrukcje takie jak load, store,add sa prefiksowane typami, więc np. aload, istore, fadd,... Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 9 / 35

Wykonanie instrukcje Checkcast cname InvokeVirtual method InvokeSpecial method treturn Pop Goto adres sprawdź czy obiekt jest danej klasy wywołanie metody wywołanie inicjalizatora, metody prywatnej etc. powrót (prefiksowane typem) If_icmpGe adres weź ze stosu a i b, skocz gdy a b; także: eq, ne, lt, gt,le ifeq adres weź ze stosu a (int), skocz gdy a = 0; także: ne, lt, gt,le, ge Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 10 / 35

Kompilacja przekazywanie argumentów int addtwo(int i, int j) { return i + j; } kompiluje się do: Method int addtwo(int,int) 0 iload_1 // zmienna lokalna 1 na stos (i) 1 iload_2 // zmienna lokalna 2 na stos (j) 2 iadd // dodaj; wynik na szczycie stosu 3 ireturn // powrót z wynikiem this w zmiennej lokalnej 0 Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 11 / 35

Kompilacja wywoływanie metod int add12and13() { return addtwo(12, 13); } kompiluje się do: Method int add12and13() 0 aload_0 // this na stos 1 bipush 12 // 12 na stos 3 bipush 13 // 13 na stos 5 invokevirtual addtwo(ii)i // wywołanie metody 8 ireturn // powrót z wynikiem, to jest // tez wynik addtwo() Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 12 / 35

Kompilacja switch int choosenear(int i) { switch (i) { case 0: return 0; case 2: return 1; case 3: return 2; default: return -1; } } kompiluje się do... Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 13 / 35

Kompilacja switch Method int choosenear(int) 0 iload_1 // zmienna lokalna 1 (i) na stos 1 tableswitch 0 3 28 // gdy i to 0, skocz do 28 34 // nie bylo 1 to default 30 // gdy i to 2, skocz do 30 32 // gdy i to 3, skocz do 32 default: 34 // wpp. skocz do 34 28 iconst_0 // i to 0; stała 0 na stos 29 ireturn //...oraz powrót 30 iconst_1 // i to 1; stała 1 na stos 31 ireturn //...oraz powrót 32 iconst_2 // i to 2; stała 2 na stos 33 ireturn //...oraz powrót 34 iconst_m1 // wpp na stos -1... 35 ireturn //...oraz powrót Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 14 / 35

Kompilacja switch int choosefar(int i) { switch (i) { case -100: return -1; case 0: return 0; case 100: return 1; default: return -1; } } kompiluje się do... Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 15 / 35

Kompilacja switch Method int choosefar(int) 0 iload_1 1 lookupswitch 3: -100: 36 0: 38 100: 40 default:42 36 iconst_m1 37 ireturn 38 iconst_0 39 ireturn 40 iconst_1 41 ireturn 42 iconst_m1 43 ireturn Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 16 / 35

Jasmin Java ASM tłumaczy tekstowy opis kodu JVM na plik.class java -jar jasmin.jar hello.j http://jasmin.sourceforge.net/ Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 17 / 35

Jasmin hello.class.super public Hello java/lang/object ; standard initializer.method public <init>()v aload_0 invokespecial java/lang/object/<init>()v return.end method Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 18 / 35

Jasmin hello c.d..method public static main([ljava/lang/string;)v.limit stack 2 getstatic java/lang/system/out Ljava/io/PrintStream; ldc "Hello" invokevirtual java/io/printstream/println(ljava/lang/string;)v return.end method Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 19 / 35

Java sumto public class Sumto { int sumto(int n) { int i, sum; i = 0; sum = 0; while (i<n) { i = i+1; sum = sum+i; } return sum; } } Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 20 / 35

Jasmin sumto.method public sumto(i)i.limit locals 4.limit stack 2 iconst_0 istore_2 iconst_0 istore_3 L1: iload_2 iload_1 if_icmpge L2 iload_2 iconst_1 iadd istore_2 iload_3 iload_2 iadd istore_3 goto L1 L2: iload_3 ireturn.end method Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 21 / 35

Działanie maszyny Potrzebna klasa jest ładowana do pamięci weryfikacja przygotowanie rozwiazywanie nazw Następnie wykonywana jest inicjalizacja klasy Wykonuje kolejne instrukcje Instrukcje operuja na stosie operacji Metody sa wywoływane na stosie wywołań Przy wykonywaniu sprawdzane sa rózne własności Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 22 / 35

Ładowanie weryfikacja Instrukcje maja poprawna strukturę Skoki sa do poczatków instrukcji Metody maja poprawne sygnatury Instrukcje przestrzegaja typów i inne... Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 23 / 35

Ładowanie przygotowanie Tworzenie pól statycznych klasy Inicjalizacja wartościami domyślnymi (zwykle 0) Wstępne tworzenie pomocniczych struktur danych, np. tablica metod tablica stałych... Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 24 / 35

Ładowanie rozwiazywanie nazw Nazwy w plikach.class sa tekstowe List.list [Ljava/lang/Object; Możliwe opóźnione rozwiazywanie Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 25 / 35

Inicjalizacja klas Inicjalizacja nadklasy Wykonanie statycznych inicjalizatorów Wykonanie inicjalizatorów pól statycznych Inicjalizacja interfejsów niekonieczna Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 26 / 35

LLVM Low Level Virtual Machine, http://llvm.org/ maszyna rejestrowa, nieograniczona ilość rejestrów generacja kodu na rzeczywisty procesor prez alokację rejerstrów (następny wykład) biblioteka C++, ale także format tekstowy kod czwórkowy: %t2 = add i32 %t0, %t1 instrukcje sa silnie typowane: %t5 = add double %t4, %t3 store i32 %t2, i32* %loc_r nowy rejestr dla każdego wyniku(tzw. Static Single Assignment, patrz następny wykład) Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 27 / 35

LLVM przykład declare void @printint(i32) ; w innym module define i32 @main() { %i1 = add i32 2, 2 call void @printint(i32 %i1) ret i32 0 } $ llvm-as t2.ll $ llvm-ld t2.bc runtime.bc $ lli a.out.bc 4 Uwaga: nazwy globalne zaczynaj się od @, lokalne od % nazwy zewnętrzne sa deklarowane (@printint) Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 28 / 35

LLVM silnia, rekurencyjnie define i32 @fact(i32 %n) { %c0 = icmp eq i32 %n, 0 br i1 %c0, label %L0, label %L1 L0: ret i32 1 L1: %i1 = sub i32 %n, 1 %i2 = call i32 @fact(i32 %i1) %i3 = mul i32 %n, %i2 ret i32 %i3 } Uwaga: argumenty funkcji sa deklarowane wszystko jest typowane, nawet warunki skoków skoki warunkowe tylko z else Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 29 / 35

LLVM typy (nie wszystkie) n-bitowe liczby całkowite: in, np.: i32 dla int i1 dla bool i8 dla char nie ma podziału na liczby ze znakiem i bez sa natomiast operacje ze znakiem lub bez, np sle signed less or equal udiv unsigned div float oraz double label void wskaźniki: t tablice: [n t], e.g. @hw = constant [13 x i8] c"hello world\0a\00" struktury {t 1,..., t n } Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 30 / 35

LLVM bloki proste Definicja Blok prosty jest sekwencja kolejnych instrukcji, do której sterowanie wchodzi wyłacznie na poczatku i z którego wychodzi wyłacznie na końcu, bez możliwości zatrzymania ani rozgałęzienia wewnatrz. Kod LLVM: etykietowane bloki proste każdy blok kończy się skokiem (ret lub br) nie ma automatycznego przejścia od ostatniej instrukcji bloku do pierwszej kolejnego (kolejność bloków może być swobodnie zmieniana) skoki warunkowe maja dwa cele: br i1 %c0, label %L0, label %L1 blok wejścia do funkcji jest specjalny: nie można do niego skoczyć Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 31 / 35

LLVM silnia, iteracyjnie ; r = 1 ; i = n ; while (i > 1): ; r = r * i ; i = i - 1 ; return r define i32 @fact(i32 %n) { entry: ; zmienne lokalne, alokowane na stosie %loc_r = alloca i32 %loc_i = alloca i32 ; r = 1 store i32 1, i32* %loc_r ; i = n store i32 %n, i32* %loc_i br label %L1 Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 32 / 35

LLVM silnia, iteracyjnie ; while i > 1: L1: %tmp_i1 = load i32* %loc_i %c0 = icmp sle i32 %tmp_i1, 1 br i1 %c0, label %L3, label %L2 ; ciało pętli L2: ; r = r * i %tmp_i2 = load i32* %loc_r %tmp_i3 = load i32* %loc_i %tmp_i4 = mul i32 %tmp_i2, %tmp_i3 store i32 %tmp_i4, i32* %loc_r ; i = i-1 %tmp_i5 = load i32* %loc_i %tmp_i6 = sub i32 %tmp_i5, 1 store i32 %tmp_i6, i32* %loc_i br label %L1 Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 33 / 35

LLVM silnia, iteracyjnie L3: } %tmp_i8 = load i32* %loc_r ret i32 %tmp_i8 Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 34 / 35

W następnym odcinku: prawdziwy kod SSA define i32 @fact(i32 %n) { entry: br label %L1 L1: %i.1 = phi i32 [%n, %entry], [%i.2, %L2] %r.1 = phi i32 [1, %entry], [%r.2, %L2] %c0 = icmp sle i32 %i.1, 1 br i1 %c0, label %L3, label %L2 L2: %r.2 = mul i32 %r.1, %i.1 %i.2 = sub i32 %i.1, 1 br label %L1 L3: ret i32 %r.1 } Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 20 grudnia 2010 35 / 35