مقدمة
القصص الخيالية أكثر من صادقة: لا لأنها تخبرنا بأن التنانين موجودة، بل لأنها تخبرنا بأن التنانين يمكن هزيمتها.
جي. كَي. تشسترتون عن طريق نيل غيمان، كورالين
أنا متحمّس حقاً لأننا سنقوم بهذه الرحلة معاً. هذا كتاب عن تنفيذ مفسّرات (interpreters) للّغات البرمجة. وهو أيضاً كتاب عن كيفية تصميم لغة تستحق أن تُنفَّذ. إنه الكتاب الذي كنت أتمنّاه حين بدأتُ أُعنى باللّغات أوّل مرّة، وهو الكتاب الذي كنت أكتبه في ذهني طيلة عقد تقريباً.
على هذه الصفحات، سنسير خطوةً بخطوة عبر مفسّرين كاملين للغةٍ ذات ميزات متكاملة. وأفترض أن هذا أوّل غزوّ لك في عالم اللّغات، لذا سأشرح لك كل مفهوم وكل سطر برمجي تحتاجه لبناء تطبيق لغة متكامل وقابل للاستخدام وسريع.
ولكي أزجم تطبيقين كاملين في كتابٍ واحد دون أن يتحوّل إلى حصنٍ من الحجارة، فإنّ هذا النصّ أخفّ في النظريّة من غيره. وكما نصنع كلّ جزءٍ من النظام، سأقدّم لك التاريخ والمفاهيم الكامنة خلفه. وسأحاول أن أعوّدك على مصطلحات هذه اللّغة (lingo) بحيث إن وجدت نفسك يوماً في حفلة كوكتيل مليئة بباحثي اللّغات البرمجية (PL) لتكن واحداً منهم.
لكنّ أغلب وقتنا سينقضي في تشغيل اللّغة وإقلاعها. وهذا لا يعني أنّ النظريّة غير مهمّة. فالقدرة على التفكير بدقّة وصورة رسمية في الصياغة والدلالة هي مهارة حيويّة عند العمل على لغة. لكنّني شخصياً أتعلّم بالتطبيق. من الصعب عليّ أن أُخوض في فقرات مليئة بالمفاهيم المجرّدة وأستوعبها فعلاً. لكن إن كنتُ قد كتبتُ شيئاً، وشغّلته، وبحثتُ عن أخطائه، فإنّني أُدركه.
هذا هو هدفي معك. أريد أن تخرج من هنا بحدس متين حول كيفية حياة اللّغة وتنفّسها في الواقع. وآمل أن تكون المفاهيم هناك قد رسخت في ذهنك جيداً حين تقرأ لاحقاً كتباً أخرى أكثر نظريّة، ملتصقةً بهذه القاعدة الملموسة.
لماذا نتعلّم هذا كلّه؟
يبدو أنّ كلّ مقدّمة في كلّ كتاب عن المصرّفات تتضمّن هذا القسم. لا أعرف ما الذي في لغات البرمجة يسبّب هذا الشكّ الوجوديّ. ولا أظنّ أنّ كتب علم الطيور تشغل نفسها بتبرير وجودها. هي تفترض أنّ القارئ يحبّ الطيور وتبدأ بالشرح.
لكنّ لغات البرمجة مختلفة قليلاً. وأظنّ أنّ صحيحٌ أنّ احتمالات أن يبتدع أحدنا لغة برمجة عامّة ناجحة على نطاق واسع ضئيلة. فمصمّمو اللّغات المستخدَمة بكثرة في العالم يمكن أن يتّسع لهم حافلة فولكس فاغن، حتى لو لم تُفتح سقفها. ولو كان الانضمام إلى تلك النخبة السبب الوحيد لتعلّم اللّغات، لكان الأمر صعب التبرير. لكن لحسن الحظّ، ليس الأمر كذلك.
اللّغات الصغيرة في كلّ مكان
لكلّ لغة عامّة ناجحة، ألف لغة تخصّصية ناجحة. كنّا نسمّيها "اللّغات الصغيرة"، لكنّ تضخّم اقتصاد المصطلحات أدّى إلى تسمية "اللّغات التخصّصية للمجال". وهذه لغات مرتجلة مصمَّمة خصّيصاً لمنطقٍ معيّن. فكّر في لغات برمجة نصوص التطبيقات، ومحرّكات القوالب، وصيغ الترميز، وملفات الإعداد.

