রূপক কী ঠিক?


128

আমি জাভা প্ল্যাটফর্মে প্লাইগ্লট প্রোগ্রামিংয়ের উপর দ্য সার্ভারসাইডে একটি নিবন্ধ পড়ছিলাম । নিবন্ধে কিছু মন্তব্য কোড উত্পন্ন করার ক্ষমতা (সম্ভবত উড়ে যাওয়ার ক্ষেত্রে) রূপককে উল্লেখ করে।

ফ্লাইয়ে কোড উত্পন্ন করার ক্ষমতা রূপক বা এটি রানটাইমের সময় বিদ্যমান বস্তুগুলিতে পদ্ধতি এবং বৈশিষ্ট্যগুলি ইনজেক্ট করার ক্ষমতা (যেমন কিছু পাইথন, রুবি এবং গ্রোভির মতো কিছু গতিশীল ভাষার অনুমতি দেয়)।


7
আপনি এই উত্তর আগ্রহী হতে পারে stackoverflow.com/questions/2565572/...
ewernli

@ ইওরনলি: উত্তরটি এখানে উত্তরগুলির চেয়ে আসলে ভাল!
জেডি

উত্তর:


100

ধাতব প্রোগ্রামিং বিভিন্নভাবে বোঝায় যে কোনও প্রোগ্রামের নিজের জ্ঞান রয়েছে বা নিজেই তা পরিচালনা করতে পারে।

সি # এর মতো ভাষাগুলিতে প্রতিবিম্ব একটি রূপক রূপ যা প্রোগ্রামটি নিজের সম্পর্কে তথ্য পরীক্ষা করতে পারে। উদাহরণস্বরূপ কোনও বস্তুর সমস্ত বৈশিষ্ট্যের একটি তালিকা ফেরত দেওয়া।

অ্যাকশনস্ক্রিপ্টের মতো ভাষায়, আপনি রানাল টাইমে ফাংশনগুলি মূল্যায়ন করতে পারেন নতুন প্রোগ্রাম তৈরি করতে যেমন ইভাল ("x" + i) তৈরি করতে। ডোজোমিংথিং () x 1 নামক কোনও বস্তুকে প্রভাবিত করবে যখন আমি 1 হয় এবং x 2 হয় i

পরিশেষে, প্রোগ্রামটি অন্য-তুচ্ছ ফ্যাশনে নিজেকে পরিবর্তন করতে পারে তখন রূপকগুলির আর একটি সাধারণ রূপ। এলআইএসপি এর জন্য সুপরিচিত এবং এটি প্রায় এক দশক আগে পল গ্রাহাম চ্যাম্পিয়ন হয়েছিল। আমি তার নির্দিষ্ট কিছু রচনা সন্ধান করতে হবে। তবে ধারণাটি হ'ল এই প্রোগ্রামটি তার রাজ্যের উপর ভিত্তি করে প্রোগ্রামের আরও একটি অংশ পরিবর্তন করবে। এটি রানটাইমের সময় এক পর্যায়ে নমনীয়তার সিদ্ধান্ত নিতে দেয় যা বর্তমানে বেশিরভাগ জনপ্রিয় ভাষায় খুব কঠিন difficult

এটিও লক্ষণীয় যে, সরাসরি অ্যাসেম্বলিতে প্রোগ্রামিংয়ের ভাল অল'এর দিনগুলিতে, রানটাইম সময়ে নিজেকে বদলে ফেলা প্রোগ্রামগুলি প্রয়োজনীয় এবং খুব সাধারণ ছিল।

পল গ্রাহামের রচনা "হোয়াট মেড লিস্প ডিফারেন্ট" থেকে :

অনেক ভাষায় ম্যাক্রো নামে কিছু থাকে। তবে লিসপ ম্যাক্রোগুলি অনন্য। এবং এটি বিশ্বাস করুন বা না করুন, তারা যা করে তা প্রথম বন্ধনীগুলির সাথে সম্পর্কিত। লিস্পের ডিজাইনাররা এই সমস্ত বন্ধনীকে ভাষার চেয়ে আলাদা করার জন্য রাখেনি। ব্লাব প্রোগ্রামারটির কাছে, লিস্প কোডটি অদ্ভুত দেখাচ্ছে। কিন্তু সেই প্রথম বন্ধনীগুলি একটি কারণ রয়েছে। লিস্প এবং অন্যান্য ভাষার মধ্যে মৌলিক পার্থক্যের বাহ্যিক প্রমাণ তারা।

