تي سكريبت

TScript هي لغة برمجة نصية قابلة للتضمين وموجهة للكائنات للغة C++ ، تدعم المتغيرات المؤقتة الهرمية (TVariable). يتمثل معيار تصميمها الرئيسي في إنشاء لغة برمجة نصية تتفاعل مع C++، لتحويل البيانات وإرجاع النتيجة. وهذا يُمكّن تطبيقات C++ من تغيير وظائفها بعد التثبيت.

مثال "مرحباً بالعالم"

مثال أساسي لبرنامج "Hello World!" مكتوب بلغة TScript.

CTScript ts ; ts.SetParameter ( CTScript :: SOURCE_STRING , 0 , TEXT ( "main(){" ) TEXT ( " System::MessageBox(L " Hello World! " ) ;" ) TEXT ( "}" ) ); ts.ExecuteStaticMethod ( );

المتغيرات التلفزيونية

يمكن تعريف المتغير القياسي [ 2 ] كبيانات ثابتة مثل قيمة منطقية أو عدد صحيح أو عدد عشري، أو كمتغير ذي طول متغير مثل سلسلة ASCII أو سلسلة أحرف عريضة أو سلسلة ثنائية. يمكن استخدام نوع البيانات لتعريف المتغير، أو يمكن تحديد النوع صراحةً، فعلى سبيل المثال، variable myInteger = 0;سيقوم الكود التالي بإنشاء متغير باسم myInteger وتعيين قيمته إلى صفر. كما يمكن تعريف نوع Integer، Integer myInteger;وستكون قيمته الافتراضية صفرًا.

المتغيرات TVariable هرمية بطبيعتها وتشبه إلى حد كبير متغيرات XML و JavaScript و PHP .

يُعدّ نوع TVariable نوعاً عابراً أيضاً، إذ يمكن تحويل قيمة عدد صحيح (Integer) إلى قيمة نصية (AString) إما بتعيين قيمة نصية له أو بتحويل المتغير إلى نوع AString. على سبيل المثال، بعد إنشاء متغير عدد صحيح واستخدامه، يمكن إعادة تعيين قيمته بتحويله إلى قيمة نصية (AString).

يمكن استخدام المتغيرات من نوع TVariables لتخزين مصفوفة من المتغيرات من نوع TVariables. بمجرد إنشاء متغير صالح، يمكن استخدام ترميز فهرسة المصفوفة لتحويله إلى مصفوفة، فعلى سبيل المثال، variable list = {0,2,4,6};سيُنشئ الكود التالي مصفوفة بأربعة عناصر. سيكون نوع TVariable لـ "list.type" هو نوع بنية، وسيكون كل عنصر من عناصرها list[0].typeعددًا صحيحًا (Integer).

تُشبه الفئات في TScript المصفوفات في طريقة تعامل TVariable معها، لكنها تستخدم السلاسل النصية كنصوص مصفوفة. على سبيل المثال، سيُنشئ الكود التالي متغيرًا مُهيكلًا حيث تكون قيمة `list.Monday` صحيحة وقيمة `list.Tuesday` خاطئة. في كود C++ الأصلي، يُمكن الوصول إلى عناصر TVariable المُهيكلة في C++ باستخدام `-` أو `-` في الكود الأصلي.variablelist={"Monday"=>true,"Tuesday"=>false};list["Monday"];list.Mondaylist["Monday"]

المتغيرات المُعرَّفة (الفئات)

يدعم TScript المتغيرات الهرمية، مما يُمكّنه من تخزين كلٍ من المتغيرات الأولية والمعقدة ضمن بنية متغيرات واحدة. [ 3 ] وهذا يُلغي أي شرط لوجود فرق جوهري بين البيانات الأولية والبيانات المهيكلة، وبالتالي يجعل بنية الفئة عبارة عن تجميع منطقي للوظائف بدلاً من كونها نوعاً لتخزين البيانات.

