الهريس ، أساسيات اللغة

الصورة

مقدمة


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

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

سوف تصف هذه المقالة دليل مشروع صغير وستنظر في بناء جملة اللغة.

المتغيرات والمؤشرات الضمنية


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

أي في التعليمة البرمجية التالية ، سيتم تمرير صفيف إلى الأسلوب p (arr) كمؤشر لكائن تم إنشاؤه مسبقًا مسبقًا.

proc p(arr): ... end proc main(): arr ?= [1, 2, 3, 4, 5] p(arr) end 

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

المتغيرات المؤقتة وجامع القمامة


على عكس لغات البرمجة المماثلة ، يحتوي Mash على أداة تجميع مجمعي بيانات غير آلية ، والتي تعتمد على آلية تسميات قيمة الوقت ، بدلاً من حساب المؤشرات.

أي يقرر المطور نفسه متى يتم مسح ذاكرة القمامة ويمكنه أيضًا القيام بذلك يدويًا في بعض الحالات.

تسمى مجموعة البيانات المهملة باستخدام gc () وتحرر الذاكرة من أسفل جميع الكائنات المؤقتة.

تصاحب العديد من الإجراءات البسيطة ذات المتغيرات بإنشاء كائنات مؤقتة في الذاكرة.

يمكن للمطور التصريح صراحة تخصيص الذاكرة لمزيد من العمل معها ، أي أعلن المتغيرات للاستخدام على المدى الطويل.

أمثلة على إنشاء متغير مؤقت:

 x ?= 10 

والمتغيرات غير المحددة لمجمع البيانات المهملة:

 x ?= new(10) var x2 = 20 

مثال على استخدام gc ():

 while a > b: doSomething(a, b) gc() end 

يمكن أيضًا تحرير الذاكرة يدويًا:

 var a = 10, b = 20, c = 30 ... Free(a, b, c) 

مناطق الرؤية المتغيرة


يمكن الإعلان عن المتغيرات في Mash محليًا وعالميًا.

يتم التصريح عن المتغيرات العامة بين الطرق ، من خلال بيان var. المحلية - داخل الأساليب بأي شكل من الأشكال.

أنواع البيانات


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

أمثلة التعليمات البرمجية:

 x ?= 10 x += 3.14 x *= "3" x /= "2,45" x ?= [1, 2, 3.33, func1(1, 2, 3), "String", ["Enum type", 1, 2, 3], "3,14"] 

الاستبطان يسمح لك بتحديد نوع المتغير الذي تحتاجه:

 if typeof(x) == TypeInt: ... end 

المصفوفات و التعدادات


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

أمثلة لإعلانات المصفوفات والتعدادات:

 a ?= new[10][20] var b = new[10][20] c ?= [1, [], 3, 3.14, "Test", [1, 2, 3, 4, 5], 7.7, a, b, ["77", func1()]] var d = [1, 2, 3] 

لا يتم تحديد أي كائنات يتم الإعلان عنها من خلال المشغل الجديد لجامع البيانات المهملة.

يتم تحرير المصفوفات ، مثل الكائنات العادية في الذاكرة ، عن طريق الاتصال بـ Free ()
مثل هذا العمل مع التحويلات مريحة للغاية.

على سبيل المثال ، يمكنك الانتقال إلى أساليب أو إرجاع العديد من قيم متغير واحد منها:
 func doSomething(a, b, c): return [a+c, b+c] end 

مشغلي الاحالة


يوجد ما يصل إلى 3 مشغلي مهام في Mash.

  • ؟ =
    يعين متغير إلى مؤشر إلى كائن (إذا تم الإعلان عن متغير ولكن لا يقوم بتخزين مؤشر لكائن في الذاكرة ، يجب استخدام عامل التشغيل هذا لتعيين قيمة إليه).
  • =
    مهمة عادية. يعيّن إلى كائن بواسطة مؤشر في متغير قيمة كائن آخر.
  • @ =
    يعيّن قيمة لكائن بواسطة مؤشر صريح لهذا الكائن (سيتم مناقشته لاحقًا).

العمليات الرياضية والمنطقية


قائمة العمليات الرياضية والمنطقية المدعومة حاليًا:

  • + ، - ، * ، /
    لا تعليقات اللازمة.
  • \
    الانقسام تماما.
  • ٪
    ما تبقى من الانقسام.
  • &
    منطقي "و"
  • |
    منطقية "أو".
  • ^
    المنطقي "الحصري أو".
  • ~
    منطقية "لا".
  • ++ ، -
    الزيادة والنقصان.
  • << ، >>
    تحولات اليسار واليمين.
  • == ، <> ، > = ، <=
    عوامل المقارنة المنطقية.
  • في
    للتحقق ما إذا كان كائن ينتمي إلى تعداد أو إلى صفيف.
    مثال:
     if Flag in [1, 3, 5, 8]: ... 

