প্রোগ্রামিং ভাষার কোন বৈশিষ্ট্য সংকলনকে অসম্ভব করে তোলে?


71

প্রশ্ন:

"একটি প্রোগ্রামিং ভাষার কিছু বৈশিষ্ট্যের প্রয়োজন হতে পারে যে এতে লেখা কোডটি কার্যকর করার একমাত্র উপায় হ'ল ব্যাখ্যার মাধ্যমে other

সংকলক: প্যারাগ এইচ। ডেভ এবং হিমাংশু বি। ডেভের নীতি ও অনুশীলন (মে 2, 2012)

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


31
বিখ্যাতভাবে, পার্ল এমনকি পার্স করা যায় না । এর বাইরে, দাবিটি আরও অনুমান ব্যতিরেকে তুচ্ছভাবে ভুল বলে মনে হচ্ছে: যদি কোনও দোভাষী থাকে তবে আমি সর্বদা একটি কার্যকর কার্যকর, ভয়েলাতে দোভাষী এবং কোড বান্ডেল করতে পারি।
রাফেল

4
@ রাফেল: দুর্দান্ত ধারণা, কিন্তু ... 1) আপনি ধরে নিচ্ছেন কোডটি কার্যকর করার আগে কোডটি উপলব্ধ। এটি ইন্টারেক্টিভ ব্যবহারের জন্য ধারণ করে না। অবশ্যই, আপনি বাশ বিবৃতি বা পোস্টস্ক্রিপ্ট স্ট্যাকের সামগ্রীগুলিতে নেটিভ কোডে কেবল ইন-টাইম সংকলন ব্যবহার করতে পারেন তবে এটি একটি দুর্দান্ত উন্মাদ ধারণা। 2) আপনার ধারণাটি আসলে কোডটি সংকলন করে না: বান্ডিলটি কোডের সংকলিত সংস্করণ নয়, তবে কোডের জন্য একটি দোভাষী।
পুনরায় পোস্টার

7
ভাল পুরানো দিনগুলিতে আমার স্ব-সম্পাদনা gwbasic প্রোগ্রাম ছিল (gwbasic বেসিক প্রোগ্রামগুলিকে এক ধরণের বাইটোকডে সঞ্চয় করে)। আমি বর্তমানে তাদের সম্পাদনা করার দক্ষতা বজায় রেখে এগুলি দেশীয় মেশিন কোডগুলিতে সংকলনের একটি বুদ্ধিমান উপায় সম্পর্কে ভাবতে পারি না।
প্লাজমাএইচ

15
@PlasmaHH: স্বয়ং পরিবর্তন কোড ফিরে 1948 প্রথম কম্পাইলার 1952 সালে লেখা হয়েছিল স্ব-পরিবর্তন কোডের ধারণা হয়েছিল যায় উদ্ভাবিত নেটিভ মেশিন কোডে।
মাকিং হাঁস

10
@ রিনিয়ারপোস্ট রাফেল এই বিষয়ে তাত্ত্বিক অবস্থান নিচ্ছেন। এটিতে প্রশ্নের ধারণাগত সীমাবদ্ধতা দেখানোর যোগ্যতা রয়েছে। সংকলনটি ভাষা এস থেকে ভাষা টিতে অনুবাদ করা হয় Language ল্যাঙ্গুয়েজ টি এস এর একটি এক্সটেনশন হতে পারে যা অন্য কোনও ল্যাঙ্গুয়েজে দোভাষী কোড যুক্ত করা যেতে পারে। সুতরাং এস এবং এর দোভাষীকে বান্ডিল করা টি টি ভাষায় একটি প্রোগ্রাম an এটি কোনও ইঞ্জিনিয়ারের কাছে অযৌক্তিক বলে মনে হয় তবে এটি বোঝায় যে প্রশ্নটি অর্থপূর্ণভাবে গঠন করা সহজ নয়। কোনও অগ্রহণযোগ্য (যেমন রাফেলের মতো) থেকে ইঞ্জিনিয়ারিং দৃষ্টিকোণ থেকে কোনও গ্রহণযোগ্য সংকলন প্রক্রিয়া কীভাবে আলাদা করবেন?
বাবু

