لغة برمجة V مفتوحة المصدر

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

بناء جملة V مشابه جدًا لـ Go، حيث يستعير بعض البنيات من Oberon وRust وSwift. اللغة مبسطة قدر الإمكان، وبحسب المطور فإن 30 دقيقة من الدراسة تكفي لتعلم الأساسيات توثيق. وفي الوقت نفسه، تظل اللغة قوية جدًا ويمكن استخدامها لأداء نفس المهام عند استخدام لغات البرمجة الأخرى (على سبيل المثال، تتوفر المكتبات للرسومات ثنائية وثلاثية الأبعاد وإنشاء واجهات المستخدم الرسومية وتطبيقات الويب).

كان الدافع وراء إنشاء لغة جديدة هو الرغبة في تحقيق مزيج من بساطة بناء الجملة للغة Go، وسرعة الترجمة، وسهولة توازي العمليات، وقابلية النقل وقابلية الصيانة للتعليمات البرمجية مع أداء C/C++، وأمن Rust و توليد كود الآلة في مرحلة تجميع Zig. أردت أيضًا الحصول على مترجم مدمج وسريع يمكنه العمل دون تبعيات خارجية، والتخلص من النطاق العام (المتغيرات العامة) وتوفير القدرة على إعادة تحميل التعليمات البرمجية "الساخنة".

بالمقارنة مع C++، فإن اللغة الجديدة أبسط بشكل ملحوظ، وتوفر سرعة تجميع أسرع (تصل إلى 400 مرة)، وتمارس تقنيات برمجة آمنة، وخالية من مشاكل السلوك غير المحدد، وتوفر أدوات مدمجة لموازنة العمليات. بالمقارنة مع بايثون، V أسرع وأبسط وأكثر أمانًا وأكثر قابلية للصيانة. مقارنةً بـ Go، لا تحتوي V على متغيرات عامة، ولا توجد قيم خالية، ويجب دائمًا تعريف جميع قيم المتغيرات، وجميع الكائنات غير قابلة للتغيير افتراضيًا، ويتم دعم نوع واحد فقط من التعيين ("a := 0")، وهو أكثر إحكاما بشكل ملحوظ وقت التشغيل وحجم الملفات القابلة للتنفيذ الناتجة، ووجود إمكانية النقل المباشر من لغة C، وغياب أداة تجميع البيانات المهملة، والتسلسل الأسرع، والقدرة على استيفاء السلاسل ("println('$foo: $bar.baz')").

fn main () {
المجالات:= ['لعبة'، 'ويب'، 'أدوات'، 'علم'، 'أنظمة'، 'واجهة المستخدم الرسومية'، 'جوال'] أ:= 10
إذا كان هذا صحيحا {
إلى: = 20
}
للمنطقة في المناطق {
println('مرحبًا، مطوري منطقة $!')
}
}

