سؤال

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

أعني أنه لا توجد طريقة جافا مثل

myProgram.callCfunction(parameters);

لا يحدث أبدا أو أنا مخطئ؟

هل كانت مفيدة؟

المحلول

يعد وجود لغات متعددة في مشروع واحد أمرًا شائعًا جدًا، ولكن المبادئ الكامنة وراء ذلك ليست بسيطة دائمًا.

في الحالة البسيطة، يتم تجميع لغات مختلفة لنفس الكود.على سبيل المثال، عادةً ما يتم تجميع أكواد C وC++‎ في مُجمِّع الأجهزة أو يتم تجميع C# وVB.Net إلى IL (اللغة التي يفهمها وقت تشغيل .NET).

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

الأمثلة الكلاسيكية لقابلية التشغيل البيني بين لغات البرامج المختلفة هي (معظمها من عالم Windows):

  • اللغات المختلفة المتاحة لمنصة .NET.يتضمن ذلك C# وVB.Net وJ# وIronRuby وF# وXSLT والعديد من اللغات الأخرى الأقل شهرة.
  • يمكن استخدام مكونات COM الأصلية المكتوبة بلغة C++ أو VB مع مجموعة كبيرة ومتنوعة من اللغات:VBScript، VB، جميع لغات .NET، Java
  • يمكن استدعاء وظائف Win32 api من .NET أو VB
  • IPC (الاتصال بين العمليات)
  • كوربا, ربما يكون النهج الأكثر شمولاً (والأكثر تعقيدًا).
  • ربما تكون خدمات الويب وغيرها من البنى الموجهة نحو الخدمة هي النهج الأكثر حداثة

نصائح أخرى

وعموما، فإن أي مشروع على شبكة الإنترنت الحجم لائق استخدام حوالي خمس لغات: HTML، CSS، جافا سكريبت، نوعا من جانب الخادم "إنجاز الأمور" لغة (ASP، JSP، ومخطوطات CGI مع بيرل، PHP، الخ)، وبعض البديل من SQL للاتصال قاعدة البيانات.

(وهذا هو، بطبيعة الحال، بعيدا عن الجدل حول ما إذا كان أو لم يكن HTML و CSS عدد لغات البرمجة التلويح باليد - أنا مخيم "هم، ولكن فقط لا تورينج كامل اللغات"، ولكن هذا كله موضوع آخر).

وفيما يلي بعض الأمثلة عن كيفية عمل كل هذه معا:

إذا كنت تسير في الطريق أفضل الممارسات، وهيكل من صفحة ويب في HTML، وإرشادات حول كيفية عرضه وفي CSS - التي يمكن أن تكون في نفس الملف، ولكن لا يجب أن يكون. يحتوي CSS مجموعة من الطبقات، والتي تشير إلى HTML، والامر متروك للمتصفح لمعرفة كيفية النقر عليها معا.

وأخذ كل ما خطوة أخرى إلى الأمام، أي نصوص جافا سكريبت على تلك الصفحة يمكن أن يغير أي من HTML / CSS التي موجود (تغيير محتويات كيانات HTML، مبادلة خارج الطبقة CSS واحد لآخر، تغيير سلوك CSS، و هلم جرا). وهي تفعل ذلك عن طريق ما يسمى طراز كائن المستند، الذي هو في الأساس لغة ومنصة مستقلة API للتلاعب صفحات HTML بطريقة تشبه الكائن (وعند هذه النقطة سوف تتراجع ببطء ومجرد تقديم وصلة إلى ذات الصلة المادة يكي ).

ولكن بعد ذلك، حيث لا يأتي كل HTML / CSS / جافا سكريبت من؟ هذا ما تفعله اللغة من جانب الخادم. في أبسط صوره، واللغة الجانب سيرير هو البرنامج الذي بإرجاع سلسلة عملاقة عقد صفحة HTML كما انتاجها. هذا، بالطبع، يمكن الحصول على أكثر تعقيدا: الأشكال HTML ومعلمات سلسلة الاستعلام يمكن استخدامها كمدخل لبرنامج الخادم الجانب دينا، ومن ثم كان لديك AJAX كل شيء حيث يحصل جافا سكريبت لإرسال البيانات مباشرة إلى لغة الملقم أيضا. يمكنك أيضا الحصول على يتوهم حيث اللغة الخادم يمكن تخصيص HTML، CSS، وجافا سكريبت أن يحصل بصق - أساسا، لديك برنامج بلغة واحدة كتابة برنامج بلغة أخرى

واللغة من جانب الخادم إلى اتصال SQL تعمل الشيء نفسه. هناك الكثير من الطرق لجعلها على حد سواء أكثر تعقيدا وأكثر أمانا، ولكن أبسط طريقة هي للغة الخادم الخاص بك لبناء حيوي سلسلة مع أمر SQL في ذلك، واليد التي لقاعدة البيانات عن طريق نوع من الموصل، ونعود مجموعة نتيجة لذلك. (وهذا هو حال كنت حقا لها وظيفة التي تتلخص في someValue = database.executeThisSQLCommand (SQLString)).

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

