Anda di halaman 1dari 10

Machine Translated by Google

everse Engineering adalah everse Forward Engineering


Ira D. Baxter Michael Mehlich
Semantic Designs, Inc.
12636 Research Blvd, #C-214
Austin, TX 78759-2200
{ idbaxter,mmehlich } @ semdesigns.com

Abstrak tems sulit untuk dimodifikasi dan modifikasi sulit untuk divalidasi.

Reverse Engineering difokuskan pada tugas yang


Untuk sistem yang baru dikembangkan, masalah dapat dikurangi
menantang untuk memahami kode program lama tanpa
dengan mendokumentasikan sistem secara menyeluruh dan
memiliki dokumentasi yang sesuai. Menggunakan perspektif
memelihara dokumentasi bersama dengan sistem. Idealnya,
rekayasa ke depan transformasional, kami memperoleh
dokumentasi sistem menggambarkan produk dan desain lengkap,
wawasan bahwa sebagian besar kesulitan ini disebabkan termasuk alasannya.
oleh keputusan desain yang dibuat selama pengembangan
Sebagian besar informasi desain yang ditangkap bersifat informal
sistem. Keputusan seperti itu "menyembunyikan" fungsi
(tidak dapat diinterpretasikan oleh mesin). Sementara ini berharga
program dan persyaratan kinerja dalam sistem $nul dengan
untuk pengelola perangkat lunak, informasi informal tunduk pada
menerapkan penyempurnaan berulang melalui lapisan
interpretasi yang luas, dan kegunaan dibatasi oleh masalah
abstraksi, dan optimasi penyebaran informasi, yang keduanya
pengembang perangkat lunak yang berbeda menggunakan
mengubah representasi dan memaksa entitas program
interpretasi yang berbeda dari deskripsi yang sama.
tunggal untuk menghasilkan banyak tujuan. Untuk dapat
Deskripsi formal desain (dan alasannya) dengan semantik yang
merekayasa balik; kita pada dasarnya harus membalikkan
tepat dapat mengatasi masalah komunikasi ini. Bahkan dapat
keputusan desain ini. Mengikuti pendekatan transformasional,
memungkinkan kita untuk memodifikasi desain daripada kode (lih.
kita dapat menggunakan transformasi dari metodologi metode
[3]) dan, dengan demikian, untuk memodifikasi sistem perangkat
rekayasa maju dan menerapkannya "mundur" ke kode
lunak menggunakan alat semiotomatis. Pengembangan
rekayasa balik ke spesifikasi yang lebih abstrak. Karena
transformasional perangkat lunak (lihat misalnya [ 10, 113) dipandu
sebagian besar kode yang ada tidak dihasilkan oleh sintesis
oleh kriteria kinerja (lihat misalnya [9]) tampaknya menjadi cara
transformasional, ini menghasilkan desain transformasional
yang tepat untuk mendapatkan deskripsi desain seperti itu .
formal yang masuk akal daripada desain aktual penulis asli.
Dalam pengaturan yang ideal seperti itu tidak akan ada alasan
Produk sampingan dari proses rekayasa balik transformasional
untuk rekayasa balik. Namun, banyaknya perangkat lunak yang ada
adalah database desain untuk program yang kemudian dapat yang harus dipertahankan memaksa kita untuk menghadapi masalah
dipertahankan untuk meminimalkan kebutuhan rekayasa balik
ini.
lebih lanjut selama sisa masa pakai sistem. Konsekuensi dari
Teknologi rekayasa balik saat ini berfokus pada perolehan
perspektif ini adalah keyakinan bahwa metode pengenalan
kembali informasi dengan menggunakan alat analisis (lih. [4]) dan
rencana tidak cukup untuk rekayasa balik. Sebagai contoh,
dengan mengabstraksi program dari bawah ke atas dengan
sebuah fragmen kecil dari sistem operasi real-time direkayasa ulang menggunakan pendekatan ini.
mengenali rencana dalam kode sumber (lih. [7, 14, IS, 171). Tujuan
utama dari alat tersebut pada dasarnya adalah untuk membantu
1 Pendahuluan pengelola memahami program (lih. [ 131). Sementara kami percaya
Praktik rekayasa perangkat lunak cenderung berfokus pada pada kegunaan dari pendekatan ini sebagai bagian dari toolkit dan
desain dan implementasi produk perangkat lunak tanpa visi yang lebih besar, mereka cukup memadai untuk tugas pemulihan
mempertimbangkan masa pakainya, biasanya 10 tahun atau lebih desain. Alat analisis, meskipun berharga, hanya menyediakan
(lihat [ 161). Namun, upaya utama dalam organisasi rekayasa beberapa informasi desain yang berasal dari struktur kode, bukan
perangkat lunak dihabiskan setelah pengembangan (lihat misalnya dari maksud atau konstruksinya. Pengenalan rencana murni tidak
[5, 61) pada pemeliharaan sistem untuk menghilangkan kesalahan mungkin cukup kuat untuk mendorong rekayasa balik karena alasan
yang ada dan menyesuaikannya dengan persyaratan yang berubah. berikut: kode lama ditulis menggunakan pengkodean yang agak
Sayangnya, sistem perangkat lunak yang matang seringkali rumit untuk mencapai efisiensi yang lebih baik,
memiliki dokumentasi desain yang lengkap, salah atau bahkan
tidak ada. Hal ini membuat sulit untuk memahami apa yang sedang 0 semua pola rencana yang diperlukan dalam semua variasi
dilakukan sistem, mengapa ia melakukannya, bagaimana pekerjaan harus disediakan terlebih dahulu untuk aplikasi tertentu, dan
itu dilakukan, dan mengapa ia dikodekan seperti itu. Akibatnya matang sys

104
._ 0-8186-8162-4J97 $10.00 0 1997 IEEE
Machine Translated by Google

0 konsep abstrak yang berbeda dipetakan ke kode yang memiliki informasi yang dapat dipercaya tentang hubungan antara
sama dalam satu aplikasi. spesifikasi dan kode program. Desain dan alasannya
Yang lebih penting, alasan utama melakukan reverse engineering menggambarkan bagaimana dan mengapa hubungan ini; namun,
adalah untuk memodifikasi sistem perangkat lunak; memahami itu mereka tidak didokumentasikan dalam praktik saat ini.
hanya prasyarat yang diperlukan untuk melakukannya . Kami Ada dua pendekatan yang diketahui untuk mengurangi
menganggap pengembangan transformasional dengan modifikasi kesenjangan antara spesifikasi dan program.
tanda daripada kode sebagai sarana untuk mencapai modifikasi Yang pertama adalah pengembangan perangkat lunak dengan
kremental, karena memberi kami banyak teori dan teknik untuk penyempurnaan bertahap yang memperkenalkan deskripsi
melaksanakannya ( lihat [I, 21). Untuk sistem yang ada, ini perantara dari sistem antara spesifikasi dan kode program akhir.
menyiratkan kebutuhan untuk merekonstruksi desain transformasi Deskripsi antara harus mencerminkan keputusan desain utama
yang masuk akal yang dapat digunakan untuk mendapatkan kode selama konstruksi, yang membantu untuk memahami perangkat
dari spesifikasi abstrak sistem yang sesuai, yaitu kita ingin lunak dan desainnya. Namun, pendekatan ini memiliki beberapa
menerapkan transformasi kembali dari program ke spesifikasinya. kelemahan penting: langkah-langkah pengembangan masih manual,
Merekam transformasi ini (bersama dengan alasan untuk terlalu besar untuk tidak memuat keputusan desain yang
menerapkannya) kemudian memungkinkan kita untuk memodifikasi tersembunyi, tidak ada alasan yang secara langsung terkait dengan
desain, bukan hanya kode program. langkah-langkah tersebut, hubungan antara deskripsi hanya dapat
dibangun dengan posteriori, dan masih banyak lagi dokumen yang
Berikut ini kami mengeksplorasi rekayasa maju dan mundur harus dipelihara untuk memasukkan perubahan persyaratan sistem.
secara lebih rinci dan memberikan contoh untuk kode assembler
warisan rekayasa terbalik transformasional ke konsep tingkat tinggi.
Terlepas dari kekurangan ini, pendekatan penyempurnaan
bertahap tidak terlalu buruk. Akibatnya menyerang mereka
2 Rekayasa Maju Dalam praktik membawa kita ke pendekatan kedua: pengembangan
rekayasa ke depan saat ini, persyaratan informal entah transformasional perangkat lunak di mana langkah-langkah
bagaimana diubah menjadi spesifikasi semi-formal menggunakan pengembangan manual yang cukup besar digantikan oleh
notasi domain tanpa mendasari semantik yang tepat seperti transformasi yang melestarikan kebenaran formal yang lebih kecil
misalnya diagram aliran data, diagram hubungan entitas, deskripsi yang masing-masing mencerminkan keputusan desain kecil atau optimasi.
bahasa alami, atau notasi informal atau semiformal spesifik masalah Prasyarat yang diperlukan untuk pendekatan ini adalah memiliki
lainnya . spesifikasi formal yang mungkin berisi notasi domain (misalnya
Program kemudian dibangun secara manual (yaitu dengan cara untuk domain tujuan umum dari deskripsi logis dan diagram aliran
yang rawan kesalahan) dari spesifikasi oleh agen kreatif, data dan untuk domain aplikasi khusus seperti misalnya pengelolaan
programmer. uang dan pinjaman) dengan memberi mereka semantik dasar yang
Tersembunyi dalam konstruksi kreatif program dari spesifikasi tepat. Berdasarkan ini kode program kemudian dapat diturunkan
ini adalah seperangkat keputusan desain yang jelas dan tidak jelas dengan membuat langkah-langkah implementasi kecil menggunakan
tentang bagaimana mengkodekan bagian-bagian tertentu dari transformasi mempertahankan kebenaran formal yang mengarah
spesifikasi dengan cara yang efisien menggunakan mekanisme dari spesifikasi yang lebih abstrak ke spesifikasi yang lebih konkret.
implementasi yang tersedia untuk mencapai kriteria kinerja Kode program akhir kemudian benar dengan konstruksi sehubungan
(mengapa dari keputusan desain). Sebagai contoh, fragmen dengan spesifikasi persyaratan formal. Setiap transformasi jatuh ke
spesifikasi yang memerlukan pengambilan asosiatif menggunakan dalam salah satu dari tiga kategori: penyempurnaan (yaitu peta
kunci numerik dapat diimplementasikan menggunakan tabel hash, konsep dari tingkat abstrak ke tingkat yang lebih konkret), optimasi
sehingga menghasilkan waktu reaksi sistem yang baik. Keputusan (yaitu peta untuk mengurangi sumber daya yang digunakan pada
ini biasanya tidak didokumentasikan. tingkat abstraksi menurut beberapa kriteria), dan trans jittering.
Seiring waktu, kode program dimodifikasi untuk menghilangkan formasi (yang pada akhirnya memungkinkan penerapan
kesalahan dan menyesuaikan sistem dengan persyaratan yang penyempurnaan dan pengoptimalan). Keputusan untuk menerapkan
berubah. Persyaratan dapat berubah untuk memungkinkan transformasi tertentu merupakan informasi desain yang penting.
penggunaan kunci alfanumerik dan untuk dapat menangani Transformasi yang diterapkan ditambah dengan alasan pemilihannya
sejumlah besar data, dan implementasi direvisi untuk menggunakan adalah informasi desain yang "menjelaskan" kode. Ini disebut
B-pohon berbasis disk. Sayangnya, seringkali perubahan ini terjadi desain transformasional kode dari spesifikasi.
tanpa tercermin dengan benar dalam spesifikasi. Kesenjangan
antara spesifikasi asli dan program menjadi lebih besar dan lebih
besar. Hasilnya adalah kode program tanpa spesifikasi yang tepat Pemilihan transformasi untuk diterapkan pada spesifikasi
dan dengan informasi desain yang tidak dapat dipercaya (seperti tertentu secara umum masih merupakan proses kreatif tetapi
komentar yang menjelaskan tabel hash!). Kode menjadi sulit untuk berpedoman pada kriteria kinerja yang ingin dicapai. Pemilihan
dipahami dan, dengan demikian, sulit untuk dipertahankan. transformasi yang dipandu ini memungkinkan proses pengembangan
didukung oleh sistem semiotomatis yang berisi repertoar besar
Untuk mengatasi kekurangan ini, penting untuk mengubah transformasi yang tersedia dengan menerapkannya untuk mencapai
spesifikasi terlebih dahulu dan kemudian mencerminkan perubahan atau setidaknya mendekati kriteria kinerja.
dalam kode program. Prasyarat yang diperlukan untuk ini adalah untuk

105
Machine Translated by Google

Transformasi yang diperlukan untuk rekayasa perangkat lunak - optimasi biasanya dilakukan oleh kompiler yang baik
praktis terdiri dari semua keputusan desain yang secara implisit (gerakan kode, eliminasi subekspresi umum,
digunakan oleh pengembang perangkat lunak saat ini termasuk teknik penghapusan tedundansi parsial), dan
seperti berikut (lihat misalnya [ 11, 12, 131): Dekomposisi - Sebagian
besar masalah dapat didekomposisi menjadi submasalah yang - optimasi khusus domain seperti misalnya meminimisasi
secara umum adalah mungkin dengan cara yang berbeda. mesin keadaan terbatas yang mengenali bahasa
Struktur hierarki kode yang sebenarnya hanya mewakili satu tertentu.
pilihan tertentu dari kumpulan kemungkinan dekomposisi.
Semua keputusan desain ini mungkin tumpang tindih dan mungkin
tidak terlokalisasi selama konstruksi kode program dari spesifikasi.
GeneralizatiodSpecialization - Jika komponen yang berbeda Apakah metode ini dilakukan secara mekanis oleh alat atau secara
serupa, dimungkinkan untuk membangun versi yang lebih informal oleh pembuat program cerdas, sistem perangkat lunak yang
umum yang terdiri dari keduanya sebagai kasus khusus. dihasilkan sangat sulit untuk dipahami.
Sebaliknya untuk alasan efisiensi, mungkin merupakan pilihan
yang baik untuk mengkhususkan suatu komponen untuk
Pendekatan pengembangan perangkat lunak transformasional
aplikasi (bagian dari) tertentu.
memiliki keuntungan yang memungkinkan perekaman otomatis dari
Pilihan representasi -Untuk dapat mengimplementasikan tipe keputusan desain yang dibuat selama derivasi kode program akhir
data tingkat tinggi dalam kode program, seringkali diperlukan dari spesifikasi formal. Asalkan pemilihan transformasi yang diterapkan
untuk mengubah representasinya . Sebuah contoh umum selama pengembangan ini dipandu oleh kriteria kinerja yang akan
adalah representasi dari set dengan daftar. dicapai dan hubungan antara pemilihan dan kriteria kinerja dicatat,
Pilihan algoritme - Konsep tingkat tinggi dapat kami mendapatkan desain lengkap beserta alasannya sebagai produk
diwujudkan oleh algoritme dalam berbagai cara. Pilihan pengembangan perangkat lunak. Kode itu sendiri hanyalah produk
antara yang mungkin ditegakkan dengan kriteria kinerja sampingan yang benar berdasarkan konstruksi.
yang tidak terdokumentasi dengan baik atau bahkan
tidak terdokumentasi yang harus dipenuhi.
Interleaving - Untuk alasan efisiensi mungkin berguna untuk Merekam informasi desain ini memungkinkan kita untuk
mewujudkan konsep yang berbeda di bagian kode yang sama memodifikasi spesifikasi alih-alih kode dan kemudian memodifikasi
atau struktur data yang sama. desain untuk mendapatkan implementasi baru dari spesifikasi yang
dimodifikasi. Sifat formal dari transformasi membuat modifikasi desain
Delokalisasi - Konsep tingkat tinggi tertentu dapat tersebar di
seluruh kode yang memperkenalkan detail yang mengganggu tersebut dapat didukung oleh alat semiotomatis yang meningkatkan
dalam konsep lain (lihat studi tentang efek delokalisasi pada keandalan dan mengurangi biaya pemeliharaan sistem.
pemahaman di [W.

3 Rekayasa Terbalik Jika semua


Berbagi Sumber Daya - Kode yang disisipkan sering
perangkat lunak yang ada telah dikembangkan menggunakan
memungkinkan konsep yang berbeda untuk berbagi beberapa
sistem transformasi yang merekam desain dan rasio rasionya, maka
sumber daya seperti misalnya kondisi kontrol, hasil data
tidak perlu merekayasa balik kode apa pun. Namun, kita harus
perantara, fungsi, nama, dan sumber daya komputasi lainnya.
membuat konsesi dengan kenyataan. Sejumlah besar perangkat
Data caching'Memoization - Jika Beberapa data, yang harus lunak yang dikembangkan secara konvensional ada dan sistem seperti
dihitung , sering dibutuhkan Atau komputasinya mahal , data itu akan terus dikembangkan untuk waktu yang lama.
tersebut layak untuk di - cache, yaitu untuk memo untuk
digunakan kembali nanti.
Sistem ini memiliki kesalahan dan permintaan terus-menerus untuk
Optimasi - Untuk mencapai kode yang sangat efisien (karena peningkatan fungsi dan persyaratan kinerjanya. Modifikasi adalah
kebutuhan untuk memuaskan misalnya memori atau kendala sebuah keniscayaan. Ini berarti bahwa ada kebutuhan mendasar
waktu reaksi) banyak optimasi yang berbeda digunakan. untuk memahaminya. Karena sepuluh dirancang dengan buruk dan
Optimalisasi tersebut terdiri dari - program melipat dan memiliki dokumentasi yang tidak lengkap, tidak ada, atau, lebih buruk
membuka (inlining) lagi, salah tanpa informasi desain, ini adalah tugas yang menantang.
kode,
- penggunaan sifat aljabar fungsi , - penggabungan Saat ini pendekatan utama untuk memahami terdiri dari mencoba
perhitungan dengan menyusun atau menggabungkan mengenali rencana (fragmen kode yang mengimplementasikan
fungsi, - evaluasi parsial (sering dalam bentuk konteks- konsep pemrograman) dari bawah ke atas dari program ke deskripsi
yang lebih abstrak (lih. [ 141). Pada dasarnya, ini dilakukan dengan
pencocokan pola pada representasi internal kode (misalnya pohon
penyederhanaan dependen), -
sintaksis abstrak) yang mengarah pada pendeteksian pola rencana
pembedaan hingga, - akumulasi
atau konsep tingkat yang lebih tinggi dalam kode tingkat yang lebih
hasil, - penyederhanaan dan rendah.
eliminasi rekursi, - fusi loop, Pendekatan ini memiliki kelemahan utama: Itu tergantung pada
pengembangan semua (atau setidaknya semua rencana penting) dalam

106
Machine Translated by Google

sikap yang mungkin terjadi pada kode yang ingin kita pahami. Sayangnya aturan jalinan* untuk memungkinkan pengenal rencana mendeteksi realisasi
rencana ini dapat (dan telah) direalisasikan dalam berbagai cara karena aktual yang dapat ditemukan dalam kode. Namun, untuk dapat memelihara
interaksi antara banyak keputusan desain yang mungkin (yaitu transformasi). sistem, kami tidak hanya tertarik pada rencana yang diwujudkan dalam
Bayangkan sebuah array logis dari struktur; itu dapat diimplementasikan kode tetapi juga pada desain dan alasannya yang dapat mengarah dari
sebagai array struktur atau struktur array. rencana ke realisasinya dalam kode yang sebenarnya. Dengan demikian,
rekayasa balik tidak hanya harus menyediakan pola rencana untuk realisasi
Kode untuk mengurutkan array akan terlihat sangat berbeda tergantung rencana yang sebenarnya, tetapi juga transformasi dan pembenaran untuk
dari pilihan implementasinya. Serangkaian rencana untuk penyortiran menerapkannya, yaitu ia harus merekayasa perangkat lunak dan mencapai
entah bagaimana harus memperhitungkan semua kemungkinan representasi solusi tertentu. yang telah digunakan dalam kode.
data yang berbeda.
Jadi, untuk mendeteksi rencana dalam kode lama, kita harus dapat
mendeteksi semua realisasi berbeda dari rencana yang sama. Sebagai pendekatan alternatif, kita dapat mencapai efek yang sama
Namun sayangnya kita membutuhkan pola yang berbeda untuk mendeteksi dengan menggunakan transformasi kecil ke belakang (formasi trans ini
realisasi yang berbeda ini; dan semua pola ini harus ada terlebih dahulu mungkin atau mungkin belum disediakan oleh mesin transformasi maju)
untuk dapat merekayasa balik kode, yang tidak mungkin karena banyaknya dan mengabstraksikan kode langkah demi langkah yang hasil akhirnya
realisasi yang dapat dibayangkan, semuanya memecahkan masalah yang adalah abstrak. rencana (atau satu set rencana) sesuai dengan kode yang
sama. diberikan. Pada dasarnya, transformasi diterapkan mundur "jitter" kode ke
Lebih buruk lagi, kita harus memperhitungkan bahwa rencana yang dalam bentuk di mana rencana kanonik lebih mudah ditemukan.
ingin kita kenali saling terkait, terdelokalisasi (lih. [SI), dan berbagi sumber
daya. Jadi kita harus menemukan pola rencana dalam kode yang terjalin Rencana abstrak semacam itu mungkin sudah ada dalam sistem atau
dengan pola rencana lain yang keduanya mungkin tersebar di seluruh kode mungkin pengetahuan domain baru yang dikembangkan selama proses
program. rekayasa balik. Dengan merekam langkah-langkah transformasi (terbalik)
Jadi, untuk melakukan tugas rekayasa balik secara efektif, kita harus yang digunakan untuk mencapai rencana itu, kami memperoleh desain
menggunakan beberapa kreativitas untuk mendeteksi dan memisahkan yang masuk akal yang dapat digunakan sebagai dasar formal untuk
konsep tingkat tinggi dalam kode; tugas yang secara umum tidak dapat memelihara sistem rekayasa balik dengan mempertahankan desain.
dilakukan terlebih dahulu dengan menyediakan sejumlah pola rencana Melakukannya akan menghindari kebutuhan untuk melakukan rekayasa
standar yang wajar bahkan bersama-sama dengan aturan pencocokan pola balik berulang kali pada sistem selama masa pakainya, yang disebabkan
yang begitu canggih. oleh modifikasi kode yang terus-menerus.
Masalah-masalah ini dapat diatasi dengan dua pendekatan yang Sebagai keuntungan sampingan , pendekatan rekayasa balik
berbeda. Yang pertama adalah mengizinkan seorang reverse engineer transformasional memungkinkan kita memperoleh pengetahuan domain
serta menangkap kemungkinan desain . Tidak perlu mendefinisikan
untuk menambahkan rencana lebih lanjut, mewujudkan pola, dan mungkin lebih jauh

Eunction ReverseEngineer(Code,SetOfTransforms) mengembalikan DesignHistory


mulai
// Tegaskan: Transformasi berbentuk LHS => RHS
DesignHistory:=kosong; // belum ada informasi desain
Program Abstrak:=Kode; // keadaan awal ulangi

{ // Komponen pengenalan rencana:


MatchingTransformations:=MatchRightHandSides(SetOfTransforms,~stractCode);
Tampilan (Transformasi Pencocokan); 1;

{ // Pengetahuan yang hilang disisipkan di sini:


ChosenTransform:=InteractivelyChoose(MatchingTransformations); jika
ChosenTransform=DONE lalu kembalikan DesignHistory;

lain jika ChosenTransform=NONE maka


{ ChosenTransform:=NewlyDefinedTransform();
SetOfTranforms:=union(SetOfTransforms,ChosenTransfo~); 1;

AbstractCode:=ApplyTransformInverse(ChosenTransform,AbstractCode);
DesignHistory:=tambahkan(DesignHistory,ChosenTransform); 1; akhir ; akhir ;

Gambar 1: Model Sederhana Transformasi Rekayasa Terbalik

*Perhatikan bahwa aturan jalinan pada dasarnya adalah transformasi maju. Transformasi ini harus diterapkan pada pola yang ada untuk mendapatkan pola
baru yang saling terkait.

107
Machine Translated by Google

pengetahuan domain terlebih dahulu. Sampel termasuk konsep baru manual ke contoh nyata. Tujuan kami di sini bukan untuk secara khusus
yang diidentifikasi oleh reverse engineer bersama dengan implementasi melaksanakan tugas ini, atau untuk menyediakan algoritme yang tepat ,
seperti yang ditemukan dalam kode. Informasi ini juga dapat digunakan melainkan untuk menyoroti berbagai keputusan dan bagaimana
untuk mengembangkan dan memelihara sistem lain; yaitu kita mendapatkan menanganinya secara transformasional. Secara khusus, kami ingin
tambahan pengetahuan yang dapat digunakan oleh seorang forward engine menegaskan bahwa pengenalan rencana tidak dapat menangani tugas
turun. ini, dan transformasi terbalik dapat. Kami tidak mengklaim bahwa proses
Sementara kami berpendapat bahwa rekayasa balik transformasional ini otomatis. Kami berasumsi bahwa reverse engineer memiliki
harus jauh lebih efektif daripada pengenalan rencana murni, meskipun pengetahuan domain masalah informal yang cukup besar, dan secara
pengenalan rencana memiliki tempatnya. Pertama, teknologi pencocokan bertahap memberikan panduan ke alat yang mencatat transformasi yang
pola yang sama yang menjadi dasar pengenalan rencana digunakan oleh digunakan untuk pemeriksaan dan pemeliharaan selanjutnya.
setiap komponen penulisan ulang sistem transformasi (lihat gambar 1).
Kedua, rencana mungkin dapat " menggabungkan" bagian penting dari Contohnya adalah kode tangan, kode assembler Mo torola 6809
sistem yang ada, memberikan petunjuk kuat tentang beberapa aspek warisan yang sangat disetel dari sistem operasi tahun 1980-an yang
kode . Petunjuk-petunjuk ini dapat digunakan sebagai petunjuk-petunjuk ditulis oleh salah satu penulis. Kami akan membalikkan mesin dari
untuk memandu penerapan kebalikan dari transformasi. Sebagai contoh, sumber perakitan kembali ke abstraksi yang diwakili kode. Pengetahuan
menemukan perhitungan yang memetakan string ke bilangan asli adalah domain yang digunakan oleh insinyur terkait dengan kode sistem operasi,
petunjuk bahwa hashing sedang terjadi, dan transformasi terkait tabel khususnya untuk semaphore. Sedikit informasi ini memberikan fokus
hash harus dicoba. yang cukup besar pada proses.

Membandingkan rekayasa balik transformasional dengan rekayasa Tujuan dari kode ini adalah untuk melepaskan sumber semaphore
maju transformasional, kami melihat bahwa keduanya membutuhkan untuk memungkinkan menunggu lain, tugas prioritas mungkin lebih tinggi
pengetahuan domain dan mesin transformasi semi-otomatis yang dipandu untuk akhirnya memperoleh semaphore dan melanjutkan.
oleh beberapa kriteria tambahan untuk mengurangi upaya yang diperlukan Memiliki beberapa pengetahuan domain tentang
untuk mengembangkan produk, yaitu desain sistem. sinkronisasi tugas (termasuk setidaknya sinkronisasi
dengan semaphore) dan tidak tertarik pada bagaimana
Dengan demikian, kita dapat dengan jelas tugas prioritas tertinggi membuat prosesor berjalan, kami
menyimpulkan bahwa: Reverse engineering membutuhkan berharap untuk melihat sesuatu seperti kode abstrak
pengetahuan dan infrastruktur yang sama dengan forward engineering. berikut: procedure RT-UnLock(x: ptr to Semaphore)
Rekayasa terbalik 'hanya' menerapkan transformasi maju mundur, yaitu mulai // buka semaphore yang ditentukan
secara terbalik. V(X) ; // melepaskan pengembalian unit sumber
daya ; // kembali ke akhir pemanggil asli ;
4 Rekayasa Terbalik Warisan Saya
Saya

Contoh: Semaphore Fragmen kode aktual yang ingin kami rekayasa balik disediakan di
Pada bagian ini kami menunjukkan bahwa rekayasa balik bawah ini. (Pembaca tidak perlu memeriksa iccare sepenuhnya, karena
transformasional layak dalam praktik dengan menerapkannya kami akan mengabstraksikannya segera di halaman berikutnya). Kita

RT: Buka Kunci ; membuka blok kode yang semaphore-nya di (X) intds ; mengunci dunia
sejenak inc scb:count,x ; adaresource
yang mengantri ? ; b/ stx
bgt RT:ITSX tidak, selesai
itempx merilispointer
; simpan
ke semaphore ldx scb:tcbq,x ; pointer ke TCB untuk mengaktifkan ldd
stx itemd ; simpan pointer ke tcb:nexttcb,x
TCB untuk mengaktifkan
; temukan penunjuk
ldx itempx
ke ;TCB
pointer
setelah
ke
semaphore std scb:tcbq,x ; hapus
ke TCBtugas dari
untuk antrian
siap SCB ldx itemd ; pointer
dijalankan

RT:ITSC ; masukkan tugas di (X) ke dalam antrian siap dan alihkan konteks jika diperlukan ; Tegaskan: interupsi
dinonaktifkan di sini jsr RT:ITIQ ; masukkan tugas ke dalam antrian siap ldx RT:TCBQ ; apakah kita masih tugas
prioritas tertinggi ? cmpx RT:CTCB
#RT:ISCH
; ... ?; tidak,
beq RT:ITSX
alihkan tugas
; b/ ya,paksa
berikan
jmpkontrol
RT:Sintke; pemanggil
dengan interupsi
ldx ke
penjadwal tugas RT: ITSX inten ; aktifkan interupsi dan kembali ke pemanggil

rts
Gambar 2: Fragmen Kode Assembler Motorola 6809 Legacy

108
Machine Translated by Google

smart reverse engineer menentukan itu adalah kode yang dia Transformasi ini khusus untuk M6809 . Jelas, transformasi ini
minati dengan mendekode label perakitan, dan melakukan adalah aturan pencocokan pola sederhana yang dapat diterapkan
beberapa analisis aliran kontrol. ke kode assembler yang ada secara sederhana dan otomatis.
Komentar kode di sini asli. (Komentar dalam kode yang diubah Sejarah desain harus menangkap aplikasi dari semua ini; itu dapat
secara informal berasal dari ini. menangkap mereka sebagai satu set daripada urutan linier karena
Kami tidak benar-benar mengharapkan sistem transformasi untuk melakukan ini.)
tidak ada persyaratan urutan nyata.
Sebelum melihat kode RTL yang dihasilkan untuk contoh kita,
Kode ini berisi beberapa keputusan desain yang beberapa di mari kita perkenalkan empat transformasi pengoptimalan sederhana
antaranya kami pertimbangkan secara lebih rinci di bawah ini. (yang merupakan transformasi ekivalensi dan, dengan demikian,
Untuk kode ini, penting untuk mengetahui bahwa melepaskan dapat digunakan di kedua arah untuk tujuan kita): [penghapusan
sumber semaphore disisipkan dengan penjadwalan prioritas; untuk
subekspresi umum] kode ( ekspresi) + variabel :=ekspresi;
alasan efisiensi tugas saat ini "secara sukarela" menyerahkan
code(variab1e) di mana variabel adalah variabel baru yang
prosesor asalkan itu bukan lagi tugas prioritas tertinggi. Jadi, agar
tidak muncul di tempat lain dalam kode program dan tidak
dapat merekayasa balik kode ini, kita harus memiliki (atau
ada penetapan ke variabel yang muncul dalam ekspresi di dalam
mengembangkan) beberapa pengetahuan tentang penjadwalan
kode [daftar penggantian nama seumur hidup]
prioritas (masalah yang melampaui cakupan makalah ini).
Karena jarak antara kode assembler dan kode program
prosedural yang ingin kami abstraksi cukup besar, kami melakukan variabel baru: =expressionl; kode
langkah mundur pertama menggunakan domain perantara yang (variabel baru e) ; variabel:
terkadang digunakan oleh kompiler untuk menerjemahkan dari =ekspresi2; + vari ab1 e : = ekspresi
kode prosedural tingkat yang lebih tinggi ke assembler: register on1 ; kode ( vari ab1 e) ; variabel:
transfer bahasa (RTL) . Untuk melakukan itu, kita dapat =ekspresi2; di mana variabel
menerapkan Transformset langsung berikut dari transformasi baru adalah variabel baru yang
pemurnian mundur:
tidak muncul di tempat lain dalam program [penghapusan tugas
panggilan subrutin; + subrutin jsr + target jmp target goto ; + mati]
rts kembali; + jmp
goto x+offset; + ldx #variabel x:=alamat(variabel) offset,^
; + variabel
ldx x: =variabel;
variabel stx: =x; + ldx offset,^ x: =x->offset; + variabel
+ ldd offset,^ d: variabel:=ekspresi; + jika variabel tidak DAN

=x->offset;
(x->offset) :=d; int-enable:=true; + inten + std offset,^
int-enable:=false; digunakan lagi dalam eksekusi kode sebelum nilai diberikan
+intds (x->offset) : =x-
>offset+l; + inc offset,x cc:=bandingkan(x->offset,O) ; cc : padanya di lain waktu [bandingkan pengenalan] (ekspresi1 relasi
e) ; =+ variabel cmpx jika cc=O lalu=bandingkan (x vari
ke label fi; +beq ab1if
label
ekspresi2)
label jbgt cc>O lalu goto label fi;

+ bandingkan ( ekspresil , ekspresi2) relasi 0

Transformasi ini berguna untuk sebagian besar tugas rekayasa


balik perakitan. Kami menyatakan bahwa model sederhana
pencocokan pola struktural yang digunakan oleh sebagian besar
mesin pengenalan rencana tidak bekerja untuk ini; analisis aliran
, data diperlukan.
Menerapkan transformasi pemurnian dan pengoptimalan
mundur dapat membawa kita ke kode RTL berikut:

RT-UnLock: // membuka blok kode yang semaphore-nya ada di register X // mengunci dunia sebentar //
int-enable:=false; (x->scb- melepaskan unit sumber daya
count) :=(x->scb-count)+l; if (x->scb-count>O) lalu ke
RT-ITSX fi; tugas siap:=(x->scb-tcbq); // arahkan ke TCB untuk
mengaktifkan (x-zscb-tcbq):=ready-task->tcb:nexttcb; // hapustugas dari antrian SCB // tunjuk ke TCB untuk
membuat siap dijalankan x:=ready-task;

RT-ITSC: // masukkan tugas X ke dalam antrian dan alihkan konteks jika diperlukan // masukkan tugas ke
TCBQ=RT-CTCB) lalu ke RT-ITSX fi; x:=alamat(RT-ISCH); gotodalam RT-SInt;
antrian siap panggil RT-ITIQ; jika (RT-

// masih prioritas tertinggi? // tidak, paksa


sakelar tugas // dengan interupsi ke
penjadwal // aktifkan interupsi // kembali ke
RT-ITSX: int-enable:=true; kembali; pemanggil

Gambar 3: Kode Legacy Assembler Ditransformasikan ke Register Transfer Language (RTL)

109
Machine Translated by Google

Untuk dapat merekayasa balik lebih lanjut, kami menggunakan register X. Untuk dapat merekayasa balik ke prosedur
pengetahuan domain kami untuk mendeteksi beberapa pengoptimalan parametrik, kita harus mendeteksi fakta ini. Kemudian kita bisa
yang tidak jelas yang telah digunakan selama pengembangan kode: mengganti label: code re turn; dengan label prosedur (x)
0 Pernyataan goto RT-SInt; sebenarnya tidak menunjukkan memulai pengembalian kode ; akhir; asalkan tidak ada
kelanjutan dari RT-ITSC tetapi merupakan panggilan yang pernyataan goto di seluruh kode program yang masuk atau
dioptimalkan dari subrutin dengan putaran kembali berikut ;. keluar dari tubuh prosedur, yaitu kode. Ini termasuk pernyataan-
Jadi itu harus diganti dengan pernyataan panggilan RT-SInt; goto untuk diberi label. Sejalan dengan itu, untuk prosedur ini
kembali;. kami mengganti call la bel ; di sisi pemanggil dengan label
0 RT-ITSC sendiri adalah subrutin yang kebetulan terletak di akhir panggilan (x) ;.
RT-UnLock tetapi dapat dipanggil dari tempat lain dalam kode
program (yang tidak ditampilkan dalam fragmen program ini). Selain itu menggunakan transformasi ekivalensi yang jelas
Artinya kita harus mengganti aliran kontrol dari RT-UnLock ke [if-then-else with procedure return] if condition then codel;
RT-ITSC, yang disebabkan oleh penambahan pencacah kembali; fi;
program di prosesor, dengan panggilan ke RT-ITSC sebagai
subrutin diikuti dengan pengembalian:. kode2; kembali; +
jika kondisi maka
0 RT-ITSX merupakan kelanjutan untuk RT-UnLock dan RT-ITSC kodel;
dalam kondisi tertentu. Ini adalah subrutin terless parame kalau tidak
untuknya sendiri. Jadi melompat ke sana ( menggunakan goto kode2;
RT- ITSX ;) harus diganti dengan panggilan RT-ITSX; kembali;. fi;
Demi kesederhanaan, kami mengurutkan kode sederhana dari kembali;
prosedur ini ke dalam pemanggil. jika tidak ada pernyataan goto yang masuk atau keluar codel
Ada konvensi tersembunyi dalam kode untuk parameter ke I atau code2
prosedur RT-UnLock dan RT-ITSC (dan RT-SInt) yang dan beberapa transformasi pengoptimalan yang diberikan di atas kita
ditempatkan di mendapatkan kode program berikut:

jrocedure RT-Buka Kunci(x)


mulai // buka blok kode yang semaphore- nya ada di register X int-enable:=false; // mengunci
dunia sejenak (x->scb-count) := (x->scb-count)+l; // lepaskan unit
count>O)
sumbermaka
daya //jika
tidak
(x->scb-
ada tugas menunggu int-
enable:=true; // aktifkan interupsi else // tugas menunggu ready-task:=(x->scb-tcbq);
mengaktifkan (x->scb-tcbq):=ready_task-
// arahkan ke TCB untuk
>tcb:nexttcb:exttcb; // hapus tugas dari antrian panggilan SCE RT-ITSC(ready-task); fi; kembali; akhir ;

prosedur RT-ITSC(x)
mulai // masukkan tugas X ke dalam antrian dan alihkan konteks jika diperlukan
panggil RT-ITIQ (x) if // masukkan tugas ke dalam antrian siap // kita
(RT-TCBQ=RT-CTCB) lalu int- masih tugas dengan prioritas tertinggi // aktifkan
enable:=true; kalau tidak interupsi // tugas lain adalah prioritas tertinggi // paksa
alihkan tugas dengan panggilan penjadwal
panggil RT-SInt(alamat(RT-ISCH)); fi; kembali;
akhir ;

Gambar 4: Kode Bahasa Transfer Register yang Tidak Dioptimalkan

Sekarang mari kita coba untuk mendapatkan wawasan yang lebih ority tusk dapat berada di akhir antrian . Penunjuk ke seluruh antrian
dalam tentang prosedur RT-ITSC. Untuk melakukan itu kita harus identik dengan penunjuk ke gading pertama dalam antrian.
mengetahui sesuatu tentang organisasi antrian siap (yang tidak mungkin
hanya dengan melihat fragmen program yang dapat kita tangani dalam
Melihat ke prosedur RT-ITSC kita melihat pemeriksaan apakah
makalah ini):
tugas RT-CTCB saat ini sama dengan tugas prioritas tertinggi di kepala
Gading dalam antrian siap dipesan dengan memperhatikan antrian siap RT-TCBQ. Jadi, penjadwal tugas (yang mengubah konteks
prioritasnya, yaitu gading dengan prioritas tertinggi berada di awal program untuk menjalankan tugas dengan prioritas tertinggi) adalah
antrian sedangkan gading dengan prioritas terendah berada di awal antrian.

110
Machine Translated by Google

dipanggil jika dan hanya jika tugas dengan prioritas tertinggi bukan tugas kode tetapi dalam mendapatkan deskripsi abstrak dari prosedur, yaitu kita
saat ini (yang disebut prosedur). Ini berarti bahwa solusi mencerminkan tidak harus menghindari panggilan ke uler terjadwal untuk alasan efisiensi.
fakta bahwa pengalihan konteks ke tugas lain itu mahal dan oleh karena itu Dengan tambahan pengetahuan tentang int-enable=true setelah memanggil
harus dihindari jika tugas lain hanya yang sekarang. Namun, kami tidak RT-SInt, kita dapat menyederhanakan RT-ITSC menjadi:
tertarik untuk mendapatkan program yang sangat efisien

prosedur RT-ITSC(x)
mulai // masukkan tugas X ke dalam antrian dan alihkan konteks jika diperlukan
panggil RT-ITIQ (x) // masukkan tugas ke dalam antrian siap
panggil RT-SInt(alamat(RT-ISCH)); // paksa sakelar tugas dengan panggilan penjadwal // tugas
saat ini mungkin mendapatkan prosesor
kembali;
akhir ;

Gambar 5: Kode Pengalihan Tugas yang Tidak Dioptimalkan untuk RT-ITSC

Inlining prosedur RT-ITSC ke RT-Unloc k kemudian memungkinkan kita Melakukan beberapa transformasi ekuivalensi lebih lanjut pada pernyataan
untuk memindahkan pernyataan int-enable : =true; dari dalam pernyataan if dan kondisinya, kita memperoleh kode berikut:
if hingga akhir prosedur.$

procedure RT-UnLock(x) begin //


buka blok kode yang semaphorenya ada di register X int-enable:=false; (x->scb-count) :=(x->scb-
count)+l; jika (x->scb-count<=O) maka // mengunci dunia sejenak // melepaskan unit
sumber daya // tugas menunggu ready-task:=(x-
>scb-tcbq); // arahkan ke TCB untuk
mengaktifkan (x->scb-tcbq):=ready-task->tcb:nexttcb; // hapus tugas RT-SInt(address(RTL1SCH)
(x) panggil dari antrian SCB panggil RT-ITIQ
); fi;
int-enable:=true; kembali; akhir;
// masukkan tugas ke dalam antrian siap //
paksa alihkan tugas dengan panggilan penjadwal

// aktifkan interupsi

Gambar 6: Kode Sederhana untuk RT-UnLock

Karena kurangnya ruang dalam makalah ini, kami tidak dapat menyajikan jenis yang digunakan, yaitu "semaphore" dan "tugas' bersama dengan
detail rekayasa balik lebih lanjut dari kode ini. prosedur terkait. Melakukan itu akhirnya dapat membawa kita ke kode
Namun, langkah selanjutnya harus memulihkan data abstrak berikut:

prosedur RT-UnLock(x: ptr ke semaphore) mulai // membuka


semaphore yang ditentukan
int-enable:=false; panggil // mengunci dunia sejenak // melepaskan unit
Semaphore.Release(x); // menunggu sumber daya
Task.InsertIntoReadyQueue(Semaphore.Remove(x))
tugas if (Semaphore.Desired(x))
// masukkan tugas ke
laludalam
panggil
antrian siap panggil
Task.ContinueHighestPriorityTask0; fi; int-enable:=true; kembali; akhir ;
// lanjutkan tugas dengan prioritas tertinggi

// aktifkan interupsi

Gambar 7: Kode untuk RT-UnLock dengan Tipe Data yang Dipulihkan

Mengabstraksi ini dalam domain sinkronisasi tugas kemudian akan kode asli. Kami mencatat bahwa mengganti transformasi yang
membawa kita ke kode abstrak yang diharapkan yang telah disajikan di menyatukan kode penjadwalan prioritas dengan kode spin lock akan
awal bagian ini. memungkinkan kami untuk membuat ulang Prosedur buka kunci

Merekam semua transformasi yang digunakan dalam proses ini semaphore yang direvisi untuk beberapa Prosesor. Ini Tepatnya _
memungkinkan kita untuk menerapkannya kembali ke kode ini untuk mereproduksi

t Penyelarasan ini tidak berarti bahwa prosedur RT-ITSC menjadi usang. Prosedur mungkin (dipanggil) dari tempat tambahan dalam sistem operasi.
tPerhatikan, bahwa int-enable=true valid setelah memanggil RT-SInt yang berarti kita dapat menambahkan pernyataan int-enable : =true; secara
langsung
mengikuti panggilan tanpa mengubah arti kode program.

113
Machine Translated by Google

jenis tugas pemeliharaan yang kami inginkan untuk mencocokkan rencana dengan kode. Kedua jenis matcher ini dapat
mendukung rekayasa balik. digunakan untuk efek yang baik dalam sistem transformasi. Namun, kami
Sekarang mari kita segera mempertimbangkan masalah besar yang berharap untuk menghindari masalah “big-bang” dalam menjelaskan
mungkin muncul ketika mencoba merekayasa balik kode menggunakan seluruh program sekaligus dengan melakukan pemulihan tambahan,
pola rencana dan melihat secara khusus pada penjadwalan prioritas. menyimpan hasil sesi sebelumnya dalam sejarah desain, dan menggunakan
Mari kita asumsikan bahwa ada beberapa pengetahuan domain dan kembali desain untuk pemeliharaan. The Maintainer's Assistant (MA) (lihat
pola rencana terkait tentang penjadwalan prioritas. Pada tingkat abstrak, [ 181) menyerang masalah pemeliharaan perangkat lunak dengan
kita mungkin menemukan, misalnya, rencana prosedural berikut untuk menggunakan metode transformasional, menggunakan representasi inti
menambahkan tugas tambahan ke dalam antrian siap dan (menjadwal untuk program yang diturunkan dari kalkulus lambda. Ini memberikan
ulang tugas: dasar yang sangat baik dengan semantik yang jelas, sehingga
Task.InsertIntoReadyQueue(tugas,prioritas); memungkinkan transformasi serius untuk diterapkan pada kode asli. MA
Task.RunHighestPriorityTask(); tampaknya digunakan untuk porting dan terjemahan daripada penjelasan
Namun, dalam kode assembler kami menemukan sesuatu yang kira- dan modifikasi.
kira sesuai dengan rencana yang disempurnakan berikut (yang menuntut
penggunaan kelas implementasi tertentu untuk antrian prioritas):
6 Catatan Penutup Alasan untuk

Task.InsertIntoReadyQueue(tugas,prioritas); jika Tugas.Saat ini0 melakukan reverse engineering adalah untuk mempertahankan kode
warisan. Oleh karena itu, seharusnya tidak difokuskan pada pemahaman
= Task.FirstTaskInReadyQueue0 lalu program tetapi pada pemeliharaan sistem sebagai gantinya. Ini harus
Tugas.LanjutkanCurrent0; else dilakukan dengan cara yang membebaskan kita dari rekayasa balik sistem
Task.ContinueHighestPriorityTask0; fi; berulang kali karena modifikasi yang dilakukan pada kodenya dari waktu
ke waktu.
Oleh karena itu, reverse engineering harus difokuskan pada pemulihan
Siapa yang menghasilkan rencana yang disempurnakan ini? Bisakah desain. Karena kita membutuhkan dukungan alat yang canggih untuk
kita mengharapkannya menjadi bagian dari domain yang ada tentang melakukan pemeliharaan sistem secara efisien, desain yang dipulihkan
penjadwalan prioritas? Penyempurnaan tambahan mana dari rencana harus didasarkan pada metode formal.
awal yang kami perlukan untuk mencakup solusi yang digunakan dalam Kita telah melihat bahwa rekayasa balik transformasional adalah
kode lama lainnya untuk penjadwalan prioritas? pendekatan yang layak untuk memulihkan desain seperti itu. Ini berarti
Jawaban atas pertanyaan-pertanyaan ini adalah: Tidak ada yang bahwa kita pada dasarnya membutuhkan pengetahuan dan infrastruktur
dapat memberikan sebelumnya semua kemungkinan penyempurnaan domain yang sama seperti yang kita butuhkan untuk rekayasa ke depan
rencana yang dapat ditemukan dalam kode lama. Ini berarti bahwa kita transformasional yang dapat memberi kita desain selama konstruksi
membutuhkan generator penyempurnaan rencana kreatif, yaitu mesin sistem. Semua domain, notasinya, dan transformasi terkait dalam setiap
transformasi maju semi-otomatis. Tapi kemudian, mengapa kita tidak domain serta antara domain yang diperlukan untuk rekayasa maju juga
membuat penyempurnaan rencana ke belakang (sesuai permintaan) diperlukan untuk merekayasa balik kode warisan untuk menutupi desain
dengan merekayasa balik kode menggunakan transformasi maju ke arah yang hilang.
sebaliknya?

5 Pekerjaan Terkait Upaya Rekayasa balik transformasional dapat dengan mudah dibentuk
yang cukup besar telah diinvestasikan dalam pengenalan rencana. secara bertahap yang memungkinkan kita untuk merekayasa balik hanya
Programmer's Apprentice (lihat [ 141) masih merupakan salah satu yang bagian-bagian kode yang diperlukan untuk tugas pemeliharaan yang
paling canggih, mewakili rencana ("klise") menggunakan data dan aliran sebenarnya. Seiring waktu semakin banyak bagian dari kode yang akan
diabstraksikan dan level abstraksi akan semakin tinggi dan mungkin
kontrol. Representasi ini memberikan beberapa kemandirian bahasa dan
memaksimalkan kemampuan untuk mencocokkan klise dengan kode yang semakin tinggi sampai kita mendapatkan spesifikasi persyaratan abstrak
dipesan secara arbitrer. PA pada dasarnya mencoba untuk menyusun dari keseluruhan sistem.
(dengan tumpang tindih) program secara rekursif dengan klise untuk Semua ini dapat didukung secara efektif oleh mesin transformasi
menjelaskannya. Kami berharap contoh kami secara meyakinkan berbasis domain yang dapat menerapkan transformasi untuk wards dan
menunjukkan bahwa ubin rekursif tidak dapat menjelaskan bahkan fragmen backwards dan dapat memodifikasi penghitungan penambahan desain.
kode yang kecil. Sistem seperti itu, yang disebut Sistem Pemeliharaan Desain (DMS), yang
Masalah yang sulit dengan sekumpulan besar rencana adalah biaya ditujukan untuk menangani perangkat lunak ukuran komersial, saat ini
untuk mencocokkannya dengan program yang berpotensi sangat besar. sedang dikembangkan di Semantic Designs. Kami berharap dapat
Pencocokan grafik yang efisien (lihat misalnya [15]) dan pemecah melaporkan pengalaman nyata tahun depan.
kepuasan kendala (lihat misalnya [ 191) telah diimplementasikan untuk membantu

112
Machine Translated by Google

Referensi [ 1 11 HA Partsch. Spesifikasi dan Transformasi Program :


[ 11 ID Baxter. Pemeliharaan Transformasional dengan Penggunaan Pendekatan Formal untuk Pengembangan Perangkat Lunak.
Kembali Sejarah Desain. Tesis PhD, University of California di Springer, 1990.
Irvine, 1990. [12] S. Rugaber, K. Stirewalt, dan L. Wills. Masalah Interleaving dalam
[2] ID Baxter. Desain Sistem Pemeliharaan. Komunikasi ACM Pemahaman Program. Dalam: Working Conference on Reverse
35(4):73-89, 1992. Engineering, hlm. 166175, 1995.
[3] ID Baxter. Desain (Bukan Kode!) Pemeliharaan. Dalam: Lokakarya [ 131 S. Rugaber. Buku Putih tentang Rekayasa Terbalik. Georgia
ICSE-17 tentang Transformasi Program untuk Evolusi Perangkat Institut Teknologi, 1994.
Lunak, 1995. [ 141 C. Rich dan L. Wills. Murid Programmer. ACM Pers, 1990.

[4] VR Basili dan HD Mills. Memahami dan Mendokumentasikan


[15] C. Rich dan L. Wills. Mengenali Desain Program: Pendekatan
Program. Transaksi IEEE pada Rekayasa Perangkat Lunak
Parsing Grafik. Perangkat Lunak IEEE 7( 1):82-89, 1990.
8(3):270-283, 1982.
[5] B. Boehm. Ekonomi Rekayasa Perangkat Lunak. Prentice Hall,
[ 161 T. Tamai dan Y. Torimitsu. Seumur Hidup Perangkat Lunak dan
1981.
Proses Evolusinya dari Generasi ke Generasi. Prosiding Konferensi
[6] T. Guimaraes. Mengelola Belanja Penyewaan Utama Program 1992 tentang Pemeliharaan Perangkat Lunak, November 1992,
Aplikasi. Komunikasi ACM 26(10):739-746, 1983.
IEEE Computer Society Press.
[ 171 P. Tonella, R. Fiutem, G. Antoniol, dan E. Merlo. Meningkatkan
[7] V. Kozaczynski, JQ Ning, dan A. Engberts. Pengenalan dan Pemulihan Arsitektur Berbasis Pola dengan Analisis Aliran: Mosaik
Transformasi Konsep Program . Transaksi IEEE pada Rekayasa - Studi Kasus. Dalam: Working Conference on Reverse Engineering,
Perangkat Lunak 18( 12): 1065-1075, 1992. hlm. 198-207, 1996.
[8] S. Letovsky dan E. Soloway. Rencana Terdelokalisasi dan [ 181 MP Ward dan KH Bennett. Metode Formal untuk Sistem Warisan.
Pemahaman Program. Perangkat Lunak IEEE 3(3):41-49, 1986. Jurnal Pemeliharaan Perangkat Lunak: Penelitian dan Praktik,
[9] RD McCartney. Sintesis Algoritma dengan Kendala Kinerja Ph.D. 7(3):203-220, 1995.
tesis, Brown University, 1987. [19] S. Woods dan A. Quilici. Beberapa Eksperimen Untuk Memahami
[ 101 JM Tetangga. Pendekatan Draco untuk Membangun Bagaimana Skala Algoritma Pengenalan Rencana Program.
Perangkat Lunak dari Komponen. Transaksi IEEE pada Dalam: Working Conference on Reverse Engineering, hlm. 21-30,
Rekayasa Perangkat Lunak 10(5):564-574, 1984. 1996.

113

Anda mungkin juga menyukai