نواصل مراجعة الكمبيوتر المحلي الجديد. بعد التعرف على ميزات بنية Elbrus ، سننظر في أدوات تطوير البرمجيات المقدمة لنا.
تذكر هيكل المقالة:- مراجعة الأجهزة :
- مراجعة البرنامج :
- إطلاق نظام التشغيل ؛
- البرمجيات العادية ؛
- نظرة عامة على أدوات التطوير:
- أداء القياس :
- وصف أجهزة الكمبيوتر المتنافسة
- النتائج المعيارية
- تلخيص.
هل لديك قراءة لطيفة!ميزات العمارة
يمكن صياغة جوهر بنية E2K في جملة واحدة على النحو التالي: تسجيلات 64 بت ، موازية واضحة لتنفيذ التعليمات والوصول إلى الذاكرة التي يتم التحكم فيها بدقة.على سبيل المثال ، x86 أو معالجات هندسة SPARC القادرة على تنفيذ أكثر من تعليمة واحدة لكل دورة (superscalar) ، وأحيانًا خارج الترتيب ، ضمنيًاالتوازي: يقوم المعالج مباشرة في الوقت الحقيقي بتحليل التبعيات بين التعليمات الموجودة على قسم صغير من التعليمات البرمجية ، وإذا رأى ذلك ممكنًا ، يقوم بتحميل بعض المحركات في نفس الوقت. في بعض الأحيان يتصرف بتفاؤل كبير ، - بالمضاربة ، مع تجاهل النتيجة أو التراجع عن المعاملة في حالة توقع غير ناجح. في بعض الأحيان ، على العكس من ذلك ، هو متشائم للغاية - على افتراض التبعيات بين قيم السجلات أو أجزاء من السجلات ، والتي ليست في الواقع من وجهة نظر البرنامج القابل للتنفيذ.إذا كان صريحًاالتوازي (حوسبة التعليمات الموازية بشكل صريح ، EPIC) يتم إجراء نفس التحليل في مرحلة التجميع ، ويتم كتابة جميع تعليمات الماكينة المحددة للتنفيذ المتوازي في كلمة تعليمات كبيرة جدًا (VLIW) - وللبروس طول هذا "الكلمات" ليست ثابتة ويمكن أن تكون من 1 إلى 8 كلمات مزدوجة (في هذا السياق ، كلمة واحدة بسعة 32 بت).مما لا شك فيه ، أن المترجم يتمتع بقدرات أكبر بكثير من حيث كمية الشفرة المغطاة ، والوقت والذاكرة المستهلكة ، وعند كتابة كود الآلة يدويًا ، يمكن للمبرمج تنفيذ تحسينات أكثر ذكاءً. ولكن هذا من الناحية النظرية ، ومن الناحية العملية ، من غير المرجح أن تستخدم المجمّع ، وبالتالي يعتمد كل ذلك على مدى جودة المترجم الأمثل ، وكتابة واحد ليست مهمة سهلة ، على أقل تقدير. بالإضافة إلى ذلك ، إذا ، مع التوازي الضمني ، يمكن أن تستمر التعليمات "البطيئة" في العمل دون منع استلام الإرشادات التالية على المشغلات الأخرى ، ثم مع التوازي الصريح سينتظر الأمر الواسع بالكامل حتى الانتهاء الكامل. أخيرًا ، سيساعد المحول الأمثل في تفسير اللغات الديناميكية.كل هذا مفهوم جيدًا في MCST ، بالطبع ، وبالتالي ، يقوم Elbrus أيضًا بتنفيذ تقنيات التنفيذ المضاربة ، والتعليمات البرمجية والبيانات المحملة مسبقًا ، والعمليات الحسابية المجمعة. لذلك ، بدلاً من التنظير والتساؤل إلى ما لا نهاية كم عدد gigaflops الافتراضية التي يمكن أن تعطيها هذه المنصة أو تلك المنصة في ظل مجموعة ناجحة من الظروف ، في الجزء الرابع من المقالة نتناول ونقيم الأداء الفعلي للبرامج الحقيقية - التطبيقية والتركيبية.VLIW: اختراق أم طريق مسدود؟, VLIW : , ‑ Transmeta Crusoe — «». , Efficeon ( ) . , x86- , . , Pentium M , Pentium 4 , . VIA C3, x86.
نظرًا لطبيعتها الغريبة ، فإن تقنية التنفيذ المحمي للبرامج بلغات C / C ++ ، حيث يوفر استخدام المؤشرات مجموعة واسعة من الفرص لتصوير نفسك في القدم ، ليست أقل إثارة للاهتمام. إن مفهوم الحماية السياقية ، الذي يتم تنفيذه بشكل مشترك من قبل المترجم في مرحلة التجميع والمعالج في وقت التشغيل ، بالإضافة إلى نظام التشغيل من حيث إدارة الذاكرة ، لن يسمح بانتهاك نطاق المتغيرات ، سواء كان الوصول إلى متغير فئة خاصة ، بيانات خاصة لوحدة أخرى ، المتغيرات المحلية لوظيفة الاستدعاء . أي تلاعب بتغيير مستوى الوصول مسموح به فقط في اتجاه الحد من الحقوق. يتم حظر حفظ الروابط إلى الكائنات قصيرة العمر في الهياكل طويلة العمر. تُمنع المحاولات أيضًا من استخدام الروابط الميتة: إذا كان الكائن الذي تم استلام الرابط إليه قد تم حذفه بالفعل ،حتى موقع منشأة أخرى جديدة في نفس العنوان لن يعتبر عذرا للوصول إلى محتوياته. شجع على استخدام البيانات كرمز والتحكم في النقل في أي مكان.في الواقع ، بمجرد أن ننتقل من التعابير عالية المستوى إلى المؤشرات ذات المستوى المنخفض ، فإن جميع مجالات الرؤية هذه لا تتعدى كونها ملح نحوي. بعض (أبسط) حالات سوء استخدام المؤشرات يمكن أن تساعد في بعض الأحيان في التقاط محللات شفرة المصدر الثابتة. ولكن عندما تتم ترجمة البرنامج بالفعل إلى تعليمات جهاز x86 أو SPARC ، فلن يمنعه شيء من قراءة أو كتابة القيمة من خلية ذاكرة خاطئة أو حجم خاطئ ، مما سيؤدي إلى تعطل في مكان مختلف تمامًا - وهنا تجلس ، تنظر إلى المكدس التالف وليس لديك فكرة من أين تبدأ التصحيح ، لأنه على الجهاز الآخر يتم تنفيذ نفس الرمز بنجاح. إن تجاوز سعة المكدس ونقاط الضعف الناتجة ليست سوى آفة المنصات الشعبية. من دواعي السرور أن المطورين لدينا يعالجون هذه المشاكل بشكل منهجيولا يقتصر على ترتيب المزيد من العكازات ، والتي لا يزال تأثيرها يشبه أشعل النار. بعد كل شيء ، لا أحد يهتم بسرعة عمل برنامجك إذا لم يعمل بشكل صحيح. بالإضافة إلى ذلك ، فإن التحكم المحكم من قبل المترجم يجبرك على إعادة كتابة "الرائحة الكريهة" والشفرة التي لا تطاق ، مما يعني أنه يعزز ثقافة البرمجة بشكل غير مباشر.ترتيب البايت عند تخزين الأرقام في ذاكرة Elbrus ، على عكس SPARC ، هو نهاية صغيرة (البايت السفلي يأتي أولاً) ، أي كما هو الحال في x86. وبالمثل ، نظرًا لأن النظام الأساسي يهدف إلى دعم رمز x86 ، فلا توجد قيود على محاذاة البيانات في الذاكرة.الترتيب والمحاذاة وقابلية النقل , Intel, , (, 32‑ 0x04000005) — , , , . - , , , — , ( , UTF‑16), , , , ‑. , , — , SPARC, — .
يمكنك قراءة المزيد عن تصميم أجهزة كمبيوتر MCST على معماريات SPARC و E2K في كتاب "المعالجات الدقيقة ومجمعات الحوسبة لعائلة Elbrus" ، الذي نشره بيت بيتر للنشر في أقل وقت تشغيل للطباعة وتم بيعه منذ فترة طويلة ، ولكنه متاح مجانًا في شكل PDF ( 6 ميجا بايت ) ومقابل رسوم بسيطة على Google Play . على خلفية نقص المعلومات التفصيلية الأخرى في المجال العام ، هذا المنشور هو مجرد مخزن للمعرفة. لكن النص يتركز بشكل أساسي على الأجهزة ، وخوارزميات تشغيل المخازن المؤقتة وخطوط الأنابيب ، وذاكرة التخزين المؤقت والأجهزة المنطقية الحسابية - لم يتم تناول موضوع كتابة البرامج [الفعالة] تمامًا ، وحتى مجرد ذكر تعليمات الآلة يمكن حسابها على الأصابع.لغة الآلة
بالإضافة إلى تجميع اللغات عالية المستوى C و C ++ و Fortran ، لا تنسى الوثائق في كل فرصة ذكر إمكانية كتابة البرامج مباشرة في Assembler ، ولكن لم يتم تحديد كيف يمكنك بالضبط المشاركة في هذا الفن المصغر ، حيث يمكنك على الأقل الحصول على مرجع لتعليمات الآلة. لحسن الحظ ، يحتوي النظام على مصحح أخطاء GDB يمكنه فك شفرة البرامج المترجمة سابقًا. من أجل عدم تجاوز نطاق المقالة ، نكتب دالة حسابية بسيطة لها تراكم جيد للتوازي.uint64_t CalcParallel(
uint64_t a,
uint64_t b,
uint64_t c,
uint32_t d,
uint32_t e,
uint16_t f,
uint16_t g,
uint8_t h
) {
return (a * b) + (c * d) - (e * f) + (g / h);
}
إليك ما يترجم إليه عند الترجمة في وضع -O3 :0x0000000000010490 <+0>:
muld,1 %dr0, %dr1, %dg20
sxt,2 6, %r3, %dg19
getfs,3 %r6, _f32,_lts2 0x2400, %g17
getfs,4 %r5, _lit32_ref, _lts2 0x00002400, %g18
getfs,5 %r7, _f32,_lts3 0x200, %g16
return %ctpr3
setwd wsz = 0x5, nfx = 0x1
setbp psz = 0x0
0x00000000000104c8 <+56>:
nop 5
muld,0 %dr2, %dg19, %dg18
muls,3 %r4, %g18, %g17
sdivs,5 %g17, %g16, %g16
0x00000000000104e0 <+80>:
sxt,0 6, %g17, %dg17
addd,1 %dg20, %dg18, %dg18
0x00000000000104f0 <+96>:
nop 5
subd,0 %dg18, %dg17, %dg17
0x00000000000104f8 <+104>:
sxt,0 2, %g16, %dg16
0x0000000000010500 <+112>:
ct %ctpr3
ipd 3
addd,0 %dg17, %dg16, %dr0
أول شيء يلفت انتباهك هو أن كل أمر يتم فك شفرته على الفور إلى عدة تعليمات يتم تنفيذها بالتوازي. بشكل عام ، يعد التعيين التذكيري للتعليمات بديهيًا ، على الرغم من أن بعض الأسماء تبدو غير عادية بعد Intel: على سبيل المثال ، يُطلق على تعليمات الامتداد غير الموقعة هنا sxt وليس movzx . المعلمة للعديد من الأوامر الحسابية ، بالإضافة إلى المعاملات نفسها ، هي عدد الجهاز التنفيذي - ليس من دون سبب أن ELBRUS تعني جدولة استخدام الموارد الأساسية الصريحة ، أي "التخطيط الصريح لاستخدام الموارد الأساسية".للوصول إلى قيمة التسجيل 64 بت الكاملة ، البادئة " د"؛ من الناحية النظرية ، من الممكن أيضًا الوصول إلى 16 بت و 8 بتات أقل من القيمة. إن تعيين السجلات العامة للأغراض العامة ، والتي تحتوي على 32 قطعة ، مسبوق بـ " g " قبل الرقم ، وسجلات الإجراءات المحلية بالبادئة " r ". يمكن أن يصل حجم نافذة السجلات المحلية التي تطلبها تعليمات setwd إلى 224 ، ويتم دفع المضخة إلى المكدس تلقائيًا عند الحاجة.طريقة تطبيق تعليمات معينة مربكة: على سبيل المثال ، العودةكما قد تخمن ، فإنه يعمل على إعادة التحكم في إجراء الاستدعاء ، ومع ذلك ، في جميع عينات التعليمات البرمجية التي تمت دراستها ، يحدث هذا التوجيه قبل الأمر الأخير بوقت طويل (حيث يوجد أيضًا نوع من التلاعب في السياق) ، وأحيانًا حتى في كلمة الأمر الأولى ، كما هو الحال هنا. على الرغم من أن الكتاب المذكور أعلاه يدفع فقرة كاملة لهذه المشكلة ، إلا أنه لم يتضح لنا بعد. التحديث اعتبارًا من 9 فبراير 2016: تشير التعليقات إلى أن عبارة الإرجاع تمهد الطريق فقط للعودة من البرنامج الفرعي وتسمح للمعالج ببدء تحميل الأوامر التالية لإجراء الاستدعاء ، ويعود عنصر التحكم نفسه عندما يصل التنفيذ إلى تعليمات ct .ومع ذلك ، فإن "التعليمات البرمجية سهلة القراءة" و "التعليمات البرمجية الفعالة" بعيدة عن أن تكون هي نفسها عندما يتعلق الأمر بتعليمات الجهاز. إذا قمت بالترجمة دون تحسين ، فإن الشفرة تكون أكثر اتساقًا ومشابهًا لحساب الجبين ، ولكن على حساب الإطالة: بدلاً من 6 كلمات أمر مشبعة ، يتم إنشاء 8 كلمات متفرقة.جلسة الكهانة على أساس القهوة للشريحة ، دعنا ننتهي قبل أن نتخيل الافتراضات السخيفة تمامًا. دعونا نأمل أن يتم في يوم من الأيام نشر مرجع الأوامر ودليل البرمجة والتحسين.أدوات التطوير
إن مترجم لغة C / C ++ القياسي في نظام تشغيل Elbrus هو LCC ، وهو تطوير خاص لشركة MCST ، متوافق مع دول مجلس التعاون الخليجي. لا يتم نشر معلومات تفصيلية حول هيكل ومبادئ هذا المترجم ، ولكن وفقًا لمقابلة مع مطور سابق لأحد الأنواع الفرعية المطورة من المترجم ، تستخدم Edison Design Group واجهة أمامية لتحليل عالي المستوى لرموز المصدر ، ويمكن تنفيذ الترجمة على مستوى منخفض لتعليمات الآلة بطرق مختلفة - بدون تحسين أو باستخدام التحسين. إنه المترجم الأمثل الذي يتم تسليمه للمستخدمين النهائيين ، ليس فقط على منصة E2K ، التي لا يوجد لها ببساطة مولدات رمز آلة بديلة ، ولكن أيضًا على مجموعة منصات SPARC ، حيث يتوفر أيضًا دول مجلس التعاون الخليجي المعتادة كجزء من نظام التشغيل MSVS.بالنظر إلى الميزات المعمارية المذكورة أعلاه - التزامن الواضح ، التنفيذ الآمن للبرامج - من الواضح أن مترجم LCC يطبق العديد من الحلول الفريدة التي تستحق الدراسة والاختبار الأكثر صرامة في الممارسة. لسوء الحظ ، في وقت كتابة هذه السطور ، لم يكن المؤلف مؤهلات كافية لهذا ، ولا وقت لمثل هذه الدراسات ؛ آمل أن يتم معالجة هذه المشكلة عاجلاً أم آجلاً من قبل دائرة أوسع بكثير من ممثلي مجتمع تكنولوجيا المعلومات ، بما في ذلك أكثر كفاءة.من ما تمكنت من ملاحظته بالعين المجردة عند بناء برامج لاختبار الأداء ، فإن LCC على E2K في كثير من الأحيان يعطي تحذيرات بشأن الأخطاء المحتملة ، أو الإنشاءات الأميّة أو ببساطة الأماكن المشبوهة في الرمز. صحيح أن المؤلف ليس على دراية جيدة بدول مجلس التعاون الخليجي لضمان التمييز بين رسائل LCC الفريدة باللغة الروسية والمترجمة ببساطة (علاوة على ذلك ، فإن الترجمة انتقائية) ، ولست متأكدًا من أن التدفق الأكثر كثافة للتحذيرات ليس نتيجة لتكوين التجميع المكتمل تلقائيًا. أيضًا ، مع عدم معرفة دلالات قسم معين من التعليمات البرمجية ، يصعب أحيانًا فهم مدى ذكاء المترجم في العثور على أخطاء مخفية ، أو رفع إنذار خاطئ. على سبيل المثال ، في كود Postgresql ، تم العثور على نفس البناء أربع مرات في نفس الملف مع اختلافات طفيفة:for (i = 0, ptr = cont->cells; *ptr; i++, ptr++) {
if ((*ptr)[strspn(*ptr, " \t")] == '\0')
fputs(" ", fout);
else
html_escaped_print(*ptr, fout);
}
المترجم يتوقع طريقة ممكنة للخروج من الصفيف أحادي البعد في السلسلة باستدعاء دالة strspn . تحت أي ظروف يمكن أن يحدث هذا ، لا يفهم المؤلف (ولم يكن هناك مثل هذا التحذير على الأنظمة الأساسية الأخرى ، على الرغم من أن وضع الاختيار هو Warray-boundsيعد معيارًا قياسيًا لدول مجلس التعاون الخليجي) ، ومع ذلك ، من الجدير بالذكر أن النسخ المتكرر لنفس التصميم غير التافه (حيث كان من الضروري شرح الغرض منه في التعليق) ، بدلاً من وضعه في دالة منفصلة باسم بليغ لا يتطلب شرحًا. حتى إذا تبين أن الإنذار كاذب ، فإن الكشف عن رمز ذو رائحة كريهة يعد تأثيرًا مفيدًا ؛ سيتم ترك مؤلفي محلل ثابت PVS - Studio دون عمل. ولكن بجدية ، سيكون من الممتع والمفيد مقارنة الأخطاء الإضافية في التعليمات البرمجية التي تستطيع LCC اكتشافها بسبب الميزات الفريدة لبنية E2K - في نفس الوقت ، يمكن لعالم البرمجيات الحرة أن يتلقى دفعة أخرى من تقارير الأخطاء.وكانت آخر نتيجة التعارف غريبة مع LCC الثرثار المؤلف من التعليم، ومن ثم زملائه أكثر خبرة، على ما trigraphs ( trigraphs ) في لغات C / C ++، ولماذا لا يتم دعمها بشكل افتراضي، لحسن الحظ. هذه هي الطريقة التي تعيش بها ولا تشك في أن المزيج الذي يبدو غير ضار من علامات الترقيم في النصوص الحرفية أو التعليقات قد يكون قنبلة موقوتة - أو مادة ممتازة لإشارة مرجعية للبرنامج ، اعتمادًا على جانب الحاجز الذي تتواجد فيه.نتيجة غير سارة للاكتفاء الذاتي في LCC هي أن تنسيق رسالتها يختلف عن تنسيق دول مجلس التعاون الخليجي ، وعندما يتم تجميعها من بيئة تطوير (على سبيل المثال ، Qt Creator) ، فإن هذه الرسائل تقع فقط في السجل العام للعمل ، ولكن ليس في قائمة المشاكل المعترف بها. ربما يمكن تخصيص هذا بطريقة ما ، إما من جانب المترجم أو في بيئة التطوير ، ولكن على الأقل خارج الصندوق لا يفهم بعضهم البعض.تقليديا حادة للمنصات المحلية ، نظرا لأدائها المنخفض نسبيا ، هناك مشكلة التجميع المتبادل ، أي تجميع البرامج للهندسة المعمارية المستهدفة ومجموعة محددة من مكتبات النظام ، باستخدام موارد أجهزة الكمبيوتر الأكثر قوة ، مع بنية مختلفة وبرامج أخرى. إذا حكمنا من خلال خطوط التعريف في صميم نظام Elbrus وفي مترجم LCC نفسه ، يتم تجميعها على Linux i386 ، ولكن مجموعة الأدوات هذه لـ x86 ، بالطبع ، لا يتم تضمينها في حزمة توزيع النظام نفسه. إنه مثير للاهتمام ، ولكن هل من الممكن القيام بالعكس: على Elbrus لجمع البرامج لمنصات أخرى؟ (لم ينجح المؤلف أكثر من المرحلة الأولى لجمعية دول مجلس التعاون الخليجي لـ i386).إصدارات الحزم الأكثر أهمية للمطور:- المجمعات: lcc 1.19.18 (متوافق مع gcc 4.4.0) ؛
- : erlang 15.b.1, gawk 4.0.2, lua 5.1.4, openjdk 1.6.0_27 (jvm 20.0‑b12), perl 5.16.3, php 5.4.11, python 2.7.3, slang 2.2.4, tcl 8.6.1;
- : autoconf 2.69, automake 1.13.1, cmake 2.8.10.2, distcc 3.1, m4 1.4.16, make 3.81, makedepend 1.0.4, pkgtools 13.1, pmake 1.45;
- : binutils 2.23.1, elfutils 0.153, patchelf 0.6;
- : boost 1.53.0, qt 4.8.4, qt 5.2.1;
- : expat 2.1.0, ffi 3.0.10, gettext 0.18.2, glib 2.36.3, glibc 2.16.0, gmp 4.3.1, gtk+ 2.24.17, mesa 10.0.4, ncurses 5.9, opencv 2.4.8, pcap 1.3.0, popt 1.7, protobuf 2.4.1, sdl 1.2.13, sqlite 3.6.13, tk 8.6.0, usb 1.0.9, wxgtk 2.8.12, xml‑parser 2.41, zlib 1.2.7;
- : cppunit 1.12.1, dprof 1.3, gdb 7.2, perf 3.5.7;
- : anjuta 2.32.1.1, glade 2.12.0, glade 3.5.1, qt‑creator 2.7.1;
- : bzr 2.2.4, cvs 1.11.22, git 1.8.0, patch 2.7, subversion 1.7.7.
مرة أخرى ، إذا كنت تتوقع GCC 5 و PHP 7 و Java 9 ، فهذه هي مشكلاتك ، كما يقول لاعب كرة قدم مشهور. في هذه الحالة ، يجب أن أقول شكرًا أيضًا على الأقل ليس GCC 3.4.6 (LCC 1.16.12) ، كما هو الحال في الإصدارات السابقة من نظام Elbrus ، أو GCC 3.3.6 في تكوين MSVS 3.0 ؛ بالمناسبة ، لا يزال المترجم الرئيسي في MSVS 3.0 GCC 2.95.4 (ولماذا تتفاجأ عندما يكون هناك نواة من فرع 2.4؟). مقارنة بالوضع السابق ، عندما كان من الممكن أن تتعثر في خطأ خليجي تم إصلاحه في المنبع قبل عشر سنوات ، فإن النظام الجديد لديه ظروف سماوية تقريبًا - يمكنك حتى تمريره في C ++ 11 إذا كنت لا تريد الحفاظ على التوافق مع الإصدارات السابقة.ظهور OpenJDK ، على الأقل بشكل ما ، يمكن أن يطلق عليه بالفعل اختراقًا كبيرًا ، لأن كره Java و Monoفي مثل هذه الأنظمة معروفة منذ زمن طويل ؛ ويمكن فهم هذا الكراهية حتى عندما تتحرك البرامج الأصلية بالكاد. نظرًا لوجود العديد من Javists بين زملاء المؤلف ، بسبب الظروف المذكورة أعلاه ، أجبروا على كبح جماح النفوس الرائعة ، فقد تقرر تكريس سلسلة منفصلة من اختبارات الأداء لتكريس Java. بالنظر إلى المستقبل ، نلاحظ أن النتائج كانت محبطة حتى من الناحية النسبية: مع النجاح نفسه ، يمكنك كتابة نصوص مكتوبة بلغة PHP أو Python ، على الأرجح.لا يقتصر دعم C و C ++ فقط على التوافق مع مجموعة GNU Compiler Collection: لا يزال النظام يحتوي على مترجم فورتران. نظرًا لأن المؤلف على دراية بالأستاذ فورتران فقط ، يمكن لأي شخص مهتم أن يوصي بموضوع ديسمبر "صنع معنا"، حيث تمس التعليقات استخدام هذه اللغة كمعيار.بالنسبة للحلوى ، قمنا بتخزين ألذ: الجزء الأخير من المقالة مخصص لدراسة أداء Elbrus بالمقارنة مع مجموعة متنوعة من منصات الأجهزة والبرمجيات ، بما في ذلك المحلية.