1 / 360

P rogramování v C++

P rogramování v C++. David Bednárek www.ksi.mff.cuni.cz/~bednarek. Pravidla studia. N PRG0 41 2/2 Z,Zk. Zápis na cvičení. Elektronický zápis do jednotlivých skupin is .cuni.cz/ studium Z ápis předmětů a rozvrhu - zápis Grupíček - výsledky Zapsáni musejí být všichni Do 18 .10.

sammy
Download Presentation

P rogramování v C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programování v C++ David Bednárek www.ksi.mff.cuni.cz/~bednarek

  2. Pravidla studia NPRG041 2/2 Z,Zk

  3. Zápis na cvičení • Elektronický zápis do jednotlivých skupin • is.cuni.cz/studium • Zápis předmětů a rozvrhu - zápis • Grupíček - výsledky • Zapsáni musejí být všichni • Do 18.10. • Kapacita laboratoře je omezena, skupiny nelze přeplňovat • Zvláštní skupina pro repetenty • Repetenti kontaktují cvičícího do 18.10. • Udělit zápočet může jen cvičící,ke kterému je student zapsán • Kdo nebude do 18.10. zapsán, zápočet v tomto šk. roce nedostane

  4. Udělení zápočtu • Základní podmínky společné všem skupinám • Úspěšné složení zápočtového testu • 1. a 2. pokusy ve zkouškovém období ... 3. pokusy v dubnu • 2-3 hodiny v laboratoři, společně pro všechny skupiny • Vypracování zápočtového programu • Dohoda o tématu - do listopadu • Předvedení cvičícímu do 31.3.2014 • Doladění a odevzdání do 23.5.2014 • Další podmínky udělení zápočtu určuje cvičící • Cvičící může podmínky individuálně upravit, pokud se s ním student na začátku semestru dohodne • Přiměřená účast na cvičeních • Úspěšné odevzdání domácího úkolu

  5. Zkouška • Zkouška bude provedena formou abc-testu • Vlastnosti a pravidla jazyka C++ • Používání knihoven C++ (kontejnery, algoritmy, iostream) • Typické konstrukce objektového programování • Run-time/static polymorphism • Termíny • Ve zkouškovém období ZS • Během výuky v LS

  6. Pravidla pro budoucí neúspěšné • Zkouška • Pokud letos složíte zkoušku se známkou výborně nebo velmi dobřea nedostanete zápočet, bude vám příští rok uznána • Tento mechanismus je implementován zkoušejícími, nikoliv studijním oddělěním • Zápočet • Pokud nedostanete zápočet, budete příští rok opakovat ty části, které jste letos nesplnili • Podmínky splněné letos se automaticky uznávají • V příštím roce se musíte na začátku semestru přihlásit v SISu k některému z cvičících a dohodnout se s ním na konkrétních podmínkách

  7. Historie C++

  8. Historie C++ inspirace nadmnožina B (Bell Labs. 1969) C (Bell Labs. 1971) BCPL (Cambridge 1966) téměř nadmnožina významná změna K&R C (Kernigan & Ritchie 1978) C with classes (Stroustrup1979) The C++ programming language (Stroustrup1985) šablony C++98 (ISO/IEC 14882 1998) C++03 (ISO/IEC 14882 2003) C++TR1 (ISO/IEC 19768 2007) paralelismus C++11 (ISO/IEC 14882 2011) C++14 (2014+)

  9. Historie C++ a C inspirace nadmnožina B (Bell Labs. 1969) C (Bell Labs. 1971) BCPL (Cambridge 1966) téměř nadmnožina významná změna K&R C (Kernigan & Ritchie 1978) C with classes (Stroustrup1979) The C++ programming language (Stroustrup1985) ANSI C (ANSI X3J111989) šablony C++98 (ISO/IEC 14882 1998) C99 (ISO/IEC 9899 1999) C++03 (ISO/IEC 14882 2003) C++TR1 (ISO/IEC 19768 2007) paralelismus C++11 (ISO/IEC 14882 2011) C++14 (2014+) C11 (ISO/IEC 9899 2011)

  10. Historie C++ - Objective-C inspirace nadmnožina B (Bell Labs. 1969) C (Bell Labs. 1971) BCPL (Cambridge 1966) téměř nadmnožina významná změna K&R C (Kernigan & Ritchie 1978) C with classes (Stroustrup1979) Objective-C (Cox & Love 1981) The C++ programming language (Stroustrup1985) Object-Oriented Programing (Cox1986) ANSI C (ANSI X3J111989) šablony C++98 (ISO/IEC 14882 1998) C99 (ISO/IEC 9899 1999) C++03 (ISO/IEC 14882 2003) Objective-C 2.0 (Apple2006) C++TR1 (ISO/IEC 19768 2007) Objective-C++ (Apple 2010) paralelismus C++11 (ISO/IEC 14882 2011) C++14 (2014+) C11 (ISO/IEC 9899 2011)

  11. Historie C++ - významné příbuzné jazyky inspirace nadmnožina B (Bell Labs. 1969) C (Bell Labs. 1971) BCPL (Cambridge 1966) téměř nadmnožina významná změna K&R C (Kernigan & Ritchie 1978) C with classes (Stroustrup1979) Objective-C (Cox & Love 1981) The C++ programming language (Stroustrup1985) Object-Oriented Programing (Cox1986) ANSI C (ANSI X3J111989) Java (Sun 1995) šablony C++98 (ISO/IEC 14882 1998) C99 (ISO/IEC 9899 1999) C# (Microsoft2002) C++03 (ISO/IEC 14882 2003) Objective-C 2.0 (Apple2006) C++/CLI (Microsoft2005) C++TR1 (ISO/IEC 19768 2007) Objective-C++ (Apple 2010) paralelismus C++11 (ISO/IEC 14882 2011) C++14 (2014+) C11 (ISO/IEC 9899 2011)

  12. Historie C++ - použití C v jádrech OS inspirace Unix 1973 nadmnožina B (Bell Labs. 1969) C (Bell Labs. 1971) BCPL (Cambridge 1966) téměř nadmnožina významná změna K&R C (Kernigan & Ritchie 1978) C with classes (Stroustrup1979) Objective-C (Cox & Love 1981) MacOS 1984 The C++ programming language (Stroustrup1985) Object-Oriented Programing (Cox1986) ANSI C (ANSI X3J111989) Linux 1991 Java (Sun 1995) Windows NT 1993 šablony C++98 (ISO/IEC 14882 1998) C99 (ISO/IEC 9899 1999) OS-X 2000 C# (Microsoft2002) C++03 (ISO/IEC 14882 2003) Objective-C 2.0 (Apple2006) C++/CLI (Microsoft2005) C++TR1 (ISO/IEC 19768 2007) Objective-C++ (Apple 2010) paralelismus C++11 (ISO/IEC 14882 2011) C++14 (2014+) C11 (ISO/IEC 9899 2011)

  13. Literatura

  14. Literatura • Pro začátečníky - před C++11 • Bruce Eckel:Thinking in C++ (2000)Myslíme v jazyku C++ (Grada 2000) • Miroslav Virius:Pasti a propasti jazyka C++ (Computer Press 2005)Programování v C++ (ČVUT 2001) • Andrew Koenig, Barbara E. Moo:Accelerated C++ (2000) • Stanley B. Lippman:Essential C++ (2000)

  15. Literatura • Pro středně pokročilé - před C++11 • Andrei Alexandrescu, Herb Sutter:C++ Coding Standards (2005) • Scott Meyers:Effective C++ (1998)More Effective C++ (1996)Effective STL (2001) • Herb Sutter:Exceptional C++ (2000)More Exceptional C++ (2002)Exceptional C++ Style (2004) • Nicolai M. Josuttis:Object-Oriented Programming in C++ (2002)The C++ Standard Library (1999)

  16. Literatura • Až si budete myslet, že všechno umíte - před C++11 • Andrei Alexandrescu:Modern C++ Design (2001)Moderní programování v C++ (Computer Press 2004) • David Vandevoorde, Nicolai M. Josuttis:C++ Templates (2003)

  17. Literatura • C++11 • Scott Meyers: Overview of the New C++ (C++11) • 360 slajdů z přednášek • Vysvětluje motivaci k novým vlastnostem • Bjarne Stroustrup:The C++ Programming Language - Fourth Edition • Addison-Wesley. ISBN 978-0321563842. May 2013 • Učebnice celého C++ • Zatím jediná učebnice obsahující C++11

  18. Je lepší C++ nebo Java/C#?

  19. Je lepší C++ nebo Java/C#? Špatná otázka

  20. Co programovat v C++ • Pro které oblasti je C++ lepší než Java/C#? • Důraz na výkon • C++ umožňuje programovat způsobem, který neubírá na výkonu • Když budete programovat v C++ stejným stylem jako v Java/C#, dostanete přibližně stejný výkon • Spolupráce s hardware • C++ nechystá na programátora nepříjemná překvapení (GC etc.) • Embedded assembler, spojování s jinými jazyky • Spolupráce s OS • Všechny významné OS mají v C jádro a tudíž i rozhraní OS • Většina systémových aplikací je v C nebo C++ • Nativní knihovny jazyků Java/C# jsou implementovány v C/C++ • Generické programování • Mechanismus šablon v C++ je silnější než v C/C++ • Způsob implementace šablon v C++ neubírá na výkonu

  21. Co programovat v C++ • Programování orientované na výkon • Numerické výpočty • Převládající jazyky: FORTRAN, C • Pomalý posun směrem k C++ • Databázové systémy • Převládající jazyky: C/C++ • Existují i databázové systémy v Javě • Spolehlivé srovnání výkonu neexistuje • Proč je Java/C# pomalejší? • Garbage collection • GC způsobuje mj. problémy s využitím cache • Programování bez GC je pracnější, ale dává lepší výsledky • Chybí pokročilé metody optimalizace v překladačích • Vektorizace, transformace cyklů, ... • Existují i situace, kdy je Java/C# rychlejší • Překladače Javy/C# mají jednodušší úlohu

  22. Co programovat v C++ • Proč C++ a ne C • Stávající aplikace/knihovny/OS jsou často v C • Programování v C++ je pohodlnější než v C • Menší pravděpodobnost chyb • Šablony, operátory, zapouzdření, ... • Při troše šikovnosti stejný výkon jako v C • Moduly psané v C++ a C lze spojovat extern "C" void do_something_in_C( int x); void my_Cplusplus_function( int x) { do_something_in_C( x); } extern "C" void call_me_from_C( int y) { /* C++ code here */ }

  23. Co neprogramovat v C++ • Co raději neprogramovat v C++ • Interaktivní aplikace s GUI • C++ nemá standardizované rozhraní na GUI • Nativní rozhraní GUI v OS je většinou archaické C • Knihovny pro GUI jsou archaické, nepřenositelné nebo obojí • Qt, GTK+, wxWidgets... • Garbage Collection při programování GUI citelně chybí • Pokud je zároveň zapotřebí výkon, nic jiného než C++ nezbývá • Aplikace skládané z mnoha cizích součástí • Standard C++ poskytuje nedostatečné služby OS apod. • Cizí knihovny obvykle doplňují chybějící části vlastní tvorbou • Různé implementace chybějících částí mohou být v konfliktu

  24. Proč C++ • Proč (stále ještě) učíme C++? • Většina řadových programátorů v C++ programovat nebude • MFF chce vychovávat elitu • Programování OS, databází, překladačů • Vědecké výpočty vyžadující výkon • Hry, robotika,... • Údržba rozsáhlých a historických softwarových systémů • Porozumíte-li tomu, jak funguje C++, budete lépe rozumět • jiným programovacím jazykům • architektuře počítačů a operačních systémů • překladačům • Zvládnutí C++ je odznakem zdatnosti matfyzáka

  25. Hello, World! #include <iostream> int main( int argc, char * * argv) { std::cout << "Hello, world!" << std::endl; return 0; } • Vstupní bod programu • Dědictví jazyka C • Žádné třídy ani metody • Globální funkce main • Parametry programu • Z příkazové řádky • Děleno na kousky • Archaické datové typy • Ukazatel na ukazatel • Logicky pole polí • std - namespace knihoven • cout - standardní výstup • globální proměnná • << - výstup do streamu • přetížený operátor • endl - oddělovač řádek • globální proměnná

  26. Hello, World! // main.cpp #include "world.hpp" int main( int argc, char * * argv) { world(); return 0; } // world.cpp #include "world.hpp" #include <iostream> void world() { std::cout << "Hello, world!" << std::endl; } // world.hpp #ifndef WORLD_HPP_ #define WORLD_HPP_ void world(); #endif • Dělení do modulů • Rozhraní modulů je nutno opsat do zvláštního souboru • .hpp - hlavičkový soubor • Definující i používající modul tento soubor inkluduje • textová direktiva #include

  27. Hello, World! // main.cpp #include "world.hpp" int main( int argc, char * * argv) { world( t_arg( argv + 1, argv + argc)); return 0; } // world.cpp #include "world.hpp" #include <iostream> void world( const t_arg & arg) { if ( arg.empty() ) { std::cout << "Hello, world!" << std::endl; } } // world.hpp #ifndef WORLD_HPP_ #define WORLD_HPP_ #include <vector> #include <string> typedef std::vector< std::string> t_arg; void world( const t_arg & arg); #endif

  28. Architektura Překladače / interpretry

  29. CPU C P U

  30. CPU rozumí pouze binárním kódu C P U 01010000 01110100 11010111 10010110 00100010 10110001

  31. 1940... – programování ve strojovém kódu C P U 01010000 01110100 11010111 10010110 00100010 10110001

  32. 1940... – programování ve strojovém kódu C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 01010000 01110100 11010111 10010110 00100010 10110001

  33. 1940... – programování ve strojovém kódu C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X 01010000 01110100 11010111 10010110 00100010 10110001

  34. 1950... – assembler C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X 01010000 01110100 11010111 10010110 00100010 10110001 PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC X'40202120' DBL DC D'0' END BEGIN assembler

  35. 1950... – operační systém C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém loader PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC X'40202120' DBL DC D'0' END BEGIN assembler

  36. 1950... – operační systém C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém loader PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC X'40202120' DBL DC D'0' END BEGIN myprog.exe assembler

  37. 1950... – překladač C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XXXX X X X X X X X X X X X XX X X X X XX X X XX X X X XXX X X X X X XX XXXX X XXXX X XX X XXX X X X XX X X X X X X X X XX X X X X X X X X X X X X X X XX X X X X X X X X X X X X 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém loader READ INPUT TAPE 5, 501, IA, IB, IC 501 FORMAT (3I5) IF (IA) 777, 777, 701 701 IF (IB) 777, 777, 702 702 IF (IC) 777, 777, 703 703 IF (IA+IB-IC) 777,777,704 704 IF (IA+IC-IB) 777,777,705 705 IF (IB+IC-IA) 777,777,799 777 STOP 1 799 S = FLOATF (IA + IB + IC) / 2.0 AREA = SQRT( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) * + (S - FLOATF(IC))) WRITE OUTPUT TAPE 6, 601, IA, IB, IC , AREA STOP END myprog.exe překladač Fortran

  38. 1970... – překladač C C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 Hello,world! 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém loader #include <stdio.h> int main(int,char**) { printf( "Hello, world!\n"); } myprog.exe překladač C

  39. 1980... – překladač C++ C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 Hello,world! 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém loader #include <iostream> int main(int,char**) { std::cout << "Hello, world!\n"; } myprog.exe překladač C++

  40. 1960... – interpret(er) C P U 10 INPUT "What is your name: ", U$ 20 PRINT "Hello "; U$ 30 INPUT "How do you want: ", N 40 S$ = "" 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NEXT I 80 PRINT S$ 90 INPUT "Do you want? ", A$ 100 IF LEN(A$) = 0 THEN 90 110 A$ = LEFT$(A$, 1) 120 IF A$ = "Y" THEN 30 130 PRINT "Goodbye ";U$ 140 END 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X interpret operačnísystém

  41. Interpretace s mezikódem C P U 10 INPUT "What is your name: ", U$ 20 PRINT "Hello "; U$ 30 INPUT "How do you want: ", N 40 S$ = "" 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NEXT I 80 PRINT S$ 90 INPUT "Do you want? ", A$ 100 IF LEN(A$) = 0 THEN 90 110 A$ = LEFT$(A$, 1) 120 IF A$ = "Y" THEN 30 130 PRINT "Goodbye ";U$ 140 END 04FBC41E 77AB2000 1AE04E33 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X překladač interpret operačnísystém

  42. interpretovaný mezikód (bytecode) C P U C P U publicclass HelloWorld { publicstaticvoid main(String[] args) { System.out.println( "Hello, world!"); } } myprog.class překladač 04FBC41E 77AB2000 1AE04E33 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 Hello,world! interpret operačnísystém

  43. JIT překladač C P U C P U publicclass HelloWorld { publicstaticvoid main(String[] args) { System.out.println( "Hello, world!"); } } myprog.class překladač 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 Hello,world! JIT překladač 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém

  44. Srovnání JIT/non-JIT C P U C P U C P U C P U publicclass HelloWorld { publicstaticvoid main(String[] args) { System.out.println( "Hello, world!"); } } myprog.class překladač JIT překladač 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém 01010000 01110100 11010111 10010110 00100010 10110001 #include <iostream> int main(int,char**) { std::cout << "Hello, world!\n"; } operačnísystém loader myprog.exe překladač

  45. Srovnání JIT/non-JIT

  46. Dynamické spojování…? C P U C P U publicclass HelloWorld { publicstaticvoid main(String[] args) {mylib.doit(); } } myprog.class } } překladač mylib.class překladač JIT překladač 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém int main() { doit(); } 01010000 01110100 11010111 10010110 00100010 10110001 #include <iostream> int main() { std::cout << "Hello, world!\n"; } operačnísystém loader myprog.exe překladač mylib.dll překladač

  47. Dynamické spojování C P U C P U import acme.mylib; publicclass HelloWorld { publicstaticvoid main(String[] args) {mylib.doit(); } } myprog.class publicclass HelloWorld { publicstaticvoid main(String[] args) { System.out.println( "Hello, world!"); } } překladač mylib.class překladač JIT překladač 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém #include "mylib.hpp" int main() { doit(); } // mylib.hpp void doit(); 01010000 01110100 11010111 10010110 00100010 10110001 #include <iostream> int main() { std::cout << "Hello, world!\n"; } operačnísystém loader myprog.exe “překladač” mylib.dll “překladač”

  48. Překlad jednoduchého programu - statické spojování // iostream #include <fstream> namespace std { extern ofstream cout, cerr; }; // iostream #include <fstream> namespace std { extern ofstream cout, cerr; }; iostream.obj msvcrt.lib Kompilátor myprog.obj Linker myprog.exe // myprog.cpp #include <iostream> int main() { std::cout << "Hello, world!\n"; }

  49. Oddělený překlad a spojování modulů Standardní Standardní .obj Standardní .lib Uživatelské .hpp Uživatelské .cpp Kompilátor Přeložené .obj Linker Spustitelný soubor .exe

  50. Spojování modulů myprog.cpp #include "bee.hpp"intmain(int,char**) { return B( 7);} myprog.obj 0000: 01010000 ???????? 11010111 exportmain(int,argv**) importB(int) Kompilátor bee.hpp #ifndef bee_hpp#define bee_hppint B( int q);#endif myprog.exe 0000: 01010000 00001100 110101111100: 10010110 00100010 10110001 Linker bee.cpp #include "bee.hpp"int B( int q) { return q+1; } bee.obj 0000: 10010110 00100010 10110001 exportB(int) Kompilátor

More Related