قم بإنشاء لغة البرمجة الخاصة بك (I)

تطور لغات البرمجة

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

ربما تتساءل: «آلة افتراضية؟ لكن أليس هذا صعبًا للغاية وهل يؤدي أيضًا إلى إبطاء البرامج؟ " في المقابل ، فإن الآلة الافتراضية البسيطة بسيطة جدًا وسريعة نسبيًا. لقد اخترت Rust كلغة للجهاز الظاهري. ولكن ما هو Rust?

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

Rust يثبت في لينكس بطريقة بسيطة. ومع ذلك ، لا يوجد طرد رسمي. مستخدمو أوبونتو يمكنك إضافة هذين المؤسسة العامة للتقاعد: ppa: hansjorg / الصدأ  y ppa: cmrx64 / البضائع، مستخدمو قوس يمكن استخدام AUR (بوابة البضائع هي الحزمة التي تثبت كل شيء). يمكن للباقي استخدام:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

كيف تعمل الآلة الافتراضية؟

إذا كنت تعرف كيف يعمل عالم المجمّع ، فسيكون هو نفسه تمامًا ، مع المكدس أو المكدس. إذا لم يكن كذلك ، فسأشرح لك ذلك. دعنا نتخيل الكود التالي:

اطبع 2 + 3

لا يفهم الكمبيوتر ما تعنيه 2 + 3 ولا يعرف الترتيب الذي يجب اتباعه. تعمل أجهزة الكمبيوتر مع البطاريات أو المداخن التي يتم فيها تجميع البيانات واستخراجها باستمرار. يجب أن يبدو هذا الرمز الموجود في جهازنا الافتراضي كما يلي:

دفع 2 دفع 3 إضافة طباعة

في الأساس ، نضع الرقم 2 في المكدس في الأعلى ، والثالث أيضًا. ستقوم ADD بسحب (أي إزالتها من المكدس والحصول على قيمتها) آخر عنصرين على المكدس وإضافة النتيجة إلى الجزء العلوي من المكدس. سوف تأخذ PRINT العنصر الأخير في المكدس وتستخدمه لعرضه لنا. الآن دعونا نفعل ذلك في Rust.

يجب علينا أولاً تحديد لغة لـ البايت كود، يمكننا استخدام واحد موجود مثل الموجود في جافا أو CLR NET / Mono ، لكننا سننشئ واحدة أكثر أساسية.

https://gist.github.com/a01de8904fd39a442c20

نستخدم تدوينًا سداسيًا عشريًا لكل تعليمات. على ارتفاع وضعنا # [اشتقاق (FromPrimitive)]، هي خصوصية Rust وسيساعدنا لاحقًا على أن نتمكن من مقارنة التعداد بالبايت مباشرةً.

الآن يجب علينا عمل وظيفة تنفذ كل من هذه التعليمات. لهذا يجب أن نقرأ البايت ونقارنه بالتعليمات التي لدينا في العد. إذا وجدت أي شيء موجود ، يجب عليك تنفيذ الإجراء الخاص بك.

https://gist.github.com/8950ce212a2de2f397f9

نقوم بذلك لقراءة كل بايت على حدة وتنفيذها:

https://gist.github.com/12e24a1f0dd65e4cd65d

كما ترى ، فإننا نفرق إذا حصلنا على أمر PUSH (الأمر INTEGER) من قبل ، فسيتم نقل البايت التالي بالكامل إلى المكدس. هناك نستخدم وظيفتين لم أعلمهما إياهما ، self.pop () y self.push ()، والتي من الواضح أنها مسؤولة عن التعامل مع المكدس.

https://gist.github.com/54147f853a8a2b8c01d9

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

https://gist.github.com/99b1ab461318b3a644d0

يمكن قراءة هذا الرمز الثانوي من ملف ، ولكن هنا من أجل البساطة قمت بتخزينه في متغير. إذا قمنا بتنفيذها ، فستعطينا النتيجة المتوقعة:

يقوم Perin v0.1 Perin VM بتنفيذ FlopFlip bytecode بدءًا من مثيل PerinVM PerinVM v0.1.0 بقيمة عدد صحيح 5

كل الكود متاح في GitHub جيثب: تحت ال رخصة أباتشي 2.0: https://github.com/AdrianArroyoCalle/perin. لتجميع يجب أن يكون لديهم حمولة تثبيت ووضع:

بناء الشحن && ./target/main

في الفصل التالي سنرى المزيد عن لغة البرمجة لدينا.


اترك تعليقك

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها ب *

*