مؤشرات صريحة


يبدو ، لماذا هم بحاجة إذا لم تكن هناك مؤشرات واضحة؟ على سبيل المثال ، للتحقق مما إذا كانت المتغيرات A و B تخزن مؤشرات لنفس الكائن في الذاكرة.

  • @ - الحصول على مؤشر إلى كائن ووضعه في متغير ، مثل كائن.
  • ؟ - الحصول على الكائن عن طريق المؤشر من الكائن في المتغير.
    مثال:
     a ?= ?b 

الإجراءات والوظائف


قررت جعل الفصل اللغوي بين طرق إعادة القيم إلى الإجراءات والوظائف (كما هو الحال في Pascal).

يتم إجراء تعريفات الأسلوب مثل الأمثلة التالية:

 proc SayHello(arg1, arg2, argN): println("Hello, ", arg1, arg2, argN) end func SummIt(a, b): return a + b end 

بناء اللغة


مثال إذا..else..end build.

 if <>: ... else: ... end 

للحلقة.

 for([]; <>; [  ]): ... end 

بينما يتم التحقق من الشرط قبل التكرار.

 whilst <>: ... end 

بينما. يتم التحقق من حلقة تختلف عن بينما في هذا الشرط بعد التكرار.

 until <>: ... end 

switch..case..end..else..end ... هو بناء مألوف لإنشاء فروع منطقية.

 switch <>: case < 1>: ... end case < 2>: ... end else: ... end 

دروس وعناصر لغة OOP


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

النظر في إعلان فئة بسيطة:

 class MyClass: var a, b proc Create, Free func SomeFunction end 

لا يحتوي إعلان الفصل على تطبيقات للطرق التي تم الإعلان عنها فيه.
مُنشئ الفئة هو طريقة إنشاء. كما المدمر - الحرة.

بعد الإعلان عن الفصل ، يمكنك وصف تنفيذ أساليبه:

 proc MyClass::Create(a, b): $a ?= new(a) $b ?= new(b) end proc MyClass::Free(): Free($a, $b, $) end func MyClass::SomeFunction(x): return ($a + $b) / x end 

قد تلاحظ الرمز $ في بعض الأماكن في الكود - مع هذا الرمز ، أقوم ببساطة باختصار long->. أي الرمز:

 return ($a + $b) / x ... Free($a, $b, $) 

أي ما يعادل هذا الرمز:
 return (this->a + this->b) / x ... Free(this->a, this->b, this) 

يتضمن هذا مؤشر إلى مثيل للفئة التي تسمى طريقة هذه الفئة نيابة عنها.

من أجل وراثة وظائف الفصل الدراسي ، تحتاج إلى وصف إعلان فئة جديدة بهذه الطريقة:

 class MySecondClass(MyClass): func SomeFunction end func MySecondClass::SomeFunction(x): return ($a - $b) / x end 

MySecondClass - سيكون لها مُنشئ ومدمِّر من وظيفة السلف + SomeFunction ، التي لدى فئة الأسلاف ، يتم استبدالها بواسطة دالة من فئة جديدة.

لإنشاء مثيلات فئة ، المشغل الجديد موجود.

أمثلة التعليمات البرمجية:

 a ?= new MyClass //     

 b ?= new MyClass(10, 20) //         

يمكن تحديد نوع مثيل فئة عند إنشاء هذا المثيل ؛ وبناءً عليه ، فإن تحويل النوع غائب في اللغة.

يسمح لك Introspection بتحديد نوع مثيل الفئة ، مثال التعليمات البرمجية:

 x ?= new MyClass(10, 20) ... if x->type == MyClass: // -... end 

في بعض الأحيان تحتاج إلى اللجوء إلى وظيفة فئة والكتابة عليها باستخدام وظيفة جديدة. مثال على الكود:

 func class::NewSomeFunction(x): return $x * $y * x end ... x ?= new MyClass(10, 20) x->SomeFunction ?= class::NewSomeFunction x->SomeFunction(33) // NewSomeFunction,     . 

الخاتمة


في هذه المقالة ، حاولت أن أعرض الأشخاص المهتمين المحتملين على تصميمي.

شكرا للقراءة. في انتظار التعليقات.

Source: https://habr.com/ru/post/ar437632/


All Articles