উত্তর:


61

বর্ণিত এবং সংকলিত কোডের মধ্যে পার্থক্য সম্ভবত একটি কল্পকাহিনী, যা রাফেলের মন্তব্য দ্বারা আন্ডারলাইন করা হয়েছে :

the claim seems to be trivially wrong without further assumptions: if there is
an interpreter, I can always bundle interpreter and code in one executable ...

আসল বিষয়টি হ'ল কোডটি সর্বদা ব্যাখ্যা করা হয়, সফ্টওয়্যার দ্বারা, হার্ডওয়্যার বা উভয়ের সংমিশ্রণ দ্বারা এবং সংকলন প্রক্রিয়াটি এটি কী হতে পারে তা বলতে পারে না।

আপনি যেটি সংকলন হিসাবে বুঝতে পেরেছেন তা হ'ল একটি ভাষা (উত্সের জন্য) থেকে অন্য ভাষায় (টার্গেটের জন্য ) এর অনুবাদ প্রক্রিয়া । এবং, এর অনুবাদক সাধারণত জন্য দোভাষী থেকে আলাদা হয় ।STST

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

কিছু সংকলক প্রকৃতপক্ষে কোডের আকার হ্রাস করার জন্য ব্যবহার করা হয়েছে, "কার্যকরকরণ" প্রয়োগের জন্য নয়। প্লেটো সিস্টেমে ব্যবহৃত ভাষার ক্ষেত্রে এটি ছিল (যদিও তারা এটি সংকলন বলে না)।

আপনি আপনার কোডটি সম্পূর্ণরূপে সংকলিত বিবেচনা করতে পারেন যদি, সংকলনের প্রক্রিয়াটির পরে, আপনার আর জন্য দোভাষী দরকার নেই । অন্তত, তাত্ত্বিক প্রশ্নের চেয়ে ইঞ্জিনিয়ারিং হিসাবে আমি আপনার প্রশ্নটি পড়ার একমাত্র উপায় (যেহেতু, তাত্ত্বিকভাবে আমি সবসময় দোভাষীকে পুনর্নির্মাণ করতে পারি)।S

আফিক, সমস্যা উত্থাপন করতে পারে এমন একটি বিষয় হ'ল মেটা-সার্কুলারিটি । এটি তখনই যখন কোনও প্রোগ্রাম নিজস্ব উত্স ভাষা তে সিনট্যাক্টিক স্ট্রাকচারগুলি ম্যানিপুলেট করে , প্রোগ্রাম টুকরা তৈরি করে যা তখন ব্যাখ্যা করা হয় যেন তারা মূল প্রোগ্রামের অংশ হয়ে থাকে। যেহেতু আপনি ভাষায় স্বেচ্ছাসেবী প্রোগ্রামের টুকরো উত্পাদন করতে পারেন অর্থহীন সিন্ট্যাক্টিক টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করার ফলে, আমি অনুমান করব যে আপনি প্রোগ্রামটি ভাষায় সংকলন করতে প্রায় অসম্ভব (ইঞ্জিনিয়ারিং দৃষ্টিকোণ থেকে) করতে পারবেন , যাতে এটি এখন টুকরো তৈরি করে । অত: পর জন্য অনুবাদক প্রয়োজন হবে, অথবা থেকে অন্তত কম্পাইলার থেকেSSTTSST জন্য on-the-মাছি কম্পাইল মধ্যে উত্পন্ন টুকরা (এছাড়াও দেখুন এই দস্তাবেজটি )।S

তবে কীভাবে এটি সঠিকভাবে আনুষ্ঠানিকভাবে করা যায় (এবং এর জন্য এখনই সময় নেই) আমি নিশ্চিত নই। আর অসম্ভব একটি বিষয় যে বিধিবদ্ধ করা হয় না জন্য একটি বড় শব্দ।

আরও মন্তব্য

36 ঘন্টা পরে যুক্ত করা হয়েছে। আপনি এটি খুব দীর্ঘ সিক্যুয়ালটি এড়িয়ে যেতে চাইতে পারেন।

