هذا هو استمرار لمقال
"لماذا مضرب؟ لماذا لشب؟ كتبت بعد حوالي عام من اكتشافي
مضرب . كوني مبتدئ ، لم أستطع أن أفهم الثناء الذي انبثق على Lisp من جميع الجهات. لم أكن أعرف ماذا أفكر. كيف نفهم أن Lisp ستؤدي في النهاية إلى
"تنوير عميق" . حسنا ، يا إخوانه ، أنت تقول.
كان لدي سؤال بسيط:
ما الفائدة؟ في مقال سابق ، حاولت الإجابة عليه ولخصت الأسباب التي تجعل شخصًا ما يرغب في تعلم اللغة Lisp أو على وجه الخصوص Racket.
قمت بتجميع قائمة
بميزات اللغة التسع الأكثر قيمة بالنسبة لي كوني مبتدئًا في Racket. على سبيل المثال ، الميزة رقم 5 هي "إنشاء لغات برمجة جديدة". وتسمى هذه الطريقة أيضًا
البرمجة الموجهة للغات ، أو
JOP .
منذ ذلك الحين ، أصبحت IOP الجزء المفضل لدي من Racket ، وشاركت إعجابي في كتاب
Beautiful Racket على الإنترنت ، والذي يشرح تقنية ROP وأداة Racket.
مثال واحد في عملي هو
حبوب اللقاح . لقد كتبت لغة البرمجة هذه للطباعة المريحة لكتبي على الإنترنت. في حبوب اللقاح ، يتم برمجة الفقرة السابقة على النحو التالي:
#lang pollen ◊link["https://beautifulracket.com/appendix/why-racket-why-lisp.html#so-really-whats-in-it-for-me-now"]{ }, Racket. , № 5 — « ». ◊em{- }, ◊em{}.
مثال آخر هو
brag ، وهو مولد للمحلل (بأسلوب
lex/yacc
) ، والذي يأخذ
قواعد BNF ككود مصدر. مثال بسيط للغة
فرنك بلجيكي :
#lang brag bf-program : (bf-op | bf-loop)* bf-op : ">" | "<" | "+" | "-" | "." | "," bf-loop : "[" (bf-op | bf-loop)* "]"
يتم تطبيق كلتا اللغتين في Racket ويمكن تشغيلهما باستخدام مترجم Racket المعتاد أو داخل معرف Racket IDE (يسمى DrRacket).
القضايا الرئيسية
ومع ذلك ... على الرغم من أن الكتاب أجبر الآلاف من الناس على البدء في استكشاف Racket ، يبدو لي في بعض الأحيان أنني أخطو على نفس الأرض السريعة مثل مشجعي Lisp الذين انتقدتهم ذات يوم.
إذا كان NOP رائعًا ، فلماذا تقضي بضعة أيام في قراءة كتاب. أليس كذلك؟ يمكنني شرح كل شيء لفترة وجيزة ، دون مزيد من اللغط. يجب الإجابة عن سؤالين بسيطين:
- ما هي المشاكل الأنسب لبرمجة اللغة؟
- لماذا هو أفضل مضرب لإنشاء اللغات؟
السؤال الثاني بسيط. الأول ليس كذلك. سئلته عدة مرات. كثيراً ما أقتبس من جملة القاضي بوتر ستيوارت
الشهيرة : سوف تفهمها عندما تراها. الجواب جيد بما يكفي لأولئك الذين يهتمون حقًا. ولكن ليس لأولئك الذين هم على الجانب ويودون سماع الحجج الموضوعية.
لذلك ، سأحاول. ضع في اعتبارك أنني لست أستاذًا لعلوم الكمبيوتر ولا يمكنني التحدث عن نظرية لغات البرمجة. بدلاً من ذلك ، أستخدم Racket ولغات المجال المحددة (DSL) لأغراض عملية: عملي اليومي يعتمد عليها. لذلك ، سأركز على الجوانب العملية.
إجابة قصيرة
- JOP هو في الواقع وسيلة تصميم واجهة. إنه مثالي للمهام التي تتطلب الحد الأدنى من التدوين مع الحفاظ على الدقة القصوى . تدوين الحد الأدنى يعني التدوين المسموح به فقط. لا اكثر الدقة القصوى ، وهذا هو ، معنى هذا التدوين ، هو بالضبط ما تقوله. لا غموض أو أنماط. IOP يحصل على هذه النقطة مثل أي شيء آخر.
(الصبر يمكن الانتقال إلى فئات محددة من المهام التي ستستفيد من NOP).
- تعد Racket مثالية لـ OOP نظرًا لنظامها الكلي . أنها تعمل في نمط مترجم ، وتبسيط تحويل التعليمات البرمجية. نظام الماكرو Racket أفضل من أي نظام آخر.
في هذه المرحلة ، سيرغب نصف قراء المقالة في نشر تعليقات مجهولة تنتقد أطروحاتي. لكن من فضلك ضع في اعتبارك: على أي حال ، لقد فزت. زادت JOP و Racket بشكل لا يصدق من إنتاجي للبرمجة. يسعدني مشاركة هذه المعرفة حتى تتمكن أنت أيضًا من الاستفادة من هذه الفوائد. لكنني سأكون سعيدًا أيضًا إذا ظلت هذه الأدوات سلاحي السري. في هذه الحالة ، سأبقى في 0.01 ٪ من المبرمجين الأكثر إنتاجية ، وحصلت على نتيجة أكثر إثارة للإعجاب ومربحة من 99.9 ٪ المتبقية
وبالتالي فإن الخيار لك.
إجابة طويلة
إذا كنت تفكر في أهم الأسئلة ، فإنها تتطرق إلى سؤال واحد: لماذا يصعب شرح فوائد الأسلحة النووية؟
ربما عندما نتحدث عن
اللغات ، يتم تحميل المصطلح بتوقعات حول ماهية اللغة وماذا تفعل. بينما نحن داخل هذا النموذج ، من الصعب فهم قيمة لغات البرمجة.
ولكن إذا قمت بتقليل النطاق واعتبرت اللغات جزءًا من فئة أوسع من واجهات الإنسان - الكمبيوتر ، فمن السهل رؤية المزايا المحددة لـ OOP. لذلك دعونا نفعل ذلك.
اللغات العامة واللغات الخاصة بالمجال
أولا ، القليل من المصطلحات. البرمجة الموجهة للغات (المعروفة أيضًا باسم OOP) هي فكرة حل مشكلات البرمجة عن طريق إنشاء لغة جديدة ، ثم كتابة برنامج عليها. غالبًا ما تسمى هذه "اللغات الصغيرة" لغات خاصة بالنطاقات (DSL).
كما يوحي الاسم ، يتم تكييف لغة موجهة للموضوع لمهام حقل معين. على سبيل المثال ، تعد PostScript و SQL و
make
و التعبيرات العادية و
.htaccess
و HTML لغات موجهة نحو الموضوع. إنهم لا يحاولون فعل كل شيء. بدلا من ذلك ، فهي تركز على فعل شيء واحد بشكل جيد.
في الطرف الآخر من الطيف
توجد لغات للأغراض العامة . هنا نرى C ، Pascal ، Perl ، Java ، Python ، Ruby ، Racket ، إلخ. لماذا لا يُعتبرون موضوعيين؟ لأنها تضع نفسها في مجموعة واسعة من مهام الحوسبة.
في الممارسة العملية ، غالبًا ما تتخصص اللغات متعددة الأغراض في مجال معين. على سبيل المثال ، C أفضل من غيرها لبرمجة النظام. بيرل - للبرامج النصية في إدارة النظام. بيثون تبرز كلغة للمبتدئين. مضرب البرمجة الموجهة للغات. في كل حالة ، هذا هو ما تم تصميم اللغة له في الأصل.
يوجد خط دقيق بين DSL ولغات الأغراض العامة. على سبيل المثال ، تم إنشاء Ruby كلغة عامة الغرض ، لكنه أصبح مشهورًا بشكل أساسي لتطبيقات الويب من خلال ارتباطه بـ Ruby on Rails. جافا سكريبت ، من ناحية أخرى ، كانت في الأصل لغة موجهة نحو المواضيع لنصوص متصفح الويب. لكنه تحور مثل الفيروس ، ومنذ ذلك الحين نمت إلى ما هو أبعد من المهمة الأصلية.
ما هي اللغة؟
إذا كان هذا الطيف الواسع كله يسمى اللغات ، فما هي السمات المميزة للغة؟
أعرف ما تفكر به: "هذا هو المكان الذي تخطئ فيه. HTML ليس لغة. هذا مجرد ترميز. لا يستطيع وصف الخوارزمية ". أو: "التعبيرات العادية ليست لغة. أنها لا تعمل من تلقاء نفسها. إنه مجرد بناء جملة للغة أخرى. "
اعتدت أن أفكر بذلك أيضا. لكن كلما بحثت عن كثب ، بدا أن هذه الاختلافات أكثر ضبابية. وهكذا ، أول بيان رئيسي (من أصل ثلاثة): لغة البرمجة هي بطبيعتها وسيلة للتبادل -
نظام تدوين مفهومة للناس وأجهزة الكمبيوتر .
نظام التدوين (التدوين) يعني أن اللغة تحتوي على بناء جملة. تعني كلمة "مسح" أنه مع بناء الجملة ، تحمل اللغة
معنى (أو
دلالات ، إذا كنت تستخدم كلمة أكثر نزوة). يغطي هذا التعريف جميع لغات البرمجة للأغراض العامة. وجميع DSL. (ولكن ليس كل دفق البيانات ، والتي سيتم مناقشتها بمزيد من التفاصيل في وقت لاحق).
(بالمناسبة ، على الرغم من أن "البرمجة" و "اللغة" هما كلمتان مصطلحتان معًا ، إلا أن هذه اللغات لا تستخدم فقط من قبل الأشخاص لبرمجة أجهزة الكمبيوتر. في بعض الأحيان يتم استخدامها من قبل أجهزة الكمبيوتر للتواصل معنا (على سبيل المثال ، تعبيرات S) ، وأحيانًا للتواصل مع بعضهم البعض (على سبيل المثال ، XML و JSON و HTML.) بالتأكيد ، يبدو من الخطأ استبعاد هذه الميزات ، لكن في الممارسة العملية ، نعم - ما نفعله عادة بلغة البرمجة هو ، في الواقع ، البرمجة).
ضع في اعتبارك رمز HTML: طريقة لإخبار الكمبيوتر - خاصة متصفح الويب - عن كيفية رسم صفحة ويب. هذا هو نظام تدوين (أقواس الزاوية والعلامات والسمات ، وما إلى ذلك) المفهوم للبشر وأجهزة الكمبيوتر (تشير سمة
charset
إلى ترميز الأحرف ، وتحتوي العلامة
p
على فقرة ، وما إلى ذلك).
إليك صفحة HTML صغيرة:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>My web page</title> </head> <body> <p>Hello <strong>world</strong></p> </body> <html>
لنفترض أنك لا توافق على أن لغة HTML هي لغة برمجة. حسنا. سوف نعرض صفحتنا في بيثون. هذه هي لغة البرمجة الحقيقية ، أليس كذلك؟
print "<!DOCTYPE html>" print "<html>" print "<head>" print "<meta charset=\"UTF-8\">" print "<title>My web page</title>" print "</head>" print "<body>" print "<p>Hello <strong>world</strong></p>" print "</body>" print "<html>"
إذا كانت Python لغة برمجة ، ولكن HTML ليست كذلك ، فإن نموذج Python هذا هو برنامج ، لكن نموذج HTML ليس كذلك.
من الواضح أن هذا فرق معذب. هنا الثعبان لا يضيف شيئا سوى التعقيد والقوالب النمطية. الشيء الغريب هو أن المحتوى الدلالي الوحيد المثير للاهتمام في برنامج Python - من وجهة نظر إدارة متصفح الويب - هو أنه مضمن في HTML (يمكن اعتبار علامات HTML مثل
DOCTYPE
و
meta
و
strong
بمثابة وظائف تستدعي وسيطات). يقودنا المنطق إلى استنتاج أن HTML ، على الرغم من أنه أبسط وأقل مرونة ، لا يزال لغة برمجة.
اللغات المدمجة
مثال على HTML و Python توصلنا إليه. لكن تضمين DSL بلغة أخرى أمر شائع. تسمى اللغات المستخدمة بهذه الطريقة
مضمن . إنهم يمثلون أكثر أشكال البرمجة اللغوية شيوعًا. كمبرمج ، لقد اعتمدت على JOP لسنوات عديدة ، حتى لو كنت لا تعرف اسمها.
على سبيل المثال ، التعبيرات العادية (أمثلة أخرى:
printf
لسلاسل التنسيق ، CLDR لأنماط التاريخ / الوقت ، SQL). لا يمكننا التفكير في التعبير المنتظم كلغة مستقلة. لكن كل مبرمج يعرف ما هو:
^fo+(bar)*$
علاوة على ذلك ، ربما يمكنك إدخال هذا التعبير المنتظم بلغة البرمجة المفضلة لديك وسيعمل فقط. هذا السلوك الثابت ممكن فقط لأن تدوين التعبير العادي هو لغة خارجية (
POSIX ).
كما هو الحال مع HTML ، يمكننا كتابة تعبير مكافئ في تدوين لغة المضيف. على سبيل المثال ، يدعم Racket
التعبيرات المعتادة
للمخطط (SRE): هذه تعبيرات عادية مع تدوين
S-expression . سيتم كتابة القالب أعلاه مثل هذا:
(seq bos "f" (+ "o") (* (submatch "bar")) eos)
لكن مبرمجي المضرب نادراً ما يستخدمون تعبيرات SRE. إنها طويلة جدًا ويصعب تذكرها.
مثال آخر في كل مكان على DSL مضمن: التعبيرات الرياضية. كل مبرمج يعرف ماذا يعني هذا:
(1 + 2) * (3 / 4) - 5
التعبيرات الرياضية وحدها لا تنشئ برامج مثيرة للاهتمام. نحتاج إلى دمجها مع بنيات لغة أخرى. ولكن ، كما هو الحال مع التعبيرات المعتادة ، هذا سجل مريح وعملي. التعبيرات الرياضية لها تدوينات ومعاني خاصة مفهومة لكلٍّ من الأشخاص وأجهزة الكمبيوتر ، لذلك فهم مؤهلون كلغة مدمجة منفصلة.
هل تمزح أن HTML هو البرمجة؟
لا ، إنه كذلك. أؤكد أن HTML (كل من التعبيرات العادية والتعبيرات الرياضية) تعتبر لغات برمجة بدائية. هذا يعني أن كتابة HTML (أو التعبيرات العادية أو التعبيرات الرياضية) تؤهل للبرمجة الأولية.
من فضلك لا داعي للذعر. بالطبع ، "مبرمج" على LinkedIn مع معرفة HTML والحساب فقط ، هذا هراء (على الرغم من أنه في غضون أسبوع سيحصل على وظيفة مقابل 180 ألف دولار). لكن هذه قضية منفصلة ، ماذا تعني كلمة "مبرمج" في سوق العمل. نحن لا نتحدث عن ذلك.
تورينج فخ تماما
إذا كان تعريف لغات البرمجة لا يزال يزعجك ، فربما تعتقد أن لغة برمجة حقيقية يجب أن تعبر عن جميع الخوارزميات الممكنة - أي ، يجب أن تكون
Turing كاملة .
أنا أفهم أن هذا التفكير يوحي بحد ذاته. كل لغة برمجة للأغراض العامة هي تورينج كاملة.
لكن المشكلة هي أن هذا شريط منخفض. اكتمال تورينج هو مقياس تقني لا يتوافق مع استخدام اللغة في العالم الحقيقي. على سبيل المثال ، التعبيرات العادية ليست Turing كاملة ، لكنها مفيدة عند التعبير عن العديد من العمليات الحسابية مع الحد الأدنى من الرموز. HTML أيضًا لم يكتمل تورينج ، لكنه طريقة مفيدة للتحكم في المستعرض. على العكس من ذلك ، فإن لغة
bf هي Turing كاملة ، ولكن حتى أكثر المهام تافهة تتطلب كيلومترات من التعليمات البرمجية غير السهلة.
قيود اللغة
هل هناك أي شيء يخضع لتعريفي للغة؟ لا.
- لا تعتبر تنسيقات البيانات الثنائية لغات. على سبيل المثال ، ملف
jpeg
. على الرغم من أن الكمبيوتر يمكنه فهمها ، إلا أن الشخص لا يفهمها. أو PDF: إذا اخترقته ، فهناك بعض الأجزاء التي يمكن قراءتها داخل الإنسان. ولكن هذا يرجع إلى كيفية عمل PDF. لا يوجد أي نقطة في كتابة أي أفكار باستخدام بنيات PDF.
- الملفات النصية ليست لغات. لنفترض أن لدينا ملفًا مع هوميروس إلياد. نحن البشر نستطيع قراءتها وفهمها. على الرغم من أن الكمبيوتر يمكنه معالجة الملف بطريقة تافهة من خلال طباعة محتوياته ، على سبيل المثال ، لا يمكن فهم النص الموجود داخل الكمبيوتر.
- واجهات المستخدم الرسومية ليست لغات. نعم ، هذه أنظمة تدوين (تعتمد على النص والصورة). لكنها مفهومة فقط للناس. ترسم أجهزة الكمبيوتر واجهة المستخدم الرسومية ولكنها لا تفهمها.
لغات واجهات
أعلاه ، وصفت لغة البرمجة بأنها "وسيلة تبادل" بين الناس وأجهزة الكمبيوتر. وبالتالي ، تنسجم اللغات مع فئة أوسع ، والتي نسميها
واجهات .
هذا يؤدي إلى العبارة الأساسية الثانية (من أصل ثلاثة): أن
برمجة اللغة هي في الأساس وسيلة لتصميم واجهة . إذا كنت ترغب في التفكير في واجهات ، سوف تحب JOP. إذا لم يكن الأمر كذلك ، فستظل تحب JOP لجعله واجهات ممكنة غير قابلة للتحقيق.
أحد الأمثلة المفضلة للغة كواجهة
براغ هي لغة مولد محلل تم إنشاؤها باستخدام Racket. إذا سبق لك استخدام سلسلة أدوات lex / yacc ، فأنت تعلم أنه غالبًا ما يكون الهدف هو إنشاء محلل لغوي من
BNF . على سبيل المثال ، بالنسبة إلى
bf ، يبدو الأمر كما يلي:
bf-program : (bf-op | bf-loop)* bf-op : ">" | "<" | "+" | "-" | "." | "," bf-loop : "[" (bf-op | bf-loop)* "]"
لإنشاء محلل بلغة عامة الغرض ، تحتاج إلى ترجمة هذا النحو إلى مجموعة من التعليمات البرمجية الأصلية. هذه وظيفة شاقة. ومن غير المجدي - ألا نكتب القواعد النحوية بالفعل؟ لماذا تفعل ذلك مرة أخرى؟
ومع ذلك ،
brag
يلبي رغبتنا. لجعل المحلل اللغوي ، نضيف ببساطة السطر
#Lang brag
إلى الملف ، والذي يحول بطريقة سحرية قواعد BNF إلى الكود المصدري
brag
:
#Lang brag bf- : (Bf-op | Bf-loop)* bf-op : ">" | "<" | "+" | "-" | "."| "," Bf-loop : "["(Bf-op | Bf-loop)* "]"
القيام به! عند التحويل البرمجي ، يقوم هذا الملف بتصدير وظيفة
parse
، والتي تقوم بتنفيذ قواعد BNF هذه.
هذا هو أحد الأمثلة المفضلة لدي لأنه متفوق بلا شك على الخيارات الأخرى. علاوة على ذلك ، مع لغة عامة الغرض ، مثل هذه الواجهة مستحيلة عمليا.
لكن مبرمج JOP يبذل باستمرار مثل هذه الواجهات.
حيث اللغة هي أفضل واجهة
يقودني هذا إلى رسالتي الأساسية الثالثة والأخيرة التي تفيد بأن
اللغات لها مزايا فريدة عبر الواجهات . بالطبع ، الفئات أدناه ليست شاملة أو حصرية. لكنني وجدت أن IOP لديها الكثير لتقدمه في مثل هذه الحالات:
1. عندما تريد إنشاء واجهة للمبرمجين الأقل مهارة ، أو غير المبرمجين ، أو المبرمجين كسول (لا نقلل من حجم الفئة الأخيرة).
على سبيل المثال ، لدى Racket
مكتبة تطبيق ويب متطورة. ولكن يمكن أيضًا بدء خادم ويب بسيط باستخدام لغة
web-server/insta
:
#lang web-server/insta (define (start request) (response/xexpr '(html (body "Hello LOP World"))))
يوضح ماثيو فلات في مقاله
"إنشاء لغات في مضرب" اللغة التي تولد مغامرات نصية قابلة للعب. مثل
brag
، يبدو مثل مواصفات أكثر من برنامج ، لكنه يعمل:
#lang txtadv ===VERBS=== north, n "go north" south, s "go south" get _, grab _, take _ "get" ===THINGS=== ---cactus--- get "Ouch!" ===PLACES=== ---desert--- "You're in a desert. There is nothing for miles around." [cactus, key] north meadow south desert
2. عندما تريد تبسيط التدوين. مثال واحد هو التعبيرات العادية. مثال آخر هو لغتي الموجهة نحو الموضوع
لقاح الكتب الإلكترونية. حبوب اللقاح تشبه Racket ، هنا فقط تبدأ العمل في وضع النص وتستخدم أحرفًا خاصة للإشارة إلى أوامر Racket المضمنة في المحتوى (يعتمد Pollen على لغة وثائق Racket تسمى
Scribble ، والتي تأخذ الجزء الأكبر من التحميل). لذلك ، يتم برمجة بداية هذه الفقرة على النحو التالي:
. — . — - ◊link["https://pollenpub.com/"]{Pollen} -.
يهتم اللقاح بلصق جميع العلامات الضرورية وتحويلها إلى HTML غير صحيح. لا يزال لدي كل مزايا العلامات اليدوية (التحكم الكامل في الصفحة) ، لكن لا توجد عيوب (على سبيل المثال ، لا يمكنني ترك علامة غير مغلقة بطريق الخطأ).
مثال آخر على الترميز المبسط هو
lindenmayer
،
lindenmayer
في
نظام lindenmayer
ولغة الرسم ، مثل هذا:
في Racket نموذجي ، قد يبدو برنامج Lindenmayer بالشكل التالي:
#lang racket/base (require lindenmayer/simple/compile) (define (finish val) (newline)) (define (A value) (display 'A)) (define (B value) (display 'B)) (lindenmayer-system (void) finish 3 (A) (A -> AB) (B -> A))
ولكن يمكنك استخدام الترميز المبسط عن طريق تغيير تدوين
#lang
في الجزء العلوي من الملف:
#lang lindenmayer/simple ## axiom ## A ## rules ## A -> AB B -> A ## variables ## n=3
تفترض اللغة أنك معتاد بالفعل على نظام L. لكن تدوين مبسط يجعل من السهل تدوين رغباتك في برنامج يقوم بما تريده.
3. عندما تريد العمل مع تدوين موجود. لقد رأينا أعلاه كيف يستخدم
brag
القواعد النحوية BNF كرمز مصدر.
#lang brag bf-program : (bf-op | bf-loop)* bf-op : ">" | "<" | "+" | "-" | "." | "," bf-loop : "[" (bf-op | bf-loop)* "]"
مثال آخر قال الأشخاص الذين جربوا حبوب اللقاح "نعم ، هذا شيء رائع ، لكنني أفضل تخفيض السعر". لا مشكلة:
pollen/markdown
هي لهجة اللقاح التي تقدم دلالات حبوب اللقاح ولكن يقبل تدوين المعتاد:
. — . — - [Pollen]("https://pollenpub.com/") -.
الشيء الأكثر متعة؟ لقد كتبت هذه اللهجة في غضون ساعة واحدة ، مع الجمع بين
محلل تخفيض السعر مع الرمز الحالي.
4. إذا كنت ترغب في إنشاء هدف وسيط للغات أخرى. تعد JSON و YAML و S-تعبيرات و XML جميع اللغات الموجهة للموضوع والتي تحدد تنسيقات البيانات للقراءة والكتابة في الآلة.
في Perfect Racket ، تسمى لغة تدريب واحدة
jsonic
. يتيح لك تضمين تعبيرات المضرب في JSON ، مما يجعل JSON قابلة للبرمجة. يشبه الكود المصدر:
#lang jsonic // a line comment [ @$ 'null $@, @$ (* 6 7) $@, @$ (= 2 (+ 1 1)) $@, @$ (list "array" "of" "strings") $@, @$ (hash 'key-1 'null 'key-2 (even? 3) 'key-3 (hash 'subkey 21)) $@ ]
يجمع إلى JSON العادية:
[ null, 42, true, ["array","of","strings"], {"key-1":null,"key-3":{"subkey":21},"key-2":false} ]
5. عندما يكون الجزء الرئيسي من البرنامج هو التكوين. على سبيل المثال ، يمكن وصف Dotfiles كـ DSL. مثال أكثر تعقيدًا من Racket هو Resse Rostoste لـ Jesse Alama ، وهي لغة لاختبار API HTTP المستندة إلى JSON:
#lang riposte $productId := 41966 $qty := 5 $campaignId := 1 $payload := { "product_id": $productId, "campaign_id": $campaignId, "qty": $qty } POST $payload cart/{uuid}/items responds with 200 $itemId := /items/0/cart_item_id GET cart responds with 200
كلغة برمجة مصغرة ، Riposte هو أكثر ذكاء بكثير من dotfile المتوسط. إنه يخفي جميع الشفرات الوسيطة اللازمة لمعاملات HTTP ، ويسمح للمستخدم بالتركيز على اختبارات الكتابة. لا يزال تنظيف المنزل. ولكن على الأقل يمكنك التركيز على الأسرة التي تهتم بها.
لماذا مضرب؟
في كثير من الأحيان ، يسأل نقاد JOP: "لماذا نصنع لغة موجهة نحو الموضوع؟ هل من الأسهل كتابة مكتبة أصلية؟ "
لا ، ليس الأمر أسهل إذا كانت لديك الأداة الصحيحة. مضرب غير عادي: تم تصميمه من الألف إلى الياء خصيصا ل YOP.
وبالتالي ، فإن تنفيذ DSL على Racket أسرع وأرخص وأسهل من البدائل. على سبيل المثال ، في الدرس الأول من كتابي ، أوضحت كيفية تطوير لغة جديدة في ساعة واحدة - حتى لو لم تكن تستخدم Racket مطلقًا.تحت غطاء كل DSL في Racket ، يعمل المترجم المصدر إلى المصدر بالفعل ، والذي يحول تدوين DSL ودلالاته إلى برنامج Racket مكافئ. لهذا السبب ، لن تتمكن Racket DSL من العمل بأسرع ما يمكن من الشفرة C. المكتوبة يدويًا ، ولكن بعد ذلك تتوفر جميع الأدوات والمكتبات Racket لكل DSL. تخسر الإنتاجية ، لكنك تربح مرارا وتكرارا. وعندما يكون إنشاء DSL مناسبًا وسهلاً ، يصبح خيارًا واقعيًا لمجموعة واسعة من المشكلات.وبالتالي ، للرد على النقد - لا ، لا يحتاج DSL بالضرورة إلى عمل أكثر من المكتبة الأصلية. علاوة على ذلك ، كما رأينا بالفعل ، كواجهة ، يمكن للغة أن تفعل ما لا تستطيع مكتبة أصلية.لماذا الكلي؟
نظرًا لأن جميع DSLs يتم تجميعها في Racket ، يجب على المبرمج كتابة بعض محولات بناء الجملة التي تحول تدوين DSL إلى Racket الأصلي. تُعرف محولات بناء الجملة هذه بوحدات الماكرو . في الواقع ، يمكن وصفها على أنها امتدادات لبرنامج التحويل البرمجي Racket.نظام Racket الكلي واسع وأنيق وهو بلا شك لؤلؤة تاجه. الكثير من كتابي يدور حول متعة العمل مع وحدات الماكرو Racket. يمكنني تسمية وظيفتين متميزتين:- Racket , . . , , Racket , , , , , . ( . « » ).
- وحدات ماكرو Racket صحية ، أي أن الكود الذي تم إنشاؤه بواسطة الماكرو ، بشكل افتراضي ، يحافظ على السياق المعجمي الذي تم تعريف الماكرو منه. في الممارسة العملية ، يلغي هذا الكم الهائل من الإيماءات غير الضرورية التي عادة ما تكون مطلوبة ل DSL (لمزيد من التفاصيل ، انظر الفصل "النظافة" ).
هل من الممكن تنفيذ DSL في بايثون؟ بالطبع
في الواقع ، كتبت أول خط DSL خاصًا في بيثون - وما زلت أستخدمه في أعمال تصميم الكتابة الخاصة بي . حسنا ، هذا. مرة واحدة كانت كافية. منذ ذلك الحين أستخدم المضرب.الخلاصة: النصر مع YaOP
في الوقت الحالي ، قد يكون لديك واحد من اثنين من ردود الفعل:- « , , » . , . , , . . . , . .
- «, , c Racket » . , - Riposte , — ( ):
[ ] - Racket. , , - … : « API , ?» : « Riposte». , , [DSL], , . «» Racket. DSL , .
في نهاية المقال "لماذا المضرب؟ لماذا لشب؟ قلت إن لغة Lisp "تتيح لك الفرصة لإطلاق إمكاناتك كمبرمج ومفكر وبالتالي زيادة توقعاتك بشأن ما يمكنك تحقيقه."يوفر IOP فرصة مماثلة: لزيادة توقعاتنا فيما يتعلق بما يمكن أن تفعله لغات البرمجة بالنسبة لنا. اللغات ليست صناديق سوداء. هذه هي الواجهات التي يمكننا تصميمها. في الوقت نفسه ، نفتح إمكانيات جديدة لما يمكن القيام به بمساعدة البرامج.إذا كان يمكنك العثور على أفضل تقنية برمجة ، فاستخدمها. الآن بعد أن أصبح لدي OOP و Racket ، لن أعود أبدًا.مزيد من القراءة