أقسام الموقع
اختيار المحرر:
- بعض خواص العمليات على المصفوفات
- "سكيريم": التمرير الأكبر
- افتح القائمة اليسرى كايو كوكو
- لماذا نحتاج إلى الاتصالات الراديوية ومحطات الراديو؟
- معاملات ارتباط الرتب كيندال وسبيرمان مثال على معامل ارتباط الرتب كيندال
- وظائف البرمجة
- محفظة الأطفال - تنزيل قوالب مجانية
- أنواع فيروسات الكمبيوتر وأسباب خطورتها
- إعادة ضبط المصنع لجهاز Samsung Galaxy A3
- BIOS: التمهيد من القرص
دعاية
ما هو اسم الوظيفة في البرمجة. وظائف البرمجة |
الهدف من العمل: 1) دراسة قواعد وصف الوظائف؛ 2) اكتساب مهارات استخدام الدوال عند كتابة البرامج بلغة C++. المعلومات النظريةالوحدة الرئيسية للبرامج في C++ هي الوظيفة. وظيفة- جزء مكتمل منطقيًا ومصمم بالتأكيد من برنامج له اسم. تتيح لك الوظائف تقسيم المهام الحسابية الكبيرة إلى مهام أصغر. يحتوي كل برنامج C++ بالضرورة على وظيفة تسمى main، وهي نص البرنامج. بالنسبة لجميع الوظائف الأخرى، إذا كانت موجودة في البرنامج، فيجب الإعلان عن النماذج الأولية - وهي تدوينات تخطيطية تخبر المترجم باسم وشكل كل وظيفة في البرنامج. بناء جملة النموذج الأولي للوظيفة مع المعلمات هو: return_value_type function_name (parameter_list_with_type_inification); الوظائف في C++ قياسية (مكتبة) وقابلة للبرمجة بواسطة المستخدم. الميزات القياسيةتم العثور على أوصاف الوظائف القياسية في الملفات المضمنة في البرنامج باستخدام التوجيه #include. تسمى هذه الملفات ملفات الرأس؛ لديهم الامتداد ح. تسمى الإشارة إلى اسم الوظيفة في البرنامج الرئيسي باستدعاء دالة. تؤدي وظائف الاستدعاء إلى تنفيذ بعض الإجراءات أو حساب بعض القيمة، والتي يتم استخدامها بعد ذلك في البرنامج. ص = الخطيئة(س); // وظيفة حساب الجيب تعريف الوظيفةبشكل عام، يتم تعريف الوظائف على النحو التالي: return_value_type function_name (اكتب اسم المعلمة،...، اكتب اسم المعلمة) وظيفة الجسم ميزات قابلة للبرمجةالوظائف التي ينشئها المبرمج بنفسه تسهل عملية كتابة البرامج لأنها: تساعد على تجنب البرمجة المتكررة، حيث يمكن استخدام نفس الوظيفة في برامج مختلفة؛ زيادة مستوى نمطية البرنامج، وبالتالي تسهيل القراءة وإجراء التغييرات وتصحيح الأخطاء. مثال9 .1. لنقم بإنشاء دالة تطبع 65 حرفًا "*" على التوالي. ولجعل هذه الوظيفة تعمل في سياق ما، يتم تضمينها في برنامج طباعة الورق ذي الرأسية. يتكون البرنامج من الوظائف: main() وstars(). // ترويسة #يشمل حد ثابت = 65؛ نجوم باطلة (باطلة) ؛ // النجوم النموذجية للوظيفة () cout<<"Moscow Institute of
Electronic Engineering"< // تعريف وظيفة النجوم (). ل (العد = 1؛ العد<=Limit; count++) لقد نظرنا إلى مثال لدالة بسيطة لا تحتوي على وسائط ولا تُرجع أي قيم. دعونا نلقي نظرة على مثال لاستخدام معلمات الوظيفة. مثال9.
2.
لنكتب مساحة الوظيفة () ،
ستكون حجتها هي عدد المسافات التي يجب أن تطبعها هذه الوظيفة. # تحديد العنوان "زيلينوغراد" #تعريف الاسم "معهد موسكو للهندسة الإلكترونية" #تعريف قسم "المعلوماتية والبرمجة" const int LIMIT=65; #يشمل مساحة فارغة (عدد صحيح)؛ cout< space=(LIMIT - strlen(name))/2; // احسب كم // تحتاج إلى مسافات cout< space((LIMIT - strlen(department))/2); // الوسيطة - التعبير cout< // تعريف وظيفة النجوم (). ل (العد = 1؛ العد<=LIMIT; count++) // تعريف وظيفة المساحة (). مساحة فارغة (رقم int) ل (العد = 1؛ العد<=number; count++) يسمى المتغير الرقمي حجة رسمية. يأخذ هذا المتغير قيمة الوسيطة الفعلية عند استدعاء الدالة. بعبارة أخرى، حجة رسميةهو متغير في تعريف ما يسمى روتين فرعي، و الحجة الفعليةهي القيمة المحددة المخصصة لهذا المتغير بواسطة برنامج الاستدعاء. إذا كانت الدالة تتطلب أكثر من وسيطة واحدة للتواصل معها، فيمكنك تحديد قائمة من الوسائط مفصولة بفواصل بالإضافة إلى اسم الدالة: رقم الطباعة الفارغ (int i، int j) (كوت<<"Координаты
точек”<< i << j < يمكن معالجة قيمة الإدخال للوظيفة بسبب وجودها دعوى; يتم إرجاع قيمة الإخراج باستخدام الكلمة الأساسية return. نادرًا ما يواجه المستخدمون البعيدون عن البرمجة من حيث المبدأ مفاهيم الوظائف والإجراءات، وهم مرتبطون بشيء رياضي وبيروقراطي طبي. في البرمجة، تعمل العديد من اللغات بهذه المفاهيم، ومع ذلك، حتى الخبراء في بعض الأحيان لا يستطيعون فهم الفرق بين الوظيفة والإجراء بوضوح. كما هو الحال مع ذلك الغوفر: إنه هناك، لكن لا أحد يراه. دعونا نرى ما إذا كانت الاختلافات غير مرئية إلى هذا الحد. الفرق الرئيسي بين الوظيفة والإجراء هو النتيجة التي تعود بها. في الواقع، كل من الوظائف والإجراءات عبارة عن كتل غير قابلة للتجزئة منطقيًا تشكل رمز البرنامج. تقوم الدالة بإرجاع قيمة، بينما لا يقوم الإجراء في معظم لغات البرمجة بذلك، أو (في لغة C، على سبيل المثال) تقوم بإرجاع قيمة فارغة. في الحالة الأخيرة (في لغة C)، يعتبر الإجراء نسخة ثانوية من الوظيفة. يحتوي رأس الوظيفة على كلمة "وظيفة"، ومعرف (الاسم الصحيح للوظيفة)، وقائمة اختيارية من المعلمات، وبالضرورة، نوع النتيجة. يجب أن يحتوي نص الوظيفة على عامل يقوم بتعيين قيمة لاسم الوظيفة، والتي سيعود بها نتيجة لذلك. يحتوي رأس الإجراء على كلمة "إجراء" ومعرف (اسم الإجراء) وقائمة من المعلمات بشكل اختياري. يتم تنفيذ استدعاء دالة كجزء من التعبيرات حيث يتم استخدام هذه التعبيرات، ويتطلب استدعاء الإجراء عبارة منفصلة. يتم استدعاء الإجراء بالاسم فقط، بينما يرتبط اسم الوظيفة بقيمتها. في مخططات الخوارزمية، يتم تصوير استدعاء الوظيفة في كتلة الإخراج أو في كتلة العملية، ويتم تصوير استدعاء الإجراء في كتلة خاصة "عملية محددة مسبقًا". أساس أي برنامج كمبيوتر هو الخوارزميات، ويتم التعبير عنها كأوامر. يقول الشخص الذي يكتب الكود، خذ هذا، افعل هذا، هذا وذاك به، ثم أخرج النتيجة هناك واذهب للراحة. لذلك، بحيث لا يتم دمج الأوامر في البرامج في فوضى واحدة ويمكن أن تتفاعل مع بعضها البعض، يتم تجميعها في ما يسمى بالوظائف والإجراءات. وسوف نتعرف على هذه المفاهيم. يتم استخدام أسماء الوظائف: 1) لإنشاء الوثائق؛ 2) لواجهة برمجة التطبيقات (API)، أي واجهة للاتصال ببرنامج أو نظام تشغيل كامل لأي تطبيق. لذلك، من المنطقي أن نذكر مرة أخرى أن هذه الأسماء يجب أن تكون واضحة، وإذا أمكن، مناسبة للإجراءات التي يتم تنفيذها. لذلك، فإن الوظائف هي نوع من الحاويات لتجميع الخوارزميات. هم: الإجراءات هي في الواقع نفس الوظائف، وإن كانت "فارغة" ولا تُرجع أي شيء (وهذا هو الفرق الرئيسي بينهما). وهي أدوات مساعدة مصممة لتنفيذ الإجراءات الروتينية، وكذلك لتوفير المساحة والجهد والوقت. المنشورات السابقة: ليس من قبيل الصدفة أن أسمي هذه المقالة "الوظائف كجزء لا يتجزأ من البرمجة"، لأنه بدونها، في رأيي، لا يحق لأي لغة أن توجد. ما هذا؟ الوظيفة هي المكون الرئيسي لبرنامج مكتوب بشكل جيد. فهو لا يجعل قراءة التعليمات البرمجية أسهل فحسب، بل يغير أيضًا فكرة البرمجة المنظمة بشكل جذري. بمساعدة الوظائف، يمكنك إعادة استخدام الأجزاء الفردية من البرنامج عن طريق تمرير أي معلمات عليها. لا يمكن تصور أي برنامج جاد بدون هذه المعجزة من عنصر البرمجة. سأخبرك بإيجاز كيف يعمل. الوظيفة عبارة عن كتلة من التعليمات التي يمكن لبرنامجك الاتصال بها. عند الوصول إلى رأس هذه الكتلة (اسم الوظيفة)، يتم تنفيذها وتنفيذ بعض الإجراءات المحددة من قبل المبرمج. بعد ذلك، تقوم هذه الكتلة بإرجاع القيمة المستلمة وتمريرها إلى البرنامج الرئيسي. اسمحوا لي أن أشرح في الممارسة العملية.
بالمعنى التقريبي، يبدو الأمر هكذا. اسمحوا لي أن أشرح لفترة وجيزة. نقوم بإنشاء متغير ما ونخصص له نتيجة تنفيذ الدالة myfunc، والتي بدورها تحسب قيمة تربيع بعض الأرقام. لا يتم تنفيذ الوظائف فورًا عند بدء تشغيل البرنامج، ولكن يتم تنفيذها فقط عند استدعائها. قد يكون الأمر مربكًا بعض الشيء، ولكن هذا هو الحال. من أجل استدعاء وظيفة، تحتاج إلى إنشائها. على الرغم من وجود وظائف مدمجة أيضًا. على سبيل المثال هذا: كوس، الخطيئة، md5، العد، القيمة المطلقةوما إلى ذلك وهلم جرا. للاتصال بهم، تحتاج فقط إلى تعيين القيمة المطلوبة للمتغير.
وسيطة الدالة هي القيمة التي تمررها إليها عند استدعائها. يتم وضع وسائط الدالة بين قوسين. عند إنشاء دالة، يمكنك تحديد الأسماء الشرطية للوسائط. ومن ثم يمكن استخدام هذه الأسماء في نص الدالة، كمتغيرات محلية. دعنا نعود إلى الوظائف التي ينشئها المستخدم بنفسه. ويتم ذلك بسهولة بالغة. أولاً يتم إنشاء الجسم الوظيفي: وظيفة مرحبا () (صدى "مرحبا بالعالم!"؛) ثم نتصل بها. علاوة على ذلك، إذا لم تكن تحتوي على معلمات، فإننا ببساطة نضع قوسين. لاستدعاء هذه الدالة نستخدم السطر فقط: مرحبًا()؛. يمكن لأي دالة أيضًا إرجاع قيمة باستخدام كلمة محجوزة يعود. يتوقف هذا البيان عن تنفيذ الوظيفة ويرسل القيمة المرجعة إلى برنامج الاستدعاء. مجموع الدالة($أولاً، $ثانيًا) ($r=$first + $ثانيًا؛ إرجاع $r;) echo sum(2,5); وستكون نتيجة تنفيذ البرنامج تساوي 7. المتغيرات المحلية والعالمية كما هو الحال في أي لغة برمجة أخرى، هناك متغيرات متوفرة فقط داخل دالة ومتغيرات متوفرة في كود البرنامج نفسه. وتسمى هذه المتغيرات المحلية والعالمية، على التوالي. داخل الدالة، لا يمكنك ببساطة الوصول إلى متغير تم إنشاؤه خارج الدالة. إذا حاولت القيام بذلك، فسوف تقوم بإنشاء متغير جديد بنفس الاسم، ولكنه محلي لهذه الوظيفة. $per="ديما"; function primer() // تنفيذ: عرض متغير محلي ( echo "My name is ".$per; ) echo primer(); في هذه الحالة، ستظهر عبارة "اسمي هو" على الشاشة. هذا يعني أنه تم إنشاء المتغير $per داخل الدالة التمهيدية وتم تعيين قيمة صفر له افتراضيًا. من أجل تجنب مثل هذه العضادات، تحتاج إلى استخدام المشغل عالمي. دعنا نصحح الكود أعلاه وفقًا لذلك: $per="ديما"; function primer() // يؤدي: عرض متغير عام ( global $per; echo "My name is ".$per; ) echo primer(); يجب أن يكون كل شيء على ما يرام الآن - تم حل المشكلة. فقط لا تنس أنه إذا قامت دالة بتغيير قيمة متغير خارجي، فإن مثل هذا التغيير سيؤثر على البرنامج بأكمله، لذلك تحتاج إلى استخدام هذا العامل بعناية! يمكن جعل بعض الوسائط التي تم تمريرها إلى دالة اختيارية، مما يجعل الوظيفة أقل تطلبًا. والمثال التالي يوضح ذلك بوضوح: … خط الوظيفة($text, $size=5) // افعل: حجم خط الإخراج ( echo " ".$نص."";) الخط("مرحبا افتراضيًا، حجم الخط هو 5. إذا حذفنا المعلمة الثانية للدالة، فستكون مساوية لهذه القيمة. قبل أن أقول وداعا، أريد أن ألفت انتباهكم إلى نصيحة واحدة. وهو يتألف من وضع جميع الوظائف التي كتبتها في ملف واحد (على سبيل المثال، function.php). وبعد ذلك، في الملف الذي تريد استدعاء الوظيفة فيه، ما عليك سوى تضمين function.php وسيكون كل شيء جاهزًا للاستخدام. سيؤدي ذلك إلى تسهيل فهم المنطق في برنامجك. للاتصال استخدم: include_once("function.php"); require_once("function.php"); إذا فهمت جوهر المشكلة التي تمت مناقشتها في هذه المقالة، فأنا متأكد من أنه يمكنك بسهولة استخدام الوظائف الموجودة في برامجك. مرة أخرى، هذا لجعلها أكثر قابلية للتكيف وإعادة الاستخدام. هذا هو المقال الثالث في سلسلة “نظرية التصنيف للمبرمجين”. باستخدام لغة الآلة، سيتم قبول وتنفيذ أي مجموعة من البايتات التي تنتجها القرود. ولكن في اللغات عالية المستوى، من المهم جدًا أن يكون المترجم قادرًا على اكتشاف الأخطاء المعجمية والنحوية. سيتم ببساطة رفض العديد من البرامج، وستُترك القرود بدون موز، لكن الباقي سيكون لديه فرصة أفضل لأن يكون له معنى. يوفر التحقق من النوع حاجزًا آخر ضد البرامج غير المنطقية. بالإضافة إلى ذلك، في حين أنه في اللغات المكتوبة ديناميكيًا، لن يتم اكتشاف عدم تطابق النوع إلا في وقت التشغيل، في اللغات المكتوبة بقوة والتي تم التحقق منها بشكل ثابت، يتم اكتشاف عدم تطابق النوع في وقت الترجمة، مما يؤدي إلى التخلص من العديد من البرامج غير الصحيحة قبل أن تتاح لها فرصة التنفيذ. لذا فإن السؤال هو، هل نريد أن تكون القرود سعيدة أم أن تنشئ برامج صحيحة؟ عادةً ما يكون الهدف من تجربة القرد الفكرية هو إنشاء الأعمال الكاملة لشكسبير (ملاحظة المترجم: أو الحرب والسلام لتولستوي). سيؤدي التدقيق الإملائي والنحوي في حلقة إلى زيادة فرص نجاحك بشكل كبير. يذهب نظير فحص النوع إلى أبعد من ذلك: بعد إعلان روميو كإنسان، سيتأكد فحص النوع من أنه لا ينمو أوراقًا وأنه لا يلتقط الفوتونات بمجال جاذبيته القوي. الحجة الجادة الوحيدة التي سمعتها ضد الكتابة الثابتة القوية هي أنها قد ترفض بعض البرامج الصحيحة من الناحية اللغوية. في الممارسة العملية، يحدث هذا نادرا للغاية (ملاحظة المترجم: لتجنب الالتباس، أشير إلى أن المؤلف لم يأخذ في الاعتبار، أو لا يوافق، على وجود العديد من الأساليب، كما أن كتابة البطة، المألوفة لدى المبرمجين في لغات البرمجة النصية، لها الحق في الحياة أيضًا من ناحية أخرى، فإن كتابة البط ممكنة في نظام كتابة صارم من خلال القوالب والسمات وفئات الكتابة والواجهات، وهناك العديد من التقنيات، لذلك لا يمكن اعتبار رأي المؤلف غير صحيح تمامًا.)وعلى أية حال، تحتوي كل لغة على نوع ما من الأبواب الخلفية لتجاوز نظام الكتابة عندما يكون ذلك ضروريًا حقًا. حتى هاسكل لديه إكراه غير آمن. ولكن مثل هذه التصاميم يجب أن تستخدم بحكمة. شخصية فرانز كافكا، جريجور سامسا، تكسر نظام الكتابة عندما تتحول إلى خنفساء عملاقة، وكلنا نعرف كيف ينتهي الأمر (ملاحظة المترجم: سيئة :). الحجة الأخرى التي أسمعها كثيرًا هي أن الكتابة القوية تضع عبئًا كبيرًا على المبرمج. يمكنني أن أتعاطف مع هذه المشكلة، بعد أن كتبت العديد من إعلانات التكرار بنفسي في لغة C++، باستثناء أن هناك تقنية، نوع الاستدلال، التي تسمح للمترجم باستنتاج معظم الأنواع من السياق الذي يتم استخدامها فيه. في لغة C++، يمكنك الإعلان عن متغير تلقائي وسيقوم المترجم باستنتاج النوع المناسب لك. في هاسكل، باستثناء حالات نادرة، تكون التعليقات التوضيحية للكتابة اختيارية. يميل المبرمجون إلى استخدامها على أي حال لأن الأنواع يمكن أن تخبرك كثيرًا عن دلالات التعليمات البرمجية الخاصة بك، وتساعدك إعلانات النوع على فهم أخطاء الترجمة. من الممارسات الشائعة في هاسكل بدء المشروع من خلال تطوير الأنواع. لاحقًا، تشكل التعليقات التوضيحية للكتابة أساس التنفيذ وتصبح تعليقات مضمونة من قبل المترجم. غالبًا ما تُستخدم الكتابة الثابتة القوية كذريعة لعدم اختبار التعليمات البرمجية. في بعض الأحيان ستسمع مبرمجي هاسكل يقولون: "إذا تم إنشاء الكود، فهو صحيح". وبطبيعة الحال، ليس هناك ما يضمن أن البرنامج الذي يتم كتابته بشكل صحيح هو الصحيح بمعنى إنتاج النتيجة الصحيحة. ونتيجة لهذا الموقف، في عدد من الدراسات، لم تتفوق هاسكل بشكل ملحوظ على اللغات الأخرى في جودة التعليمات البرمجية، كما قد يتوقع المرء. يبدو أنه في البيئة التجارية، لا توجد الحاجة إلى إصلاح الأخطاء إلا عند مستوى معين من الجودة، والذي يرتبط في الغالب باقتصاديات تطوير البرمجيات وتسامح المستخدم النهائي، ولا علاقة له بلغة البرمجة أو التطوير. المنهجية. سيكون المقياس الأفضل هو قياس عدد المشاريع المتأخرة عن الجدول الزمني أو التي تم تسليمها بوظائف منخفضة للغاية. الآن، فيما يتعلق بالادعاء بأن اختبار الوحدة يمكن أن يحل محل الكتابة القوية. دعونا نلقي نظرة على ممارسة إعادة البناء الشائعة في اللغات المكتوبة بقوة: تغيير نوع الوسيطة إلى دالة. في اللغات المكتوبة بقوة، يكفي تغيير تعريف هذه الوظيفة، ثم إصلاح أي أخطاء في البناء. في اللغات المكتوبة بشكل ضعيف، لا يمكن أن تعزى حقيقة أن الوظيفة تتوقع الآن بيانات أخرى إلى المتصل. قد يكشف اختبار الوحدة عن بعض التناقضات، لكن الاختبار دائمًا ما يكون عملية احتمالية وليست عملية حتمية (ملاحظة المترجم: ربما كانوا يقصدون مجموعة من الاختبارات: أنت لا تغطي جميع المدخلات الممكنة، ولكن عينة تمثيلية معينة.)الاختبار هو بديل ضعيف لإثبات الصحة. يمكن أن تكون المجموعات محدودة أو لا نهائية. يعد نوع السلسلة، وهو في الأساس مرادفًا لقائمة Char، مثالاً لمجموعة لا نهائية. عندما نعلن أن x عدد صحيح: هناك بعض التفاصيل الدقيقة التي تجعل من الصعب مساواة الأنواع بالمجموعات. هناك مشاكل مع الدوال متعددة الأشكال التي لها تعريفات دورية، وأيضًا مع حقيقة أنه لا يمكنك الحصول على مجموعة من جميع المجموعات؛ ولكن، كما وعدت، لن أكون عالم رياضيات صارمًا. المهم أن هناك فئة من المجموعات اسمها Set وسنعمل بها. المجموعة هي فئة خاصة لأننا نستطيع النظر داخل كائناتها وهذا سيساعدنا على فهم الكثير بشكل حدسي. على سبيل المثال، نحن نعلم أن المجموعة الفارغة لا تحتوي على عناصر. نحن نعلم أن هناك مجموعات خاصة من عنصر واحد. نحن نعلم أن الوظائف تربط عناصر مجموعة ما بعناصر مجموعة أخرى. يمكنهم ربط عنصرين في عنصر واحد، ولكن ليس عنصر واحد في عنصرين. نحن نعلم أن وظيفة الهوية تربط كل عنصر من عناصر المجموعة بنفسها، وهكذا. أخطط لنسيان كل هذه المعلومات تدريجيًا والتعبير بدلاً من ذلك عن كل هذه المفاهيم بشكل قاطع بحت، أي من حيث الأشياء والسهام. في عالم مثالي، يمكننا أن نقول ببساطة أن الأنواع في هاسكل هي مجموعات، والدوال في هاسكل هي وظائف رياضية بينهما. هناك مشكلة صغيرة واحدة فقط: وظيفة الرياضيات لا تنفذ أي تعليمات برمجية - إنها تعرف الإجابة فقط. يجب أن تقوم دالة في هاسكل بحساب الإجابة. ولا تعتبر هذه مشكلة إذا كان من الممكن الحصول على الإجابة بعدد محدود من الخطوات، مهما كان هذا العدد كبيرًا. ولكن هناك بعض الحسابات التي تنطوي على التكرار، والتي قد لا تكتمل أبدًا. لا يمكننا ببساطة عدم السماح بالوظائف غير المنتهية في هاسكل لأن التمييز بين انتهاء الوظيفة أم لا - مشكلة التوقف الشهيرة - غير قابل للحل. ولهذا السبب توصل علماء الكمبيوتر إلى فكرة عبقرية، أو اختراق قذر حسب وجهة نظرك، لمد كل نوع بقيمة خاصة تسمى القاع (ملاحظة المترجم: هذا المصطلح (الأسفل) يبدو غبيًا نوعًا ما باللغة الروسية، إذا كان أي شخص يعرف خيارًا جيدًا، يرجى اقتراحه.)، والذي يُشار إليه بـ _|_ أو في Unicode ⊥. تتوافق هذه "القيمة" مع عملية حسابية غير مكتملة. لذلك تم الإعلان عن وظيفة على النحو التالي: ومن المثير للاهتمام، أنه بمجرد قبول "الأسفل" في نظام الكتابة، فمن المناسب التعامل مع كل خطأ في وقت التشغيل على أنه "أسفل"، وحتى السماح للوظيفة بالعودة إلى "الأسفل" بشكل صريح. يتم تنفيذ الأخير عادةً باستخدام التعبير غير المحدد: تسمى الوظائف التي يمكن أن ترجع إلى الأسفل جزئية، على عكس الوظائف العادية التي ترجع نتائج صالحة لجميع الوسائط الممكنة. بسبب القاع، تسمى فئة أنواع ووظائف Haskell Hask، وليس Set. من وجهة نظر نظرية، يعد هذا مصدرًا لتعقيدات لا نهاية لها، لذا في هذه المرحلة سأستخدم سكين الجزار الخاص بي وسأنهي الأمر. من وجهة نظر عملية، من الممكن تجاهل الوظائف غير المنتهية والجزء السفلي ومعاملة Hask كمجموعة كاملة. هناك وسائل رسمية لوصف دلالات اللغة، ولكن نظرًا لتعقيدها، فإنها تستخدم بشكل أساسي في اللغات الأكاديمية المبسطة، بدلاً من العمالقة الحقيقيين للبرمجة الصناعية. إحدى هذه الأدوات تسمى الدلالات التشغيلية وتصف آليات تنفيذ البرنامج. إنه يحدد المترجم الرسمي والمثالي. عادة ما يتم وصف دلالات اللغات الصناعية مثل C++ باستخدام المنطق غير الرسمي، غالبًا من حيث "الآلة المجردة". تكمن المشكلة في أنه من الصعب جدًا إثبات أي شيء يتعلق بالبرامج التي تستخدم الدلالات التشغيلية. لإظهار خاصية برنامج ما، عليك بشكل أساسي "تشغيله" من خلال مترجم مثالي. لا يهم أن المبرمجين لم يثبتوا صحتهم بشكل رسمي. نحن دائمًا "نعتقد" أننا نكتب البرامج الصحيحة. لا أحد يجلس أمام لوحة المفاتيح ويقول: "أوه، سأكتب بضعة أسطر من التعليمات البرمجية وأرى ما سيحدث." (ملاحظة المترجم: أوه، لو فقط...)نعتقد أن الكود الذي نكتبه سينفذ إجراءات معينة تؤدي إلى النتائج المرجوة. عادةً ما نتفاجأ جدًا إذا لم يكن الأمر كذلك. هذا يعني أننا في الواقع نفكر في البرامج التي نكتبها، وعادةً ما نقوم بذلك عن طريق تشغيل مترجم في رؤوسنا. إنه فقط أنه من الصعب جدًا تتبع جميع المتغيرات. أجهزة الكمبيوتر جيدة في تنفيذ البرامج، والناس ليسوا كذلك! لو كنا كذلك، لن نحتاج إلى أجهزة الكمبيوتر. ولكن هناك بديل. ويسمى دلالات دلالية ويستند إلى الرياضيات. في علم الدلالة الدلالية، يتم وصف تفسير رياضي لكل بناء لغوي. وبالتالي، إذا كنت تريد إثبات خاصية لبرنامج ما، فما عليك سوى إثبات نظرية رياضية. تعتقد أن إثبات النظريات أمر صعب، ولكن في الواقع، نحن البشر نقوم ببناء أساليب رياضية منذ آلاف السنين، لذلك هناك الكثير من المعرفة المتراكمة التي يمكن استخدامها. أيضًا، بالمقارنة مع النظريات التي يثبتها علماء الرياضيات المحترفون، فإن المشكلات التي نواجهها في البرمجة تميل إلى أن تكون بسيطة جدًا، إن لم تكن تافهة. (ملاحظة المترجم: للإثبات، المؤلف لا يحاول الإساءة إلى المبرمجين.) خذ بعين الاعتبار تعريف دالة المضروب في هاسكل، وهي لغة تفسح المجال بسهولة للدلالات الدلالية: إحدى المزايا المهمة لوجود نموذج رياضي للبرمجة هي القدرة على إجراء دليل رسمي على صحة البرنامج. قد لا يبدو هذا مهمًا جدًا عند كتابة برامج استهلاكية، ولكن هناك مجالات في البرمجة يمكن أن تكون تكلفة الفشل فيها هائلة، أو تكون فيها حياة الإنسان معرضة للخطر. ولكن حتى عند كتابة تطبيقات الويب لنظام الرعاية الصحية، يمكنك تقدير فكرة أن الوظائف والخوارزميات من مكتبة هاسكل القياسية تأتي كاملة مع أدلة صحتها. يمكننا تنفيذ دالة رياضية في لغة برمجة: مثل هذه الدالة، بالنظر إلى قيمة الإدخال، ستحسب قيمة الإخراج. من المحتمل أن تقوم دالة تربيع رقم بمضاعفة قيمة الإدخال بنفسها. سيفعل ذلك في كل مرة يتم استدعاؤه، ويضمن الحصول على نفس النتيجة في كل مرة يتم استدعاؤه بنفس الوسيطة. مربع الرقم لا يتغير مع مراحل القمر. علاوة على ذلك، فإن حساب مربع الرقم لا ينبغي أن يكون له أثر جانبي يتمثل في إعطاء كلبك مكافأة لذيذة. "الوظيفة" التي تقوم بذلك لا يمكن بسهولة نمذجتها بواسطة دالة رياضية. في لغات البرمجة، تسمى الوظائف التي تنتج دائمًا نفس النتيجة على نفس الوسائط وليس لها أي آثار جانبية نقية. في لغة وظيفية خالصة مثل هاسكل، جميع الوظائف نقية. وهذا يجعل من السهل تحديد الدلالات الدلالية لهذه اللغات ونمذجةها باستخدام نظرية الفئة. بالنسبة للغات الأخرى، يمكنك دائمًا قصر نفسك على مجموعة فرعية خالصة، أو التفكير في الآثار الجانبية بشكل منفصل. سنرى لاحقًا كيف تسمح لنا المونادات بنمذجة جميع أنواع التأثيرات باستخدام وظائف خالصة فقط. ونتيجة لذلك، فإننا لا نخسر شيئًا إذا اقتصرنا على الوظائف الرياضية. (تذكر أن a هو متغير النوع، والذي يمكن أن يكون أي نوع.) هذا الاسم ليس من قبيل الصدفة. هناك تفسير أعمق للأنواع والوظائف من حيث المنطق يسمى تماثل كاري هوارد. يمثل نوع الفراغ عدم الصدق، وتمثل الدالة السخيفة التأكيد على أن شيئًا ما يتبع من كذب، كما في العبارة اللاتينية "ex falso sequitur quodlibet". (ملاحظة المترجم: كل شيء يأتي من الكذب.) بعد ذلك يأتي النوع المطابق للمجموعة المفردة. هذا هو النوع الذي له قيمة واحدة محتملة فقط. هذا المعنى هو ببساطة "هناك". قد لا تتعرف عليه على الفور، ولكنه باطل في لغة C++. فكر في الوظائف من وإلى هذا النوع. يمكن دائمًا استدعاء دالة باطلة. إذا كانت دالة خالصة، فسوف تُرجع دائمًا نفس النتيجة. فيما يلي مثال على هذه الوظيفة: ماذا عن الوظائف التي ترجع فارغة، أو في هاسكل، ترجع واحدة؟ في لغة C++، يتم استخدام مثل هذه الوظائف للتأثيرات الجانبية، لكننا نعلم أن هذه الوظائف ليست وظائف حقيقية بالمعنى الرياضي للكلمة. الدالة الخالصة التي تُرجع واحدًا لا تفعل شيئًا: فهي تتجاهل حجتها. رياضيًا، تقوم دالة من المجموعة A إلى مجموعة مفردة بتعيين كل عنصر إلى عنصر واحد من تلك المجموعة. لكل A هناك وظيفة واحدة بالضبط. هنا هو لعدد صحيح: تسمى الوظائف التي يمكن تعريفها بنفس الصيغة لأي نوع متعددة الأشكال حدودياً. يمكنك تنفيذ مجموعة كاملة من هذه الوظائف بمعادلة واحدة، باستخدام معلمة بدلاً من نوع محدد. كيفية استدعاء دالة متعددة الأشكال من أي نوع إلى نوع واحد؟ وبالطبع سنسميها وحدة: تقوم وظائف Pure Bool ببساطة بتحديد قيمتين من النوع المستهدف، واحدة تتوافق مع True والأخرى تتوافق مع False. تسمى الوظائف في Bool المسندات. على سبيل المثال، تحتوي مكتبة Data.Char في Haskell على العديد من المسندات، مثل IsAlpha أو isDigit. توجد مكتبة مماثلة في C++ |
يقرأ: |
---|
جديد
- "سكيريم": التمرير الأكبر
- افتح القائمة اليسرى كايو كوكو
- لماذا نحتاج إلى الاتصالات الراديوية ومحطات الراديو؟
- معاملات ارتباط الرتب كيندال وسبيرمان مثال على معامل ارتباط الرتب كيندال
- وظائف البرمجة
- محفظة الأطفال - تنزيل قوالب مجانية
- أنواع فيروسات الكمبيوتر وأسباب خطورتها
- إعادة ضبط المصنع لجهاز Samsung Galaxy A3
- BIOS: التمهيد من القرص
- كيفية التمهيد من قرص DVD أو محرك أقراص فلاش "تثبيت" - إعداد BIOS بالصور