এই প্রশ্নের বহু মন্তব্য সমস্যার দুটি মতামত দেখায়: একটি তাত্ত্বিক দৃষ্টিভঙ্গি যা এটিকে অর্থহীন হিসাবে দেখায় এবং দুর্ভাগ্যবশত এত সহজে আনুষ্ঠানিক নয় এমন একটি প্রকৌশল দৃষ্টিভঙ্গি।

ব্যাখ্যা এবং সংকলনটি দেখার জন্য অনেকগুলি উপায় রয়েছে এবং আমি কয়েকটি স্কেচ করার চেষ্টা করব। আমি যেমন পরিচালনা করতে পারি তেমন অনানুষ্ঠানিক হওয়ার চেষ্টা করব

টম্বস্টোন ডায়াগ্রাম

প্রাথমিক আনুষ্ঠানিকতার একটি (১৯60০-এর দশকের গোড়ার দিকে 1990 অবধি) টি বা টম্বস্টোন ডায়াগ্রাম । এই চিত্রগুলি সংশ্লেষযোগ্য গ্রাফিকাল উপাদানগুলিতে দোভাষী বা সংকলকের প্রয়োগকারী ভাষা, উত্স ভাষাটি ব্যাখ্যা করা বা সংকলন করা এবং সংকলকগুলির ক্ষেত্রে লক্ষ্য ভাষা উপস্থাপন করা হয়েছে। আরও বিস্তৃত সংস্করণ বৈশিষ্ট্য যুক্ত করতে পারে। এই গ্রাফিক উপস্থাপনাগুলিকে অলঙ্কার হিসাবে বিবেচনা করা যেতে পারে, অনুমানের নিয়মগুলি, প্রসেসর প্রজন্মকে অক্সিমোস থেকে তাদের অস্তিত্বের প্রমাণ থেকে ব্যবহারের জন্য ব্যবহারযোগ্য, à লা কারি-হাওয়ার্ড (যদিও আমি নিশ্চিত নই যে ষাটের দশকে হয়েছিল :)।

আংশিক মূল্যায়ন

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

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

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

স্মন উপপাদ্য

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

একটি গোডেলের সংখ্যায়ন দেওয়া recursive ফাংশন, আপনি দেখতে পারেন আপনার হার্ডওয়ার যেমন, যাতে গোডেলের নম্বর দেওয়া (পড়া অবজেক্ট কোড ) একটি প্রোগ্রাম ফাংশন দ্বারা সংজ্ঞায়িত করা হয় (অর্থাত অবজেক্ট কোড দ্বারা নির্ণিত আপনার হার্ডওয়্যার)।φφpφpp

এর সহজতম ফর্মটিতে, উপপাদ্যটি উইকিপিডিয়াতে নিম্নরূপ বর্ণিত হয়েছে (স্বীকৃতিতে একটি ছোট পরিবর্তন পর্যন্ত):

একটি গোডেলের সংখ্যায়ন দেওয়া রিকার্সিভ ফাংশন, একটি আদিম রিকার্সিভ ফাংশন নিম্নলিখিত সম্পত্তি সঙ্গে দুই আর্গুমেন্ট: প্রতিবার গোডেলের সংখ্যার জন্য একটি আংশিক গণনীয় ফাংশনের দুটি আর্গুমেন্ট, এক্সপ্রেশন সঙ্গে এবং প্রাকৃতিক সংখ্যার এবং এর একই সংমিশ্রণের জন্য সংজ্ঞায়িত করা হয় এবং তাদের মানগুলি এই জাতীয় কোনও সংমিশ্রণের জন্য সমান। অন্য কথায়, প্রতিটি জন্য নিম্নলিখিত ক্রিয়াকলাপগুলির এক্সটেনশনাল সাম্যতা থাকে : φσqfφσ(q,x)(y)f(x,y)xyxφσ(q,x)λy.φq(x,y).

এখন, গ্রহণ দোভাষী হিসেবে , একটি প্রোগ্রাম সোর্স কোড হিসাবে , এবং যেমন ডাটা যে প্রোগ্রাম জন্য, আমরা লিখতে পারেন: qISxpSydφσ(IS,pS)λd.φIS(pS,d).