লিস্প কোডটি লিস্প ডেটা অবজেক্টগুলির বাইরে তৈরি হয়। এবং তুচ্ছ অর্থে নয় যে উত্স ফাইলগুলিতে অক্ষর রয়েছে এবং স্ট্রিংগুলি ভাষা দ্বারা সমর্থিত ডেটা ধরণের একটি। লিস্প কোডটি পার্সার দ্বারা পড়ার পরে, ডেটা স্ট্রাকচার দিয়ে তৈরি যা আপনি পেরিয়ে যেতে পারেন।

কম্পাইলাররা কীভাবে কাজ করে তা যদি আপনি বুঝতে পারেন তবে আসলে কী চলছে তা এতটা নয় যে লিস্পের কাছে একটি অদ্ভুত বাক্য গঠন রয়েছে যেহেতু লিস্পের কোনও সিনট্যাক্স নেই। আপনি পার্স গাছগুলিতে প্রোগ্রামগুলি লিখেন যা সংকলকটির মধ্যে অন্য ভাষাগুলি বিশ্লেষণ করার সময় উত্পন্ন হয়। তবে এই পার্স গাছগুলি আপনার প্রোগ্রামগুলিতে সম্পূর্ণ অ্যাক্সেসযোগ্য। আপনি সেই প্রোগ্রামগুলি লিখতে পারেন যা সেগুলি হেরফের করে। লিস্পে, এই প্রোগ্রামগুলিকে ম্যাক্রো বলা হয়। তারা প্রোগ্রাম যে প্রোগ্রাম লিখুন।

প্রোগ্রাম যে প্রোগ্রাম লিখুন? আপনি কখন এটি করতে চান? খুব প্রায়ই না, যদি আপনি কোবলে ভাবেন। সব সময়, যদি আপনি লিস্পে ভাবেন। আমি এখানে শক্তিশালী ম্যাক্রোর উদাহরণ দিতে এবং সেখানে বলতে পারলে সুবিধাজনক হবে! কীভাবে? তবে আমি যদি তা করি তবে এটি কেবল লিস্পকে চেনে না এমন ব্যক্তির কাছে কেবল জিবির মতো মনে হবে; এর অর্থ কী তা বোঝার জন্য আপনার জানতে প্রয়োজনীয় সমস্ত কিছু ব্যাখ্যা করার জন্য এখানে কোনও স্থান নেই। ইন ANSI প্রচলিত পাতার মর্মর আমি যত দ্রুত বরাবর যেমন আমি পারতাম জিনিষ সরানো করার চেষ্টা করেছিল, এবং এমনকি তাই আমি পৃষ্ঠা 160 পর্যন্ত ম্যাক্রো পেতে হয়নি।

তবে আমি মনে করি আমি একধরনের যুক্তি দিতে পারি যা নিশ্চিত হতে পারে। ভায়াবেব সম্পাদকের উত্স কোডটি সম্ভবত প্রায় 20-25% ম্যাক্রো ছিল। ম্যাক্রোগুলি সাধারণ লিস্প ফাংশনগুলির তুলনায় লেখা শক্ত এবং এগুলি যখন প্রয়োজন হয় না তখন সেগুলি ব্যবহার করা খারাপ স্টাইল হিসাবে বিবেচিত হয়। সুতরাং যে কোডটিতে প্রতিটি ম্যাক্রো রয়েছে কারণ এটি হওয়া দরকার। এর অর্থ হ'ল এই প্রোগ্রামের কমপক্ষে 20-25% কোড এমন কাজ করছে যা আপনি অন্য কোনও ভাষায় সহজেই করতে পারবেন না। তবে ব্ল্প প্রোগ্রামার লিস্পের রহস্যময় শক্তির জন্য আমার দাবির বিষয়ে সন্দেহবাদী হতে পারে, তবে তাকে কৌতূহলী করা উচিত। আমরা আমাদের নিজের বিনোদনের জন্য এই কোডটি লিখছিলাম না। আমাদের এবং আমাদের প্রতিযোগীদের মধ্যে প্রযুক্তিগত বাধা তৈরি করতে আমরা যতটা হার্ড প্রোগ্রামিং করতাম আমরা একটি ছোট্ট সূচনা ছিলাম।

সন্দেহজনক ব্যক্তি ভাবতে শুরু করতে পারে যে এখানে কিছু সম্পর্ক আছে কিনা। আমাদের কোডের একটি বড় অংশ এমন কাজ করছিল যা অন্য ভাষায় করা খুব কঠিন। ফলস্বরূপ সফ্টওয়্যার এমন কাজ করেছিল যা আমাদের প্রতিযোগীদের সফ্টওয়্যার করতে পারে না। সম্ভবত কিছুটা সংযোগ ছিল। আমি আপনাকে এই থ্রেড অনুসরণ করতে উত্সাহিত করি। চোখের দেখা পাওয়ার চেয়ে বৃদ্ধা তার ক্রাচগুলিতে ঝাঁপিয়ে পড়ে আরও কিছু থাকতে পারে।


