Mungkin
Pada artikel yang bersifat ikhtisar ini, kami akan mencoba melihat beberapa dasar-dasar arsitektur Eclipse sebagai platform untuk membangun alat pengembangan terintegrasi dan memberikan gambaran awal tentang komponen Eclipse yang menjadi fondasi teknologi tersebut. platform untuk "Konfigurator baru" 1C: Perusahaan.
Pengantar Arsitektur Eclipse
Pertama mari kita lihat beberapa aspek umum arsitektur Eclipse menggunakan sebuah contoh
Pertama-tama, perlu dicatat bahwa Eclipse dicirikan oleh lapisan arsitektur yang cukup jelas, dengan pemisahan fungsionalitas yang tidak bergantung pada bahasa dari fungsionalitas yang dirancang untuk mendukung bahasa pemrograman tertentu, dan pemisahan komponen "inti" yang tidak bergantung pada UI dari komponen yang terkait. dengan antarmuka pengguna yang mendukung.
Dengan demikian, Platform Eclipse mendefinisikan infrastruktur umum yang tidak bergantung pada bahasa, dan alat pengembangan Java menambahkan IDE Java berfitur lengkap ke Eclipse. Baik Platform Eclipse maupun JDT terdiri dari beberapa komponen, yang masing-masing merupakan bagian dari “inti” atau lapisan UI yang tidak bergantung pada UI (Gambar 1).
Beras. 1. Platform Eclipse dan JDT
Mari kita daftar komponen utama Platform Eclipse:
- Runtime — Mendefinisikan infrastruktur plugin. Eclipse dicirikan oleh arsitektur modular. Pada dasarnya, Eclipse adalah kumpulan "titik ekstensi" dan "ekstensi".
- ruang kerja — Mengelola satu atau lebih proyek. Sebuah proyek terdiri dari folder dan file yang dipetakan langsung ke sistem file.
- Perangkat Widget Standar (SWT) - Menyediakan elemen antarmuka pengguna dasar yang terintegrasi dengan sistem operasi.
- wajah J — Menyediakan sejumlah kerangka UI yang dibangun di atas SWT.
- Workbench — Mendefinisikan paradigma Eclipse UI: editor, pandangan, perspektif.
Harus dikatakan bahwa Platform Eclipse juga menyediakan banyak komponen berguna lainnya untuk membangun alat pengembangan terintegrasi, termasuk Debug, Bandingkan, Pencarian, dan Tim. Perhatian khusus harus diberikan pada Teks JFace - dasar untuk membangun "editor cerdas" kode sumber. Sayangnya, pemeriksaan sekilas terhadap komponen-komponen ini, serta komponen lapisan UI, tidak mungkin dilakukan dalam cakupan artikel ini, jadi di sisa bagian ini kami akan membatasi diri pada ikhtisar komponen “inti” utama dari Platform Eclipse dan JDT.
Waktu Proses Inti
Infrastruktur plugin Eclipse didasarkan pada
Ruang Kerja Inti
Hampir semua lingkungan pengembangan terintegrasi yang dibangun di atas Platform Eclipse berfungsi dengan ruang kerja Eclipse. Ini adalah ruang kerja yang biasanya berisi kode sumber aplikasi yang dikembangkan di IDE. Ruang kerja dipetakan langsung ke sistem file dan terdiri dari proyek, yang berisi folder dan file. Proyek, folder, dan file ini disebut sumber daya ruang kerja. Implementasi ruang kerja di Eclipse berfungsi sebagai cache sehubungan dengan sistem file, yang memungkinkan untuk mempercepat traversal pohon sumber daya secara signifikan. Selain itu, ruang kerja menyediakan sejumlah layanan tambahan, antara lain
Komponen Sumber Daya Inti (plugin org.eclipse.core.resources) bertanggung jawab untuk mendukung ruang kerja dan sumber dayanya. Secara khusus, komponen ini menyediakan akses terprogram ke ruang kerja dalam bentuk model sumber daya. Untuk bekerja secara efektif dengan model ini, klien memerlukan cara sederhana untuk menyajikan tautan ke sumber daya. Dalam hal ini, sebaiknya sembunyikan objek yang secara langsung menyimpan status sumber daya dalam model dari akses klien. Jika tidak, dalam kasus, misalnya, menghapus file, klien dapat terus menahan objek yang tidak lagi ada dalam model, dengan masalah yang timbul. Eclipse memecahkan masalah ini menggunakan sesuatu yang disebut menangani sumber. Handle bertindak sebagai kunci (hanya mengetahui jalur ke sumber daya di ruang kerja) dan sepenuhnya mengontrol akses ke objek model internal, yang secara langsung menyimpan informasi tentang status sumber daya. Desain ini merupakan variasi pola
Beras. Gambar 2 mengilustrasikan idiom Handle/Body sebagaimana diterapkan pada model sumber daya. Antarmuka IResource mewakili pegangan sumber daya dan merupakan API, tidak seperti kelas Resource, yang mengimplementasikan antarmuka ini, dan kelas ResourceInfo, yang mewakili isi, yang bukan API. Kami menekankan bahwa pegangan hanya mengetahui jalur ke sumber daya relatif terhadap akar ruang kerja dan tidak berisi tautan ke info sumber daya. Objek info sumber daya membentuk apa yang disebut “pohon elemen”. Struktur data ini sepenuhnya terwujud dalam memori. Untuk menemukan instance info sumber daya yang sesuai dengan suatu pegangan, pohon elemen dilintasi sesuai dengan jalur yang disimpan dalam pegangan itu.
Beras. 2. iResource dan ResourceInfo
Seperti yang akan kita lihat nanti, desain dasar model sumber daya (kita mungkin menyebutnya berbasis pegangan) juga digunakan di Eclipse untuk model lain. Untuk saat ini, mari kita daftar beberapa ciri khas dari desain ini:
- Pegangan adalah objek nilai. Objek nilai adalah objek abadi yang kesetaraannya tidak didasarkan pada identitas. Objek tersebut dapat digunakan dengan aman sebagai kunci dalam wadah hash. Beberapa contoh pegangan dapat mereferensikan sumber daya yang sama. Untuk membandingkannya, Anda perlu menggunakan metode sama dengan(Objek).
- Handle mendefinisikan perilaku sumber daya, namun tidak berisi informasi tentang status sumber daya (satu-satunya data yang disimpannya adalah "kunci", jalur ke sumber daya).
- Pegangan dapat merujuk pada sumber daya yang tidak ada (baik sumber daya yang belum dibuat, atau sumber daya yang telah dihapus). Keberadaan sumber daya dapat diperiksa menggunakan metode IResource.exists().
- Beberapa operasi dapat diimplementasikan hanya berdasarkan informasi yang disimpan dalam pegangan itu sendiri (disebut operasi hanya pegangan). Contohnya adalah IResource.getParent(), getFullPath(), dll. Sumber daya tidak perlu ada agar operasi tersebut berhasil. Operasi yang memerlukan keberadaan sumber daya agar berhasil memunculkan CoreException jika sumber daya tidak ada.
Eclipse menyediakan mekanisme yang efisien untuk memberitahukan perubahan sumber daya ruang kerja (Gambar 3). Sumber daya dapat berubah baik sebagai akibat dari tindakan yang dilakukan dalam Eclipse IDE itu sendiri atau sebagai akibat sinkronisasi dengan sistem file. Dalam kedua kasus tersebut, klien yang berlangganan notifikasi diberikan informasi rinci tentang perubahan dalam bentuk “delta sumber daya”. Delta menggambarkan perubahan antara dua keadaan pohon sumber daya ruang kerja (sub-) dan merupakan pohon itu sendiri, masing-masing simpul menggambarkan perubahan pada sumber daya dan berisi daftar delta di tingkat berikutnya yang menggambarkan perubahan pada sumber daya anak.
Beras. 3. IResourceChangeEvent dan IResourceDelta
Mekanisme notifikasi berdasarkan delta sumber daya memiliki karakteristik sebagai berikut:
- Perubahan tunggal dan banyak perubahan dijelaskan menggunakan struktur yang sama, karena delta dibangun menggunakan prinsip komposisi rekursif. Klien pelanggan dapat memproses pemberitahuan perubahan sumber daya menggunakan penurunan rekursif melalui pohon delta.
- Delta berisi informasi lengkap tentang perubahan pada sumber daya, termasuk pergerakannya dan/atau perubahan “penanda” yang terkait dengannya (misalnya, kesalahan kompilasi direpresentasikan sebagai penanda).
- Karena referensi sumber daya dibuat melalui pegangan, delta secara alami dapat mereferensikan sumber daya jarak jauh.
Seperti yang akan segera kita lihat, komponen utama desain mekanisme pemberitahuan perubahan model sumber daya juga relevan untuk model berbasis pegangan lainnya.
Inti JDT
Model sumber daya ruang kerja Eclipse adalah model dasar tanpa bahasa. Komponen JDT Core (plugin org.eclipse.jdt.core) menyediakan API untuk menavigasi dan menganalisis struktur ruang kerja dari perspektif Java, yang disebut “model Java” (model Jawa). API ini didefinisikan dalam elemen Java, bukan API model sumber daya yang mendasarinya, yang didefinisikan dalam folder dan file. Antarmuka utama pohon elemen Java ditunjukkan pada Gambar. 4.
Beras. 4. Elemen Model Java
Model Java menggunakan idiom handle/body yang sama dengan model sumber daya (Gambar 5). IJavaElement adalah pegangannya, dan JavaElementInfo berperan sebagai badan. Antarmuka IJavaElement mendefinisikan protokol yang umum untuk semua elemen Java. Beberapa metodenya hanya dapat ditangani: getElementName(), getParent(), dll. Objek JavaElementInfo menyimpan status elemen terkait: struktur dan atributnya.
Beras. 5. IJavaElement dan JavaElementInfo
Model Java memiliki beberapa perbedaan dalam implementasi desain dasar pegangan/badan dibandingkan dengan model sumber daya. Seperti disebutkan di atas, dalam model sumber daya, pohon elemen, yang simpulnya merupakan objek info sumber daya, seluruhnya terdapat dalam memori. Namun model Java dapat memiliki jumlah elemen yang jauh lebih besar daripada pohon sumber daya, karena model ini juga mewakili struktur internal file .java dan .class: jenis, bidang, dan metode.
Untuk menghindari terwujudnya seluruh pohon elemen dalam memori, implementasi model Java menggunakan cache LRU info elemen berukuran terbatas, dengan kuncinya adalah pegangan IJavaElement. objek info elemen dibuat sesuai permintaan saat pohon elemen dinavigasi. Dalam hal ini, item yang paling jarang digunakan akan dikeluarkan dari cache, dan konsumsi memori model tetap terbatas pada ukuran cache yang ditentukan. Ini adalah keuntungan lain dari desain berbasis pegangan, yang sepenuhnya menyembunyikan detail implementasi tersebut dari kode klien.
Mekanisme untuk memberitahukan perubahan pada elemen Java secara umum mirip dengan mekanisme untuk melacak perubahan pada sumber daya ruang kerja yang dibahas di atas. Klien yang ingin memantau perubahan dalam model Java berlangganan notifikasi, yang direpresentasikan sebagai objek ElementChangedEvent yang berisi IJavaElementDelta (Gambar 6).
Beras. 6. ElementChangedEvent dan IJavaElementDelta
Model Java tidak berisi informasi tentang badan metode atau resolusi nama, jadi untuk analisis rinci kode yang ditulis dalam Java, JDT Core menyediakan model tambahan (berbasis non-pegangan):
Karena pohon sintaksis dapat menghabiskan banyak memori, JDT hanya menyimpan satu AST untuk editor aktif. Berbeda dengan model Java, AST biasanya dipandang sebagai model "perantara", "sementara", yang elemen-elemennya tidak boleh dirujuk oleh klien di luar konteks operasi yang mengarah pada pembuatan AST.
Tiga model yang terdaftar (model Java, AST, binding) bersama-sama membentuk dasar untuk membangun “alat pengembangan cerdas” di JDT, termasuk editor Java yang kuat dengan berbagai “pembantu”, berbagai tindakan untuk memproses kode sumber (termasuk mengatur daftar impor nama dan pemformatan sesuai dengan gaya yang disesuaikan), alat pencarian dan pemfaktoran ulang. Dalam hal ini, model Java memainkan peran khusus, karena digunakan sebagai dasar representasi visual dari struktur aplikasi yang sedang dikembangkan (misalnya, dalam Package Explorer, Outline, Search, Call Hierarchy, dan Ketik Hirarki).
Komponen Eclipse yang digunakan dalam 1C:Enterprise Developments Tools
Pada Gambar. Gambar 7 menunjukkan komponen Eclipse yang menjadi dasar platform teknologi untuk 1C:Enterprise Development Tools.
Beras. 7. Eclipse sebagai platform untuk 1C:Enterprise Development Tools
Platform Gerhana menyediakan infrastruktur dasar. Kita telah melihat beberapa aspek infrastruktur ini di bagian sebelumnya.
Seperti alat serba guna lainnya, EMF cocok untuk memecahkan berbagai masalah pemodelan, namun beberapa kelas model (misalnya, model berbasis pegangan yang dibahas di atas) mungkin memerlukan alat pemodelan yang lebih khusus. Berbicara tentang EMF adalah tugas yang tidak ada gunanya, terutama dalam batasan satu artikel, karena ini adalah subjek dari buku tersendiri, dan cukup tebal. Mari kita perhatikan saja bahwa sistem generalisasi berkualitas tinggi yang mendasari EMF memungkinkan lahirnya seluruh rangkaian proyek yang didedikasikan untuk pemodelan, yang termasuk dalam proyek tingkat atas.
1C:Enterprise Development Tools secara aktif menggunakan EMF itu sendiri dan sejumlah proyek Pemodelan Eclipse lainnya. Secara khusus, Xtext adalah salah satu dasar alat pengembangan untuk bahasa 1C:Enterprise seperti bahasa pemrograman dan bahasa kueri bawaan. Basis lain untuk alat pengembangan ini adalah proyek Eclipse Handly, yang akan kita bahas lebih terinci (dari komponen Eclipse yang terdaftar, komponen ini masih paling sedikit diketahui).
Prinsip arsitektur dasar model berbasis pegangan, seperti idiom pegangan/badan, telah dibahas di atas menggunakan model sumber daya dan model Java sebagai contoh. Dicatat juga bahwa model sumber daya dan model Java merupakan fondasi penting untuk alat pengembangan Eclipse Java (JDT). Dan karena hampir semua proyek *DT Eclipse memiliki arsitektur yang mirip dengan JDT, tidak berlebihan untuk mengatakan bahwa model berbasis pegangan mendasari banyak, jika tidak semua IDE dibangun di atas Platform Eclipse. Misalnya, Eclipse C/C++ Development Tooling (CDT) memiliki model C/C++ berbasis pegangan yang memainkan peran yang sama dalam arsitektur CDT seperti model Java di JDT.
Sebelum Handly, Eclipse tidak menawarkan perpustakaan khusus untuk membangun model bahasa berbasis pegangan. Model-model yang ada saat ini dibuat terutama dengan mengadaptasi langsung kode model Java (alias copy/paste), dalam kasus yang memungkinkan Lisensi Publik Eclipse (EPL). (Jelas, ini biasanya bukan masalah hukum, katakanlah, proyek Eclipse itu sendiri, tetapi tidak untuk produk sumber tertutup.) Selain keserampangan yang melekat, teknik ini menimbulkan masalah yang umum: duplikasi kode yang ditimbulkan saat beradaptasi dengan kesalahan, dll. Yang lebih buruk lagi adalah model-model yang dihasilkan tetap “sesuatu” dan tidak memanfaatkan potensi unifikasi. Namun mengisolasi konsep dan protokol umum untuk model bahasa berbasis pegangan dapat mengarah pada pembuatan komponen yang dapat digunakan kembali untuk bekerja dengannya, serupa dengan yang terjadi dalam kasus EMF.
Bukan berarti Eclipse tidak memahami masalah ini. Kembali pada tahun 2005
Dalam arti tertentu, proyek Handly dirancang untuk memecahkan masalah yang kira-kira sama dengan EMF, tetapi untuk model berbasis pegangan, dan terutama model bahasa (yaitu, mewakili elemen struktur beberapa bahasa pemrograman). Tujuan utama yang ditetapkan saat mendesain Handly tercantum di bawah ini:
- Identifikasi abstraksi utama bidang studi.
- Mengurangi upaya dan meningkatkan kualitas implementasi model bahasa berbasis pegangan melalui penggunaan kembali kode.
- Menyediakan API tingkat meta terpadu ke model yang dihasilkan, sehingga memungkinkan pembuatan komponen IDE umum yang bekerja dengan model berbasis pegangan bahasa.
- Fleksibilitas dan skalabilitas.
- Integrasi dengan Xtext (dalam lapisan terpisah).
Untuk menyoroti konsep dan protokol umum, implementasi model berbasis pegangan bahasa yang ada dianalisis. Antarmuka utama dan implementasi dasar yang disediakan oleh Handly ditunjukkan pada Gambar. 8.
Beras. 8. Antarmuka umum dan implementasi dasar elemen Handly
Antarmuka IElement mewakili pegangan elemen dan umum untuk elemen semua model berbasis Handly. Elemen kelas abstrak mengimplementasikan mekanisme pegangan/tubuh yang digeneralisasi (Gbr. 9).
Beras. 9. Implementasi IElement dan handle/body generik
Selain itu, Handly menyediakan mekanisme umum untuk memberi tahu tentang perubahan elemen model (Gbr. 10). Seperti yang Anda lihat, ini secara umum mirip dengan mekanisme notifikasi yang diterapkan dalam model sumber daya dan model Java, dan menggunakan IElementDelta untuk memberikan representasi terpadu informasi perubahan elemen.
Beras. 10. Antarmuka umum dan implementasi dasar mekanisme notifikasi Handly
Bagian Handly yang dibahas di atas (Gbr. 9 dan 10) dapat digunakan untuk mewakili hampir semua model berbasis pegangan. Untuk membuat linguistik model, proyek ini menawarkan fungsionalitas tambahan - khususnya, antarmuka umum dan implementasi dasar untuk elemen struktur teks sumber, yang disebut elemen sumber (Gbr. 8). Antarmuka ISourceFile mewakili file sumber, dan ISourceConstruct mewakili elemen dalam file sumber. Kelas abstrak SourceFile dan SourceConstruct mengimplementasikan mekanisme umum untuk mendukung pekerjaan dengan file sumber dan elemennya, misalnya, bekerja dengan buffer teks, mengikat koordinat elemen dalam teks sumber, merekonsiliasi model dengan konten buffer copy pekerjaan saat ini , dll. Penerapan mekanisme ini biasanya cukup menantang, dan Handly dapat secara signifikan mengurangi upaya pengembangan model bahasa berbasis pegangan dengan menyediakan implementasi dasar berkualitas tinggi.
Selain mekanisme inti yang tercantum di atas, Handly menyediakan infrastruktur untuk buffer teks dan snapshot, dukungan untuk integrasi dengan editor kode sumber (termasuk integrasi langsung dengan editor Xtext), serta beberapa komponen UI umum yang bekerja dengan editor kode sumber Model praktis seperti kerangka kerangka. Untuk mengilustrasikan kemampuannya, proyek ini memberikan beberapa contoh, termasuk implementasi model Java di Handly. (Dibandingkan dengan implementasi penuh model Java di JDT, model ini sengaja disederhanakan agar lebih jelas.)
Seperti disebutkan sebelumnya, fokus utama selama desain awal Handly dan pengembangan selanjutnya adalah skalabilitas dan fleksibilitas.
Pada prinsipnya, model berbasis pegangan berskala cukup baik “sesuai desain”. Misalnya, idiom handle/body memungkinkan Anda membatasi jumlah memori yang dikonsumsi oleh suatu model. Namun ada juga nuansanya. Jadi, saat menguji skalabilitas Handly, masalah ditemukan dalam implementasi mekanisme notifikasi - ketika sejumlah besar elemen diubah, membangun delta membutuhkan terlalu banyak waktu. Ternyata masalah yang sama juga terjadi pada model JDT Java, yang pernah mengadaptasi kode terkait. Kami memperbaiki bug di Handly dan menyiapkan patch serupa untuk JDT, yang diterima dengan penuh syukur. Ini hanyalah salah satu contoh di mana memperkenalkan Handly ke dalam implementasi model yang ada berpotensi berguna, karena dalam kasus ini bug tersebut dapat diperbaiki hanya di satu tempat.
Agar penerapan Handly ke dalam implementasi model yang ada layak secara teknis, perpustakaan harus memiliki fleksibilitas yang signifikan. Masalah utamanya adalah menjaga kompatibilitas ke belakang di seluruh model API. Masalah ini diselesaikan di
Fleksibilitas juga memiliki aspek lain. Misalnya, Handly hampir tidak menerapkan batasan pada struktur model dan dapat digunakan untuk memodelkan bahasa tujuan umum dan bahasa khusus domain. Saat membangun struktur file sumber, Handly tidak menentukan bentuk representasi AST tertentu dan, pada prinsipnya, bahkan tidak memerlukan kehadiran AST itu sendiri, sehingga memastikan kompatibilitas dengan hampir semua mekanisme parsing. Terakhir, Handly mendukung integrasi penuh dengan ruang kerja Eclipse, tetapi juga dapat bekerja secara langsung dengan sistem file berkat integrasinya
Versi sekarang
Seperti disebutkan di atas, salah satu produknya adalah 1C:Enterprise Development Tools, di mana Handly digunakan sejak awal untuk memodelkan elemen struktur tingkat tinggi dari bahasa 1C:Enterprise seperti bahasa pemrograman bawaan dan bahasa kueri . Satu lagi produk yang kurang dikenal masyarakat umum. Ini
Kami berharap setelah rilis versi 1.0 dengan jaminan stabilitas API dan proyek keluar dari status inkubasi, Handly akan memiliki pengguna baru. Sementara itu, proyek ini terus menguji dan menyempurnakan API lebih lanjut, merilis dua rilis "utama" per tahun - pada bulan Juni (tanggal yang sama dengan rilis Eclipse secara bersamaan) dan Desember, memberikan jadwal yang dapat diprediksi dan dapat diandalkan oleh pengguna. Kami juga dapat menambahkan bahwa “tingkat bug” proyek ini tetap berada pada tingkat yang rendah dan Handly telah bekerja dengan andal pada produk-produk pengguna awal sejak versi pertama. Untuk menjelajahi Eclipse Handly lebih jauh, Anda dapat menggunakan
Sumber: www.habr.com