আই এস এসφIS দেখা যেতে পারে যেমন অনুবাদক সঞ্চালনের , হার্ডওয়্যার, অর্থাত উপর একটি কালো বাক্স ভাষায় লেখা প্রোগ্রাম ব্যাখ্যা করার জন্য প্রস্তুত হিসাবে ।ISS

মূল্যায়নের মতো ফাংশন এমন একটি ফাংশন হিসাবে দেখা যেতে পারে যা প্রোগ্রাম জন্য দোভাষী কে বিশেষ করে । সুতরাং গডেল নম্বর এর অবজেক্ট কোডটি দেখা যেতে পারে যা প্রোগ্রাম সংকলিত সংস্করণ ।আই এস পি এস σ ( আই এস , পি এস ) পি এসσISPSσ(IS,pS)pS

সুতরাং ফাংশনটি একটি ফাংশন হিসাবে দেখা যেতে পারে যা ভাষায় ভাষায় লিখিত কোনও প্রোগ্রামের উত্স কোড হিসাবে যুক্তি হিসাবে গ্রহণ করে এবং সেই প্রোগ্রামের জন্য অবজেক্ট কোড সংস্করণটি ফিরিয়ে দেয় সুতরাং সাধারণত একটি সংকলক বলা হয়।কিউ এস এস সি এসCS=λqS.σ((IS,qS)qSSCS

কিছু সিদ্ধান্তে

তবে, যেমনটি আমি বলেছিলাম: "তত্ত্বটি মিথ্যাবাদী হতে পারে", বা বাস্তবে এটি একটি বলে মনে হয়। সমস্যাটি হ'ল আমরা ফাংশনটির কিছুই জানি না । প্রকৃতপক্ষে এ জাতীয় অনেকগুলি কার্য রয়েছে এবং আমার ধারণা হ'ল উপপাদ্যের প্রমাণটি এর পক্ষে খুব সাধারণ সংজ্ঞা ব্যবহার করতে পারে, যা ইঞ্জিনিয়ারিং দৃষ্টিকোণ থেকে রাফেলের প্রস্তাবিত সমাধানের চেয়ে ভাল আর কিছু হতে পারে না: সোর্স কোড ব্যাখ্যাকারী সঙ্গে । এটি সর্বদা করা যায়, যাতে আমরা বলতে পারি: সংকলন সর্বদা সম্ভব।q এস আই এসσqSIS

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

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

এটি বলেছিল, কোনও নির্দিষ্ট বৈশিষ্ট্য সংকলনযোগ্য না হলেও, ইঞ্জিনিয়াররা বুঝতে পেরেছেন এমন অর্থে, স্ট্যান্ডার্ড সংকলন কৌশলগুলি সর্বদা এমন প্রোগ্রামগুলির অংশগুলিতে প্রয়োগ করা যেতে পারে যা এই জাতীয় বৈশিষ্ট্য ব্যবহার করে না, যেমন গিলসের উত্তর দ্বারা মন্তব্য করা হয়েছে।

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

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

নোট করুন যে সংকলন প্রক্রিয়াটি মেশিন কোড তৈরি করতে হবে তা কোনও সহায়ক নয়। এটাই হ'ল সংক্ষিপ্ত বিবরণটি মেশিন কোড হিসাবে বান্ডিলিংটি কী করতে পারে (ভাল, ক্রস সংকলনের সাহায্যে জিনিসটি আরও কিছুটা জটিল হয়ে উঠতে পারে)।


3
" অসম্ভব একটি বড় শব্দ" খুব খুব বড় শব্দ। =)
ব্রায়ান এস

3
যদি কোনও এক্সিকিউটিভ প্রোগ্রামের প্রথম ইনপুট গ্রহণের আগে পুরোপুরি ঘটে যাওয়া পদক্ষেপগুলির ক্রমকে বোঝাতে "সংকলন" সংজ্ঞায়িত করে এবং প্রোগ্রামটির বিমূর্ত মেশিন মডেলের অংশ না হয় এমন উপায়ে ডেটা নিয়ন্ত্রণ প্রোগ্রাম প্রবাহ হওয়ার প্রক্রিয়া হিসাবে ব্যাখ্যা করা হয় , তারপরে কোনও ভাষার সংকলন করার জন্য কম্পাইলারটির সনাক্তকরণ কার্যকর করা আবশ্যক, কার্যকর করা শুরু হওয়ার আগে, ভাষা নির্মানের প্রতিটি সম্ভাব্য অর্থ হতে পারে। যে ভাষাগুলিতে কোনও ভাষা নির্মানের সীমাহীন সংখ্যার অর্থ থাকতে পারে, সংকলনটি কাজ করবে না।
সুপারক্যাট