6
সি ++ তে টেমপ্লেট মেটাপোগ্র্যামিং সম্পর্কে ভুলবেন না। সংকলন সময়ে এক্সপ্রেশন কার্যকর করতে এবং সিদ্ধান্ত নেওয়ার ক্ষমতা এবং ফলাফলগুলি স্থিতিশীলভাবে চূড়ান্ত সম্পাদনযোগ্যতে সংকলিত করার ক্ষমতা।
রেমি Lebeau

1
আমি হতবাক হয়ে গেলাম in order to put technical barriers between us and our competitorsএবং এটি ঠিক তমাদে আছে।
ইভান হু

4
যে প্রোগ্রামগুলি নিজেরাই ম্যানিপুলেট করে সেগুলি সমস্ত রূপকগুলির একটি উপসেট। সাধারণভাবে ধাতব প্রোগ্রামিংয়ের অর্থ প্রোগ্রামগুলি হেরফের করে এমন প্রোগ্রামগুলি।
জেডি

55

দুর্দান্ত প্রশ্ন। আমি অত্যন্ত দুঃখিত যে বর্তমানে উত্তরগুলির কোনওটিই আপনার প্রশ্নের সঠিক উত্তর দেয় না। সম্ভবত আমি সাহায্য করতে পারি ...

রূপান্তরকরণের সংজ্ঞাটি আসলেই খুব সহজ: এর অর্থ প্রোগ্রামগুলি হ'ল প্রোগ্রামগুলি।

আপনার গৃহীত উত্তরগুলি এমন প্রোগ্রামগুলিকে বলে যেগুলি নিজেরাই হেরফের করে। এগুলি প্রকৃতপক্ষে রূপকগুলি তবে তারা সমস্ত রূপকথার একটি উপসেট।

সমস্ত:

  • parsers
  • ডোমেন নির্দিষ্ট ভাষা (ডিএসএল)
  • এম্বেডড ডোমেন সুনির্দিষ্ট ভাষা (ইডিএসএল)
  • কম্পাইলার
  • দোভাষী
  • মেয়াদ পুনর্লিখনক
  • উপপাদ্য প্রবাদের

রূপকগুলি। সুতরাং জিসিসি সংকলক একটি রূপক, সিপিথন ইন্টারপ্রেটার একটি রূপক, ম্যাথমেটিকা ​​কম্পিউটার বীজগণিত সিস্টেম একটি রূপক, কোক তাত্ত্বিক প্রবাদটি একটি রূপক এবং আরও অনেক কিছু।

অন্যান্য উত্তরগুলি দৃserted়ভাবে জানিয়েছে যে রূপান্তরগুলি এমন প্রোগ্রাম যা অন্যান্য প্রোগ্রাম উত্পন্ন করে। সেগুলি প্রকৃতপক্ষে রূপকগুলি তবে আবার তারা সমস্ত রূপকথার একটি উপসেট। দ্রুততম ফুরিয়ার পাশ্চাত্যে ট্রান্সফর্ম (FFTW) গ্রন্থাগারের এই ধরনের একটি metaprogram এর একটি উদাহরণ। সোর্স কোড বেশিরভাগই লেখা আছে OCaml এবং এটি সি কোড (নামক codelets) যে উচ্চ কার্যকারিতা তৈরি করতে একত্রিত করা হয় এর বিট উত্পন্ন ফাস্ট ফুরিয়ার ট্রান্সফর্ম নির্দিষ্ট মেশিনের জন্য অপ্টিমাইজ করা রুটিন। সেই লাইব্রেরিটি আসলে মতলব এফএফটি রুটিন সরবরাহ করতে ব্যবহৃত হয়। ফরট্রানের প্রথম দিন থেকেই মানুষ কয়েক দশক ধরে সংখ্যাসূচক পদ্ধতি তৈরির জন্য প্রোগ্রাম লিখছেন ।