كلّ مشروع برمجيات كبير يحتاج عملياً إلى حفنة منها. وحينما تستطيع، من الجيّد أن تعيد استخدام لغة موجودة بدلاً من أن تبني واحدة من الصفر. فبمجرد أن تحسب في التوثيق، وأدوات تنقيح الأخطاء، ودعم المحرّرات، وإبراز الصياغة، وكلّ الزخارف الأخرى، تصبح صناعتها بنفسك مهمّة شاقة.
لكنّ الاحتمال جيّد جداً بأنّك ستجد نفسك بحاجة إلى إنشاء محلّل (parser) أو أداة أخرى حين لا توجد مكتبة قائمة تناسب احتياجاتك. وحتى حين تعيد استخدام تطبيق قائم، فستنتهي حتماً إلى الحاجة إلى تنقيحه وصيانته والتنقّل في أجزائه الداخلية.
اللّغات تمرين رائع
يتدرّب عدّاؤو المسافات الطويلة أحياناً بأوزان مربوطة حول كواحلهم، أو على ارتفاعات عالية حيث يكون الهواء رقيقاً. وحين يتخلّصون لاحقاً من تلك الأعباء، فإنّ سهولة النسب الجديدة لأطراف خفّة والهواء الغنيّ بالأكسجين تمكّنهم من الجري أبعد وأسرع.
تنفيذ لغة اختبار حقيقيّ لمهارات البرمجة. فالكود معقّد وحسّاس للأداء. عليك أن تتقنى التعاود (recursion)، والمصفوفات الديناميكيّة، والأشجار، والرسوم البيانيّة، وجداول التجزئة (hash tables). ربما تستخدم جداول التجزئة على الأقلّ في برمجتك اليوميّة، لكن هل تتفهّمها حقاً؟ حسناً، بعد أن نُنشئ جداول التجزئة بأنفسنا من الصفر، أضمن لك أنّك ستتفهّمها.
رغم أنّني أعتزم أن أريك أنّ المفسّر ليس مخيفاً بقدر ما قد تظنّ، فإنّ تنفيذه على الوجه الجيّد يظلّ تحدّياً. فاجهه وستخرج مبرمجاً أقوى، وأكثر وعياً بكيفية استخدامك لبنى البيانات والخوارزميّات في عملك اليوميّ.
سببٌ آخر
هذا السبب الأخير يصعب عليّ الاعتراف به، لأنّه قريب جدّاً من قلبي. منذ تعلّمت البرمجة طفلاً، شعرت بأنّ في اللّغات شيئاً سحرياً. حين كنتُ أكتب برامج BASIC ضغطةً ضغطة، لم أستطع أن أتخيّل كيف صُنع BASIC نفسه.
ولاحقاً، كان مزيج الهيبة والرعب على وجوه زملائي في الجامعة حين يتحدّثون عن صفّ المصرّفات كافياً ليقنعني بأنّ قراصنة اللّغات فصيلةٌ مختلفة من البشر -- نوعٌ ما من السحرة مُنحوا وصولاً امتيازياً إلى الفنون الغامضة.
إنّها صورة جذّابة، لكنّ لها جانباً مظلماً. لم أشعر أنا بأنّني ساحر، فبقيت أفكّر أنّني أفتقر إلى صفة فطرية لازمة للانضمام إلى تلك الجماعة. ومع أنّني كنت مسحوراً باللّغات منذ أن رسمتُ كلماتٍ مفتاحية مُختلقة على دفتر مدرستي، فقد استغرق مني عقوداً لأجمع الشجاعة وأن أحاول بجدّ أن أتعلّمها فعلاً. تلك الصفة "السحرية"، ذلك الإحساس بالحصرية، كان يستبعدني.
حين بدأتُ أخيراً في تجميع مفسّراتي الصغيرة، تعلّمتُ سريعاً أنّ، بالطبع، لا سحر هنا البتّة. إنّها مجرّد شيفرة، والذين يتلاعبون باللّغات هم مجرّد بشر.
وهناك بعض التقنيّات التي لا تصادفها كثيراً خارج اللّغات، وبعض الأجزاء صعبة قليلاً. لكنّها ليست أصعب من العوائق الأخرى التي تجاوزتها. وآمل أن تكون قد شعرتَ بالارتباك تجاه اللّغات، وأن يساعدك هذا الكتاب على التغلّب على ذلك الخوف، وعسى أن أتركك أكثر جرأةً بقليل ممّا كنتَ عليه من قبل.
ومن يدري، ربما ستفعل أنتَ أن تصنع اللّغة العظيمة القادمة. فلا بدّ لأحدٍ أن يفعل.
كيف نظُم الكتاب
هذا الكتاب مقسّم إلى ثلاثة أجزاء. أنتَ تقرأ الجزء الأوّل الآن. إنّه فصلان ليعود بك إلى الجادة، ويعلّمانك بعض المصطلحات التي يستعملها قراصنة اللّغات، ويعرّفانك على Lox، اللّغة التي سننفّذها.
وكلّ من الجزأين الآخرين يبني مفسّراً واحداً كاملاً للغة Lox. وداخل هذين الجزأين، كلّ فصل مبنيّ بالطريقة نفسها. يأخذ الفصل إحدى ميزات اللّغة، ويعلّمك المفاهيم الكامنة خلفها، ويرافقك عبر تنفيذها.
استغرق ذلك قدراً كبيراً من التجريب والخطأ من جهتي، لكنّني نجحت في تقسيم المفسّرين اثنين إلى أجزاء بحجم الفصل، تبنى على الفصول السابقة ولا تتطلّب شيئاً من الفصول اللاحقة. منذ الفصل الأوّل، سيكون لديك برنامج عامل يمكنك تشغيله والعب به. ومع كلّ فصلٍ ينقضي، ينمو البرنامج أكثر فأكثر حتى تملك في النهاية لغةً كاملة.
وبخلاف النثر الإنجليزي الغزير اللامع، تتضمّن الفصول مظاهر أخرى بعضها ممتع:
الشيفرة
نحن على وشك أن نصنع مفسّرات، لذا يحتوي هذا الكتاب على شيفرة حقيقية. فكلّ سطر شيفرةٍ مطلوب مُدرَج، وكلّ مقتطف يخبرك أين تضعه في تطبيقك الذي يكبر يوماً بعد يوم.
وتستعمل كتب اللّغات وتطبيقاتها الأخرى كثيرة أدواتً مثل Lex وYacc، وهي ما يُسمّى مصرّفات المصرّفات (compiler-compilers)، التي تولّد آلياً بعض ملفات المصدر لأيّ تطبيق انطلاقاً من وصف أكثر تجريداً. ولكلّ هذه الأدوات مزايا وعيوب، وآراء قوية -- بل يمكن القول إنّها إيمان -- في كلا الطرفين.
وسنمتنع عن استخدامها هنا. أريد أن أتأكّد أنّه لا توجد زوايا داكنة يمكن للسحر والحيرة أن يختبئا فيها، لذا سنكتب كلّ شيء بأيدينا. وكما سترى، ليس الأمر سيئاً كما يبدو، وهذا يعني أنّك حقاً ستفهم كلّ سطر في الشيفرة وكيف يعمل كلا المفسّرين.
وللكتاب قيود تختلف عن قيود "العالم الحقيقي"، لذا قد لا يعكس
أسلوب الكتابة هنا دائماً أفضل طريقة لكتابة برمجيات إنتاجية
قابلة للصيانة. فإذا بدوتُ متهاوناً قليلاً حين أُسقط private
مثلاً، أو أُعلِن متغيّراً عامّاً (global variable)، فاعلم أنّني
أفعل ذلك لإبقاء الشيفرة أسهل على عينيك. فالصفحات هنا ليست
عريضة كما هي محرّرك البرمجي، وكلّ حرفٍ يُحسب.
وأيضاً، لا تحوي الشيفرة على تعليقات كثيرة. والسبب في ذلك أنّ
كلّ حفنة أسطرٍ محاطةٌ بعدّة فقراتٍ من النصوص الصادق الذي
يشرحها. فحين تكتب كتاباً يرافق برنامجك، لك أن تُهمل التعليقات
أيضاً. وفي غير ذلك، ينبغي لك أن تستعمل // أكثر قليلاً مما
أفعل أنا.
وبينما يحتوي الكتاب على كلّ سطر من الشيفرة ويعلّمك معنى كلّ سطر، إلّا أنّه لا يصف الآليّات اللازمة لتصريف المفسّر وتشغيله. وأفترض أنّك تستطيع تجميع ملفّ make أو مشروعٍ في محرّرك البرمجي المفضّل لديك كي يعمل هذا الشيفرة. فتعليماتٌ من هذا النوع تصبح قديمة بسرعة، وأريد أن يتقادم هذا الكتاب كما تتقادم براندير XO، لا كمشروب حارة.
المقتطفات
ولأنّ الكتاب يحتوي حرفياً على كلّ سطر شيفرةٍ مطلوب للتطبيقين، فإنّ المقتطفات دقيقة إلى حدٍّ كبير. وأيضاً، لأنّني أحاول إبقاء البرنامج في حالة قابلة للتشغيل حتى حين تغيب ميزاتٌ كبرى، فإنّنا نضيف أحياناً شيفرةً مؤقّتة تُستبدل في مقتطفات لاحقة.
ويبدو المقتطف بكامل أجزائه هكذا:
default:
في scanToken()
استبدل سطراً واحداً
if (isDigit(c)) {
number();
} else {
Lox.error(line, "Unexpected character.");
}
break;
في الوسط، لديك الشيفرة الجديدة التي ستضيفها. وقد يكون فوقها أو تحتها بضعة أسطرٍ باهتة لبيان موضعها ضمن الشيفرة المحيطة الحالية. وهناك أيضاً فقرةٌ قصيرة تخبرك في أيّ ملفٍ وفي أيّ موضع تضع المقتطف. فإذا كانت تلك الفقرة تقول "استبدل _أسطر"، فهناك شيفرةٌ قائمة بين السطرين الباهتين عليك حذفها واستبدالها بالمقتطف الجديد.
الحواشي
تحتوي الحواشي على لمحاتٍ من السيرة الذاتية، وخلفيةٍ تاريخية، وإشاراتٍ إلى مواضيعَ ذات صلة، واقتراحاتٍ لمناطق أخرى تستحقّ الاستكشاف. ولا يوجد فيها ما يجب أن تعرفه لفهم الأجزاء اللاحقة من الكتاب، لذا يمكنك تخطّيها إن أردت. لن أحكم عليك، لكنّني قد أشعر بشيءٍ من الحزن.
التحديات
ينتهي كلّ فصلٍ ببضعة تمارين. وخلافاً لمجموعات مسائل الكتب الدراسية التي تميل إلى مراجعة ما غطّيتَه بالفعل، فإنّ هذه التمارين موجودة لمساعدتك على تعلّم أكثر ممّا في الفصل. فهي تجبرك على أن تنزل عن المسار المرسوم وأن تستكشف بمفردك. وهي ستدفعك إلى البحث في لغاتٍ أخرى، وإلى اكتشاف كيفية تنفيذ الميزات، أو إلى الخروج من منطقة راحتك بطريقةٍ أو بأخرى.
وإذا غلَبتَ التحديات، فستخرج بفهمٍ أوسع، وقد تُصاب بيضٍ وكدوس. أو تخطّاها إن أردت البقاء داخل مقصورة الحافلة المريحة. هذا كتابك.
ملاحظات التصميم
معظم كتب "لغات البرمجة" هي في الواقع كتبٌ عن تنفيذ لغات البرمجة. فقليلةٌ جدّاً ما يتناقش حول كيفية تصميم اللّغة التي يجري تنفيذها. والتنفيذ ممتع لأنّه محدَّد بدقّة. ويبدو أنّ لدينا كمبرمجين ميلاً إلى الأشياء السوداء والبيضاء، إلى الآحاد والأصفار.
شخصياً، أظنّ أنّ العالم لا يحتاج إلّا إلى عددٍ محدود من تطبيقات FORTRAN 77. فعند نقطة ما، تجد نفسك تصمّم لغةً جديدة. ومتى ما بدأتَ تلعب تلك اللعبة، تصبح المعادلة اللّطيفة الإنسانية هي المهمّة الأولى. أمورٌ مثل: أيّ الميزات يسهل تعلّمها، وكيف توازن بين الابتكار والمألوفية، وأيّ صياغةٍ أكثر قابلية للقراءة ولمَن.
كلّ تلك الأمور تؤثّر بعمق في نجاح لغتك الجديدة. أريد أن تنجح لغتك، لذا أنهي بعض الفصول بملاحظة تصميم، وهي مقالةٌ قصيرة عن زاويةٍ ما من الجانب الإنساني للّغات البرمجة. ولستُ خبيراً في هذا -- ولا أظنّ أنّ أحداً خبيرٌ فعلاً -- لذا خذها بكمياتٍ كبيرة من الملح. وهذا سيجعلها طعاماً ألذّ للتأمّل، وهو هدفي الرئيسيّ.
المفسّر الأوّل
سنكتب مفسّرنا الأوّل، jlox، بـJava. والركّز على المفاهيم. سنكتب أبسط الشيفرات وأنظفها لنُنجِز تنفيذ دلالة اللّغة على نحو صحيح. وهذا سيجعلنا مرتاحين مع التقنيّات الأساسية، كما سيصقل فهمنا لكيفية تصرّف اللّغة تماماً كما يُفترض.
وJava لغةٌ رائعة لهذا. فهي عالية المستوى بما يكفي كي لا نُغرق في تفاصيل التنفيذ المملة، لكنّها تبقى صريحةً إلى حدٍّ كبير. وخلافاً للغات النصوص، فإنّ هناك آليّاتٍ أقلّ تعقيداً تختبئ عادةً تحت الغطاء، ولدينا أنواعٌ ساكنة تُريك ما هي بنى البيانات التي تعمل معها.
وقد اخترتُ Java تحديداً أيضاً لأنّها لغةٌ موجّهة نحو الأشياء. فقد اجتاح هذا النمَط عالم البرمجة في التسعينيات، وصار اليوم الطريقةَ الغالبة في التفكير لملايين المبرمجين. والاحتمال جيّدٌ أنّك معتادٌ أصلاً على تنظيم الشيفرة في أصنافٍ (class) ودوالّ (method)، لذا سنُبقيك داخل منطقة راحتك.
ورغم أنّ أهل اللّغات الأكاديميّين ينظرون أحياناً بازدراء إلى اللّغات الموجّهة نحو الأشياء، فإنّ الواقع أنّها مستخدَمة على نطاقٍ واسع حتى في عمل اللّغات. فـGCC و LLVM مكتوبان بـC++، وكذلك معظم آلات JavaScript الافتراضية. واللّغات الموجّهة نحو الأشياء في كلّ مكان، والأدوات والمصرّفات الخاصة بلغةٍ ما كُتبت غالباً بلغتها هي نفسها.
وأخيراً، تحظى Java بشعبيةٍ هائلة. وهذا يعني أنّ الاحتمال جيّدٌ أنّك تعرفها أصلاً، فهناك أقلّ عليك تعلّمه لتبدأ في الكتاب. وإن لم تكن متمرّساً في Java إلى حدٍّ كافٍ، فلا تذهب. أحاول التقيّد بمجموعةٍ فرعية دقيقة منها. أستخدم عامل الماس (diamond operator) من Java 7 لجعل الأمور أكثر إيجازاً قليلاً، لكنّها إلى هذا الحدّ بالنسبة للميزات "المتقدّمة". وإن كنتَ تعرف لغةً موجّهةً نحو الأشياء أخرى مثل C# أو C++، فبإمكانك أن تتدبّر أمراك.
وبحلول نهاية الجزء الثاني، سيكون لدينا تطبيقٌ بسيطٌ ومقروء. ليس سريعاً جدّاً، لكنّه صحيح. غير أنّنا نستطيع تحقيق ذلك فقط بالبناء على مرافق بيئة التشغيل (runtime) الخاصة بآلة Java الافتراضية. ونحن نريد أن نتعلّم كيف تنفّذ Java نفسها تلك الأمور.
المفسّر الثاني
إذن في الجزء التالي نبدأ من جديد تماماً، لكن هذه المرّة بـC. وC هي اللّغة المثالية لفهم كيفية عمل تطبيقٍ حقاً، وصولاً إلى البايتات في الذاكرة والشيفرة التي تجري عبر المعالج.
ومن الأسباب الكبيرة لاستعمالنا C أنّه يتيح لي أن أريك الأشياء التي تتفوّق فيها C تحديداً، لكنّ هذا يعني أيضاً أنّك ستحتاج إلى أن تكون مرتاحاً معها إلى حدٍّ كبير. لستَ بحاجة إلى أن تكون تجسيداً لدنيس ريتشي من جديد، لكنّك لا ينبغي أن تخاف المؤشّرات (pointer) أيضاً.
إن لم تكن هناك بعد، فالتقط كتاباً تمهيدياً عن C وتدرّب عليه، ثمّ عُد إلى هنا حين تنتهي. وفي المقابل، ستخرج من هذا الكتاب مبرمج C أقوى. وهذا مفيد بالنظر إلى كم من تطبيقات اللّغات مكتوبةٍ بـC: Lua و CPython و MRI في Ruby، على سبيل ذكر القليل.
وفي مفسّرنا المكتوب بـC، وهو clox، نضطرّ إلى تنفيذ بأنفسنا كلّ الأشياء التي وفّرتها Java مجاناً. سنكتب مصفوفتنا الديناميكيّة وجدول تجزئتنا. وسنقرّر كيف تُمثَّل الأشياء في الذاكرة، ونبني جامعَ نفايات (garbage collection) لاستعادة ذاكرتها.
كان تركيز تطبيقنا المكتوب بـJava على الصحّة. وبعد أن أتقنّا ذلك، سنتحوّل إلى أن يكون سريعاً أيضاً. وسيحتوي مفسّرنا بـC على مصرّف يترجم Lox إلى تمثيل شيفرة بايت (bytecode) كفء، ثمّ ينفّذه. وهذه هي التقنية نفسها التي تستعملها تطبيقات Lua و Python و Ruby و PHP ولغاتٍ ناجحة أخرى كثيرة.
وسنجرّب أيضاً أيدينا في القياس البنيوي (benchmarking) والتحسين. وبحلول النهاية، سيكون لدينا مفسّرٌ متينٌ ودقيقٌ وسريعٌ للّغتنا، قادرٌ على مجاراة تطبيقاتٍ احترافية أخرى موجودة هناك. ليس سيئاً لكتابٍ واحد وبضعة آلاف من أسطر الشيفرة.
التحديات
-
تُستخدَم في النظام الصغير الذي جمعته لكتابة هذا الكتاب ونشره ستّ لغاتٍ تخصّصية على الأقلّ. ما هي؟
-
اكتب برنامج «مرحباً، عالم!» في Java واجعله يعمل. هيّئ ملفات make أو مشاريع محرّك البرمجة التي تحتاجها كي يعمل. وإن كان لديك منقّح أخطاء، فتعوّد عليه ونفّذ برنامجك خطوةً خطوة أثناء تشغيله.
-
افعل الشيء نفسه في C. ولكي تتدرّب على المؤشّرات، عرّف [قائمةً مترابطةً مزدوجة][] من نصوصٍ مخصَّصة في الكومة (heap). اكتب دوالّ لإدراج العناصر فيها وإيجادِها وحذفِها. اختبرها.
ملاحظة تصميم: ماذا في الاسم؟
كان أحد أصعب التحدّيات في كتابة هذا الكتاب هو إيجاد اسمٍ للّغة التي ينفّذها. مررتُ بـصفحاتٍ كاملةٍ من الأسماء المرشّحة قبل أن أعثر على اسمٍ ينجح. وكما ستجد في اليوم الأوّل الذي تبدأ فيه ببناء لغتك أنت، فإنّ التسمية صعبةٌ بشكل ماكر. والاسم الجيّد يستوفي عدّة معايير:
-
ليس مستخدَماً. فتدريجياً قد تقع في مشكلاتٍ من كلّ الأنواع، قانونيةً واجتماعية، إن صادفت بالخطأ اسمَ شخصٍ آخر.
-
سهل النطق. إن سارت الأمور على ما يرام، فأنت ملأت الدنيا من الناس سيقولون ويكتبون اسم لغتك ويكرّرونه. وأيّ اسمٍ أطول من مقطعين أو بضعة حروفٍ سيُزعجهم إلى ما لا نهاية.
-
مميّزٌ بما يكفي للبحث عنه. سيفعل الناس google اسم لغتك ليتعلّموا عنها، لذا تريد كلمةً نادرةً بما يكفي بحيث تشير معظم النتائج إلى وثائقك. وإنّ كمّ محركات البحث الذكيّ التي تحشره اليوم، فهذه المسألة أقلّ حدّة. ومع ذلك، لن تخدم مستخدميك إذا سمّيت لغتك "من أجل".
-
لا تحمل دلالاتٍ سلبية عبر ثقافاتٍ متعدّدة. من الصعب أن تكون متيقّظاً لذلك، لكنّ من المفيد النظر فيه. فمصمّم Nimrod اضطرّ في النهاية إلى إعادة تسمية لغته إلى "Nim" لأنّ عدداً كبيراً من الناس يتذكّرون أنّ Bugs Bunny كان يستعمل "Nimrod" بصفتها شتيمة. (وBugs كان يستعملها على سبيل السخرية.)
إن مرّ اسمُك المحتمل من هذا المدرّب، فأبقِه. ولا تتعثّر في البحث عن تسميةٍ تختزل جوهر لغتك. فإذا كان في أسماء لغات العالم الناجحة الأخرى ما يعلّمنا شيئاً، فهو أنّ الاسم لا يهمّ كثيراً. كلّ ما تحتاجه هو رمزٌ فريدٌ إلى حدٍّ معقول.