مميزات المشروع:

  • مترجم مدمج وسريع، والذي يستغرق مع المكتبة القياسية حوالي 400 كيلو بايت. يتم تحقيق سرعة التجميع العالية من خلال التوليد المباشر لرمز الآلة ونمطيتها. تبلغ سرعة التجميع ما يقرب من 1.2 مليون سطر من التعليمات البرمجية في الثانية على نواة واحدة لوحدة المعالجة المركزية (يُلاحظ أنه أثناء العملية V يمكن استخدام C، ثم تنخفض السرعة إلى 100 ألف سطر في الثانية). يستغرق التجميع الذاتي للمترجم، والذي يتم كتابته أيضًا بلغة V (توجد أيضًا نسخة مرجعية في Go)، حوالي 0.4 ثانية. بحلول نهاية العام، من المتوقع أن يتم الانتهاء من العمل على تحسينات إضافية، مما سيؤدي إلى تقليل وقت إنشاء المترجم إلى 0.15 ثانية. بناءً على الاختبارات التي أجراها المطور، يتطلب التجميع الذاتي لـ Go 512 ميجابايت من مساحة القرص ويتم تشغيله في دقيقة ونصف، ويتطلب Rust 30 جيجابايت و45 دقيقة، وGC - 8 جيجابايت و50 دقيقة، وClang - 90 جيجابايت و 25 دقيقة،
    سويفت - 70 جيجابايت و90 دقيقة؛

  • يتم تجميع البرامج في ملفات قابلة للتنفيذ دون تبعيات خارجية. يبلغ حجم الملف القابل للتنفيذ لخادم http البسيط بعد التجميع 65 كيلو بايت فقط؛
  • أداء التطبيقات المترجمة يكون على مستوى تجميعات برامج C؛
  • القدرة على التفاعل بسلاسة مع كود C، دون أي تكاليف إضافية. يمكن استدعاء الوظائف في لغة C من التعليمات البرمجية في لغة V، وبالعكس، يمكن استدعاء التعليمات البرمجية في لغة V بأي لغة متوافقة مع C؛
  • دعم ترجمة مشاريع C/C++ إلى تمثيل بلغة V. يتم استخدام محلل من Clang للترجمة. لم يتم دعم كافة ميزات معيار C حتى الآن، ولكن القدرات الحالية للمترجم كافية بالفعل ترجمة بلغة لعبة V DOOM. لا يزال مترجم C++ في مرحلة مبكرة من التطوير؛
  • دعم تسلسلي مدمج، دون التقيد بوقت التشغيل؛
  • تقليل عمليات تخصيص الذاكرة؛
  • ضمان السلامة: لا يوجد NULL ومتغيرات عامة وقيم غير محددة وإعادة تعريف المتغير. المدمج في التحقق من تجاوز المخزن المؤقت. دعم الوظائف العامة (عامة). الكائنات والهياكل التي لا يمكن تغييرها بشكل افتراضي؛
  • إمكانية إعادة تحميل التعليمات البرمجية "الساخنة" (التي تعكس التغييرات في التعليمات البرمجية بسرعة دون إعادة الترجمة)؛
  • أدوات لضمان تعدد الخيوط. تمامًا كما هو الحال في لغة Go، يتم استخدام بنية مثل "run foo()" لبدء سلسلة تنفيذ جديدة (على غرار "go foo()"). في المستقبل، تم التخطيط لدعم goroutines وجدولة الخيط؛
  • دعم أنظمة التشغيل Windows وmacOS وLinux و*BSD. ومن المخطط إضافة دعم لنظامي التشغيل Android وiOS بحلول نهاية العام؛
  • إدارة الذاكرة في وقت الترجمة (كما هو الحال في Rust)، دون استخدام أداة تجميع البيانات المهملة؛
  • توفر مجموعة أدوات متعددة المنصات لإخراج الرسومات، باستخدام GDI+/Cocoa وOpenGL للعرض (من المخطط دعم DirectX وVulkan وMetal APIs). هناك أدوات للعمل مع الكائنات ثلاثية الأبعاد والرسوم المتحركة الهيكلية والتحكم في الكاميرا؛
  • توفر مكتبة لإنشاء واجهات رسومية مع عناصر التصميم الأصلية لكل نظام تشغيل. يستخدم Windows WinAPI/GDI+، ويستخدم macOS Cocoa، ويستخدم Linux مجموعته الخاصة من الأدوات. المكتبة مستخدمة بالفعل في التطوير فولت — عميل Slack وSkype وGmail وTwitter وFacebook؛

    تتمثل الخطة في إنشاء تطبيق تصميم واجهة يشبه دلفي، وتوفير واجهة برمجة تطبيقات تعريفية مشابهة لـ SwiftUI وReact Native، وتوفير الدعم لإنشاء تطبيقات الهاتف المحمول لنظامي التشغيل iOS وAndroid؛

    لغة برمجة V مفتوحة المصدر

  • توفر إطار ويب مدمج، يُستخدم لإنشاء موقع ويب ومنتدى ومدونة لمطوري المشروع. يتم دعم التجميع المسبق لقوالب HTML، دون معالجتها عند كل طلب؛
  • دعم التجميع المتقاطع. لإنشاء الملف القابل للتنفيذ لنظام التشغيل Windows، ما عليك سوى تشغيل "v -os windows"، ولنظام التشغيل Linux - "v -os linux" (من المتوقع دعم التجميع المتقاطع لنظام التشغيل macOS لاحقًا). يعمل التجميع المتقاطع أيضًا مع التطبيقات الرسومية؛
  • مدير التبعية المدمج ومدير الحزم وأدوات البناء. لبناء البرنامج، فقط قم بتشغيل "v"، دون استخدام أدوات مساعدة خارجية. لتثبيت مكتبات إضافية، ما عليك سوى تشغيل، على سبيل المثال، "v get sqlite"؛
  • توفر المكونات الإضافية للتطوير بلغة V في المحررين قانون VS и همة.

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

وفي الوقت نفسه، تمت إزالة حوالي 10 منشورات من أداة تعقب الأخطاء في Project V توضيح يشير رمز الجودة المنخفضة، على سبيل المثال، إلى استخدام C-inserts واستخدام وظائف المكتبة لحذف دليل الأمر rm من خلال الاستدعاء os.system("rm -rf $path"). مؤلف المشروع وذكربأنه قام بحذف الرسائل فقط، نشرت القزم (مع التغييرات التي تؤكد صحة النقد، остались в تحرير التاريخ).

المصدر: opennet.ru

إضافة تعليق