Předehra: Nastavujeme překladač Céčka



Podobné dokumenty
IUJCE 07/08 Přednáška č. 1

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

PB071 Programování v jazyce C Jaro 2015

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

CPAN, tvorba a šíření softwaru v jazyce Perl. Petr Pajas Hejnice 2010

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

PROGRAMOVÁNÍ V C++ CVIČENÍ

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Odvozené a strukturované typy dat

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Algoritmizace a programování

IUJCE 07/08 Přednáška č. 6

Algoritmizace a programování

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

x86 assembler and inline assembler in GCC

dostat zdroják Petr Zemek Fakulta informačních technologií VUT v Brně izemek

Vstupní a vstupní proudy v C++

PB161 Programování v jazyce C++ Přednáška 10

Programování v Javě I. Únor 2009

Př. další použití pointerů

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Programování v Javě I. Leden 2008

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Programovací jazyk C++ Hodina 1

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

PB161 Programování v jazyce C++ Přednáška 10

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

C++ 0x aka C++11. Základním kamenem je třída std::thread

PREPROCESOR POKRAČOVÁNÍ

Rozšiřování a upravování stávající funkcionality PLToolbox, Orafce

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Metody připojování periferií

Struktury, funkce, reference

Základy programování (IZP)

PB161 Programování v jazyce C++ Přednáška 4

Základní datové struktury

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

dovolují dělení velkých úloh na menší = dekompozice

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Jazyk C++ II. Výjimky

Úvod do programovacích jazyků (Java)

Embedded SQL v C/C++ úvod. Administrace Oracle Kateřina Opočenská

Programování v C++ 1, 1. cvičení

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

Rozsáhlé programy = projekty

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Operační systémy. Cvičení 3: Programování v C pod Unixem

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

Operační systémy. Cvičení 4: Programování v C pod Unixem

PB071 Programování v jazyce C Jaro 2017

18. února 2015, Brno Připravil: David Procházka. Programovací jazyk C++

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

Ukazatele, paměťové třídy, volání funkcí

Abstraktní třídy, polymorfní struktury

LZ77 KNIHOVNA PRO KOMPRESI A DEKOMPRESI DAT POMOCÍ ALGORITMU LZ77. Příručka uživatele a programátora

Zápis programu v jazyce C#

Canon Controller. Komunikační protokol. Řídicí jednotka k objektivům Canon EF/EF-S

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

- jak udělat konstantu long int: L long velka = 78L;

Základy programování (IZP)

Integrace OpenOffice.org a Javy. CZJUG, , Robert Vojta

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování.

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza.

přetížení operátorů (o)

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.


Programovanie v jazyku C - ti to zratam...

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

8 Třídy, objekty, metody, předávání argumentů metod

Generické programování

- tzv. standardní vstupní a výstupní proud (input / output stream)

Programovanie v jazyku C - to chce dynamiku

Třídy a struktury v C++

PB071 Programování v jazyce C Jaro 2013

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Základy C++ I. Jan Hnilica Počítačové modelování 18

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Základy programování (IZP)

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Vstupní požadavky, doporučení a metodické pokyny

1 Knihovní funkce Skupina funkcí bool Skupina funkcí String Testovací program ELDEC Interface X.XX Example...

Semestrální práce KIV/PC Řešení kolizí frekvencí sítě vysílačů Zdeněk Bečvář A14B0466P 10. ledna 2016

Funkční objekty v C++.

Digitální učební materiál

Singleton obsah. n Motivace. n Základní myšlenka. n Implementace. n Problémy. n Dědičnost. n Obecná implementace. n Shrnutí.

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

: Teoretická informatika(ti)

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Transkript:

Předehra: Nastavujeme překladač Céčka (ExtUtils::Embed) perl -MExtUtils::Embed -e ccopts -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -fstack-protector -fno-strict-aliasing -pipe -I/usr/local/include -I/usr/lib/perl/5.14/CORE perl -MExtUtils::Embed -e ldopts -Wl,-E -fstack-protector -L/usr/local/lib -L/usr/lib/perl/5.14/CORE -lperl -ldl -lm -lpthread -lc -lcrypt Viz též: perl -MConfig print $Config{ccflags} perl -V::ccflags: perl -V:.*

Minimalistický /usr/bin/perl (perlembed) #include <EXTERN.h> #include <perl.h> int main(int argc, char **argv, char **env) { PERL_SYS_INIT3(&argc, &argv, &env); PerlInterpreter *my_perl = perl_alloc(); perl_construct(my_perl); PL_exit_flags = PERL_EXIT_DESTRUCT_END; perl_parse(my_perl, NULL, argc, argv, NULL); perl_run(my_perl); } perl_destruct(my_perl); perl_free(my_perl); PERL_SYS_TERM();

