Diplomové práce pro FIT
Tato zadání jsou určené pro studenty MI_SWI_SI a MI_TI_SP. Je žádoucí splnění předmětu MIRUN. Předpokladem je znalost jazyka C a schopnost aktivně pracovat s cizími zdrojovými kódy (hacking).
Podpora uložených procedur v PostgreSQL
RDBMS PostgreSQL nabízí pro vývoj uložených procedur několik programovacích jazyků. V této nabídce ovšem chybí programovací jazyk PSM, který byl navržen přímo pro vývoj uložených procedur. Paradoxně PostgreSQL také nepodporuje procedury (podporuje pouze funkce). Cílem navržených témat je: zefektivnit stávající podporu uložených procedur, implementovat podporu jazyka PSM a konečně připravit prostředí pro spouštění procedur.
Témata mohou být použita pro bakalářské i magisterské práce. Po dohodě s zadavatelem dojde k upřesnění zadání a rozsahu práce.
Zadavatel: Ing. Pavel Stěhule, pavel.stehule@gmail.com, tel: 724 101 000
Organizace: CSPUG
Akcelerátor PL/pgSQL
PL/pgSQL je standardní programovací jazyk pro uložené procedury v RDBMS PostgreSQL. Jedná se o jednoduchý interpret založený na rekurzivní interpretaci AST. Aktuálním hrdlem je vyhodnocení výrazů - což je volání AST interpretu (executoru SQL v PostgreSQL). Cílem diplomové práce je převedení AST výrazů do bytecode (případně JIT) s vlastním rychlým interpretem.
- nastudujte si techniky použité pro urychlení zpracování interpretovaných jazyků (např. threading),
- nastudujte si architekturu vyhodnocení výrazů v PostgreSQL (exekutor),
- nastudujte si datové struktury používané pro uložení AST výrazů,
- navrhněte a realizujte vlastní interpret výrazů a posuďte jeho rychlost vůči exekutoru PostgreSQL.
PostgreSQL PL proxy
Cílem diplomové práce je emulace reálných uložených procedur pro RDBMS PostgreSQL pomocí proxy serveru. Proxy server filtruje komunikaci server/klient, přičemž všechny běžné požadavky posílá na server. V případě, že klient použije příkaz CALL, tak proxy server spustí modifikovaný interpret PL/pgSQL, který umožní exekuci kódu mimo vlastní jádro databáze. Další příkazy, které musí proxy server zpracovat, jsou příkazy CREATE OR REPLACE PROCEDURE a DROP PROCEDURE.
- nastudujte rozdíly v podpoře uložených procedur v RDBMS Oracle, DB2 a MSSQL,
- seznamte se s komunikačním protokolem použitým pro komunikaci db PostgreSQL,
- navrhněte jednoduchý proxy server podporující příkazy SHOW TABLES, SHOW DATABASES,
- proxy server rozšiřte o možnost aktivace kódu v programovacím jazyce LUA s možností předání relevantního db připojení,
- proxy server rozšiřte o podporu SQL uložených procedur - o příkaz CALL, CREATE PROCEDURE a DROP PROCEDURE
- proxy server rozšiřte o podporu session proměnných - příkaz DECLARE.
Poznámka - jako programovací jazyk můžete použít Perl, Python, C nebo Lua.
Vytvoření interpretu PSM nad virtuálními stroji PARROT nebo LUA
Jazyk PSM je procedurální programovací jazyk navržený pro vývoj uložených procedur - jeho definice je součástí standardu ANSI SQL (cca v letech 1993-1997). K dispozici je prototyp, k dispozici jsou regresní testy. Cílem diplomové práce je vytvořit překladač PSM pro virtuální stroj PARROT nebo pro virtuální stroj LUA - a to tak, aby bylo možné použít JIT implementovanou pro tyto virtuání stroje. Součástí diplomové práce bude bližší seznámení se s těmito vývojovými platformami.
- seznamte se s programovacím jazykem PSM,
- seznamte se s prostředím PARROT nebo LUA a návrhem překladačů v těchto prostředích
- realizujte jazyk PSM v prostředí PARROT nebo LUA,
- zhodnoťte efektivitu, složitost, objem Vaší implementace vůči vestavěnému programovacímu jazyku PL/pgSQL.
Návrh a realizace efektivního interpretu jazyka PSM
Aktuálně existují dvě implementace programovacího jazyku PSM pro RDBMS PostgreSQL - PL/pgPSM (AST interpret) a PL/PSM0 (interpret bytecode). Cílem diplomové práce je analyzovat implementace PSM, navrhnout a realizovat řešení, které urychlí interpretaci (např. použitím technik použitých pro urychlení provádění Javascriptu), a posoudit obě varianty (z hlediska rychlosti, z hlediska velikosti a komplexnosti kódu).
- urychlete následující kód:
#include <stdio.h> #include <string.h> int data[10]; typedef struct { int op; int *param1; int *param2; int *result; } instr; instr prg[20]; static void sum(instr *op, int *pc) { *(op->result) = *(op->param1) + *(op->param2); (*pc)++; } static void mul(instr *op, int *pc) { *(op->result) = *(op->param1) * *(op->param2); (*pc)++; } static void set(instr *op, int *pc) { *(op->result) = (int) op->param1; (*pc)++; } static void jmpnz(instr *op, int *pc) { if (*(op->param1) != 0) { *pc = (int) op->param2; } else { (*pc)++; } } static void eval() { int exit_loop = 0; int pc = 0; while (pc < 10 && !exit_loop) { switch (prg[pc].op) { case 1: sum(&prg[pc], &pc); break; case 2: mul(&prg[pc], &pc); break; case 3: set(&prg[pc], &pc); break; case 4: jmpnz(&prg[pc], &pc); break; default: exit_loop = 1; } } } static void storeop(int op, int *param1, int *param2, int *result, int *pc) { instr *addr = &prg[(*pc)++]; addr->op = op; addr->param1 = param1; addr->param2 = param2; addr->result = result; } int main() { int pc = 0; int A = 1; int B = 1; int C = 1; int i = 10000000; int aux = 0; memset(prg, 0, sizeof(prg)); storeop(3, (int *) 0, 0, &B, &pc); storeop(1, &C, &B, &A, &pc); storeop(3, (int *) 1, 0, &B, &pc); storeop(1, &A, &B, &C, &pc); storeop(3, (int *) -1, 0, &aux, &pc); storeop(1, &i, &aux, &i, &pc); storeop(4, &i, (int *) 0, 0, &pc); eval(); printf("result: %d\n", C); }
- nastudujte stávající implementace jazyku PSM a PL/pgSQL,
- nastudujte implementaci jazyka Javascript v8,
- navrhněte efektivní interpret jazyka PSM a posuďte jeho výkon a složitost vůči stávajícímu interpretu PL/pgSQL.
Odkazy
- http://forge.mysql.com/wiki/MySQL_Proxy
- http://sqlrelay.sourceforge.net/sqlrelay/router.html
- http://freshmeat.net/projects/postgresql-relay/
- http://www.postgresql.org/docs/8.1/static/protocol.html
- https://labs.omniti.com/labs/pgtreats/wiki/pgsniff
- https://github.com/dalibo/pgshark/wiki
- https://github.com/okbob/plpsm0
- http://parrot.org/
- http://www.inf.puc-rio.br/~roberto/talks/lua-ll3.pdf
- http://lamp.epfl.ch/teaching/courses2/_media/advanced_compiler/2011/acc2011_08_interpreters-and-vms_6.pdf
- C a PostgreSQL - interní mechanismy