@ ব্রায়ানস না, এটি নয়, অন্যথায় প্রমাণ করাও অসম্ভব;)
মাইকেল গাজোন্ডা

@ সুপের্যাট এটি এখনও কোনও সংজ্ঞা নয়। কোন ভাষা গঠনের 'অর্থ' কী?
রাইময়েড

আমি একধরণের আংশিক মৃত্যুদন্ড হিসাবে সংকলক / দোভাষীকে দেখার ধারণাটি পছন্দ করি!
বার্গি

17

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

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

কোনও ভাষার অন্তর্ভুক্ত হওয়ার evalঅর্থ এই নয় যে এর বেশিরভাগ অংশ স্থানীয় কোডে সংকলন করা যায় না। উদাহরণস্বরূপ, লিস্প সংকলকগুলি অনুকূল রয়েছে, যা ভাল নেটিভ কোড উত্পন্ন করে এবং তবুও সমর্থন করে eval; eval'এড কোডটি ব্যাখ্যা করা যেতে পারে, বা উড়তে সংকলন করা যেতে পারে।

evalচূড়ান্ত প্রয়োজনগুলির জন্য একটি ইন্টারপ্রেটার বৈশিষ্ট্য, তবে এমন আরও কিছু বৈশিষ্ট্য রয়েছে যার জন্য দোভাষীের সংক্ষিপ্ত কিছু প্রয়োজন require সংকলকটির কয়েকটি সাধারণ পর্যায় বিবেচনা করুন:

  1. পদান্বয়
  2. টাইপ চেকিং
  3. কোড জেনারেশন
  4. সংযোগস্থাপন

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

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

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

Erc অনুশীলন: এমন একটি ভাষা নির্ধারণ করুন যা ব্যাখ্যা করা যায় না।


(1) সংকলন হিসাবে উত্স কোড গণনা সহ একজন দোভাষীকে বান্ডিল করা সম্পর্কে আমি একমত নই, তবে আপনার পোস্টের বাকী অংশটি দুর্দান্ত। (2) পুরোপুরিভাবে eval সম্পর্কে একমত। (3) আমি দেখতে পাচ্ছি না কেন প্রতিবিম্ব ভাষাগুলিকে স্থানীয় কোডগুলিতে সংকলন করা শক্ত করে তোলে। অবজেক্টিভ-সি এর প্রতিবিম্ব আছে এবং (আমি ধরে নিই) এটি সাধারণত সংকলিত হয়। (৪) সাবলীলভাবে সম্পর্কিত নোট, সি ++ টেমপ্লেট মেটাাম্যাগিক সাধারণত সংকলিত হয়ে মৃত্যুদন্ড কার্যকর করার পরিবর্তে ব্যাখ্যা করা হয়।
মাকিং হাঁস

আমার সাথে কেবল ঘটেছে, লুয়া সংকলিত হয়েছে। evalকেবল বাইটকোড প্রনয়ন, এবং তারপর একটি পৃথক পদক্ষেপ হিসেবে বাইনারি বাইটকোড সঞ্চালন করে। এবং এটি অবশ্যই সংকলিত বাইনারি প্রতিবিম্ব আছে।
মাকিং হাঁস

