UniSharping: Konversi C # Code di Java dan Python

Pendahuluan


Sejak 70-an, Bahasa Inggris Sederhana telah berkembang, yang tujuannya adalah untuk menentukan subset dari bahasa yang dapat dimengerti oleh berbagai penutur non-penutur asli bahasa tersebut. Disarankan, misalnya, untuk dokumentasi teknis. Penerjemah otomatis pada subset seperti itu akan bekerja jelas lebih benar, idealnya menghasilkan teks yang tidak memerlukan proofreading manual.
Jika Anda menerapkan pendekatan ini ke C # untuk tugas mengubah kode secara otomatis ke bahasa pemrograman lain, Anda dapat memilih subset dari konstruksi bahasa, pustaka sistem, dan teknologi yang berpotensi diterjemahkan ke berbagai bahasa lain. Selain itu, konversi bukan hanya satu kali (migrasi), tetapi konstan untuk memperluas kemampuan integrasi proyek dalam C # - sehingga setiap saat Anda bisa mendapatkan kode yang berfungsi dalam bahasa lain tanpa perlu mengedit apa pun.


Biarkan saya perkenalkan: UniSharping


Pembatasan C # .NET untuk menyelesaikan masalah ini disebut U # (Universal Sharp), dan proses konversi dan alatnya disebut UniSharping . Modul yang dapat dieksekusi, pengaturan, dan dokumentasi tersedia di GitHub , sistem ini gratis untuk penggunaan non-komersial (Non-Komersial Freeware).


Untuk lintas platform, Microsoft telah membuat batasan .NET Framework dalam hal perpustakaan dan teknologi: .NET Core. Ini seperti langkah pertama ke arah yang benar, U # mengambil langkah kedua untuk "lintas-programabilitas".


Ada beberapa batasan U # dalam konstruksi bahasa - ini adalah goto dan kasus goto atavisme, serta hasil, yang tidak dimodelkan secara memadai dalam mode otomatis. Tidak disarankan (walaupun dimungkinkan) untuk menggunakan struct, ada nuansa dengan nama - semua ini dijelaskan secara rinci dalam dokumen terpisah. U # parser memberikan kesalahan dan peringatan, dan untuk menjamin pembuatan yang benar, Anda harus menyesuaikan kode sumber C # sehingga idealnya benar-benar hilang. Jika Anda masih perlu mempertahankan versi aslinya, Anda dapat menggunakan arahan preprosesor #jAWA || PHP ... #else ... #endif. Pembatasan ini berlaku pada tingkat mesin U # dan tidak tunduk pada koreksi eksternal, serta daftar bahasa yang didukung.


Tetapi pembatasan pada tingkat pustaka sistem tidak diatur secara kaku dan dikonfigurasi secara eksternal melalui file teks khusus yang menentukan bagaimana menerjemahkan kelas tertentu dan anggotanya ke dalam bahasa yang sesuai. Jika ada analog langsung, maka itu ditunjukkan, jika situasinya lebih rumit, maka sepotong kode dari bahasa final ditulis, atau secara umum kelas (layanan) khusus yang memecahkan masalah yang diinginkan. Dalam kasus yang sangat sulit, Anda harus "hardcode" di tingkat mesin, tetapi situasi seperti itu sangat jarang (sekitar selusin). Prosedur untuk mengatur kelas sistem dan anggotanya dijelaskan dalam dokumen terpisah. Berikut adalah daftar kelas C # yang didukung dan anggotanya dengan analog di Jawa dan Python dalam versi saat ini di situs, ada juga demo online .


Adapun teknologi, sekarang daftar ini terbatas pada aplikasi konsol dan tes unit (UnitTest). Nah, proyek Lib individu, sebagai kasus khusus, diterjemahkan ke dalam konstruksi yang sesuai dari bahasa yang diinginkan.


