تحويل الأكواد البرمجية: بناء أداة تحول كود JavaScript إلى Python باستخدام AI
لماذا نحتاج إلى أداة ذكية لتحويل JavaScript إلى Python؟
تحويل الشيفرات بين اللغات البرمجية لم يعد مجرد رفاهية، بل أصبح حاجة عملية في فرق التطوير التي تعمل على ترحيل الخدمات، بناء أدوات داخلية، أو إعادة استخدام المنطق البرمجي في بيئات مختلفة. لكن التحويل الحرفي من JavaScript إلى Python غالباً ما يفشل، لأن كل لغة تملك فلسفة مختلفة في التعامل مع المتغيرات، النطاقات، البرمجة غير المتزامنة، وهياكل البيانات.
هنا تظهر قوة نماذج اللغة الكبيرة LLMs. بدلاً من استبدال الكلمات المفتاحية فقط، يستطيع النموذج فهم النية البرمجية Intent ثم إعادة صياغة المنطق في لغة الهدف بأسلوب طبيعي وقابل للتنفيذ. وإذا أضفنا طبقة تحقق وهيكلة واضحة للمدخلات والمخرجات، يمكننا بناء أداة عملية تترجم الأكواد مع شرح للأجزاء الحساسة، وليس مجرد ناتج خام.
المعمارية الهندسية للأداة
الأداة التي سنبنيها تعتمد على معمارية من أربع طبقات، وهي مناسبة جداً لتطبيقات الذكاء الاصطناعي الإنتاجية:
- طبقة الإدخال: تستقبل كود
JavaScriptمن المستخدم. - طبقة التوجيه: تنشئ برومبت هندسي منظم يشرح للنموذج المطلوب بدقة.
- طبقة التوليد: ترسل الطلب إلى
LLMعبر واجهةAPI. - طبقة التحقق: تعالج المخرجات وتفصل الكود عن الشرح، ويمكن لاحقاً اختبار الكود أو تقييمه آلياً.
هذا التصميم ليس مبالغاً فيه؛ بل هو ما يجعل الأداة قابلة للتطوير لاحقاً. فمثلاً يمكن إضافة طبقة مخرجات مهيكلة بصيغة JSON أو دمج قاعدة معرفة خاصة بالتحويلات البرمجية باستخدام نظام RAG إذا احتجنا قواعد تحويل داخلية خاصة بالشركة.
تدفق البيانات داخل النظام
- المستخدم يرسل دالة أو ملف كود بلغة
JavaScript. - النظام ينظف الإدخال ويضعه داخل قالب طلب ثابت.
- يتم إرسال البرومبت إلى النموذج مع إعدادات منخفضة الإبداع مثل
temperatureالمنخفضة للحفاظ على الدقة. - النموذج يعيد كود
Pythonمع ملاحظات حول الفروقات الدلالية. - يمكن للنظام حفظ الناتج أو تمريره إلى واجهة ويب أو
API.
إعداد البيئة البرمجية
قبل البدء، نحتاج إلى بيئة تشغيل مناسبة. إذا لم تكن جهزت بيئة العمل سابقاً، راجع مقال تثبيت مكتبات Python الأساسية للتعامل مع الذكاء الاصطناعي. سنستخدم هنا LangChain لتغليف التدفق البرمجي بشكل أنظف.
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0.1
)
prompt = ChatPromptTemplate.from_messages([
("system", "You are an expert software migration assistant. Convert JavaScript code to clean, executable Python. Preserve logic, explain major differences briefly, and avoid unnecessary commentary."),
("human", "Convert the following JavaScript code to Python:\n\n{js_code}")
])
chain = prompt | llm
هذا البناء يعتمد على مفهوم السلاسل Chains في إطار LangChain، حيث يتم تمرير المدخلات تلقائياً من قالب الطلب إلى النموذج.
تصميم البرومبت بشكل هندسي
نجاح الأداة لا يعتمد فقط على النموذج، بل على صياغة التعليمات. عند تحويل الأكواد، يجب أن نحدد للنموذج ما يلي:
- أن المطلوب هو تحويل دلالي وليس ترجمة حرفية.
- أن يحافظ على أسماء الدوال إذا أمكن.
- أن يحول الأساليب غير المتزامنة بما يناسب
Python. - أن يشرح فقط النقاط التي تغير فيها السلوك.
- أن يعيد الإخراج بشكل منظم وسهل التحليل.
حوّل كود JavaScript التالي إلى Python مع الحفاظ على نفس المنطق الوظيفي. إذا كان الكود يحتوي على Promise أو async/await فحوّله إلى النمط المناسب في Python. أعد النتيجة في قسمين واضحين: Python Code ثم Notes. لا تضف شروحات عامة خارج هذين القسمين.
هذا النمط ينسجم مع أفضل ممارسات تحسين جودة الردود باستخدام Few-Shot Prompting إذا قررت مستقبلاً إضافة أمثلة تحويل ناجحة داخل البرومبت.
تنفيذ أداة التحويل عملياً
الآن سنكتب دالة تنفيذية تستقبل الكود وتعيد الناتج النصي من النموذج:
def convert_javascript_to_python(js_code: str) -> str:
response = chain.invoke({"js_code": js_code})
return response.content
sample_js = """
function calculateTotal(items) {
let total = 0;
for (let item of items) {
total += item.price;
}
return total;
}
"""
result = convert_javascript_to_python(sample_js)
print(result)
هذا المثال بسيط، لكنه يوضح نقطة مهمة: الأداة لا تعتمد على Regex أو قواعد ثابتة فقط، بل تستفيد من فهم النموذج للبنية المنطقية. لذلك يمكنها التعامل مع الحلقات، الشروط، والمصفوفات بطريقة أذكى من المحولات التقليدية.
مثال على المخرجات المتوقعة
Python Code
def calculate_total(items):
total = 0
for item in items:
total += item[“price”]
return totalNotes
تم تحويل الحلقة for…of إلى حلقة for في Python، وتم افتراض أن كل عنصر داخل items عبارة عن قاموس يحتوي على المفتاح price.
إخراج مهيكل لتسهيل المعالجة الآلية
إذا كنت تريد تحويل الأداة إلى خدمة إنتاجية، فالأفضل أن تطلب من النموذج إرجاع مخرجات مهيكلة. هذا يسهل عرض الكود في الواجهة، وتخزين الملاحظات، وتمريرها إلى أنظمة أخرى. ويمكنك الاستفادة من مقال إجبار الذكاء الاصطناعي على الرد بصيغة JSON فقط.
structured_prompt = ChatPromptTemplate.from_messages([
("system", "Return valid JSON only with keys: python_code, notes."),
("human", "Convert this JavaScript code to Python:\n\n{js_code}")
])
structured_chain = structured_prompt | llm
response = structured_chain.invoke({"js_code": sample_js})
print(response.content)
بهذا الشكل، يصبح من السهل لاحقاً ربط الأداة بواجهة Streamlit أو تحويلها إلى خدمة مستقلة باستخدام FastAPI.
التحديات الواقعية في تحويل الأكواد
رغم قوة النماذج، هناك تحديات هندسية يجب الانتباه لها:
- اختلاف نموذج التنفيذ: بعض مفاهيم
JavaScriptلا تملك مقابلاً مباشراً. - السياق المفقود: إذا أرسلت دالة مقتطعة بدون تعريفات محيطة، فقد يفترض النموذج تفاصيل غير دقيقة.
- استهلاك الرموز: الملفات الكبيرة قد ترفع التكلفة، لذلك يفيدك فهم إدارة
Tokens. - التحقق بعد التوليد: لا يجب الوثوق بالناتج دون مراجعة أو اختبار.
وفي المشاريع الأكبر، يمكن استخدام طبقات تقييم تلقائي مستوحاة من مقال التقييم الآلي لمقارنة ناتج التحويل مع حالات اختبار متوقعة.
كيف تطور الأداة إلى منتج حقيقي؟
إذا نجحت النسخة الأولية، يمكنك تطويرها عبر الخطوات التالية:
- إضافة واجهة إدخال ونسخ الناتج.
- دعم ملفات كاملة بدلاً من دوال منفردة.
- إضافة
Streamingلعرض الناتج تدريجياً كما في البث المباشر للردود. - بناء قاعدة أمثلة تحويل داخلية باستخدام
Embeddingsوقواعد البيانات المتجهةVector DBs. - حماية البرومبت ضد المدخلات الخبيثة بالاعتماد على ممارسات منع
Prompt Injection.
خلاصة هندسية
بناء أداة تحول كود JavaScript إلى Python باستخدام الذكاء الاصطناعي هو مثال ممتاز على كيفية تحويل LLMs من أدوات محادثة إلى مكونات هندسية إنتاجية. القيمة الحقيقية لا تكمن في إرسال كود للنموذج فقط، بل في تصميم تدفق منضبط: إدخال نظيف، Prompt واضح، إعدادات دقيقة، ومخرجات قابلة للمعالجة والاختبار.
وعندما تنظر للأداة بهذه العدسة الهندسية، ستكتشف أنها ليست مجرد مترجم شيفرات، بل نواة لنظام أكبر يمكن توسيعه ليشمل مراجعة الكود، إعادة الهيكلة Refactoring، أو حتى الترحيل بين أطر العمل والأنظمة المختلفة.