طرق ربط لغات برمجة مع بعضها

يعتمد تحديد اللغة البرمجية التي ستُستخدم في برمجة المشروع على عدة عوامل، مثل نظام التشغيل الذي يتم برمجة المشروع من أجله, سهولة كتابة الكود (Syntax)، حجم المجتمع الذي يستخدمها و الداعم لها و الذي سيساعدك في إيجاد حلول للمشاكل التي قد تواجهك عند إستخدامها، بالإضافة إلى المكتبات المشهورة المكتوبة بها و التي تُستخدم لتسريع العمل.

عادةً ما تحمل المشاريع الكبيرة خواصاً مختلفة يصعب جمعها في لغة واحدة. كمثال بسيط موقع هرمش يستخدم لغة Javascript ليكون المستخدم قادر على وضع تعليقه على المقال و بنفس الوقت يستخدم لغة PHP ليستقبل تعليق المستخدم المرسل والتشييك عليها (فحصه) لمعرفة ما إن كان قد تسبب بضرر للموقع في حال كان يحتوي على كود خبيث, أو أنه يحتوي على كلام سيئ و عندها إن وجد أنه لا مشكلة فيه يقوم بحفظه في قاعدة البيانات و من ثم يرسل لنا رسالة تخبرنا بأنه يوجد تعليق جديد تم إضافته.

هنا قد يقلق المبتدئ من صعوبة ربط اللغات مع بعضها ظناً منه أن هذا أمر صعب جداً و يتطلب خبرة كبيرة.

في الواقع هذا الأمر سهل جداً و لكنه يتطلب فقط دراسة و إتباع طرق معينة لربط البيانات التي تتبادلها لغات البرمجة بشكل صحيح.

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


1- التواصل عن طريق واجهة برمجية

بعض لغات البرمجة توفر لك مجموعة دوال يقال لها واجهة برمجية (API) تسمح بالتواصل مع لغات أخرى، فمثلاً يمكن لبرنامج مكتوب بلغة Java إستدعاء دوال مكتوبة بلغة ++C عن طريق واجهة برمجية مخصصة لذلك إسمها (JNI) التي هي إختصار لجملة Java Native Interface.

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

 

2- التواصل عن طريق موجه الأوامر

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

import sys

print("Hello " + sys.argv[1])

و البرنامج الأساسي مكتوب بلغة Java و يريد تشغيل البرنامج المكتوب بلغة Python سيكون الكود كالتالي.

import java.io.*;

public class Main {

    public static void main(String[] args) throws Exception {
        Process process = Runtime.getRuntime().exec("python helper.py Rami");
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
        System.out.println(stdInput.readLine());
    }
  
}

هنا عند تشغيل الكود المكتوب بلغة Java سيقوم بإرسال أمر مباشر لموجه الأوامر يطلب منه أن يشغل مفسّر لغة Python حتى ينفذ الأوامر الموجودة في الملف helper.py مع تمرير الكلمة Rami له أيضاً.

عند تنفيذ الأوامر الموجودة في الملف helper.py سيقوم بوضع الكلمة Rami التي مررناها له بشكل مؤقت في المصفوفة sys.argv و من بعدها سيقوم بطباعتها على الشاشة حتى يخرجها للبرنامج المكتوب بلغة Java.

في النهاية سيقوم البرنامج المكتوب بلغة Java بقراءة المخرجات التي نتجت عن تنفيذ الملف helper.py و يطبعها.


معلومة

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

 

3- الإتصال عن طريق الشبكة Network

يمكن للبرنامج الأساسي و البرنامج المساعد التواصل عن طريق localhost أو شبكة الإنترنت، و يتم تبادل البيانات بهذه الطريقة عن طريق بروتوكول معين مثل HTTP أو WebSocket، و تتميز هذه الطريقة عن غيرها بإمكانية تشغيل البرنامج المساعد على جهاز آخر يسمى حينها خادماً (Server).

لتتوضح الأمور قليلا عليك فهم كيف تعمل الشبكة.

الشبكة هي عبارة عن عدة طبقات كما هو موضح في الصورة التالية:

صورة توضح طبقات الشبكة تبعا لنموذج OSI (المصدر GeeksForGeeks.org , تحت رخصة CC BY-SA 4.0)

أول ثلاث طبقات في الأسفل هم طبقات الأجزاء المادية (Hardware)، و تكون هذه الطبقات مسؤولة بشكل عام عن نقل البيانات الرقمية Digital على شكل نبضات كهربائية في الأسلاك أو على شكل إشعاع كهرومغناطيسي، و تليها طبقة النقل Transport المسؤولة عن إدارة نقل البيانات بين الجهازين و من بروتوكولاتها TCP و UDP، و الطبقة الأخيرة هي طبقة البرمجيات Software، و هذه الطبقة التي تبرمج فيها البروتوكولات المعروفة مثل HTTP و WebSocket و وظيفة هذه البروتوكولات هي تبادل البيانات بين الجهازين بحيث يفهم كل طرف ما الذي يتم تبادله و كيف يتم تبادله، و يبدأ كل بروتوكول عملية المراسلة بعملية المصافحة (Handshaking) وهي أول ما يتم إرساله من المستخدم إلى الخادم ليخبره فيها عن البروتوكول الذي يريد التواصل به معه و عن معلومات أخرى أيضاً تعتمد على نوع البروتوكول، و يقوم الخادم بعدها بالرد عليه بالإيجاب و يرسل معلومات أخرى أيضاً.

الآن الفرق الرئيسي بين البروتوكولين HTTP و WebSocket هو أن HTTP يقوم على إرسال المستخدم طلباً إلى الخادم ويرد عليه الخادم ثم يغلق الاتصال، و لا يستطيع بعدها الخادم التعرف على المستخدم إن قام بإرسال طلب آخر. في المقابل البروتوكول Websocket يقوم على إنشاء اتصال مستمر بين المستخدم و الخادم، و لا ينقطع الإتصال إلا عندما يقرر ذلك أحد الطرفين مما يسمح بتبادل البيانات بشكل مستمر.

إذاً يمكنك إختيار أحد الوسيلتين تبعاً لإحتياجك فإن كان طلباً و جواباً فقط تستخدم HTTP و إن كان إحتياجك هو تبادل معلومات بشكل مستمر وإن كانت لفترة قصيرة تستخدم Websocket.


4- مشروع GraalVM

لمواكبة آخر التطورات يجب علينا ذكر هذا المشروع الرائد الذي طورته شركة Oracle عام 2019، و هو آلة Java إفتراضية تدعم عدة لغات برمجة أخرى مثل JavaScript، Ruby، R و Python حيث يمكن لأي لغة منهم إستخدام اللغات الأخرى، و هذا مثال على كود JavaScript يقوم بتنفيذ كود Python.

var array = Polyglot.eval("python", "[1,2,42,4]")
console.log(array[2]);

آخر تحديث: 23-12-2021

الكاتب

رامي عبدالله

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

تعليقات 1

أضف تعليق

يجب تسجيل الدخول حتى تتمكن من إضافة تعليق أو رد.

تقييم المقال

لم تقم بتقييم المقال بعد!

الدورات

أدوات مساعدة

أقسام الموقع

دورات
مقالات كتب مشاريع أسئلة