لغة البرمجة الأساسية المختلطة

التصميم

في الاصل صممت لكتابة مترجمات لغات أخرى، BCPL لم يعد استعمالها شائع. ومع ذلك، لا نزال نشعر بنفوذها حتى الآن جرد بانخفاض وتم عمل إصدار بقواعد لغة مختلفة واسمه بدل من من BCPL، أصبح B، وكانت اللغة التي استندت عليها لغة البرمجة C. BCPL كان أول لغة برمجة استخدمت القوس المجعد، والأقواس المتعرجة بقت عبر تغييرات بناء القواعد، وأصبحت وسيلة شائعة تدل على بيانات كود مصدر برنامج. في الممارسة العملية، على لوحات المفاتيح المحدودة هذه الايام، غالبا ما تستخدم برامج المصدر تسلسل $ (و$) في مكان الرموز} و{. وتعليقات السطر واحد '/ /' BCPL، والتي لم تؤخذ في C، وعادت إلى الظهور في سي++، وبعد ذلك في C99.
وكان BCPL ردا على الصعوبات التي سابقتها في لغة البرمجة المختلطة (CPL)، التي أنشئت أوائل الستينات. ريتشاردز أنشاء BCPL من خلال "إزالة مميزات للغة الكاملة التي تجعل من الصعب تجميعها". وكان تنفيذ مترجم اللغة الأول، لـ IBM 7094 تحت نظام اقتسام للوقت متوافق (CTSS)، وكتبت في حين كان ريتشاردز يزور مشروع MAC في MIT (]]معهد ماساتشوستس للتكنولوجيا[[) في ربيع عام 1967. وقد وصفت الغة لأول مرة في ورقة قدمت إلى المؤتمر الحاسوب المشتركة في ربيع 1969.
اللغة نظيفة، متناسقة، وقوية، وسهلة الانتقال. ثبت بالتالي أن من الممكن كتابة مترجمات صغيرة وبسيطة لها، وكما هو الشائع يمكن تشغيل بعض المترجمين في 16 كيلو بايت. علاوة على ذلك، مترجم ريتشاردز، في حد ذاته كتب بلغة BCPL، زو كان سهل الانتقال.. وكان BCPL بالتالي خيارا شعبيا لإلباس حذاء النظام.
أحد الأسباب الرئيسية لقابلية المترجم للنقل يكمن في هيكلته. وقد انقسم إلى قسمين : الطرف الأمامي تقوم بتحليل المصدر وتولد رمزO للجهاز الافتراضي، والطرف الخلفي اخذ رمزO وترجمه إلى رمز للجهاز المستهدف. هناك فقط 1 / 5 من رموز المترجم بحاجة إلى إعادة كتابة لدعم جهاز جديد، وهي مهمة تستغرق عادة ما بين 2 و 5 أشهر. وأصبح هذا النهج ممارسة شائعة في وقت لاحق، على سبيل المثال، باسكال أو چاڤا، ولكن مترجم ريتشاردز BCPL كان الأول لتحديد جهاز افتراضي لهذا الغرض.
اللغة غير عادية في وجود نوع واحد فقط من البيانات : كلمة، عدد محدد من البتات، وعادة ما يتم اختيارها لتتحد مع كلمة آلة البناء وبالقدرة الكافية لتمثيل أي عنوان تخزين صالح. لآلات كثيرة من ذلك الوقت، كان نوع البيانات كلمة 16 ]]بت [[. وهذا الخيار أثبت لاحقا أنه مشكلة كبيرة عندما كانت تستخدم BCPL على الأجهزة التي أصغر بند عنونة فيها لم يكن كلمة، ولكن بايت أو على أجهزة مع أحجام أكبر للكلمات : 32 بت و 64 بت، التي سمحت لهم بإدارة مسافات عنوان كبيرة.
وتم تحديد تفسير أي قيمة من قبل المشغلين الذين اعتادوا على معالجة القيم. (على سبيل المثال، + تضيف قيمتين معا وتتعامل معهما بوصفهما أعداد صحيحة ؛! بلا إتجاه من خلال القيمة، وعالجتها بطريقة فعالة على أنها مؤشر.) ومن أجل أن يعمل هذا، لم تقدم التطبيقات أي فحص للنوع. التدوين المجري Hungarian notation تم وضعه للمساعدة المبرمجين على تجنب أخطاء النوع غير المقصودة.
عدم التطابق بين توجيه الكلمة لـ BCPL وأجهزة توجيه البايت تم معالجتها بعدة طرق. أحداها كان توفير إجراءات مكتبة قياسية للتعبئة وتفريغ الكلمات إلى سلاسل بايتات. مفي وقت لاحق، تم إضافة ميزتين إلى اللغة : اختيارلمشغل مجال البايت وأقحام مشغل مراوغة البايت (أشيرت بواسطة الرمز '%').
BCPL تتولى ربط مجموعة الوحدات compilation units المنفصلة الممتدة بطريقة فريدة من نوعها. لا توجد متغيرات للمستخدم معلن عنها شاملاً، بدلا من ذلك هناك متجة شامل، الذي يشبه "فراغ مشترك" في فورتران Fortran. جميع البيانات مشتركة بين مجموعة الوحدات المختلفة تشمل المدرجات والمؤشرات إلى المتجهات المخزنة في مكان معد لهذا الغرض في متجة شامل. وبالتالي ملفات الرأس (الملفات المضمنة خلال التجميع باستخدام التوجيه "GET") تصبح الوسيلة الرئيسية لمزامنة البيانات الشاملة بين مجموعة الوحدات، التي تحتوي على توجيهات " GLOBAL" التي تسرد قائمة بأسماء رمزية، كل مزدوج مع العدد الذي يقترن مع اسم الكلمة المقابلة عدديا في المتجه الشامل. فضلا عن المتغيرات، ويحتوي المتجه الشامل أيضا على إجراءات الربط الخارجية. وهذا ما يجعل التحميل الديناميكي لمجموعة الوحدات تحقيقه بسيط جدا. بدلا من الاعتماد على محمل الربط للتطبيق الأساسي.أعطت BCPL للمبرمج السيطرة ْ من عملية الربط بفاعلية.
المتجه الشامل أيضا سهل من عملية استبدال أو زيادة الإجراءات للمكتبة القياسية. برنامج يمكن ان يحفظ المؤشر من المتجه الشامل للروتين الأصلي واستبداله بمؤشر لنسخة بديلة. ولعل البديلة تقوم باستدعاء الأصلية كجزء من معالجتها. ويمكن أن تستخدم كوسيلة مساعدة سريعة ومؤقتة لتصحيح الأخطاء.
BCPL كما هو مشاع بأنها اللغة التي تم كتابة البرنامج الأصلي hello world program بها.  كان الأول MUD مكتوب أيضا بلغة BCPL.
وكان العديد من أنظمة التشغيل مكتوب جزئيا أو كليا بلغة BCPL (على سبيل المثال، TRIPOS وأجزاء كبيرة من AmigaOS، بما في ذلك بدء عمليات Kickstart وأقدم إصدارات AmigaDOS) وكانت BCPL أيضا اللغة الأولية المستخدمة في بذرة مشروع زيروكس بارك ألتوXerox PARC Alto، وهو أول كمبيوتر شخصي حديث، بين المشاريع الأخرى، ونظام إعداد وثيقة برافوكتب أيضاً بلغة BCPL.
بحلول عام 1970، وجدت تطبيقات لـ Honeywell 635 و 645, و IBM 360, و TX-2, و CDC 6400, و Univac 1108, و PDP-9, و KDF 9 و Atlas 2. وكان هناك أيضا نسخة المنتجة للمايكرو بي بي سي BBC Micro في منتصف الثمانينات من منتجات كمبيوتر ريتشاردز، بدأت الشركة بجون ريتشاردز، شقيق الدكتور مارتن ريتشاردز. [citation needed] مشروع يوم قيامة بي بي سي BBC Domesday Project الذي قدم استخدام اللغة أيضاً. تم أيضا عمل إصدارات BCPL لأجهزة الكمبيوترAmstrad CPC و Amstrad PCWفي عام 1986 بواسطة شركة برامج بيت أرنور الإنجليزية المحدودة.
في عام 1979 تمت تطبيقات BCPL لما لا يقل عن 25 بنية ؛ في عام 2001 كان يرى ان استخدامها قليل.
ويمكن تلخيص فلسفة BCPL بالاقتباس من كتاب BCPL، اللغة ومترجمها : 
فلسفة BCPL أنها ليست مستبدة كالمستبد الذي يعتقد أنه يعرف أفضل ويضع القانون على ما هو مسموح به وما هو غير مسموح به، بل على الأصح BCPL تعمل كخادم يقدم خدماته على أفضل من قدرته دون شكوى، حتى عندما يواجه هراء واضح. ويفترض دائما أن المبرمج يعرف ما يفعله ولا تحاصره القيود البسيطة.
تصميم، وفلسفة، BCPL أثرت بشدة في B، التي أثرت بدورها في C.
وهناك شائعات بأن BCPL كانت مرشحة لـ " لبس حذاء لغة برمجة كامبردج"، على أي حال لم توجد CPL حتى توقفت BCPL عن التنمية، والاسم المختصر كان إعادة تفسير لكتاب BCPL.

أمثلة

هذه الأمثلة كاملة وقابلة للمقارنة وهي من توزيع BCPL لمارتن ريتشاردز.
طباعة المضاريب:
GET "libhdr"

LET start() = VALOF
{ FOR i = 1 TO 5 DO writef("fact(%n) = %i4*n", i, fact(i))
  RESULTIS 0
}

AND fact(n) = n=0 -> 1, n*fact(n-1)
حلول العد لمسألة ن من الملكات:
GET "libhdr"
 
GLOBAL { count:200; all:201 }
 
LET try(ld, row, rd) BE TEST row=all

                        THEN count := count + 1

                        ELSE { LET poss = all & ~(ld | row | rd)
                               UNTIL poss=0 DO
                               { LET p = poss & -poss
                                 poss := poss - p
                                 try(ld+p << 1, row+p, rd+p >> 1)
                               }
                             }

LET start() = VALOF
{ all := 1
  
  FOR i = 1 TO 12 DO
  { count := 0
    try(0, 0, 0)
    writef("Number of solutions to %i2-queens is %i5*n", i, count)
    all := 2*all + 1
  }

  RESULTIS 0
}