لغات متعددة في استخدام ما يسمى "التوافقية" أو "إمكانية التشغيل المتداخل" للاختصار.

والمثال الخاص بك هو الخطأ. جافا يمكن استدعاء وظائف C.

واللغة يوفر آلية لإمكانية التشغيل المتداخل.

في حالة .NET، يتم تجميع اللغات إلى IL كجزء من CLI. وبالتالي أي لغة. NET يمكن إمكانية التشغيل المتداخل (أساليب الدعوة التي يحددها) وحدات المعرفة في أي لغة. NET الأخرى.

وكمثال على ذلك:

ويمكنني تحديد أسلوب في C #

static void Hello(){ Console.WriteLine("Hello World");}

وأنا يمكن أن يطلق عليه من بايثون (و IronPython)

 Hello()

والحصول على الناتج المتوقع.

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

يمكن أن تتفاعل لغات متعددة مع:

  1. إدخال/إخراج الأنابيب (أي لغة يمكن أن تفعل ذلك لأنه يجب تنفيذ الإدخال والمخرجات بالضرورة في كل لغة غير عادية)
  2. وجود رمز بلغة واحدة يجمع إلى مكتبة أصلية بينما يدعم الآخر استدعاء الكود الأصلي.
  3. التواصل عبر اتصال شبكة الاسترجاع.يمكنك مواجهة صعوبات مع تدخل جدار الحماية بهذه الطريقة.
  4. قواعد بيانات.يمكن اعتبار هذه تنسيق تخزين البيانات "العالمي" ، وبالتالي يمكن الوصول إليها من خلال معظم اللغات مع امتدادات قاعدة البيانات.يتطلب هذا بشكل عام برنامج واحد لإنهاء العملية قبل أن يتمكن البرنامج التالي من الوصول إلى قاعدة البيانات.بالإضافة إلى ذلك ، يتم كتابة جميع "الاتصالات" عمومًا على القرص.
  5. إذا كانت اللغات المعنية تعمل في نفس وقت التشغيل (أي.NET ، JVM) ، ثم يمكنك عمومًا تمرير بيانات الكائن من لغة واحدة مباشرة إلى أخرى مع القليل من المعاوقة.

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

وأعمل على مشروع مؤسسة كبيرة والتي تتألف من (في آخر إحصاء) حوالي 8 لغات. غالبية الاتصالات هي عبر باص رسالة مستوى المؤسسة التي تحتوي على روابط لعدة لغات للاستفادة من وتمرير البيانات ذهابا وإيابا. انه دعا تيبكو .

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

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

  1. استخدام لغات مختلفة معًا لإنشاء تطبيق واحد.على سبيل المثال، استخدام Java لإنشاء واجهة المستخدم الرسومية واستخدام JNI للوصول إلى C API (وبالتالي، للإجابة على سؤالك، يمكنك استدعاء وظائف C من Java؛))
  2. استخدام لغات مختلفة معًا في مشروع واحد ولكنها ليست جزءًا من نفس التطبيق.على سبيل المثال.أعمل حاليًا على تطبيق iPhone يستخدم كمية كبيرة من النص.أستخدم حاليًا ثلاث لغات Python (للعمل مع المصادر الأصلية للنص)، وSQL (لوضع نتائج تطبيق python بتنسيق يمكن الوصول إليه بسهولة من iphone sqlite3 api) وObjectiv C لإنشاء التطبيق الفعلي.على الرغم من أن المنتج النهائي سيكون فقط Objective C، فقد استخدمت لغتين أخريين للوصول إلى المنتج النهائي

هناك طرق مختلفة يمكن من خلالها استخدام لغات متعددة في مشروع واحد.بعض الأمثلة:

  • يمكنك كتابة ملف DLL بلغة C، على سبيل المثال، ثم استخدام تلك المكتبة من برنامج VB، على سبيل المثال.
  • يمكنك كتابة برنامج خادم بلغة C++، على سبيل المثال، والحصول على الكثير من تطبيقات اللغة المختلفة للعميل.
  • غالبًا ما يستخدم مشروع الويب الكثير من اللغات؛على سبيل المثال، برنامج خادم، مكتوب بلغة Java (لغة برمجة)، والذي يجلب البيانات من قاعدة بيانات باستخدام SQL (لغة استعلام)، ويرسل النتيجة إلى المتصفح بتنسيق HTML (لغة ترميزية)، والتي يمكن للمستخدم التفاعل باستخدام Javascript (لغة البرمجة النصية)...

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

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

وأبعد من ذلك هناك العديد من الطرق الأخرى التي يمكن لغات التحدث مع بعضهم البعض. في رمز العالم صافي المترجمة أسفل إلى رمز IL، الذي هو نفسه لكل لغة، وبهذه الطريقة C #، VB.Net هي كل نفس تحت غطاء محرك السيارة ويمكن أن نطلق / العمل مع بعضها البعض بسلاسة.

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

وفقط لإضافة إلى قائمة من الأمثلة، فإنه من الشائع نسبيا لتحسين التعليمات البرمجية بايثون في C أو C ++ أو الكتابة مكتبة C لربط مكتبة أخرى لبيثون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top