تُطبّق لغة TScript مفاهيم الوراثة وتغليف التعليمات البرمجية من خلال المتغيرات المُعرّفة. على سبيل المثال، يُظهر مقتطف التعليمات البرمجية التالي متغيرين مُعرّفين هما Foo و Bar يدعمان دالة إنشاء.

متغير Bar { عدد صحيح minimum ، عدد صحيح maximum ؛ Bar () { this.minimum = 1 ؛ } }variable Foo extends Bar { WString name ; Foo ( WString name ){ this . name = name ; this . Bar (); } }public main (){ Foo foo ( L "Goo" ); System :: MessageBox ( foo . ToString ()); }

تعريفات الدوال

من السمات البارزة الأخرى للغة TScript تعريفات الدوال، [ 4 ] التي تستخدم معاملات الإخراج بدلاً من قيم الإرجاع ، وتوفر دعمًا نحويًا لها. تأخذ الدالة القياسية في العديد من لغات البرمجة الإجرائية، تبعًا للغة Algol، الشكل التالي:

[ نوع الإرجاع ] < اسم الدالة >([ متغير الإدخال ], ...) .

في لغة TScript، تم تغيير هذا النمط إلى الشكل التالي:

< اسم الدالة >([ متغير الإدخال ],...  :[ متغير الإخراج ],...) .

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

أدى السماح للدوال باحتواء قائمة من متغيرات الإدخال والإخراج مفصولة بفاصلة منقوطة (":") إلى تغيير طريقة استدعاء الدوال واستخدامها. يُغني هذا عن استخدام مؤشرات المراجع لإرجاع متغيرات متعددة، وهو أمر شائع في لغتي C/C++، بل ويمنع استخدام المراجع في معظم لغات البرمجة النصية الأخرى، مما يُجبر على استخدام بنية أو مصفوفة لإرجاع قيم متعددة.

الأمر الثاني الملحوظ في اصطلاحات الاستدعاء هو أن جميع الدوال الآن تتضمن آلية مدمجة لمعالجة الأخطاء، على غرار لغتي C++ و Java. في TScript، بما أن جميع الدوال تُرجع خطأً، فإن عبارة `return` تعمل بشكل مشابه لعبارة `throw`. على سبيل المثال، العبارة `return error = "Have an error message";` ستنهي الدالة وتعيد رسالة الخطأ. أما العبارة الفارغة `return;` فستنهي الدالة دون إرجاع أي خطأ.try{}catch(){}thrownewException()

مثال على قيم إرجاع متعددة

public TextExtent ( WString text : Integer width , Integer height ) { text = text.Fragment ( L " \ n " ) ; for ( height = width = 0 ; height < text.length ; height ++ ) { if ( width < text [ height ] .length ) width = text [ height ] .length ; } }

تدوين مختصر

لتسهيل الأمر، توفر لغة TScript دالة مختصرة تُستدعى في حالة وجود متغير واحد فقط مُعاد. سيحل هذا الترميز محل حالة . يمنع هذا الترميز المختصر الكود المُستدعي من رصد أي أخطاء، وسيتم إرجاعها تلقائيًا إلى الكود المُستدعي الأصلي.function(:variable);forvariable=function();

معالجة الأخطاء

تُعالج الأخطاء في العديد من اللغات الأخرى باستخدام الاستثناءات . يستخدم TScript عملية مشابهة لمعالجة الأخطاء، [ 5 ] وإن كانت تختلف قليلاً. يحتوي TScript على متغير خطأ عام مشابه لمتغير errno التقليدي في لغة C، إلا أن متغير الخطأ في TScript قادر على استيعاب كلٍ من رمز الخطأ ورسالة الخطأ التفصيلية.

في العديد من اللغات التي تستخدم هذا التركيب، يُعاد الخطأ عبر عبارة catch، مما قد يُعيق سير عمل الكود في الحالات التي يُمكن فيها استعادة بعض الأخطاء. أما TScript، فتستخدم هذا التركيب الذي يسمح للكود المُستدعي بتصفية الخطأ، ما قد يُتيح استعادة الكود والعودة إلى العمل الطبيعي، أو إعادة الخطأ إلى الدالة المُستدعِية نفسها.try{...}catch(...){...}if(...){...}else{...}