হার্ভার্ড আর্কিটেকচার মেশিনে, সংকলনের কোড উত্পন্ন করা উচিত যা কখনই "ডেটা" হিসাবে অ্যাক্সেস করতে হবে না। আমি উত্স ফাইলটি থেকে তথ্য পোস্ট করব যা কোডের চেয়ে ডেটা হিসাবে সংরক্ষণ করা শেষ করে যা সত্যই "সংকলিত" নয়। কোনও সংকলক int arr[] = {1,2,5};[১,২,৫] সমন্বিত একটি প্রাথমিক-উপাত্ত বিভাগ তৈরি করার মতো একটি ঘোষণা গ্রহণ এবং তৈরি করার মতো কোনও ভুল নেই , তবে আমি এর আচরণটি [১,২,৫] মেশিন কোডে অনুবাদ হিসাবে বর্ণনা করব না। যদি কোনও প্রোগ্রামের প্রায় সমস্তটি ডেটা হিসাবে সঞ্চয় করতে হয় তবে এর কোন অংশটি সত্যই "সংকলিত" হবে?
সুপারক্যাট

2
@ সুপের্যাট এটি গণিতবিদ এবং কম্পিউটার বিজ্ঞানীরা তুচ্ছ বলে বোঝান। এটি গাণিতিক সংজ্ঞা ফিট করে তবে আকর্ষণীয় কিছুই ঘটে না।
গিলস

@ গিলস: যদি "সংকলন" শব্দটি মেশিনের নির্দেশাবলী (সম্পর্কিত "ডেটা" ধরে না রেখে) অনুবাদ করার জন্য সংরক্ষিত থাকে এবং একটি সংকলিত ভাষায়, অ্যারে ঘোষণার আচরণটি অ্যারে "সংকলন" করে না, তবে কিছু ভাষা রয়েছে যার মধ্যে কোডের অর্থপূর্ণ ভগ্নাংশটি সংকলন করা অসম্ভব।
সুপারকেট

13

আমি মনে করি লেখকরা এই সংকলনটির অর্থ ধরে নিচ্ছেন

  • উত্স প্রোগ্রামটি রান-টাইমে উপস্থিত থাকার প্রয়োজন নেই, এবং
  • কোনও সংকলক বা দোভাষীর রান-টাইমে উপস্থিত থাকার প্রয়োজন নেই।

এখানে এমন কিছু নমুনা বৈশিষ্ট্য রয়েছে যা এ জাতীয় প্রকল্পের জন্য "অসম্ভব" না হলে এটি সমস্যাযুক্ত করে তুলবে:

  1. আপনি যদি রান-টাইমে কোনও ভেরিয়েবলের মানটি জিজ্ঞাসা করতে পারেন, তার নামটি (যা একটি স্ট্রিং) দ্বারা ভেরিয়েবলের উল্লেখ করে, তবে আপনার রান চলাকালীন সময়ে পরিবর্তনশীল নামগুলির প্রয়োজন হবে।

  2. আপনি যদি রান-টাইমে কোনও ফাংশন / প্রক্রিয়াটির নাম উল্লেখ করে (যা একটি স্ট্রিং) কল করতে পারেন তবে রান-টাইমে আপনার ফাংশন / পদ্ধতির নামগুলি প্রয়োজন হবে।

  3. আপনি যদি রান-টাইমে (স্ট্রিং হিসাবে) কোনও প্রোগ্রাম তৈরি করতে পারেন, অন্য কোনও প্রোগ্রাম চালনা করে, বা এটি একটি নেটওয়ার্ক সংযোগ থেকে পড়ার মাধ্যমে বলতে পারেন, তবে আপনার রান-টাইমে কোনও অনুবাদক বা সংকলক প্রয়োজন প্রোগ্রাম এই টুকরা চালান।

লিস্পের তিনটি বৈশিষ্ট্যই রয়েছে। সুতরাং, লিসপ সিস্টেমে সর্বদা রান-টাইমে একটি ইন্টারপ্রেটার বোঝাই থাকে। জাভা এবং সি # এর ভাষা চলমান সময়ে ফাংশনের নাম এবং তাদের অর্থ কী তা সন্ধান করার জন্য টেবিল রয়েছে। সম্ভবত বেসিক এবং পাইথনের মতো ভাষারও চলমান সময়ে পরিবর্তনশীল নাম রয়েছে। (আমি এটি সম্পর্কে 100% নিশ্চিত নই)।


