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