*

  1. المسؤول عن البيانات: ميغيل أنخيل جاتون
  2. الغرض من البيانات: التحكم في الرسائل الاقتحامية ، وإدارة التعليقات.
  3. الشرعية: موافقتك
  4. توصيل البيانات: لن يتم إرسال البيانات إلى أطراف ثالثة إلا بموجب التزام قانوني.
  5. تخزين البيانات: قاعدة البيانات التي تستضيفها شركة Occentus Networks (الاتحاد الأوروبي)
  6. الحقوق: يمكنك في أي وقت تقييد معلوماتك واستعادتها وحذفها.

  1.   رودر قال

    الفضول المثير للاهتمام ، على الرغم من أنه ليس مفيدًا جدًا في الواقع ، إلا أنه لا يضر بالمعرفة.

    إنه لأمر رائع أن تعلن عن Rust ، إنها لغة تعد بالكثير ، ليس فقط لأنها أكثر أمانًا من C ++ ، ولكنها (في الوقت الحالي) أوضح في تركيبها.

    بالنسبة للصورة ، لن أعتبر تطور جافا XD.

    1.    رودر قال

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

      1.    كريه قال

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

      2.    جون قال

        ربما تكون لغة Fortran هي اللغة العظيمة الأخرى جنبًا إلى جنب مع C. لا يزال اليوم في الأسئلة الحرجة حقًا واحدًا أو آخر.

        وسيكون من المثير للجدل أن تكون فورتران بمثابة "تطور" للغة C ، في حين أنه ربما ينبغي أن يكون العكس ، حيث أن لغة C أحدث وأكثر حداثة ولديها إمكانيات أكبر ؛ على الرغم من أن أحدهما لا ينفصل عن الآخر في أقل تقدير.

        على الرغم من أن المواقف النهائية كلها قابلة للنقاش من وجهة نظر ما.

    2.    فرانسيسكو قال

      +1 لجافا

  2.   بورتارو قال

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

  3.   com.usergnulinux قال

    ما هو الغرض الحقيقي من إنشاء لغة برمجة جديدة؟ يبدو لي شخصيًا أنها خدعة لإخفاء شفرة المصدر.

  4.   ييلي قال

    صديقي ، ما الذي حدث لاستمرار "نظام التشغيل الخاص بك"؟ لا تتركها هناك من فضلك تابعها.

    في الواقع ، أنت سيد وقد أسرت هاتان الأغنيتان انتباهي تمامًا ، لكني لا أرغب في التوقف في منتصف الطريق.

    أعلم أن الكثيرين منا يفكرون في الأمر نفسه وننتظر استمرار واستنتاجات هذه الموضوعات الشيقة للغاية.

  5.   كريستيان ديفيد قال

    ممتع جدا ، شكرا جزيلا لك. 🙂

  6.   صريح قال

    أنا لا أعتبر جافا لغة برمجة ، بل هي مترجم أوامر ، لأنها غير قابلة للترجمة

    1.    ماريو قال

      [لغة البرمجة هي لغة رسمية مصممة للتعبير عن العمليات التي يمكن أن تنفذها الآلات مثل أجهزة الكمبيوتر.]

      لهذا السبب ، تعد Java لغة برمجة. حتى لغة Bash (لغة Linux shell) هي لغة برمجة بحد ذاتها.

      هناك نوعان من اللغات:
      - تجميع وانتاج
      - مترجم
      - مختلط (يتم تجميع الأجهزة الافتراضية والمكتبات الأصلية وتفسير الشفرة الوظيفية)

      المترجمون الفوريون مفيدون للغاية عندما يتعلق الأمر بمنصات متعددة وليس لديهم أداء كارثي لذلك. Java و VB.NET و C ++ .NET و F # و C # كلها لغات مختلطة. لغة bash و bat و PHP و Javascript وغيرها الكثير هي لغات مفسرة.

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

      ولماذا لا؟ حتى لغة الآلة لا يمكن اعتبارها لغة لأنها في الحقيقة مجرد مجموعة من الأوامر "يفسرها" المعالج.

      لأن جميع اللغات بشكل فعال ليست أكثر من مجموعة من الأوامر التي يتم تفسيرها بواسطة المعالج.

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

    2.    ماريو قال

      😐 أتمنى ألا أبدو وقحًا جدًا

      1.    ماريا أنطونييتا دي مانويلا كارديناس قال

        لا هدوء أنت فقط دمرت حياتنا

      2.    ماريو قال

        هاهاهاهاها ، بيردوون. لم يكن في نيتي xD

    3.    كارلوس قال

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

  7.   إلياس مونجيلوس قال

    معلومات جيدة جدا

  8.   كارلوس أرتورو قال

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