هل من الممكن كتابة التعليمات البرمجية لكتابة التعليمات البرمجية؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

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

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

المحلول

وتبدأ من خلال النظر في quines ، ثم في الماكرو-الجامعون ثم <أ href = ل "http://www.google.com/search؟q=lex+yacc" يختلط = "نوفولو noreferrer"> يكس وياك ، و <لأ href = "http://www.google.com/ البحث؟ ف = فليكس + البيسون "يختلط =" نوفولو noreferrer "> العطف والبيسون . ثم النظر تعديل ذاتي كود .

وفيما يلي كواين (منسق، استخدم الناتج كإدخال جديد):

#include<stdio.h>

main()
{
  char *a = "main(){char *a = %c%s%c; int b = '%c'; printf(a,b,a,b,b);}";
  int b = '"';
  printf(a,b,a,b,b);
}

والآن إذا كنت تبحث فقط عن الأشياء المبرمجين لا يمكن أن لا ننظر لعكس NP-كاملة.

نصائح أخرى

إذا كنت تريد معرفة المزيد عن حدود الحاسوبية، قرأت عن مشكلة وقف

<اقتباس فقرة>   

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

     ثبت

وآلان تورينج في عام 1936 أن   الخوارزمية العامة لحل مشكلة وقف لجميع   ممكن أزواج برنامج المدخلات لا يمكن أن توجد

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

الحصول على رأسك حول هذا: نظرية الحاسوبية

نعم، هذا ما تفعله معظم وحدات الماكرو ليسب (على سبيل المثال واحد فقط).

ونعم بالتأكيد، وإن لم يكن في سياق كنت في اشارة للتحقق من هذا على T4.

إذا نظرتم البرمجة الوظيفية التي لديها العديد من الفرص لكتابة التعليمات البرمجية التي تولد المزيد من رمز، والطريقة التي لغة مثل اللثغة لا يفرق بين التعليمات البرمجية والبيانات هو جزء هام من انها السلطة.

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

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

ونعم فمن الممكن لخلق المولدات رمز. أكثر من مرة أنها تأخذ إدخال المستخدم وإنتاج رمز صالح. ولكن هناك احتمالات أخرى.

وprogrames المعدلة الذاتي من الممكن أيضا. لكنها كانت أكثر شيوعا في عهد دوس.

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

وأنت مربكة / الخلط بين اثنين من معاني كلمة "الكتابة". واحد المعنى هو الكتابة المادية من وحدات البايت إلى متوسطة، والآخر هو تصميم البرمجيات. بالطبع يمكن أن يكون البرنامج تفعل في السابق، إذا تم تصميمه للقيام بذلك.

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

وبالتأكيد هو عليه. كتبت لها تأثير على Paint.NET * والتي تمنحك محررا ويسمح لك لكتابة تأثير رسومي "على الطاير". وقفة عند كتابتها تجمع لدلل، يحمل هو وينفذ ذلك. الآن، في المحرر، تحتاج فقط لكتابة وظيفة الفعلية تقديم، على كل شيء آخر ضروري لخلق دلل هو مكتوب من قبل المحرر وإرسالها إلى C # مترجم.

ويمكنك تحميله مجانا هنا: http://www.boltbait.com/pdn/codelab /

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

وشفرة المصدر متاح للتحميل من تلك الصفحة أيضا.

و* Paint.NET هو صورة محرر الحرة التي يمكنك تحميل هنا: http://getpaint.net

في ما يتعلق الذكاء الاصطناعي، نلقي نظرة على الخوارزميات التطورية .

<اقتباس فقرة>   

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

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

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

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

وهناك الكثير من البرامج التي تكتب برامج أخرى، مثل ياك أو البيسون، ولكن لم يكن لديهم نفس النوعية الدينامية يبدو لك أن تكون تبحث عنه.

ونلقي نظرة على Langtom في حلقة . هذا هو أبسط مثال على التكاثر الذاتي "البرنامج".

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

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

وعن تلك المتقدمة يمكن قانون قابل للتنفيذ المخرجات. مع .NET، هناك مساحة كله (System.CodeDom) مخصصة لإنشاء رمز قابل للتنفيذ. وهذه الكائنات، يمكنك أن تأخذ C # (أو لغة أخرى) رمز، ترجمة عليه، وربطه إلى حسابك في برنامج قيد التشغيل حاليا.

وأفعل هذا في PHP.

لتستمر إعدادات لفئة، وأظل متغير محلي يسمى $data. $ البيانات هو مجرد القاموس / جدول هاش / ASSOC مصفوفة (اعتمادا على المكان الذي جئت منه).

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

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

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

ويسب يسب يسب يسب: p

والمزاح، إذا كنت ترغب التعليمات البرمجية التي ينشئ رمز لتشغيل وكنت حصلت على الوقت لتفقد تعلمها وكسر عقلك مع الاشياء عودي توليد المزيد من التعليمات البرمجية، في محاولة لمعرفة ثغة:)

(eval '(or true false))
<اقتباس فقرة>   

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

ولا توجد تقريبا الحالات التي من شأنها أن حل مشكلة لا يمكن حلها "أفضل" باستخدام تعليمات برمجية غير تعديل الذاتي ..

وقال ان هناك بعض شائعة جدا (مفيدة) حالات كتابة الكود رمز آخر .. والأكثر وضوحا هو أي من جانب الخادم على شبكة الإنترنت تطبيق، والذي يولد HTML / جافا سكريبت (حسنا، HTML هي العلامات، ولكنها متطابقة في نظرية). أيضا أي السيناريو الذي يغير بيئة المحطات عادة إخراج شيل الذي eval'd من قذيفة الأم. wxGlade يولد الرمز إلى أن يخلق اجهات القائم على WX عارية العظام.

DMS برنامج إعادة هندسة أدوات . هذا هو آلية للأغراض العامة لقراءة وتعديل البرامج أو توليد البرامج عن طريق تجميع شظايا.

وهذا هو واحد من الأسئلة الأساسية للذكاء الاصطناعي. شخصيا آمل أنه ليس من الممكن - على خلاف ذلك قريبا سأكون عاطلا عن العمل! :)

ويطلق عليه الفوقية البرمجة- و هو على حد سواء طريقة لطيفة لكتابة برامج مفيدة ، وموضوع البحث مثير للاهتمام. الكائنات الاصطناعية: ضمير كتاب آلة اعية يجب تهمك كثيرا. وتتعلق في معظمها لبرامج الكمبيوتر المستندة إلى علم الدراية.

ومصطلح آخر ذي صلة هو href="http://www.cs.rice.edu/~taha/MSP/" مراحل متعددة البرمجة (ولأن هناك عدة مراحل برامج، يولد كل منها واحد القادم).

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