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