Fejlett programozási nyelvek C++ Antal Margit 2010 slide 1
Témák Fontos tudnivalók Programozási paradigmák Programozási nyelvek slide 2
I. Fontos tudnivalók Jegy ) 3 számítógépes felmérő (50%) 4. hét 8. hét 12.hét gyakorlati jegy (40%) - minden laborfeladat kötelező elődás jelenlét: 10% slide 3
Könyvészet Antal Margit, Fejlett programozási technikák, Scientia, 2006. (jegyzet) [Vitaly] Vitaly Shmatikov: http://www.cs.utexas.edu/~shmat/courses/cs345_spring08/ Bjarne Stroustrup, A C++ programozási nyelv, Kiskapu, 2001. Nicolai M. Josuttis, The C++ Standard Library, A Tutorial and Reference, Addison-Wesley, 1999. Andrei Alexandrescu, Programarea moderna în C++, Teora, 2002. Scott Meyers, STL biblioteca programatorului, Teora, 2002. slide 4
Könyvészet Matthew H. Austern, Generic Programming and the STL, Addison-Wesley, 1999. David Vandevoorde, Nicolai M. Josuttis, C++ Templates, Addison-Wesley, 2003. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Programtervezési minták, Kiskapu, 2004. James O. Coplien, Multi-Paradigm Design for C++, Addison-Wesley, 2003. Andrei Alexandrescu, Herb Sutter, C++ kódolási szabályok, Kiskapu, 2005. slide 5
Gyakorlati jegy Minden gyakorlatot kötelező bemutatni A másolás vizsgáról való kizárást jelent Adott heti gyakorlatot az adott héten, illetve a rákövetkező héten lehet bemutatni! slide 6
Mit tanulunk? Programozási paradigmák Fogalmak a modern programozási nyelvekben A C++, mint egy többelvű programozási nyelv procedurális (imperatív) elemek objektumorientált elemek generikus elemek STL - Standard Template Library slide 7
Dijkstra on Language Design [Vitaly] The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence. FORTRAN, 'the infantile disorder is hopelessly inadequate for whatever computer application you have in mind today: it is now too clumsy, too risky, and too expensive to use. It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration. slide 8
TIOBE Programming Community Index for February 2010 Position Programming Language Rating 1 Java 17,34% 2 C 16,60% 3 PHP 10,01% 4 C++ 9,44% 5 (Visual) Basic 7,05% 6 C# 5,01% 7 Python 4,31% 8 Perl 3,60% 9 Delphi 2,65% 10 JavaScript 2,63% http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html slide 9
HipHop for PHP Facebook 2010 PHP --->C++ (optimalizált) forráskód átalakító g++ GNU Compiler PHP szkript nyelv C++ kompilált nyelv Eredmény: szerveroldali CPU-idő 50%-al csökkent slide 10
II. Programozási paradigmák Imperatív (procedurális) Funkcionális Objektumorientált Logikai Szkriptek A programozási nyelvek általában hibrid nyelvek, több programozási paradigmát is támogatnak slide 11
Programozási paradigmák hogyan kellene felépíteni a programokat? procedurák matematikai függvények objektumok... slide 12
Imperatív paradigma jellemzők: parancs- pl. értékadás állapot változók pillanatnyi értékeinek halmaza program: parancsok sorozata Nyelvek: Fortran, Algol, Cobol, PL/I, Pascal, Modula-2, Ada, C slide 13
Objektumorientált paradigma alapfogalmak: objektumok üzenetek Program: üzenetek sorozata Nyelvek: Simula, Smalltalk, C++, Modula-3, Java (imperatív OO nyelvek) CLOS (Common Lisp Object System) nem imperatív slide 14
Funkcionális és logikai Funkcionális matematikai függvény nincs állapot, mellékhatás nem minden funkcionális nyelv tiszta (DEFUN EXISTS ( ATOM LIST ) (COND ((NULL LIST) NIL) ((EQ ATOM (CAR L)) ((EXISTS ATOM (CDR L))) ) ) Logikai slide 15
Szkript nyelvek magas szintű nyelvek gyakran komponensek összeragasztására használják dinamikusan típusos gyengén típusos nagyon elterjedt a webalkalmazások készítésére slide 16
Statikusan és dinamikusan típusos statikusan: változó típusa már fordításidőben eldől kompilált nyelvek biztonságos dinamikusan: változó típusa futásidőben dől el értelmezett nyelvek a hibák csak futásidőben derülnek ki slide 17
Több milliárd dolláros tévedés sikertelen az Ariane 5 rakéta fellövése (1996) $7 milliárd a fejlesztési költség szoftver hiba 64 bites lebegőpontos szám (vízszintes sebesség) átalakítása 16 bites egész számmá; a szám nagyobb volt mint 32767 [Vitaly] slide 18
Programozási nyelvek átalakítása Natív-kód fordító: gépi kód Kompilált nyelvek: Fortran, C, C++, Pascal,... Értelmező (interpreter): belső formátumra alakít és utána végrehajtja (read-eval-print ciklus) Értelmezett nyelvek: Basic, Scheme, Haskell, Python Bájtkód fordító: hordozható bájtkód a bájtkódot egy virtuális gépen kell végrehajtani (Java) Hibrid fordítás: Forrásnyelvre alakítás (C++ C gépi kód) Just-in-time Java fordítók a gyakran hívott bájtkód darabokat az első végrehajtáskor natív kóddá alakítják slide 19
Fordítás gépi kódra [Vitaly] Lexikális elemző tokens Szintaktikus elemző forráskód Preprocesszor forráskód ASTs Köztes kódgenerálás IC Optimizáló ICopt Végleges kódgenerálás ASM Assembler Gépi kód slide 20
Fordítás lépései Előfeldolgozás szöveghelyettesítés Lexikális analízis kulcsszavak, azonosítók, konstansok szimbólum sorozat Szintaktikai analízis: szintaxis-fa Kódgenerálás köztes kód optimalizálás gépi kód slide 21
Értelmező (interpreter) Read Eval -Print bemenő kifejezés REPL interpreter eredmény Interpreter processz Mi a hátránya az értelmezett programnak a fordítotthoz képest? slide 22
Bájtkód forrás program Bájtkód fordító bájtkód Bájtkód interpreter eredmény Emulált virtuális gép A bájtkód a gépi kódhoz hasonló, de nem valós mikroprocesszor utasításokat hanem virtuális mikroprocesszor utasításokat tartalmaz. 1. lépés: fordítás forráskód -->bájtkód 2. lépés: értelmezés bájtkód interpreter megvalósítja (emulálja) a virtuális gépet és ezen végrehajtja a bájtkódot Mi az előnye a bájtkódnak a gépi kódhoz képest? slide 23
Kötés (binding) Binding = asszociáció egy objektum és annak egy tulajdonsága között változó - típus változó - érték Kötéstípusok Early binding korai kötés - fordítási időben Late binding késői kötés futási időben slide 24
III. Programozási nyelvek I have regarded it as the highest goal of programming language design to enable good ideas to be elegantly expressed. Sir Charles Antony Richard Hoare -best known for the development in 1960 of Quicksort (Hoaresort), slide 25
Programozási nyelv számítások formális leírása jellemzők: szintaxis szemantika (jelentés)- minden egyes szintaktikai egységre gyakorlati megvalósítás egy valós vagy virtuális gépre hatékonyság vagy hordozhatóság slide 26
Assembly nyelv [Vitaly] 1950-es évek elején bináris műveletkódok helyett szöveges kódok push ebp mov ebp, esp sub esp, 4 push edi slide 27
FORTRAN procedurális, imperatív nyelv kutatásban napjainkban is használják 1950 - IBM -John Backus (1924-2007) Backus 1977-ben Turing díjat kapott slide 28
FORTRAN --> LISP Anyone could learn Lisp in one day, except that if they already knew FORTRAN, it would take three days - Marvin Minsky slide 29
LISP John McCarthy matematikus (1927-...) 1971 -Turing díj a lambda-kalkulus bevezetése hozzajárult a PL fogalmak bevezetéséhez: automatikus memóriafelszabadítás (garbage collection) dinamikusan tipizált slide 30
Algol 60 Tervezés: 1958-1960 Modern programozási nyelvek BNF - Backus Naur Form Peter Naur (Dánia): 2005 Turing díj procedura, változó deklarálás, rekurzív eljárások, verem használata alprogram hívására Birth of computer science -- Dijkstra A language so far ahead of its time that it was not only an improvement on its predecessors, but also on nearly all its successors -- Hoare slide 31
Pascal Niklaus Wirth svájci elektromérnök tervezte 1970-ben 1984 Turing díj Jellemzők hasznos struktúrák népszerű a programozás tanításában ipari környezetben nem sikeres 1980: Modula-2 1988: Oberon slide 32
SIMULA 67 Ole-Johan Dahl (1931-2002) norvég informatikus Kristen Nygaard (1926-2002) norvég matematikus és informatikus 2001 közösen kaptak Turing díjat Első objektumorientált nyelv osztályok és objektumok öröklődés virtuális eljárások slide 33
BCPL / B / C nyelvcsalád Alacsony szintű nyelv: kézi memóriakezelés explicit pointer(cím)kezelés gyengén típusos (char int) rendszerprogramok készítésére alkalmas PDP-7, PDP-11, VAX, Unix munkaállomás és PC C nyelv = hordozható assembly nyelv slide 34
B 1969: Ken Thomson mérnök (és Dennis Ritchie mérnök), Bell Labs Tömör nincsenek egymásba ágyazott függvények Pre-/postfix jelölés: x++ és ++x, x:=x+1 helyett null karakterben végződő karakterláncok Ken Thompson és Dennis Ritchie slide 35
C Bell Labs 1972 (Dennis Ritchie mérnök) A UNIX op. rendszerrel egyszerre tervezték 1983 Turing díj K. Thompson és D. Ritchie natív kódra fordítás slide 36
C típusok C típusok int int int int int int int i, *pi, **ppi; f(); *f(); **f(); *(*pf)(); (*pf)(int); *api[10]; slide 37
C standardok 1973-1980: új típusok unsigned, long, union, enums 1978: megjelent a K&R C könyv 1989: ANSI C standard Függvény prototípus mint a C++ nyelvben 1999: ISO 9899:1999, C99" Concurrent C, Objective C, C++, C# slide 38
C++ Bell Labs 1979 (Bjarne Stroustrup, dán informatikus) C with Classes (1983: C++ nyelv) a Simula nyelv befolyásolta Kezdetben C forrásnyelvre alakított majd natív kódra GNU g++ PL-ből átvett fogalmak több ősosztály sablonok, generikus programozás kivételek kezelése slide 39
Java Sun 1991-1995 (James Gosling informatikus) Oak, eredeti név háztartási gépek vezérlésére tervezték C, C++ és Modula-3 keverék eltérések, C++ nincs többszörös származtatás nincs operátor túlterhelés Modula-3, hasonlóságok interfész típus egy ősosztály kivételkezelés beépített szálkezelés slide 40
Programozási nyelvek fejlődése Keressük a legjobb módszereket szoftverek építésére A jó ötletek fennmaradnak Algol Simula Smalltalk C with Classes C++,,Céltudatosan'' fejlesztett nyelvek: Szkript nyelvek: Perl, Tcl, Python, PHP, stb. PHP is a minor evil perpetrated by incompetent amateurs, whereas Perl is a great and insidious evil, perpetrated by skilled but perverted professionals. - Jon Ribbens slide 41