"দোভাষী" কোডটি সংকলিত হলে কী হবে? উদাহরণস্বরূপ, ভার্চুয়াল পদ্ধতিতে কল পাঠাতে টেবিলগুলি ব্যবহার করা, এগুলি কি ব্যাখ্যা বা সংকলনের উদাহরণ?
এরউইন বলউইড্ট

2
"রান-টাইমে কোনও সংকলক বা দোভাষীর উপস্থিতির প্রয়োজন নেই", তাই না? ভাল যদি এটি সত্য হয় তবে গভীর অর্থে সিটিকে বেশিরভাগ প্ল্যাটফর্মে "সংকলিত" করা যায় না। সি রানটাইমের খুব বেশি কিছু করার নেই: স্টার্টআপ, স্ট্যাকস সেটআপ করা এবং আরও অনেক কিছু, এবং atexitপ্রক্রিয়াজাতকরণের জন্য শাটডাউন । তবে এটি এখনও আছে।
ছদ্মনাম

1
"লিস্প সিস্টেমে সর্বদা রান-টাইমে ইন্টারপ্রেটার বোঝাই থাকে।" - অগত্যা। অনেকগুলি লিস্প সিস্টেমে রানটাইমের সময় একটি সংকলক থাকে। কিছু এমনকি কোনও দোভাষী পাওয়া যায় না।
জার্গ ডব্লু মিট্টাগ

2
ভাল চেষ্টা করুন, তবে en.wikedia.org/wiki/Lisp_machine# টেকনিক্যাল_উভারভিউ । তারা লিস্প সংকলন করে এবং ফল কার্যকরভাবে কার্যকর করতে ডিজাইন করা হয়েছে।
পিটার এ স্নাইডার

@ ছদ্মনাম: সি রানটাইমটি একটি গ্রন্থাগার, সংকলক বা দোভাষী নেই।
মাকিং হাঁস

8

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

অন্যান্য উত্তরগুলি নির্দেশ করে যে বর্ণিত বনাম সংকলিত ভাষার পার্থক্য অনেক ক্ষেত্রে তাত্পর্যপূর্ণভাবে ঝাপসা হয়ে উঠতে পারে যেমন আরও কিছু আধুনিক ভাষার সাথে জাভা বলতে একটি "ঠিক সময়ে সংকলক" ওরফে "হটস্পট" (জাভাস্ক্রিপ্ট ইঞ্জিনগুলি যেমন ভি 8 ক্রমবর্ধমানভাবে এই কৌশলটি ব্যবহার করে) ব্যবহার করে। "eval- মত" কার্যকারিতা অবশ্যই তাদের মধ্যে একটি।


2
ভি 8 একটি ভাল উদাহরণ। এটি একটি খাঁটি সংকলক, কোনও ব্যাখ্যা কখনও চলছে না। তবুও এটি এখনও সীমাহীন সহ ECMAScript এর সম্পূর্ণ শব্দার্থকে সমর্থন করে eval
জার্গ ডব্লু মিট্টাগ

1
লুয়াও একই কাজ করে।
মাকিং হাঁস

3

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

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

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

অন্যদিকে, আধুনিক সিপিইউ এমনকি "মেশিন ল্যাঙ্গুয়েজ" ইনপুট নেয় এবং এটিকে নিম্ন-স্তরের নির্দেশিকায় অনুবাদ করে, যা মৃত্যুদন্ড কার্যকর করার আগে হস্তান্তর করার আগে পুনরায় সাজানো এবং অনুকূলিতকরণ (যেমন, "সংকলিত") করা হয়।

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


1

বাস্তবতা হ'ল কিছু বেসিক প্রোগ্রামটি ব্যাখ্যা করা এবং এসেম্বেলারকে কার্যকর করার মধ্যে একটি বড় পার্থক্য রয়েছে। এবং পি-কোড / বাইট-কোডের সাথে (কেবলমাত্র সময়ের মধ্যে) সংকলকগুলি সহ বা এর বাইরে কিছু ক্ষেত্র রয়েছে। তাই আমি এই বাস্তবতার প্রসঙ্গে কয়েকটি পয়েন্ট সংক্ষিপ্ত করার চেষ্টা করব।

  • সোর্স কোডটি কীভাবে পার্স করা হয় তা রান-টাইম অবস্থার উপর নির্ভর করে, একটি সংকলক লেখা অসম্ভব হয়ে উঠতে পারে বা এত কঠিন যে কেউ বিরক্ত করবে না।

  • যে কোডটি নিজেকে পরিবর্তিত করে তা সাধারণ ক্ষেত্রে সংকলন করা অসম্ভব।

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

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

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