مثال على إرجاع الأخطاء ومعالجتها

function (){ return error = -1 ;}public main () { if ( ! function ()) { if ( error != -1 ) return error ; } System :: MessageBox ( L "تم تنفيذ الدالة بنجاح" ); }

الربط أثناء التشغيل

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

للتغلب على هذه المشكلة، كُتبت لغة TScript بتقنية الربط أثناء التشغيل. ويعني هذا أن الدالة المُستدعاة تعتمد على نوع المتغيرات عند استدعاء الدالة.

هذه تكتيكة غير مألوفة، لكنها تنطوي على بعض المزايا الإضافية. أولًا، تعني عدم الحاجة إلى تعريف الدوال قبل استخدامها، ففي لغة C++ مثلًا، قد تستدعي دالتان بعضهما البعض، مثل `f` و`f` . في هذه الحالة، يجب تعريف الدالة `f` لكي تستدعيها الدالة `f`. أما في TScript، فإن الربط أثناء التشغيل يسمح بتعريف الدوال بأي ترتيب دون الحاجة إلى تعريفها. وهذا يُسهّل كتابة التعليمات البرمجية للمبرمجين الأقل خبرة، مما يُتيح لهم التركيز على منطق البرنامج بدلًا من متطلبات اللغة.voidFoo(){Bar();}voidBar(){Bar();}Bar()Foo()

يُمكّن الربط أثناء التشغيل اللغة من دعم البرمجة أثناء التشغيل باستخدام دوال مثل AddMethod و AddDefinedVariable . وهذا يُتيح لبرامج TScript كتابة نفسها تلقائيًا. على سبيل المثال، عند استخدام واجهة SOAP ، يتم ترميز ملف WSDL البعيد في مكتبة البرامج النصية، مما يسمح باستدعاء الدوال الموجودة فيه كما لو كانت مُبرمجة أثناء مرحلة التصميم. بالإضافة إلى ذلك، يُمكن كتابة كود قادر على التعلم الذاتي، وكتابة دوال جديدة عند الحاجة.

ربط المكتبات ديناميكيًا

تُعدّ TScript من بين مجموعة صغيرة من لغات البرمجة النصية التي توفر إمكانية تحميل المكتبات المشتركة الموجودة وربطها ديناميكيًا . وتُعتبر Java، من خلال JNI، و VB6 لغتين أخريين من لغات البرمجة النصية تُمكّنان من كتابة تعليمات برمجية لتحميل مكتبة خارجية وتنفيذها عبر واجهتها الأصلية. وهذا يمنح TScript القدرة على استخدام مجموعة كبيرة من الوظائف والتعليمات البرمجية الموجودة مسبقًا والمكتوبة بلغات مختلفة، ويمكن القيام بذلك دون الحاجة إلى تغيير واجهة المكتبة المشتركة أو تجميعها مع شفرة المصدر.

إدارة الذاكرة

تستخدم لغة TScript نموذج تغليف الفئات القياسي في لغة C++ لتخصيص موارد الذاكرة وتحريرها. وهذا يعني أن جميع الذاكرة المخصصة تُحرر عند حذف المتغير الذي يحتويها، وتختلف هذه العملية عن نموذج جمع البيانات المهملة في لغة Java أو نموذج عد المراجع في لغات .NET .

تتم إدارة موارد نظام التشغيل مثل الملفات والمآخذ ومفاتيح التشفير عبر آلية عد المراجع المشابهة لـ .NET، لذلك سيتم تحريرها بمجرد عدم وجود متغيرات تحتوي على قيمها.

الأمن الاستباقي

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

تم تصميم بنية الأمان هذه للسماح بتشغيل البرامج النصية بطريقة مشابهة لـ JavaScript مع تمكين استخدام لغات البرمجة النصية الأكثر قوة مثل Perl .

مراجع