রূপান্তরিতকরণের জন্য একীভূত সমর্থনকারী প্রথম প্রোগ্রামিং ভাষা হ'ল 1950 এর দশকের শেষের দিকে এলআইএসটি প্রসেসর (এলআইএসপি) ভাষা। এলআইএসপি ১.৫ এর মধ্যে এমন অনেকগুলি বৈশিষ্ট্য অন্তর্ভুক্ত ছিল যা রূপান্তরকে সহজ করে তোলে। প্রথমত, এলআইএসপি-র মূল তথ্য টাইপগুলি নেস্টেড তালিকাগুলি, যেমন গাছের মতো (a (b c) d), যার অর্থ কোনও এলআইএসপি কোড স্থানীয়ভাবে ডেটা স্ট্রাকচার হিসাবে প্রকাশ করতে পারে। এটি হোমোসোনসিটি হিসাবে পরিচিত। দ্বিতীয়ত, এলআইএসপি কোডটি কোয়েট ব্যবহার করে সহজেই ডেটাতে রূপান্তর করা যায়। উদাহরণস্বরূপ (+ 1 2 3)1 + 2 + 3 (QUOTE (+ 1 2 3))যোগ করে এবং এমন একটি অভিব্যক্তি তৈরি করে যা মূল্যায়নের সময় 1 + 2 + 3 যোগ করে। তৃতীয়ত, এলআইএসপি একটি মেটা-বিজ্ঞপ্তি মূল্যায়নকারী সরবরাহ করেছিল যা আপনাকে রান-টাইমে উত্পন্ন এলআইএসপি কোড সহ রান-টাইমে এলআইএসপি কোডটি মূল্যায়ন করতে হোস্ট ইন্টারপ্রেটার বা সংকলক ব্যবহার করতে দেয়। এলআইএসপি'র বংশধরদের মধ্যে স্কিম এবং ক্লোজার অন্তর্ভুক্ত রয়েছে। এই সমস্ত ভাষায় রূপকগুলি সাধারণত প্রোগ্রামগুলির আকারে দেখা যায় যা সাধারণত নিজেরাই সংশোধন করে ম্যাক্রো ব্যবহার করে।

১৯ 1970০ এর দশকে, রবিন মিলনার একটি মেটা ল্যাঙ্গুয়েজ (এমএল) তৈরি করেন যা প্রমিত প্রোগ্রামিং ভাষার এমএল পরিবারে বিকশিত হয় যার মধ্যে স্ট্যান্ডার্ড এমএল এবং ওসিএএমএল রয়েছে এবং হাস্কেল এবং এফ # তে দৃ strongly়ভাবে প্রভাবিত হয়েছিল । এই ভাষাগুলি অন্যান্য ভাষাগুলি প্রকাশ করা সহজ করে। এই ভাষাগুলিতে রূপকগুলি সাধারণত লেক্সার, পার্সার্স, দোভাষী এবং সংকলক আকারে দেখা যায়।

1994 সালে, এরউইন উরুহ আবিষ্কার করেছিলেন যে সি ++ টেম্পলেট সিস্টেমটি টিউরিং সম্পূর্ণ ছিল এবং সংকলনের সময় নির্বিচারে প্রোগ্রামগুলি সম্পাদন করতে ব্যবহৃত হতে পারে । সি ++ টেমপ্লেট মেটাপোগ্র্যামিং ধোয়া ধোয়া জনগণের জন্য রূপক এনেছিল যারা (আব) এটি ব্লিট ++ লাইব্রেরিতে সংখ্যাসূচক পদ্ধতি তৈরি সহ অনেকগুলি বিভিন্ন কাজে ব্যবহার করেছিলেন ।


33

ঠিক আছে, ধাতব প্রোগ্রামিং কেবল প্রোগ্রামিং, তবে এটি মূলত "রাইটিং কোড যা কোড লেখেন"

আপনি যে দক্ষতার কথা উল্লেখ করেছেন, যখন কোনও প্রোগ্রাম তার নিজস্ব কাঠামো এবং আচরণ পর্যবেক্ষণ ও সংশোধন করতে পারে তাকে প্রতিবিম্ব বলা হয় এবং এটি একধরনের রূপক।

গতিশীল টাইপ করা ভাষাগুলি, শক্তিশালী রানটাইম প্রতিবিম্ব বৈশিষ্ট্য রয়েছে, এই ভাষাগুলির ব্যাখ্যামূলক প্রকৃতির দ্বারা সম্ভব হয়েছে ...

স্ট্যাটিক টাইপযুক্ত ভাষাগুলিতে শক্তিশালী রূপক কৌশল রয়েছে, উদাহরণস্বরূপ সি ++ টেম্পলেট মেটাপোগ্র্যামিং ...


14

এটি কেবলমাত্র আমার ব্যক্তিগত মতামত, যা সম্ভবত রূপবিদ্যার সবচেয়ে উদার সংজ্ঞা।