Volání funkce (perlembed) int main(int argc, char **argv, char **env) { PERL_SYS_INIT3(&argc, &argv, &env); PerlInterpreter *my_perl = perl_alloc(); perl_construct(my_perl); PL_exit_flags = PERL_EXIT_DESTRUCT_END; char *av[] = { argv[0], "script.pl", NULL }; perl_parse(my_perl, NULL, 2, av, NULL); perl_run(my_perl); char *par[] = { "42", NULL }; call_argv("answer", G_DISCARD, par); } perl_destruct(my_perl); perl_free(my_perl); PERL_SYS_TERM();

Zvěřinec typů (perlguts) Perlové typy: SV AV HV GV skalár pole heš typeglob Pomocné typy: IV UV NV PV RV integer unsigned integer number (double) pointer (typicky na string) reference na perlový typ

Práce se skaláry 1/2 // Výroba sv = newsviv(42); sv = newsvpv("hello!", 0); sv = newsvpvf("%d", 42); sv = newsvsv(sv); sv = newsv(len); // Čtení SvIV(sv) SvNV(sv) SvPV(sv, len) SvPV_nolen(sv) SvTRUE(sv) // Změna hodnoty sv_setiv(sv, 1); sv_setpv(sv, "Goodbye!"); (perlguts, perlapi) // 0 = délka se spočítá automaticky // undef s bufferem dané délky // makro modifikující len

Práce se skaláry 2/2 (perlguts, perlapi) // Vlastnosti SvOK(sv) // defined(...)? SvIOK(sv) // má integerovou hodnotu (veřejnou)? SvPOK(sv) // má stringovou hodnotu (veřejnou)? // Výroba polymorfního skaláru sv_setiv(sv, 1); sv_setpv(sv, "Goodbye!"); SvIOK_on(sv); // Standardní konstanty (read-only!) PL_sv_undef PL_sv_yes PL_sv_no // Nalezení skaláru podle jména sv = get_sv("pkg::var", GV_ADD); // SvIOK // SvPOK,!SvIOK (jen privátně) // SvPOK, SvIOK

Reference a smrtelnost (perlguts, perlapi) // Počítání odkazů cnt = SvREFCNT(sv) SvREFCNT_inc(sv); SvREFCNT_dec(sv); // vrací tutéž sv // Perlové reference (speciální případ SV) rv = newrv_inc(sv) // může být i přetypovaná AV/HV/... rv = newrv_noinc(sv) sv = SvRV(rv) // výsledek lze přetypovat SvROK(sv) SvTYPE(svRV(rv)) // SVt_PVAV pro pole atd. // Smrtelné skaláry sv_2mortal(sv); // objedná pozdější SvREFCNT_dec sv = sv_newmortal() sv2 = sv_mortalcopy(sv) // smrtelná kopie skaláru

Magie (perlguts) Každý skalár může mít jednu nebo více struct magic. Obsahují: typ soukromá data odkaz na tabulku virtuálních funkcí: pre-get, post-set, free,... Příklady druhů magie: pos tie hodnota v %ENV hodnota v @ISA délka pole ($#array) Některé funkce magii vyvolávají samy, jinak je nutno volat: SvGETMAGIC (před čtením) SvSETMAGIC (po zápisu)

Předávání argumentů a výsledků (perlcall, perlapi) dsp; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv_2mortal(newSViv(1))); // nebo mxpushi(1) XPUSHs(sv_2mortal(newSViv(2))); PUTBACK; int nres = call_pv("add", G_SCALAR); if (nres!= 1) croak("nevermore!"); SPAGAIN; printf("result = %d\n", POPi); PUTBACK; FREETMPS; LEAVE; // kontext

Ošetření výjimek (perlcall, perlapi)... PUSHMARK(SP); mxpushi(1); mxpushi(2); PUTBACK; int cnt = call_pv("subtract", G_SCALAR G_EVAL); SPAGAIN; if (SvTRUE(ERRSV)) printf("error: %s", SvPV_nolen(ERRSV)); else if (cnt == 1) printf("result = %d\n", POPi); else printf("unexpected result\n"); PUTBACK;... // $@

Vyrábíme Céčkovou knihovnu (perlxstut, perlxs) Necháme si poradit: h2xs -A -n Oracle::Delphi --skip-ppport Oracle-Delphi/ Makefile.PL Delphi.xs lib/oracle/delphi.pm t/oracle-delphi.t MANIFEST README Changes