Untuk terjemahan yang berhasil, proyek sumber C # (solusi) harus memiliki bagian start-up yang memeriksa fungsionalitas dalam sumber C #. Baik jika ini adalah sistem pengujian otomatis yang luas (UnitTest standar dalam implementasi yang berbeda atau ditulis sendiri), tetapi setidaknya harus ada setidaknya aplikasi konsol yang berfungsi dengan benar ketika diluncurkan tanpa campur tangan pengguna. Kebutuhan akan hal ini sudah jelas - setelah generasi ke dalam bahasa final, Anda dapat segera memeriksa kinerjanya. Idealnya, semua tes harus bekerja sama dengan C #.


Sejarah proyek


Ide konverter semacam itu telah ada sejak lama. Proyek pemrosesan bahasa alami utama saya SDK Pullenti adalah kandidat yang ideal untuk konversi: sejumlah besar kode yang kompleks dan terus meningkat. Untuk berintegrasi dengan Java, saya harus membungkusnya dengan layanan web, server tcp, dll.
Musim panas lalu, saya menemukan waktu dan energi untuk membuat opsi pertama. Dia menerjemahkan proyek Pullenti ke Jawa, dan juga dirinya di Jawa.
Selama enam bulan ke depan, konverter dikembangkan pada beberapa proyek internal yang ada di perusahaan, terutama melalui perluasan kelas sistem.
Pada musim semi 2018, muncul ide untuk mendukung Python, yang diterapkan pada musim panas. Tetapi dimasukkannya bahasa kedua tidak disediakan dalam versi awal dan ternyata dengan canggung. Pada musim panas saya harus sepenuhnya mengulang mesin untuk potensi beberapa bahasa terakhir. Juga, pengaturan untuk kelas sistem dari hardcode dipindahkan ke file teks eksternal. Saya harap set ini tidak akan berkembang tanpa bantuan Anda.


Rencana selanjutnya adalah sebagai berikut:


  • tarik Python ke tingkat Java. Python sekarang didukung di tingkat Pullenti, tetapi Java telah jauh lebih maju pada proyek-proyek lain dibandingkan dengan itu.
  • mendukung PHP setidaknya di tingkat proyek Pullenti.
  • mendukung C ++. Ya, saya menyadari ini sangat sulit, karena tidak jelas kapan membebaskan memori yang merupakan tautan dan yang harus dilakukan penghapusan. Tapi ada ide ...

Siapa yang bisa berguna


Sebagian besar mereka yang mengembangkan SDK lintas-platform yang berpotensi di C #. Berkat konverter UniSharping, SDK mereka juga bisa menjadi "lintas-perangkat lunak", yang akan memperluas lingkaran pengguna potensial.
Baru-baru ini, posisi STR semakin menguat di Rusia, yang telah menjadi kewajiban di sebagian besar lembaga pemerintah dan beberapa perusahaan besar. Jelaskan bahwa .NET Core juga tidak selalu berfungsi, karena itu adalah "Microsoft." Biarkan beberapa perusahaan mengembangkan sistem informasinya dalam C #. Untuk memperkenalkan produk ke "perusahaan sumber terbuka", Anda dapat memilih bagian logis dari proyek (back-end), secara otomatis mengubahnya menjadi rilis yang diperlukan, dan membuat bagian visual (ujung depan) menjadi perangkat lunak sumber terbuka. Artinya, untuk melanjutkan pengembangan di C #, dan di Jawa hanya front-end.


Saya tidak mengecualikan bahwa pada prinsipnya konversi proyek web dimungkinkan (dengan keterbatasan, tentu saja), tetapi saya tidak memiliki keterampilan dan informasi yang diperlukan untuk ini. Jika ada yang melihat peluang seperti itu, maka sangat mungkin untuk mengimplementasikannya di UniSharping.


Saya perhatikan bahwa untuk proyek C # yang sangat kompleks, mendukung Java atau bahasa lain akan membutuhkan upaya untuk memodifikasi kode, menyorot bagian portabel dalam proyek, dan "melingkari" dengan unit test. Juga, pengaturan kelas sistem dan metode yang masih tidak didukung dan memperbaiki kesalahan UniSharping sendiri (dengan bantuan saya) masih bekerja. Tetapi prosesnya konvergen, di mana proyek mengharapkan bonus lintas-programmer.

Source: https://habr.com/ru/post/id422965/


All Articles