1

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

অন্য কথায় ভাষাটি তার নিজস্ব মেটা-সিস্টেমকে উপস্থাপন করতে পারে (আরও দেখুন মেটাপ্রগ্রামিং )

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

আর একটি বৈশিষ্ট্য যা সংকলনকে কঠিন করে তোলে বা সেরা বিকল্পটি নয় (তবে অসম্ভব নয়) ভাষায় ব্যবহৃত টাইপিং স্কিমটি (যেমন ডায়নামিক টাইপিং বনাম স্ট্যাটিক টাইপিং এবং শক্তিশালী টাইপিং বনাম আলগা টাইপিং)। এটি সংকলকটির জন্য সংকলনকালে সমস্ত শব্দার্থবিজ্ঞান রাখা কঠিন করে তোলে, তাই কার্যকরভাবে সংকলকটির একটি অংশ (অন্যথায় একটি দোভাষী) উত্পন্ন কোডের অংশ হয়ে যায় যা রান-টাইমে শব্দার্থকে পরিচালনা করে । এটি অন্য কথায় সংকলন নয় বরং ব্যাখ্যা


এলআইএসপি একটি ভয়ানক উদাহরণ, যেমন এটি একটি স্প্রিট হিসাবে গর্ভধারণ হয়েছিল
ভোনব্র্যান্ড

@ ভনব্র্যান্ড, সম্ভবত তবে হোমোসোনসিটি ধারণা এবং অভিন্ন ডেটা-কোড দ্বৈততা উভয়ই দেখায়
নিকস এম।

-1

আমি অনুভব করি মূল প্রশ্নটি ভালভাবে তৈরি হয়নি। প্রশ্নের লেখকরা কিছুটা আলাদা প্রশ্ন জিজ্ঞাসা করতে চেয়েছিলেন: ক্রমবর্ধমান ভাষার কোন বৈশিষ্ট্য এটির জন্য একটি সংকলক লেখার সুবিধার্থে?

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


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

-1

প্রশ্নের সঠিক উত্তর এতটা সুস্পষ্ট যে এটিকে সাধারণত তুচ্ছ হিসাবে উপেক্ষা করা হয়। তবে এটি অনেক প্রসঙ্গেই তা বিবেচনা করে এবং মূল কারণ হ'ল ব্যাখ্যা করা ভাষা কেন বিদ্যমান:

মেশিন কোডে উত্স কোডটি সংগ্রহ করা অসম্ভব যদি আপনার কাছে এখনও সোর্স কোড না থাকে।

দোভাষীরা নমনীয়তা যুক্ত করে এবং বিশেষত তারা চলমান কোডের নমনীয়তা যুক্ত করে যা অন্তর্নিহিত প্রকল্পটি সংকলিত হওয়ার সময় উপলভ্য ছিল না।


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

1
@ ডেভিডরিচার্বি আমি অনুমান করি যে ব্যবহারের ক্ষেত্রে টাইলির মনে আছে ইন্টারেক্টিভ ব্যাখ্যার অর্থ, রানটাইমের সময় কোড প্রবেশ করানো। যদিও আমি সম্মতি জানাই যে এটি ভাষার কোনও বৈশিষ্ট্য না হওয়ায় এটি প্রশ্নের আওতার বাইরে।
রাফায়েল

@DavidRicherby এবং রাফায়েল, আমি বলে যে এই পোস্টের লেখক (আমি আমার উত্তর কি বর্ণনা) বোঝা স্ব-পরিমার্জন বৈশিষ্ট্য যা অবশ্যই একটি ভাষা এবং নকশা কনস্ট্রাক্ট কিছু নির্দিষ্ট প্রোগ্রাম একটি হস্তনির্মিত বস্তু হিসাবে
নিকোস এম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.