ماذا تعني عبارة "البيانات مجرد تعليمات برمجية غبية، والرمز مجرد بيانات ذكية"؟[مغلق]

StackOverflow https://stackoverflow.com/questions/871833

  •  22-08-2019
  •  | 
  •  

سؤال

لقد توصلت للتو إلى فكرة في هيكل وتفسير برامج الكمبيوتر:

البيانات هي مجرد كود غبي، والرمز هو مجرد بيانات ذكية

لا أستطيع أن أفهم ما يعنيه.هل يمكن لأحد أن يساعدني على فهم ذلك بشكل أفضل؟

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

المحلول

وهذا هو أحد الدروس الأساسية للSICP واحدة من أكثر الأفكار القوية لعلوم الكمبيوتر. وهي تعمل مثل هذا:

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

وغالبا ما تحتوي على اللغات تفسر آليات لمعالجة البيانات والرموز، مما يعني أنه يمكنك تمرير الشفرة في وظيفة بشكل أو بآخر ومن ثم تنفيذ ذلك - أو حتى إنشاء التعليمات البرمجية في وقت التشغيل:

#!/usr/bin/perl
# Note that the above line explicitly defines the interpretive context for the
# rest of this file.  Without the context of a Perl interpreter, this script
# doesn't do anything.
sub foo {
    my ($expression) = @_;
    # $expression is just a string that happens to be valid Perl

    print "$expression = " . eval("$expression") . "\n";
}

foo("1 + 1 + 2 + 3 + 5 + 8");              # sum of first six Fibonacci numbers
foo(join(' + ', map { $_ * $_ } (1..10))); # sum of first ten squares

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

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

واحدة من أقوى الوسائل لكتابة رمز كما هو وصف بسيط لماذا تحتاج: البيانات التي سيتم تحويلها إلى كود يصف كيف لتحصل على ما تحتاج اليه من سياق التفسيري. نحن نسمي هذا "برمجة تعريفية" .

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

نصائح أخرى

في سياق الأمن: نظرا لعازلة الفيضانات، ما من حيث الفكر البيانات، وبالتالي غير ضارة (مثل الصورة) يمكن أن تصبح تنفيذها كما رمز وp0wn جهازك

.

في سياق تطوير البرمجيات: العديد من مطوري خائفون جدا من الأشياء "hardcoding" وحريصة جدا على استخراج المعلمات التي قد تضطر الى تغيير في ملفات التكوين. وغالبا ما يعتمد هذا على فكرة أن ملفات التكوين هي "البيانات" فقط، وبالتالي يمكن تغييرها بسهولة (perhapy من قبل العملاء) من دون التطرق الى القضايا (تجميع ونشر واختبار) أن تغيير أي شيء في قانون من شأنه.

وماذا هؤلاء المطورين لا يدركون أنه منذ هذه "البيانات" يؤثر على سلوك هذا البرنامج، هو حقا المدونه؛ يمكن أن كسر البرنامج والسبب الوحيد الذي لم تتطلب اختبار كامل بعد هذا التغيير هو أنه إذا فعلت بشكل صحيح، والقيم شكلي لها، وتأثير موثقة جيدا محددة للغاية وأي قيمة غير صالحة أو سيتم القبض على بنية الملف المكسور البرنامج.

ولكن، كل ما يحدث في كثير من الأحيان هو أن هيكل ملف التكوين يصبح لغة البرمجة في حد ذاتها، كاملة مع التحكم في التدفق وكل شيء - تلك التي وثقت بشكل سيئ، لديها تركيب ملتوي ومحلل والتي فقط للمطورين الأكثر خبرة في الفريق يمكن تلمس دون كسر تطبيق تماما.

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

وهذا شيء يجب أن تأتي لفهم من الكتابة في المجمع.

وخطوة واحدة مشتركة في المجمعين هو تحويل البرنامج إلى شجرة جملة مجردة. والتمثيل في كثير من الأحيان يكون مثل أشجار مثل [+، 2، 3] حيث + غير الجذر، و 2، و 3 أولاد.

واللغات يسب ببساطة تتعامل مع هذا الأمر البيانات الخاصة به. لذلك ليس هناك فصل بين البيانات ورمز وكلاهما القوائم التي تبدو وكأنها أشجار AST.

الكود هو بالتأكيد بيانات، لكن البيانات هي بالتأكيد ليس دائما شفرة.لنأخذ مثالاً أساسيًا - اسم العميل.لا علاقة له بالكود، إنه وظيفي (أساسي)، مقابل أ اِصطِلاحِيّ (عرضي) جانب من التطبيق.

ربما يمكنك القول أن أي بيانات فنية/عرضية هي عبارة عن تعليمات برمجية وأن البيانات الوظيفية/الأساسية ليست كذلك.

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