ধরা যাক এক্স ইনপুট ল্যাঙ্গুয়েজ, জেড আউটপুট ল্যাঙ্গুয়েজ, তারপরে চ কম্পাইলার, যা Y ভাষায় লেখা হয়েছে is
f = X -> Z
যেহেতু চ কেবলমাত্র একটি প্রোগ্রাম, আমি মনে করি Y কোনও ভাষা হতে পারে, তাই না? সুতরাং আমরা সংকলক f1, f2, প্রতিটি Y1, Y2 এ লিখিত থাকতে পারি।
f1 = f Y1
f2 = f Y2
g = Z -> M
h = g . f # We get a compiler X -> M
উদাহরণস্বরূপ, সিপিথন সংকলক নিন, এক্সটি পাইথন, জেডটি পাইথন ভিএম কোড, ওয়াই সি C.
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
পাইথন উত্সগুলি পাইথন ভিএম কোড, .pyc ফাইলগুলিতে সংকলিত হয়, তারপরে দোভাষী দ্বারা তা ব্যাখ্যা করা হয়। দেখে মনে হচ্ছে এটির একটি সংকলক রয়েছে যা সরাসরি পাইথন -> মেশিনকোড করতে পারে, বাস্তবায়ন করা অনেক কঠিন হলেও:
hardpython = interpreter2 . cpython
পাইথন -> পাইথনভিএমকোড, অন্য ভাষায় কাজ করার জন্য আমরা আরেকটি সংকলকও লিখতে পারি, পাইথন নিজেই বলে।
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
এখন, পাইপাই এর জটিল উদাহরণ। আমি পাইপাইয়ের একমাত্র নবাগত, আমি ভুল হলে আমাকে সংশোধন করুন:
পিপিপি ডক http://doc.pypy.org/en/latest/architecture.html#pypy-transla-- ফ্রেমওয়ার্ক
ভাষা লক্ষ্য প্রয়োগকারীদের সমস্যাটির একটি সম্ভাব্য সমাধান প্রদান আমাদের লক্ষ্য: l গতিশীল ভাষার জন্য l * o * p ইন্টারপ্রেটার এবং o প্ল্যাটফর্মের গুরুতর নকশার সিদ্ধান্ত নিয়ে লিখতে।
আমরা ভাবতে পারি যে l হ'ল এক্স, পি হ'ল একটি প্রোগ্রাম রয়েছে যা সমস্ত আরপিথন প্রোগ্রামগুলিকে সি তে অনুবাদ করে:
rpython_compiler = RPython -> C Python
pypy = Python -> Nothing RPython
translate = compile the program pypy written in RPython using rpython_compiler
py2rpy = Python -> RPython Python
py2c = Python -> C Python
py2c = rpython_compiler . py2rpy
আরপিথন প্রোগ্রামগুলি ঠিক ভিএম নির্দেশিকার মতো, আরপিথন_কম্পেলারটি ভিএম।
Q1। পাইপি হ'ল দোভাষী, একটি আরপিথন প্রোগ্রাম যা পাইথন কোডটি ব্যাখ্যা করতে পারে, কোনও আউটপুট ভাষা নেই, তাই আমরা এটিকে সংকলক হিসাবে বিবেচনা করতে পারি না, তাই না?
যোগ করা হয়েছে:
- আমি সবেমাত্র আবিষ্কার করেছি যে অনুবাদ করার পরেও পাইপি এখনও দোভাষী হয়, কেবলমাত্র এবার সি-তে লেখা time
- আমরা যদি ইন্টারপ্রেটার পাইপির গভীরে নজর রাখি তবে আমি বিশ্বাস করি যে এখানে অবশ্যই এক ধরণের সংকলক উপস্থিত থাকতে হবে, যা পাইথনের উত্সগুলিকে কিছু এএসটি সংকলন করে, তারপর মৃত্যুদন্ড কার্যকর করবে
এটার মত:
compiler_inside_pypy = Python -> AST_or_so
Q2। সমস্ত পাইথন প্রোগ্রামগুলিকে আরপিথনে রূপান্তর করে পাইপআরপি সংকলক উপস্থিত থাকতে পারে? কোন ভাষায় এটি লিখিত তা অপ্রাসঙ্গিক। যদি হ্যাঁ, আমরা পাই আরও একটি সংকলক পাই। প্রকৃতিতে পাইপি এবং পাইপিআরপি-র মধ্যে পার্থক্য কী? পাইপির চেয়ে লেখার জন্য পাইপআইআরপি কি আরও শক্ত?
Q3। এ সম্পর্কে কিছু সাধারণ নিয়ম বা তত্ত্ব উপলব্ধ?
আরও সংকলক:
gcc_c = C -> asm? C # not sure, gimple or rtl?
g++ = C++ -> asm? C
clang = C -> LLVM_IR C++
jython = Python -> JVMCode java
ironpython = Python -> CLI C#
Q4। প্রদত্ত এফ = এক্স -> জেড, এক্স-এ লেখা একটি প্রোগ্রাম পি When আমরা পি-কে দ্রুত করতে চাইলে আমরা কী করতে পারি? সম্ভাব্য উপায়:
আরও দক্ষ অ্যালগরিদমে পি পুনরায় লিখুন
আরও ভাল জেড উত্পন্ন করতে পুনরায় লিখুন
যদি জেডকে ব্যাখ্যা করা হয় তবে আরও ভাল জেড ইন্টারপ্রিটার লিখুন (পাইপাই এখানে রয়েছে?)
জেড লিখিত প্রোগ্রামগুলিকে পুনরাবৃত্তিতে গতি দিন
একটি ভাল মেশিন পান
পুনশ্চ. এই প্রশ্নটি কীভাবে একটি সংকলক লিখতে হবে তার প্রযুক্তিগত বিষয়গুলি সম্পর্কে নয়, তবে একটি নির্দিষ্ট ধরণের সংকলক লেখার সম্ভাব্যতা এবং জটিলতা।