humanista w twoim linuksie
TRANSCRIPT
Humanista w twoim Linuksie, czyli nie tylko o jądrach ale i języku słów kilka
Adam Przybyła <[email protected]>(mail i JID)
(Creative Commons CC-by-nd)Dni Wolnego Oprogramowania - Bielsko 2012
Gandhi i jego Swaradż
Monopol solny obcych kor ... kompanii
Marsze solne
Rodzime tkactwo – własne narzędzia
Bierny opór
Czy to nie brzmi znajomo?
Swaradź, swaraj (z sanskrytu swaradźia "panowanie, rząd, samorząd"), hasło wysunięte 1906 na sesji Indyjskiego Kongresu Narodowego, 1920 wpisane do jego programu. Wolność ale także w sensie ekonomicznym.
Jądro ciemności czyli co tkwi w systemach Linuksowych
Jądro – czyli system
Interpretery
Python, Perl, Php
Filtry
Awk, Sed, Tr, Grep,
Translatory
Flex, Bison, ANTLR, M4
[adam@tao ~]$ file {/usr,}/bin/*|cut f2 d: |awk '{print $1,$2}'|sort |uniq c|sort rn
2008 ELF 32bit
315 POSIX shell
311 symbolic link
105 a /usr/bin/python
95 a /usr/bin/perl
21 BourneAgain shell
16 a python
13 setuid ELF
5 setuid executable,
4 setgid ELF
3 setgid executable,
3 a perl
[adam@tao ~]$
Opis CSV w EBNFCSV file
file ::= [ header ] { line }
header ::= [ { entry separator } entry ] newline
line ::= [ { entry separator } entry ] newline
entry ::= character+ | { character* " separator " } | " entry newline entry "
newline ::= \n
separator ::= ,
character ::= a|b|..|A|B|..|0|1|..
escapedQuote ::= ""
Flex i Bison
Flex – analizator leksykalny
Rozszerzona wersja programu lex
Generuje tablice przejść
Parsery LR i LL
Plik konfiguracyjny analizatora leksylalnego%%
, {return COMMA;}
\n {return NEWLINE;}
\r\n {return NEWLINE;}
[^,\n\r]+ {return ITEM;}
Kod Bisona
%token COMMA NEWLINE ITEM
%%
csv_file : line_list | line_list line;
line_list : line_list line newline | line newline | line_list newline | newline;
line : line comma | line item | item | comma;
comma : COMMA ;
newline : NEWLINE;
item : ITEM ;
Program wynikowy we Flex
static yyconst flex_int32_t yy_ec[256] = { 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
1, 1, 3, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 4, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
[ciach]
Program wynikowy we Bisonstatic const yytype_uint8 yytranslate[] =
{
0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
Flex z kernelem
Filtr klasyfikujący do kernela
https://github.com/AdamPrzybyla/layer7flex
Kilka razy szybsze rozwiązanie niż wyrażenia regularne niż oryginalne rozwiązanie
Analizator leksykalny ANTLR
PCTTS
Dla leniwych
Analizator LL(*)
Przejrzysty kod
Generacja kodu Java,c#,Python,C++
Tryby pracy ANTLR
Analizator leksykalny
Tworzenie AST
Walker AST
Generowanie plików graphviz
Przetwarzanie AST
Język template
Przetwarzanie drzew AST
Kompilator c kiedyś:
Źródło w C
C z rozwiniętymi makrami
Asembler
Plik .o + linkowanie
Kompilator C teraz:
Kolejne modyfikacje drzew AST
Gramatyka CSV w ANTLR
grammar csv;
options { language=Python; }
file : record (NEWLINE record)* EOF ;
record : (quoted_field | unquoted_field) (COMMA (quoted_field | unquoted_field))* ;
quoted_field : DQUOTE ( CHAR | COMMA | DQUOTE DQUOTE | NEWLINE)* DQUOTE ;
unquoted_field : CHAR* ;
CHAR : '\u0000' .. '\u0009' | '\u000b' .. '\u000c' | '\u000e' .. '\u0021' | '\u0023' .. '\u002b' | '\u002d' .. '\uffff' ;
COMMA : '\u002c' ;
DQUOTE : '\u0022' ;
NEWLINE : '\u000d'? '\u000a' | '\u000d' ;
Zrozumiały kod (Java)
case CHAR:
{ alt5=1; }
break;
case COMMA:
{ alt5=2; }
break;
case NEWLINE:
{ alt5=4; }
break;
Wywołanie funkcji – jak w ręcznych parserach
if alt2 == 1:
# csv.g:26:8: quoted_field
pass
self._state.following.append(self.FOLLOW_quoted_field_in_record57)
self.quoted_field()
self._state.following.pop()