Céčková knihovna: Makefile.PL (ExtUtils::MakeMaker) use ExtUtils::MakeMaker; WriteMakefile( NAME VERSION_FROM AUTHOR LIBS ); => Oracle::Delphi, => lib/oracle/delphi.pm, => Martin Mares <mj@ucw.cz>, => [ -lm ], perl Makefile.PL INSTALL_BASE=~/perl make -> blib/ make test -> spustí t/*.t a případně test.pl make install

Céčková knihovna: MANIFEST (ExtUtils::Manifest) Changes Delphi.xs Makefile.PL MANIFEST README t/oracle-delphi.t lib/oracle/delphi.pm

Céčková knihovna: Delphi.pm (XSLoader) package Oracle::Delphi; use 5.014002; use strict; use warnings; require Exporter; our @ISA = qw(exporter); our @EXPORT = qw(prophecy); our $VERSION = 0.01 ; require XSLoader; XSLoader::load( Oracle::Delphi, $VERSION); # Zde může být kus modulu napsaný v Perlu 1; END Zde jednou bude dokumentace...

Céčková knihovna: Delphi.xs (perlxs) #include "EXTERN.h" #include "perl.h" #include "XSUB.h" MODULE = Oracle::Delphi PACKAGE = Oracle::Delphi char * prophecy(question) INPUT: char *question; CODE: RETVAL = "Great empire will be destroyed."; OUTPUT: RETVAL INPUT: lze vynechat a parametry deklarovat jako v ANSI C CODE: lze vynechat, pak se zavolá Céčková funkce téhož jména

XS: Definice vlastního typu (perlxs) #include "EXTERN.h" #include "perl.h" #include "XSUB.h" typedef enum { OM_AUGURY, OM_HARUSPICY, OM_SPIRITISM, } oracle_mode; MODULE = Oracle::Delphi PACKAGE = Oracle::Delphi char * prophecy(oracle_mode mode, char *question) CODE: RETVAL = "Great empire will be destroyed."; OUTPUT: RETVAL

XS: Překlad vlastního typu (perlxstypemap) Soubor typemap: TYPEMAP oracle_mode_num T_IV oracle_mode T_ORACLE_MODE INPUT T_ORACLE_MODE char *tmp = SvPV_nolen($arg); if (!strcmp(tmp, \"augury\")) $var = OM_AUGURY;... else croak(\"invalid oracle mode\"); Podobně OUTPUT...

XS: Přímá konstrukce SV (perlxs) SV * prophecy(oracle_mode mode, char *question) CODE: RETVAL = newsvpv("offer more if you want to ask: ", 0); sv_catpv(retval, question); OUTPUT: RETVAL

XS: Ruční obsluha argumentů i výsledku (perlxs) void prophecy(...) PREINIT: int i; PPCODE: if (items < 1) croak("only barbarians ask no questions"); for (i=0; i<items; i++) puts(svpv_nolen(st(i))); if (GIMME_V == G_ARRAY) { mxpushs(newsvpv("sacrifice", 0)); // mxpushp nechceme mxpushi(100); mxpushs(newsvpv("computer bugs", 0)); XSRETURN(3); } else { ST(0) = sv_2mortal(newsvpv("empire will be...", 0)); sv_setiv(st(0), 42); SvPOK_on(ST(0)); XSRETURN(1); }

XS: Příklad volání (Devel::Peek) #!/usr/bin/perl use common::sense; use Oracle::Delphi; use Devel::Peek; say prophecy("will I", "pass the exam?"); say scalar prophecy("will I?"); say 0 + prophecy("will I?"); Dump(scalar prophecy("will I?")); SV = PVIV(0x1da35b8) at 0x1d91998 REFCNT = 1 FLAGS = (TEMP,IOK,POK,pIOK,pPOK) IV = 42 PV = 0x1db0680 "Great empire will be destroyed"\0 CUR = 30 LEN = 32

Op-tree: Interní reprezentace programu (perlinterp, B::Terse) perl -MO=Terse -e $a=$b+$c LISTOP (0x1a3a240) leave [1] OP (0x1a2cfc0) enter COP (0x1a3aae0) nextstate BINOP (0x1a39010) sassign BINOP (0x1a3a200) add [4] UNOP (0x1a3a2c0) null [15] PADOP (0x1a3a390) gvsv GV (0x1a31e68) *b UNOP (0x1a38f70) null [15] PADOP (0x1a3a280) gvsv GV (0x1a14a88) *c UNOP (0x1a3a550) null [15] PADOP (0x1a3a6f0) gvsv GV (0x1a31e38) *a

Op-tree: Pořadí provádění (perlinterp, B::Terse) perl -MO=Terse,-exec -e $a=$b+$c OP (0xc8efc0) enter COP (0xdc09e0) nextstate PADOP (0xc9c3b0) gvsv GV (0xc93e68) *b PADOP (0xc9c2a0) gvsv GV (0xc76a88) *c BINOP (0xc9c220) add [4] PADOP (0xc9c710) gvsv GV (0xc93e38) *a BINOP (0xc9b030) sassign LISTOP (0xc9c260) leave [1]