PRESENTATIE ABI PROJECT Automatische conversie van Accell naar Java
Gert van der Kaaden Maarten Snels Eddy Spreeuwers 12 november 2011 1
Inhoud Inleiding ● Parser ● Type inferencer ● Code generator ● Framework ● Resultaten ● Conclusie ●
2
Project Opdracht: ● Eigen initiatief ● Uit werksituatie ● Vervangende opdrachtgever ● Scope beperking Verloop ● Drie wekelijkse bijeenkomsten (voortgang) ● Wekelijks Skype (taakverdeling) ● Ad hoc: svn, mail. ● Issues en uren : Spreadsheet Google docs Taakverdeling ● Op componenten ● Iedereen alle disciplines
3
Context Voorziening tot samenwerking Politie Nederland (vtsPN) ● Onderdeel van de politie ● Onder andere applicatie ontwikkeling voor politie (ca. 200 man) ● Ontwikkeling van de BVH Applicatie Basis Voorziening Handhaving (BVH) ● Basis processensysteem voor de handhavingstaken van de politie ● Bijhouden van relevante gegevens voor het maken van processen verbaal. ● Genereren van dossiers voor het Openbaar Ministerie 4
Aanleiding Business case ●
Hoge licentiekosten Unify Accell
Weinig personeel met Accell kennis veel personeel met Java kennis ● Geen modern ontwikkelgereedschap ● Handmatige conversie naar Java is zeer kostbaar en risicovol ● Automatische conversie is goedkoper, sneller en betrouwbaarder ● Grote codebase: ca 2.000 files, 1.000.000 regels code ●
Opdracht Onderzoek haalbaarheid van automatische code conversie. ● Proof of concept d.m.v. een werkend prototype. ●
5
Voorbeeld Accell code VOID FUNCTION helloWorld($f_id) LOCAL $l_naam BEGIN SET $l_naam TO SELECT persoon.naam FROM persoon WHERE persoon.id = $f_id; DISPLAY 'Hello World from ' + $l_naam FOR FYI_MESSAGE END
6
Risico “Low-level porting, even with provided documentation, is one of the blackest software arts; knowing how to do it well will surely get you a first-class ticket to hell.” S.C. Sprong, conversie van Fortran naar C
7
Accell vs. Java Accell Weak typing SQL integrated Procedural Precompiler Pascal like syntax Fuzzy dynamic scoping
Java Strong typing JDBC libraries Object oriented packaging C Like syntax Static scoping
8
Risico beperking Domein-analyses: Type-inferencing (Gert) ● Broncode-conversie (Eddy) ● Java-frameworks (Maarten) ●
Uitgangspunten: Geen refactoring. ● Code moet op de oorspronkelijk source lijken ● Code moet gangbare java syntax gebruiken ● Pragmatisch omgaan met verschillen in semantiek. ● Fouten en onmogelijke constructies handmatig verhelpen ● Beperking tot syntax-subset van Accell tot BVH ●
9
Conversie schema Type info
Accell bron code
Framework
Type inferer
parser
Code/Ast generator
AST
Accell grammar
Java code
AST processing Tree walking
10
Parser keuze Drie mogelijkheden voor parsing: Xtext ( Eclipse plugin beschikbaar) ● ANTLR (Eclipse plugin beschikbaar) ● Zelf een parser schrijven ●
Xtext gekozen, beste grammatica en meeste mogelijkheden.
11
Conversie schema Type info
Accell bron code
Type inferencer
parser
Framework
Code/Ast generator
AST
Accell grammar
Java code
AST processing Tree walking
12
Taken type inferencer Afleiden van types van variabelen via ● Databaseschema ● Returntypes van functies ● Analyse van de broncode Toevoegen van ontbrekende declaraties Opsporen van dubbele declaraties
13
Resultaat type inferencer Verdeling wel/niet getypeerd
Verdeling declaraties
6 716
210 3524 3008 getypeerd ongetypeerd
Gedeclareerd Toegevoegd Dubbel
14
Conversie schema Type info
Accell bron code
Framework
Type inferer
parser
Code/Ast generator
AST
Accell grammar
Java code
AST processing Tree walking
15
Syntactische conversie Belangrijkste gesimuleerde syntax constructies: SQL queries Systeemfuncties Included C functies
Aanroep framework-functies
String switch e.a.
Java constructies
16
Conversie voorbeeld #1 Accell SQL
Java SQL
List
arguments1 = new ArrayList(); arguments1.add(new PSO($f_id,"INT")); SET ResultSet rs1 = runSQLSelect( $l_id, "SELECT persoon.id, persoon.naam " + $l_naam "FROM persoon WHERE " + TO SELECT "persoon.id = ?", arguments1); persoon.id, try { persoon.naam while (resultSet1.next()) { FROM $l_id =rs1.getInt(1); //persoon.id persoon $l_naam = rs1.getString(2); //persoon.naam WHERE break; persoon.id = $f_id } } catch (SQLException _x) { //reporteer error } 17
PSO = PreparedStatementObject
Conversie schema Type info
Accell Bron bestanden
Type inferer
parser AST
Accell grammar
Framework
Code/Ast generator
Java source
AST processing Tree walking
18
Code organisatie RunSQL
runSQ LSelect() framework Fr am ew ork
include incl ude
ICodes
Datafile
Syst em Functions systemfunctions
BaseImpl
Aclenv getG lobal()
Formulier
FormLib
Lib
macroImpl
chooksImpl add_entity() add_to_m c() init_m c()
definedN otN ull() undef() undefN ull()
formulier For m ulier
For m lib formlib
AccellFunctions yesno() w ritePipeline() beep() val_to_str() to_num () current_date() current_tim e()
li b lib
incl ude include
Macro
Chooks
19
Conversie schema Type info
Accell Bron bestanden
Framework
Type inferer
parser
Code/Ast generator
AST
Accell grammar
Java code
AST processing Tree walking
20
Resultaten Code ● 10.000 regels broncode ●
125 files geconverteerd en compileerbaar. 62K regels broncode 30K regels gegenereerde code.
Kwaliteitsslag, opsporen van: ● ●
Syntax fouten Missende en dubbele variabele declaraties
Kwaliteits controle: ● ●
Parser fouten rapportage Error reports bij conversie en type inferencing 21
Conclusie Poc: ●
POC test toont aan dat de gegenereerde code de zelfde werking heeft als de oorspronkelijke code.
Kwaliteits slag op het gebied van: ● ●
Opsporen van syntax fouten. Niet of dubbel gedeclareerde variabelen (of spelfouten in variabelen)
Aanbevelingen: ● ● ● ●
Commentaar meenemen in code-generatie. Framework optimalisatie. Accell User interface ondersteuning Statistische analyse van de BVH code 22