Component adaptation and assembly using interface relations Or: a tool called Cake . Stephen Kell Stephen.Kell@cl.cam.ac.uk Computer Laboratory University of Cambridge Component adaptation. . . Cake – p.1/18
There’s something about software... Software is expensive and inflexible . Tools assume: � ground-up � perfect fit � don’t change � never replaced Reality: none of the above! Component adaptation. . . Cake – p.2/18
A problem A B These programming tasks arise: � as software evolves � as new user requirements emerge � as software ecosystem evolves � e.g. alternative components become available Component adaptation. . . Cake – p.3/18
This talk in one slide Cake is a tool for tasks like these. It is: � a rule-based language � ... for describing adapters � declarative � black-box � convenient Key contributions: � expressive enough for realistic tasks � ... context-sensitive , many-to-many relations � ... evaluated on real tasks Component adaptation. . . Cake – p.4/18
Common approaches ������������� A A′ B ����������� A B glue code B ����������������� A′′ Component adaptation. . . Cake – p.5/18
Overview ���� ����� ���� ���� ���� ���� ������� ���������� ������� A �� ��� exists elf reloc (”A.o”) A; // assume that object files... exists elf reloc (”B.o”) B; // ... contain debug info derive elf reloc (”whole.o”) = link [A, B] { / ∗ your rules here! ∗ / } ; Component adaptation. . . Cake – p.6/18
Simple adaptations ����� ����� A B foo (...) ← → bar (...); Component adaptation. . . Cake – p.7/18
Simple adaptations ����� ����� �������� �������� A B foo (...) ← → bar (...); baz(a, b) ← → baz(b, a); Component adaptation. . . Cake – p.7/18
Simple adaptations ����� ����� �������� �������� ������ ��������� A B foo (...) ← → bar (...); baz(a, b) ← → baz(b, a); xyz(a) ← → xyz(a, 42); Component adaptation. . . Cake – p.7/18
Simple adaptations ����� ����� �������� �������� ������ ��������� A B ��������� ��������� foo (...) ← → bar (...); baz(a, b) ← → baz(b, a); xyz(a) ← → xyz(a, 42); values Br ← → Tr Component adaptation. . . Cake – p.7/18
Simple adaptations ����� ����� �������� �������� ������ ��������� A B ��������� ��������� ����������� ������������ foo (...) ← → bar (...); baz(a, b) ← → baz(b, a); xyz(a) ← → xyz(a, 42); values Br ← → Tr { sz ← → len; } ; The Cake compiler generates wrapper functions from rules. Component adaptation. . . Cake – p.7/18
More complex adaptations ���������������������������� �������������������������� ������������� ��������������� ������������������ �������������� Real interfaces ������������������� ������� ��������������������������� ������������������������������ correspond less simply: ��������� ���������������� ������������������������ ������� ��������������������������� � non-1-to-1 mappings ��������������������������� ����������������� ��������� � context-sensitive ��������������� ������� ������������ ����������������������� ����� ���������������������� ��������������������������� � data, not just code ���������������������������� ������������������������������� ������������������������ ������������������������ �������������� ������������������������ ������������������������ ������ ������������������������ ������������������������ ��������������� ������������ ��������������� ����������� ���� ��� ���������������� �������������� �������� ��������� ���������������������� Component adaptation. . . Cake – p.8/18
Many-to-many mappings ����������� ������������ ��&����� ������� ����� ������������ ���������������� �������� �������������� ��%��(�� ����� ��'� ������ ���������� ������������� �������������� �������� ������� ������������ ������������ ��� !" ������������� ����� ������'� +" ������ ���� +" �� Component adaptation. . . Cake – p.9/18
Many-to-many mappings ����������� ������������ ��&����� ������� ����� ������������ ���������������� �������� �������������� ��%��(�� ����� ��'� ������ ���������� ������������� �������������� �������� ������� ������������ ������������ ��� !" ������������� ����� ������'� +" ������ ���� +" �� values (dec: mpeg2 dec s, info: mpeg2 info s, seq: mpeg2 sequence s, fbuf: mpeg2 fbuf s) ← → ( ctxt : AVCodecContext, vid idx: int, frame: AVFrame, p: AVPacket, s: AVStream, codec: AVCodec) { fbuf ← → frame { buf[0] as line [seq.height] ptr ← → data[0] as line [ ctxt.height ] ptr ; } } / ∗ ← − - more rules go here... ∗ / This creates an association at run time (like a join table). Component adaptation. . . Cake – p.9/18
Context-sensitive mappings Trace of start-up calls appropriate for the two libraries: avcodec_init() �→ () �→ dec av_register_all() �→ () mpeg2_init() fopen("...", "rb") �→ f av_open_file(...) �→ avf mpeg2_info(dec) �→ info av_find_stream_info(avf) �→ () mpeg2_parse(dec) �→ STATE_BUFFER avcodec_find_decoder(...) �→ codec av_codec_open(...) �→ () Problem! � one info call wants decoder object; other wants file. Solution: context predication with name binding. let dec = mpeg2 init(), ..., let f = fopen(fname, ”rb”), ..., mpeg2 info(dec) − →{ / ∗ now both f and dec are available ∗ / } ; Component adaptation. . . Cake – p.10/18
Complex object structures “Passing objects” often means passing object graphs . ����������� �������� �������� �������� ����������� ����������� ���� ���� ���� ���� ���� ���� ��� ��� ���� ���� ���� ���� ���� ���� ������� ������� ������� ������� ������� ������� � � � � � � ��� ��� � � � � � � The Cake runtime traverses object structures automatically. values list node t ← → ListNode { data ← → item; } ; values point t ← → XYPoint; Incidentally, note the following: � name-matching is Cake’s default policy � can insert stub code for value transformation (not shown) Component adaptation. . . Cake – p.11/18
Recommend
More recommend