J2CL - متأخرا أفضل من عدمه

لم يتمكن أحد حتى الآن من التأخر عن جنازتهم.
فالنتين دوميل


في الأسبوع الماضي ، نشر فريق من Google أخيرًا شفرة المصدر لإطار J2CL ، والذي تم الحديث عنه منذ عام 2015. إن فكرة ترجمة جافا إلى جافا سكريبت ليست جديدة تمامًا ، وقد شغل الجميع المخاريط لفترة طويلة باستخدام Google Web Toolkit ، لكن المجتمع كان ينتظر هذا المنتج مثل أي شخص آخر - لقد تحدثوا عنه وألقوا خطابات ، ولكن لم يره أحد.



‌‌‍‍
لقد مر أكثر من 3 سنوات منذ الإعلان الأول ، ويبدو أن المنتج فقد السوق دون أن يولد. اليوم لدينا Scala.js و Kotlin.js و JSweet ، ناهيك عن أن تطوير الويب قد تم اختراقه بواسطة TypeScript ولا توجد مساحة متبقية لـ Java. خلال هذا الوقت ، فقد الكثير ، حتى أكثر الرياضيين المتفانين ، إيمانهم بـ "Java for Front-end" وكبحوا إطار JavaScript أو ذاك.


نظرًا لأن الإصدار قد حدث ، فلنرى ما حدث ، ولمن قد يكون في متناول اليد.


فكرة


بشكل أساسي ، يعد محاكاة JVMs في المستعرض مهمة صعبة. قام مطورو مجموعة أدوات الويب من Google بحلها لفترة طويلة وحققوا نجاحات معينة: قاموا ببناء مترجم ، وطوروا آليات مضاهاة لمكتبة جافا القياسية ، وقدموا ضبطًا لتطوير التطبيقات.


هناك العديد من المزايا لهذا النهج: الكتابة الثابتة ، والقدرة على إعادة استخدام رمز الخادم في المتصفح ، والأدوات الجاهزة في شكل Java IDE. يتم الآن مشاهدة العديد من الأساليب التي تم وضعها في الأصل في GWT في TypeScript و Web Pack وأدوات تطوير الواجهة الأمامية الأخرى.


لم تكن مجموعة أدوات الويب القديمة من Google محبوبًا من حيث حجمها وتجريدها لبناء واجهة مستخدم. إن فكرة J2CL أبسط - مما يتيح لك ترجمة Java إلى JavaScript بأقل تكلفة ممكنة بحيث يمكنك بسهولة الاتصال بـ Java من JavaScript والعكس صحيح.


وإذا كان في عام 2015 لكان هناك بالفعل مترجم جافا عالي الجودة في JS بدون القمامة غير الضرورية ، فمن غير المعروف كيف سيتطور تطوير الويب بشكل أكبر.


الخلفية J2CL


في بداية عام 2015 ، اتخذ فريق Google GWT قرارًا صعبًا ولكنه ضروري - لتطوير منتج جديد يسمح لك باستخدام Java في تطوير الواجهة الأمامية.


كان هذا بشكل رئيسي بسبب الاتجاهات المتغيرة في تطوير الويب وعملائهم الداخليين الجدد ، الذين نظروا إلى Java للويب ليس كنظام بيئي معزول ، ولكن كجزء لا يتجزأ من مجموعة كبيرة. وهذا يتطلب رؤية جديدة تمامًا وإنشاء أدوات من الصفر ، والتي يجب دمجها بشكل وثيق مع بقية النظام البيئي.


مع GWT ، كان من شبه المستحيل تحقيق هذه الأهداف. على الرغم من وجود أدوات للتفاعل ثنائي الاتجاه مع JavaScipt في GWT ، لم يتمكن الإطار من التخلص من الكثير من الأمتعة في شكل واجهة مستخدم ومكتبة RPC وواجهات برمجة تطبيقات أخرى.


ما هذا الوحش


وفقًا للمطورين ، يوفر J2CL تكاملًا سلسًا لرمز Java في تطبيقات JavaScript. إنه مترجم جافا خفيف إلى JavaScript مع التركيز على تحسين التعليمات البرمجية باستخدام مترجم الإغلاق .


  • يمكنك بسهولة مزج جافا وجافا سكريبت في مشروع واحد ، للحصول على الأفضل من كل لغة.
  • يسمح بإعادة استخدام التعليمات البرمجية بين حل الخادم ، وتطبيق ويب ، ونظام Android الأساسي. يتوفر عدد كبير من مكتبات Java ، مثل: Guava و Dagger و AutoValue.
  • حديثة ومريحة. يعتمد تجميع المشاريع على Bazel ، بدعم من Live-reload.
  • تم التحقق. يُدعى أن J2CL يُستخدم في الإنتاج في مشاريع GSuite: GMail و Docs و Slides and Calendar.

بشكل أساسي ، تقوم J2CL بترجمة شفرة مصدر Java إلى شفرة JavaScript دون استخدام كود فئة فئة Java. هذا يعني أنه ، كما هو الحال في Google Web Toolkit ، لتجميع المشروع ، فأنت بحاجة إلى المصادر لجميع المكتبات المستخدمة. بالإضافة إلى ذلك ، يثير هذا أسئلة حول دعم ميزات لغة Java في الإصدارات الجديدة. في الوقت الحالي ، يعد المطورون بدعم جميع ميزات بناء الجملة في Java 11.