আমি মনে করি এটি অন্তর্ভুক্ত:

  1. কোড জেনারেশন বা রানটাইম কোড জেনারেশন (বা উভয়) সংকলন করুন
  2. দিক-ওরিয়েন্টেড চিন্তাভাবনা বা অ্যাস্পেক্ট ওরিয়েন্টেড প্রোগ্রামিং
  3. DRY চিন্তাভাবনা

আমি মনে করি আপনি এগুলির যে কোনও একটি এবং সংমিশ্রণে ব্যবহার করে সেখানে যেতে পারবেন:

  1. প্রতিফলন
  2. ডিএসএল (ডোমেন নির্দিষ্ট ভাষা)
  3. বৈশিষ্ট্য (। নেট) বা টিকা (জাভা)
  4. জেনারিক্স (। নেট / জাভা)
  5. টেমপ্লেট (সি ++)
  6. পদ্ধতি_মিশিং (রুবি)
  7. ক্লোজার / প্রথম শ্রেণির ফাংশন / প্রতিনিধি
  8. এওপি - অ্যাসপেক্ট ওরিয়েন্টেড প্রোগ্রামিং

খুব সংক্ষিপ্ত এবং চিন্তাশীল উত্তর। আমাকে তদন্তের জন্য জিনিসগুলির একটি ভাল মেনু দিয়েছে। ধন্যবাদ!
swyx

6

Metaprogramming একটি প্রোগ্রাম লিখছে যা অন্য প্রোগ্রামকে আউটপুট করে। এটি লিস্পের মতো ভাষাতে খুব ভাল। জাভা জাতীয় ভাষার চেয়ে রুবি, লিস্প, স্কিম ইত্যাদির মতো সত্যিকারের ম্যাক্রোগুলিকে (সি ++ ম্যাক্রো নয়, বরং তারা যে কোডটি আউটপুট কোড ম্যানিপুলেট করতে পারে) সমর্থন করে এমন ভাষায় করা অনেক সহজ।

একটি বাস্তবায়ন হ'ল একটি "ডোমেন নির্দিষ্ট ভাষা" তৈরি করা যা কোনও নির্দিষ্ট কাজ সম্পাদন করার জন্য প্রোগ্রামিং ভাষা উন্নত করার একটি উপায়। সঠিকভাবে করা গেলে এটি অবিশ্বাস্যভাবে শক্তিশালী হতে পারে। এই ধরণের প্রোগ্রামিংয়ের জন্য রুবি অন রেল একটি ভাল উদাহরণ।

আপনি যদি এই পদ্ধতিটি অন্বেষণ করতে আগ্রহী হন তবে কম্পিউটার প্রোগ্রামগুলির স্ট্রাকচার এবং ব্যাখ্যার যাচাই করে নিন যা বিষয়টিকে অন্তর্ভুক্ত করার জন্য একটি প্রাথমিক বই রয়েছে।


5

ধাতব প্রোগ্রামিং হ'ল কম্পিউটার প্রোগ্রামগুলি যা অন্যান্য প্রোগ্রামগুলিকে (বা নিজেরাই) তাদের ডেটা হিসাবে লিখতে বা চালিত করে বা রানটাইম সময়ে কাজটির অংশ করে যা অন্যথায় সংকলন সময়ে করা হত। অনেক ক্ষেত্রে, প্রোগ্রামাররা ম্যানুয়ালি সমস্ত কোড লেখার জন্য যেমন সময় নেয় তেমন পরিমাণে আরও কাজ করার অনুমতি দেয় বা এটি পুনরায় সংবিধান ছাড়াই নতুন পরিস্থিতিতে দক্ষতার সাথে পরিচালনা করার জন্য প্রোগ্রামগুলিকে আরও নমনীয়তা দেয়। ( উত্স ।)

মূলত, এটি এমন কোড লিখন যা আরও বেশি কোড দেয়, যা কিছু লক্ষ্য অর্জনে চালিত হয়। এটি সাধারণত একই ভাষার মধ্যে করা হয় (জাভাস্ক্রিপ্ট ব্যবহার করে একটি জাভাস্ক্রিপ্ট স্ট্রিং তৈরি করতে, তারপরে evalএটি) বা অন্য কোন ভাষা নির্গত করতে (উইন্ডোজ ব্যাচ ফাইল তৈরি করতে। নেট ব্যবহার করে)।


4

উইকিপিডিয়ায় বিষয়টিতে একটি দুর্দান্ত নিবন্ধ রয়েছে। রূপান্তরকরণ হিসাবে যোগ্যতার জন্য কোনওকে রানটাইম পরিবর্তন করতে হবে না। উদাহরণস্বরূপ, অনেকে কমপাইল সময় metaprogramming করতে সি ++ টেম্পলেট ব্যবহার করেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.