التسلسل L
SequenceL هي لغة برمجة وظيفية للأغراض العامة ، بالإضافة إلى مُصرّف ومجموعة أدوات للتوازي التلقائي ( الحوسبة المتوازية ) [ 2 ]. تتمثل أهداف تصميمها الرئيسية في الأداء على معالجات متعددة النوى ، وسهولة البرمجة، وقابلية النقل/التحسين بين المنصات، ووضوح الكود وسهولة قراءته. وتكمن ميزتها الأساسية في إمكانية استخدامها لكتابة كود مباشر يستغل تلقائيًا كامل طاقة المعالجة المتاحة، دون الحاجة إلى تحديد التوازيات ، أو تحديد التوجيه ، أو تجنب حالات التزامن ، أو غيرها من تحديات أساليب البرمجة اليدوية القائمة على التوجيهات مثل OpenMP .
يمكن ترجمة البرامج المكتوبة بلغة SequenceL إلى كود متعدد الخيوط يعمل بالتوازي، دون أي توجيهات صريحة من المبرمج حول كيفية أو ما يجب موازاته. اعتبارًا من عام 2015تُنتج إصدارات مُترجم SequenceL شفرةً متوازيةً كتمثيل وسيط بلغة C++ أو OpenCL ، مما يُتيح لها العمل مع مُعظم لغات البرمجة الشائعة، بما في ذلك C وC++ و C# و Fortran و Java و Python . يُدير وقت التشغيل الخاص بالمنصة الخيوط بأمان، مُوفراً أداءً متوازياً تلقائياً وفقاً لعدد النوى المُتاحة. تشمل بنى مجموعات التعليمات المدعومة ARM و x86 و POWER8 .
تاريخ
طُوِّرت لغة SequenceL في البداية على مدى عشرين عامًا بدءًا من عام 1989، في جامعة تكساس التقنية في الغالب . وكان التمويل الأساسي من وكالة ناسا ، التي أرادت في الأصل تطوير لغة مواصفات "ذاتية التحقق"؛ أي أنه بمجرد كتابة المتطلبات، يمكن تنفيذها ، والتحقق من النتائج مقابل النتيجة المرجوة.
كان الباحث الرئيسي في المشروع في البداية دانيال كوك، [ 3 ] الذي انضم إليه لاحقًا نيلسون روشتون (أستاذ آخر في جامعة تكساس التقنية)، ثم براد نيمانيك (طالب دكتوراه آنذاك تحت إشراف كوك). وقد دفع هدف ابتكار لغة بسيطة بما يكفي لتكون مقروءة، وواضحة بما يكفي لتكون قابلة للتنفيذ، المخترعين إلى اعتماد نهج اللغة الوظيفية التصريحية ، حيث يصف المبرمج النتائج المرجوة، بدلاً من وصف الوسائل اللازمة لتحقيقها. وبذلك، تكون اللغة حرة في حل المشكلة بأكثر الطرق كفاءةً التي يمكنها إيجادها.
مع تطور اللغة، ابتكر الباحثون مناهج حوسبة جديدة، بما في ذلك نموذج الاستهلاك والتبسيط والإنتاج (CSP). [ 4 ] في عام 1998، بدأت الأبحاث بتطبيق لغة SequenceL على الحوسبة المتوازية . وبلغ هذا ذروته في عام 2004 عندما اتخذت شكلها الأكثر اكتمالًا بإضافة دلالات التطبيع والنقل (NT) ، [ 5 ] [ 6 ] والتي تزامنت مع تحول كبرى شركات تصنيع وحدات المعالجة المركزية (CPUs) إلى المعالجات متعددة النوى بدلًا من مواصلة زيادة سرعات الساعة. تُعد دلالات NT أساسية في تبسيط وتفكيك البنى، استنادًا إلى استراتيجية تنفيذ شبيهة بتدفق البيانات ، على غرار لغتي GAMMA [ 7 ] وNESL. [ 8 ] تحقق دلالات NT هدفًا مشابهًا لهدف إزالة التعليمات البرمجية المتكررة الذي وضعه لاميل وبيتون-جونز. [ 9 ] [ 10 ] يمكن تعريف جميع خصائص اللغة الأخرى من خلال هذين القانونين - بما في ذلك الاستدعاء الذاتي ، وهياكل الفهرسة، ومراجع الدوال، وتقييم أجسام الدوال. [ 11 ] [ 12 ]
على الرغم من أن هذا لم يكن الهدف الأصلي، إلا أن هذه الأساليب الجديدة سمحت للغة بتنفيذ جزء كبير من العمليات بالتوازي، بشكل شفاف للمبرمج. في عام ٢٠٠٦، طُوِّر نموذج أولي لمترجم متوازي تلقائيًا في جامعة تكساس التقنية. وفي عام ٢٠٠٩، رخصت جامعة تكساس التقنية الملكية الفكرية لشركة تكساس مالتي كور تكنولوجيز (TMT) [ ١٣ ] لمواصلة التطوير التجاري. وفي يناير ٢٠١٧، أصدرت TMT الإصدار الثالث، الذي يتضمن النسخة الاحترافية التجارية، وأضافت نسخة مجانية متاحة للتنزيل [ ١٤ ] .
تصميم
صُممت لغة SequenceL لتكون سهلة التعلم والاستخدام قدر الإمكان، مع التركيز على الشيفرة الخوارزمية حيثما تُضيف قيمة، فعلى سبيل المثال، لم يُعِد مُبتكروها ابتكار عمليات الإدخال والإخراج لأن لغة C تُغطيها بكفاءة. ونتيجةً لذلك، لا يتجاوز المرجع الكامل للغة SequenceL أربعين صفحة، مع أمثلة وافرة، ويحتوي نحوها الرسمي على حوالي خمس عشرة قاعدة إنتاج. [ 5 ]
لغة SequenceL تُقيّم بدقة (مثل لغة Lisp )، وتُكتب بشكل ثابت مع استنتاج النوع (مثل لغة Haskell )، وتستخدم مزيجًا من عوامل التشغيل الوسطية والبادئة التي تُشبه الترميز الرياضي القياسي غير الرسمي (مثل لغات C و Pascal و Python وغيرها). وهي لغة تصريحية بحتة، بمعنى أن المبرمج يُعرّف الدوال، بالمعنى الرياضي، دون إعطاء تعليمات لتنفيذها. على سبيل المثال، التعريف الرياضي لضرب المصفوفات هو كالتالي:
- حاصل ضرب المصفوفة A من الرتبة m × p في المصفوفة B من الرتبة p × n هو المصفوفة من الرتبة m × n التي يكون عنصرها ( i , j ) هو
يتطابق تعريف SequenceL مع ذلك التعريف بشكل دقيق إلى حد كبير:
matmul(A(2), B(2)) [i,j] := let k := 1...size(B); في مجموع (A[i,k] * B[k,j])؛
تشير الرموز السفلية التي تلي كل مُعامل A و B على الجانب الأيسر من التعريف إلى أن A و B عبارة عن بنيتين من العمق 2 (أي قوائم من قوائم القيم العددية)، والتي تُعتبر هنا مصفوفات. انطلاقًا من هذا التعريف الرسمي، يستنتج SequenceL أبعاد الناتج المُعرَّف من صيغة العنصر ( i , j ) (باعتباره مجموعة الأزواج ( i , j ) التي يُعرَّف لها الجانب الأيمن)، ويحسب كل عنصر بنفس الصيغة الواردة في التعريف غير الرسمي أعلاه. لاحظ أنه لا توجد تعليمات صريحة للتكرار في هذا التعريف، أو لترتيب تنفيذ العمليات. لهذا السبب، يمكن لمُصرِّف SequenceL تنفيذ العمليات بأي ترتيب (بما في ذلك الترتيب المتوازي) يُحقق المعادلة المُعرِّفة. في هذا المثال، سيتم موازاة حساب الإحداثيات في الناتج بطريقة تتناسب خطيًا مع عدد المعالجات، وذلك بالنسبة للمصفوفات الكبيرة.
كما ذُكر سابقًا، لا تحتوي لغة SequenceL على بنيات مُدمجة للإدخال/الإخراج ، نظرًا لتصميمها للعمل بشكل تراكمي مع لغات البرمجة الأخرى. وقد ساهم قرار ترجمتها إلى لغة C++ متعددة الخيوط ودعمها لأكثر من 20 لغة من لغات SWIG (مثل C وC++ وC# وJava وPython وغيرها) في سهولة دمجها في مسارات التصميم والتدريب والأدوات الحالية. ويمكن استخدامها لتحسين التطبيقات الحالية، وإنشاء مكتبات متعددة النوى ، وحتى إنشاء تطبيقات مستقلة من خلال ربط الكود الناتج بكود آخر يُنفذ مهام الإدخال/الإخراج. كما يُمكن استعلام وظائف SequenceL من مُفسِّر باستخدام مُدخلات مُحددة، كما هو الحال في Python وغيرها من اللغات المُفسَّرة.
تطبيع - نقل
البنية غير العددية الرئيسية في لغة SequenceL هي المتسلسلة، وهي في الأساس قائمة. يمكن تداخل المتسلسلة إلى أي مستوى. لتجنب الاستخدام الروتيني للتكرار الشائع في العديد من لغات البرمجة الوظيفية البحتة، تستخدم SequenceL طريقة تُسمى " التطبيع والنقل " (NT)، حيث تُوزع العمليات العددية تلقائيًا على عناصر المتسلسلة. [ 15 ] على سبيل المثال، في SequenceL لدينا
لا ينتج هذا عن تحميل زائد لعامل الجمع (+)، بل عن تأثير NT الذي يمتد ليشمل جميع العمليات، سواءً المدمجة أو المعرفة من قبل المستخدم. كمثال آخر، إذا كانت f() دالة بثلاثة وسائط، وسائطها أعداد قياسية، فسنحصل على أي قيم مناسبة لـ x و z
يمكن استخدام بنية NT لعدة وسائط في وقت واحد، كما في المثال التالي:
يعمل هذا أيضًا عندما يكون الوسيط المتوقع عددًا غير قياسي من أي نوع T، ويكون الوسيط الفعلي قائمة من الكائنات من النوع T (أو، بشكل أعم، أي بنية بيانات تكون إحداثياتها من النوع T). على سبيل المثال، إذا كانت A مصفوفة و X<sub> s</sub> قائمة من المصفوفات [X <sub>1</sub> , ..., X<sub> n</sub> ]، وبالنظر إلى تعريف ضرب المصفوفات أعلاه، فسنحصل في SequenceL على
matmul(A,X s ) = [matmul(A,X 1 ),...,matmul(A,X n )]
كقاعدة عامة، تلغي أنظمة NT الحاجة إلى التكرار أو الاستدعاء الذاتي أو عوامل التشغيل الوظيفية عالية المستوى لـ
- قم بتطبيق نفس الإجراءات على كل عنصر من عناصر بنية البيانات، أو على
- معالجة الأجزاء المتناظرة من الهياكل ذات الأشكال المتشابهة معًا.
وهذا يفسر معظم استخدامات التكرار والتكرار الذاتي.
مثال: الأعداد الأولية
من الأمثلة الجيدة التي توضح المفاهيم المذكورة أعلاه إيجاد الأعداد الأولية ، والتي تُعرَّف على النحو التالي:
- عدد صحيح أكبر من 1، وليس له قواسم موجبة أخرى غير نفسه و1.
إذن، يكون العدد الصحيح الموجب z أوليًا إذا لم يكن هناك أي عدد من 2 إلى z - 1، شاملًا، يقسمه بالتساوي. تتيح لغة SequenceL برمجة هذه المسألة عن طريق نسخ التعريف أعلاه حرفيًا إلى اللغة.
في لغة SequenceL، تكون متتالية الأعداد من 2 إلى z -1، شاملةً، هي (2...( z -1))، لذا يمكن كتابة برنامج لإيجاد جميع الأعداد الأولية بين 100 و200 على النحو التالي:
prime(z) := z when none(z mod (2...(z-1)) = 0);
وهذا يعني باللغة الإنجليزية ببساطة،
- ...إرجاع الوسيط إذا لم يكن أي من الأرقام الواقعة بين 2، وأقل بواحد من الوسيط نفسه، يقسمه بالتساوي.
إذا لم يتحقق هذا الشرط، فإن الدالة لا تُرجع أي قيمة. ونتيجة لذلك، فإن تشغيل هذا البرنامج يُنتج
cmd:>prime(17) 17 cmd:>prime(18) فارغ
لا تظهر العبارة "بين 100 و200" في البرنامج. عادةً ما يمرر المبرمج هذا الجزء كوسيط. بما أن البرنامج يتوقع قيمة عددية كوسيط، فإن تمرير سلسلة من الأرقام بدلاً من ذلك سيجعل الدالة SequenceL تُجري العملية على كل عنصر من عناصر السلسلة تلقائيًا. ولأن الدالة تُرجع قيمة فارغة للقيم غير المطابقة، ستكون النتيجة هي سلسلة الإدخال نفسها، ولكن بعد تصفيتها لإرجاع الأرقام التي تُحقق معايير الأعداد الأولية فقط.
cmd:>prime(100...200) [101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199]
بالإضافة إلى حل هذه المشكلة ببرنامج قصير وسهل القراءة، سيتم إجراء تقييم SequenceL للتسلسلات المتداخلة بالتوازي.
عناصر
تتوفر مكونات البرامج التالية وتدعمها شركة TMT لاستخدامها في كتابة كود SequenceL. جميع المكونات متوفرة على منصات x86 التي تعمل بنظامي التشغيل Windows و macOS ومعظم توزيعات Linux (بما في ذلك CentOS و RedHat و openSUSE و Ubuntu )، وعلى منصات ARM و IBM Power التي تعمل بمعظم توزيعات Linux .
مترجم
يُتيح مُفسِّر سطر الأوامر كتابة التعليمات البرمجية مباشرةً في واجهة سطر الأوامر، أو تحميلها من ملفات نصية مُعدة مسبقًا. يُمكن تنفيذ هذه التعليمات البرمجية، وتقييم النتائج، للمساعدة في التحقق من صحتها، أو إيجاد حل سريع. كما يتوفر أيضًا عبر بيئة التطوير المتكاملة (IDE) الشهيرة Eclipse . لا تُنفَّذ التعليمات البرمجية في المُفسِّر بالتوازي؛ بل تُنفَّذ في خيط واحد.
المترجم
يقوم مترجم سطر الأوامر بقراءة كود SequenceL وإنشاء كود C++ عالي التوازي، ومتجه ، واختياريًا OpenCL، والذي يجب ربطه بمكتبة وقت تشغيل SequenceL لتنفيذه.
وقت التشغيل
بيئة التشغيل عبارة عن مجموعة مكتبات مُجمّعة مسبقًا تعمل مع كود C++ المُجمّع والمتوازي لتنفيذه على النحو الأمثل على المنصة المستهدفة. وهي مبنية على Intel Threaded Building Blocks (TBB) [ 16 ] وتتولى مهامًا مثل تحسين ذاكرة التخزين المؤقت، وإدارة الذاكرة، ومعالجة قوائم الانتظار، ومراقبة الأداء.
إضافة Eclipse IDE مع مصحح الأخطاء
توفر إضافة بيئة التطوير المتكاملة Eclipse إمكانيات تحرير قياسية (مثل تجميع الدوال، وتشفير الألوان، إلخ)، وبيئة تصحيح أخطاء SequenceL. تعمل هذه الإضافة مع مترجم SequenceL، لذا لا يمكن استخدامها لتصحيح أخطاء التعليمات البرمجية متعددة الخيوط؛ ومع ذلك، من خلال توفير التوازي التلقائي، فإن تصحيح أخطاء التعليمات البرمجية المتوازية في SequenceL هو في الواقع تحقق من صحة التعليمات البرمجية التسلسلية في SequenceL. أي، إذا تم تشغيلها بشكل صحيح تسلسليًا، فيجب أن تعمل بشكل صحيح بالتوازي - لذا فإن تصحيح الأخطاء في المترجم كافٍ.
المكتبات
تتضمن مكتبة SequenceL العديد من مكتبات الدوال الرياضية وغيرها من المكتبات القياسية كشفرة مصدرية لتسهيل عملية البرمجة وتقديم أمثلة لأفضل الممارسات. ويمكن استيراد هذه المكتبات بنفس طريقة استيراد مكتبات C أو C++ باستخدام #include.
انظر أيضاً
مراجع
- ↑ "ترخيص SequenceL" . شركة Texas Multicore Technologies ، 25 مايو 2016. مؤرشف من الأصل في 2 فبراير 2017. تم الاطلاع عليه في 26 يناير 2017 .
- ↑ أندرسن، بير هـ. (أغسطس 2002). مُترجم مُوازٍ لـ SequenceL . مكتبات جامعة تكساس التقنية (أطروحة دكتوراه). لوبوك، تكساس، الولايات المتحدة . تاريخ الاسترجاع: 27 أبريل 2026 .
{{cite thesis}}: CS1 maint: url-status ( link ) - ↑ "الدكتور دانيال كوك في شركة تكساس مالتي كور تكنولوجيز" . مؤرشف من الأصل بتاريخ 4 مارس 2016. تم الاطلاع عليه بتاريخ 24 فبراير 2016 .
- ↑ "الاستهلاك والتبسيط والإنتاج (CSP)" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 2017-02-02 . تم الاطلاع عليه بتاريخ 2017-01-26 .
- 12Nemanich, Brad; Cooke, Daniel; Rushton, Nelson (2010), SequenceL: Transparency And Multi-Core Parallelisms(PDF), DAMP '10 Proceedings of the 5th ACM SIGPLAN workshop on Declarative Aspects of Multicore Programming, New York, NY, US: ACM, pp. 45–52, archived from the original(PDF) on 2017-02-02, retrieved 2017-01-26
- ↑Cooke, Daniel; Rushton, Nelson; Nemanich, Brad; Watson, Robert G.; Andersen, Per (March 2008), "Normalize, Transpose, and Distribute: An Automatic Approach for Handling Nonscalars", ACM Transactions on Programming Languages and Systems, 30 (2): 1–49, doi:10.1145/1330017.1330020, S2CID 6833254
- ↑Banater, J-P; Le Metayer, D. (January 1993), "Programming by Multiset Transformation"(PDF), Communications of the ACM, 36 (1): 98–111, doi:10.1145/151233.151242, S2CID 17076396
- ↑Blelloch, Guy (March 1996), "Programming Parallel Algorithms", Communications of the ACM, 39 (3): 85–97, CiteSeerX 10.1.1.141.5884, doi:10.1145/227234.227246, S2CID 12118850
- ↑Lämmel, Ralf; Peyton-Jones, Simon (2003), "Scrap your boilerplate: a practical design pattern for generic programming", Proceedings of TLDI 2003
- ↑Lämmel, Ralf; Peyton-Jones, Simon (2004), "Scrap more boilerplate: reflection, zips, and generalised casts", Proceedings of ICFP 2004
- ↑Cooke, Daniel; Rushton, Nelson (January 1993), "Iterative and Parallel Algorithm Design from High Level Language Traces", ICCS'05 Proceedings of the 5th International Conference on Computational Science, vol. Part III, pp. 891–894, doi:10.1007/11428862_132, ISBN 978-3-540-26044-8
- ↑Cooke, Daniel; Rushton, Nelson (June 27–30, 2005), "SequenceL – An Overview of a Simple Language", Proceedings of the 2005 International Conference on Programming Languages and Compilers, PLC 2005
- ↑Texas Multicore Technologies, Inc.
- ↑ نورتون، دوغ (16 يناير 2017). "شركة تكساس مالتي كور تكنولوجيز تعلن عن إصدار رئيسي لتقنية التوازي التلقائي SequenceL" . بي آر نيوزواير . سيشن الولايات المتحدة . تاريخ الاسترجاع: 27 أبريل 2026 .
{{cite web}}: CS1 maint: url-status ( link ) - ↑ كوك، دانيال؛ روشتون، نيلسون (27-30 يونيو 2005)، "SequenceL - نظرة عامة على لغة بسيطة"، وقائع المؤتمر الدولي لعام 2005 حول لغات البرمجة والمترجمات، PLC 2005
- ↑ وحدات بناء Intel متعددة الخيوط (TBB)
روابط خارجية
- الموقع الرسمي لشركة تكساس مالتي كور تكنولوجيز
- لماذا يعمل التسلسل L
- مقارنة OpenMP بـ SequenceL
- ميزات التسلسل L
- نظرة عامة: التوازي التلقائي الحاصل على براءة اختراع في التسلسل
- يوتيوب: تكساس مالتي كور تكنولوجيز
- تنزيلات مجانية
- موارد وتدريب المبرمجين
- التطبيع، والنقل، والتوزيع: منهج آلي للتعامل مع الكميات غير العددية
- براءة الاختراع الأمريكية رقم 8,839,212، طريقة وجهاز وبرنامج حاسوبي لتوليد برنامج حاسوبي تلقائيًا باستخدام دلالات الاستهلاك والتبسيط والإنتاج مع عمليات التطبيع والنقل والتوزيع
- أمثلة على SequenceL في ويكي Rosetta Code
- لغات البرمجة عالية المستوى
- الحوسبة المتوازية
- لغات برمجة المصفوفات
- برامج متعددة المنصات
- لغات البرمجة التصريحية
- البرمجة الوظيفية
- اللغات الوظيفية
- لغات البرمجة ذات الكتابة الثابتة
- الحوسبة غير المتجانسة
- لغات البرمجة المتزامنة
- برامج رياضية
- برنامج التحليل العددي لنظام التشغيل ويندوز
- برنامج التحليل العددي لنظام التشغيل macOS
- برنامج التحليل العددي لنظام لينكس
- الجبر الخطي العددي
- لغات البرمجة العددية
- البرامج الرقمية
- برنامج علمي لنظام التشغيل ويندوز
- برنامج علمي لنظام التشغيل macOS
- برامج علمية لنظام لينكس
- GPGPU