لن تدعم J2CL أدوات GWT و GWT RPC وغيرها من مكتبات GWT - فقط جافا الأساسية ومحرك تكامل JavaScript JSInterop .


أي هذه نسخة محدودة جدًا من GWT مع ناقل جديد تمامًا. وبما أن المنتج الجديد لم يعد متوافقًا مع GWT ، فإنه يطلق عليه ليس GWT ، ولكن J2CL. ونتيجة لذلك ، سيكون الإصدار المخطط لـ GWT 3 إطار عمل أعلى J2CL ، حيث سيتم فصل جميع مكتبات التطبيقات عن مستوى نظام المترجم نفسه.


يتم وصف قيود توافق جافا الحالية على GitHub . بشكل أساسي ، ظلوا كما هو في GWT - لا يوجد دعم انعكاس ، ولا واجهة برمجة تطبيقات لشبكة Java. ولكن هناك شيء مختلف - لا يتم محاكاة دلالات المصفوفات والقوائم ، على سبيل المثال ، لا يتحقق الفهرس من حدوث في حدود المصفوفات. لا يركز المطورون على محاكاة سلوك JVM ، ولكن على بنية اللغة لضمان الحد الأدنى من النفقات العامة وعدم توليد الكثير من JavaScript لضمان التوافق التام.


على الرغم من أن J2CL جاهز للإنتاج ، إلا أن إصدار OSS لا يزال بعيدًا عنه. على سبيل المثال ، هناك مشاكل في بدء المشاريع على Windows ولا يعد المطورون بواجهة برمجة تطبيقات مستقرة.


من السهل شرح اختيار Bazel كنظام بناء لمنتج Google الداخلي ، ولكن لا توجد إيجابيات للمجتمع ، ولا توجد طريقة أخرى لاستخدام J2CL سوى تعلم نظام البناء هذا. كل ما تبقى هو الانتظار حتى يكتب المجتمع الإضافات لـ Maven / Gradle.


جرب


أولاً ، لتجربة J2CL الآن ، تحتاج إلى نظام التشغيل Mac OS أو Linux.
ثانيًا ، تحتاج إلى تثبيت Bazel - نظام بناء غريب إلى حد ما من Google.


الآن يمكنك على الأقل جمع شيء ما ، على سبيل المثال ، HelloWorld من المستودع الرسمي.


> bazel build src/main/java/com/google/j2cl/samples/helloworld:helloworld 

إذا نظرنا إلى النتيجة ، فسوف نفاجأ بسرور:


 > cat bazel-bin/src/main/java/com/google/j2cl/samples/helloworld/helloworld.js document.write('Hello from Java! and JS!'); 

هذا بالطبع لا يثبت أي شيء ، لكنه مسرور للغاية ببساطته بعد وحدات GWT. لا توجد أمثلة رائعة للتطبيقات حتى الآن ، سننتظر ظهورها.


لماذا من الضروري وجود xxx.js


الجواب على السؤال لماذا يجب العثور على هذا لا يزال صعبا. للوهلة الأولى ، لدى J2CL فكرة قوية جدًا - لإعادة استخدام Java للواجهة الأمامية تمامًا مثل الأشخاص الذين يستخدمون TypeScript. من ناحية أخرى ، يبدو أن المشروع متأخر.


يتم تنفيذ مشاريع Transpiler الجديدة في JS ، مثل Kotlin.js و Scala.js ، كمكوِّنات إضافية للمترجم ولا تحتاج إلى إعادة تحليل شفرة المصدر. وفي هذا الصدد ، تعد J2CL خطوة إلى الوراء ، لأنها تحتاج إلى شفرة المصدر التي سيتم تحليلها.


نقطة منفصلة هي لغة جافا نفسها. لماذا الكتابة بلغة جافا المطلقة ، إذا كان يمكنك كتابة كل من الخادم وجزء العميل باختصار Kotlin؟


على الرغم من ذلك ، عند مقارنته بمشروع آخر مماثل - JSweet ، فإنني أثق في J2CL أكثر. تعد أدوات JSweet أكثر ودية وأكثر استعدادًا للاستخدام ، ولكن JSweet لديها مجتمع صغير وكتبه كل شخص واحد تقريبًا.


هل تقول كود مفتوح المصدر؟


يسر بالتأكيد أن المشروع لديه ترخيص مفتوح لـ Apache 2.0.


للأسف ، المصدر المفتوح لا يعني عملية تطوير مفتوحة . جاءت أكبر خيبة أمل للمجتمع من الوضع الحالي ، فقد تم الإعلان عن مشروع J2CL قبل 3 سنوات ، ولكن لا أحد يظهر كود المصدر الخاص به ، ولا يمكنك التأثير على واجهة برمجة التطبيقات النهائية الخاصة به وعدم تسريع عملية التطوير ، لأنه لا يوجد مكان لإرسال التصحيحات.


دعونا نأمل أن يتحسن الوضع ويصبح المنتج قابلاً للتطبيق.


تحديث: تم نقل أول تطبيق J2CL من GWT2 - https://github.com/DominoKit/dominodo

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


All Articles