سؤال

هناك نموذج جديد بالكامل من "البرمجة الوظيفية"، والذي يحتاج إلى تغيير إجمالي أنماط الفكر مقارنة بالبرمجة الإجرائية. يستخدم وظائف ترتيب أعلى، نقاء، مونادس، إلخ، والتي لا نرى عادة باللغتين المنحرفة والكائنات.

سؤالي هو كيف التنفيذ من هذه اللغات تختلف عن اللغات الحتمية أو الموجهة نحو الكائنات، فيما يتعلق، على سبيل المثال، إدارة الذاكرة أو Internals مثل المؤشرات وما إلى ذلك ..

هناك لغات وظيفية تعمل على رأس JVM. هل هذا يعني أن هذه اللغات تعمل داخليا مثل اللغات الأخرى على JVM؟

هل كانت مفيدة؟

المحلول

تستخدم تطبيقات لغات البرمجة الوظيفية مجموعة واسعة من تقنيات التنفيذ. مقدمة ممتازة في تنفيذ المخطط (لهجة LISP) يعطي هذا الكتاب: lisp في قطع صغيرة من قبل كريستيان كوينك.

نصائح أخرى

يستخدم الكود الناتج عن اللغات الوظيفية العديد من الميزات التي تراها بدرجات متفاوتة باللغات غير الوظيفية. لقد مرت مجموعة القمامة في الاستخدام العام. تحسين دعوة الذيل هو القيام به في دول مجلس التعاون الخليجي و VC ++.

إغلاق، ومع ذلك، هي السمة المميزة للبرمجة الوظيفية. أنت لا ترى واحدة دون الآخر. إذا حددت "اللغات الوظيفية" للإشارة إلى لغات وظيفية نقية فقط، فإن الاثنين غير مرادفين لأنك تجد إغلاق بلغات حتمية تدعم البرمجة الوظيفية (مثل JavaScript ومخطط (من الضروري تقنيا، على الرغم من أن النموذج الوظيفي هو في الغالب تستخدم)). قد يتم تنفيذ الإغلاق مع سباغيتي كومة للحصول على مكدس المكالمات، أو عن طريق نسخ المتغيرات المحلية عند الخروج من إطار مكدس، أو عن طريق تخصيص المتغيرات المحلية على كومة الكومة والسماح جمع القمامة تهتم بهم.

بمجرد أن يكون لديك إغلاق، تكون الوظائف المجهولة سهلة نسبيا (مع مترجم فوري، فهي سهلة حقا). مع وجود مترجم، يتم تحويل الدالة إلى ByTecode في وقت الترجمة، ويتم ربط ByTecode (بدلا من ذلك، عنوان نقطة الدخول) في وقت التشغيل مع البيئة الحالية.

يمكن أن تعتمد تكوين الوظيفة على وظيفة مجهولة. عندما يواجه برنامج التحويل البرمجي مشغل تكوين الوظائف f . g, ، يقوم بإنشاء وظيفة مجهولة التي تستدعي الحججتين f و g, ، تمرير نتيجة واحدة كوسيطة للآخر.

يمكن تنفيذ MONADS لغات OO، إنها ليست ضرورية لأنها لغات وظيفية نقية. أنا / سهم ليسوا أي شيء مميز للغاية، فهي تعتمد فقط على حقيقة أنه يسمح النظام الأساسي بالتأثيرات الجانبية.

أعتقد أن هناك العديد من الجوانب التي تستفيد من اهتمام خاص بلغات وظيفية، واحدة تتبادر إلى الذهن هي:

اللغات الوظيفية تستخدم العودية كثيرا. لذلك يجب أن يحاول أي تنفيذ تحسين هذه الحالة. على سبيل المثال تحديد العودية الذيل وتحويلها إلى حلقة داخليا (وبالتالي حفظ وظيفة الدالة النفقات العامة مثل المكدس حفظ / استعادة). فيhttp://en.wikipedia.org/wiki/tail_recursion.)

غالبا ما يكون تنفيذ لغة برمجة وظيفية مثل Haskell تختلف كثيرا عن تلك اللغات الحتمية. يمكنك أن تقرأ عن طريقة واحدة للقيام بذلك هنا. وبعد على الرغم من أن الورقة تبلغ من العمر عدة سنوات وأعتقد أن الأفكار لا تزال تستخدم.

الفرق الأكبر الذي يتبادر إلى الذهن هو أن اللغات الوظيفية تميل إلى تصميمها بحيث تكون شفرة المصدر desugared. إلى لغة وسيطة بسيطة قوية وقوية. تحتوي هذه اللغة عادة على Lambda، مكالمات الدالة، إذا / غير ذلك، أنواع الجهاز، شيء مثل let, ، وليس أكثر بكثير. يتم تداخل الرمز المحول بشكل عميق، وقفة، ولا يمكن قراءتها الإنسان بشكل واقعي. يتم إلقاء بناء جملة السطح بعيدا.

يتعين على المحول البرمجي بلغة مثل هذا القيام ببعض التحسينات القليلة وإغلاقها لإنتاج رمز لائق. (بالنسبة لي، يبدو أن تحسينات الإغلاق خط الأساس يبدو تحليلا غير نادي وهكذا، ولكن قد يكون مجرد نقص في الإلمام).

يعمل كل شيء على نفس المعالج (وبالتالي تعليمات التجميع نفسها)، طالما كنت تذهب عميقا بما فيه الكفاية، كل شيء هو نفسه داخليا.

Outis: في حين أن اللغة قد تدعمها، تغلق الصراع مع المفهوم الرياضي لوظيفة بنفس الطريقة التي تقوم بها الآثار الجانبية: أنها تسمح لك بتحقيق نتائج مختلفة عن نفس الحجج. هذا يجعل إغلاق الإجرائية، وليس وظيفيا.

ومع ذلك، هناك حجج الكفاءة تؤيد إغلاق الإغلاق عبر العالم (خاصة في سياق تنفيذ المترجم). [لكنني أعرف اللغات الوظيفية التي لا توفر إغلاق مباشرة، على الرغم من أنه يمكن تنفيذ "alikes العمل".

(ومع ذلك، فإن الكريات يشبه الإغلاق ولا يعاني من هذا الصراع، وهو بالفعل موجود بشكل روتيني بلغات وظيفية.)

على أي حال، في رأيي، لغات البرمجة الوظيفية هي لغات تجعل الجهود الكبيرة لجعل الحساب تمثيلية كما لو كانت وظائف رياضية. هذا يعني أن التحسينات مائلة في وظائف تحسين.

منفاء ذلك، على الأقل، تسمح اللغات الوظيفية بالآلة بالعمل على تجريدات أعمدة مما سيكون مفيدا لنهج إجرائي بحت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top