Umka: لغة برمجة نصية جديدة مكتوبة بشكل ثابت


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

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

الدوافع


عادة ما تسمى الميزة الأولى للكتابة الديناميكية بتقصير دورة التطوير / التصحيح وتوفير وقت المبرمج. في خطر استياء الجمهور ، يجب أن أعترف بأن تجربتي الخاصة لا تؤكد ذلك بأي شكل من الأشكال. في كل مرة بعد تصحيح بسيط للنص البرمجي للتدريب على الشبكة العصبية في Python ، يجب أن أنتظر تحميل Python و NumPy و PyTorch وقراءة مجموعة كبيرة من البيانات من الملفات ونقلها إلى GPU وبدء المعالجة - وعندها فقط يكتشف أن PyTorch يتوقع موترًا بحجم (1 ، 1 ، م ، ن ، 3) بدلاً من (1 ، م ، ن ، 3).

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

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

لذلك كانت هناك لغة تحمل اسم قطة تحمل اسم دب.

لسان


بناء الجملة في اللغة ككل مستوحى من Go. يمكن العثور على أمثلة على تراكيب النحو في صفحة المشروع . عند التصريح عن المتغيرات ، يمكن استخدام تدوين الاختصار مع استدلال النوع. الجدير بالذكر هو الانحراف عن قواعد Go في سياق المؤشرات. اشتكى مبدعو Go من أن اتباع المثال C حرفياً تبين أنه من التعقيدات غير الضرورية لبناء الجملة هنا وأنه سيكون من المعقول أكثر إدخال عامل إلغاء الإشارة postfix مثل Pascal p^بدلاً من ذلك *p. هذا بالضبط ما فعلته أومكا.

مترجميتم تجميع Umka في رمز البايت ، ثم يتم تنفيذه بواسطة الجهاز الظاهري للمكدس. تتم جميع عمليات التحقق من النوع في مرحلة التجميع. لم تعد البيانات الموجودة على المكدس تحمل أي نوع من المعلومات. يأتي المترجم في شكل مكتبة ديناميكية مع واجهة برمجة التطبيقات الخاصة بها و "غلاف" صغير - الملف القابل للتنفيذ. تم كتابة كود المصدر في C99 ونقله إلى منصات مختلفة. يبني للمعالج إكس86-64 و(Windows و Linux) صدر الآن .

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

يتم توفير تعدد الأشكال من خلال واجهات نمط Go. لا توجد مفاهيم للطبقة ، والشيء ، والميراث.

تعدد المهامويستند إلى مفهوم "الألياف" - التدفقات المبسطة التي تعمل داخل نفس الجهاز الظاهري وتسبب بعضها البعض بشكل واضح. في الجوهر ، هذا مرادف لل corotines. نظرًا لأن منطق استخدام هذه الكورونات ينحرف قليلاً عن تقليد Go ويصبح أقرب إلى Lua و Wren ، فمن المنطقي إعطاء عينة رمز:

fn childFunc(parent: std.Fiber, buf: ^int) {
    for i := 0; i < 5; i++ {
        std.println("Child : i=" + std.itoa(i) + " buf=" + std.itoa(buf^))
        buf^ = i * 3
        fibercall(parent)
    }
}

fn parentFunc() {
    a := 0
    child := fiberspawn(childFunc, &a)    
    for i := 0; i < 10; i++ {
        std.println("Parent: i=" + std.itoa(i) + " buf=" + std.itoa(a))
        a = i * 7
        if fiberalive(child) {
            fibercall(child)
        }
    }    
    fiberfree(child)
}

أمثلة


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

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

صورة

All Articles