একটি গতিময় টাইপ করা ভাষার জন্য সংকলক লিখতে টাইপ সম্পর্কিত চ্যালেঞ্জগুলি কী কী?


9

ইন এই আলাপ , গাইডো van Rossum, টকিং (27:30) পাইথন কোডটির জন্য একটি কম্পাইলার লিখতে প্রচেষ্টা সম্পর্কে এটা বলার অপেক্ষা রাখে মন্তব্য:

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

পাইথনের মতো গতিময় টাইপ করা ভাষার জন্য সংকলক লেখার ক্ষেত্রে টাইপ সম্পর্কিত (সম্ভাব্য) চ্যালেঞ্জগুলি কী কী?


এই ক্ষেত্রে গতিশীল টাইপিং প্রায় বৃহত্তম সমস্যা নয়। অজগর জন্য এটি একটি গতিশীল স্কোপিং।
এসকে-যুক্তি

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

2
@ এসকে-লজিক পাইথনে ডায়নামিক স্কোপিং? সর্বশেষে আমি যাচাই করেছি, ভাষার সমস্ত কন্সট্রাক্টস লেক্সিকাল স্কোপিং ব্যবহার করে।

1
@ এসকে-যুক্তি আপনি গতিশীলভাবে কোড তৈরি করতে এবং এটি কার্যকর করতে পারেন, তবে সেই কোডটিও বর্ণিতভাবে বাদ যায়। পাইথন প্রোগ্রামে প্রতিটি একক ভেরিয়েবলের জন্য, কেবলমাত্র এএসটি পরীক্ষা করে কোনও ভেরিয়েবল কোন স্কোপের সাথে সম্পর্কিত তা আপনি সহজেই নির্ধারণ করতে পারেন। আপনি হয়ত execবক্তব্যটি ভাবছেন যা 3.0.০ এর পরে চলে গেছে এবং সেহেতু আমার বিবেচনার বাইরে (এবং সম্ভবত গাইডোর বক্তব্য , যেহেতু আলোচনাটি ২০১২ সাল থেকে)। আপনি একটি উদাহরণ দিতে পারেন? এবং আপনার "ডায়নামিক স্কোপিং" এর সংজ্ঞা, যদি এটি [খনি থেকে পৃথক] হয় (এন.ইউইউইকিপিডিয়া.আর / উইকি / ডায়নামিক_স্কোপিং)।

1
@ এসকে-যুক্তি কেবলমাত্র আমার জন্য একটি বাস্তবায়নের বিশদ যা কেবলমাত্র locals()কলগুলিতে অবিচ্ছিন্ন থাকার মান ফেরত পরিবর্তন locals। যা ডকুমেন্টেড এবং অবশ্যই প্রয়োগের বিশদ নয় তা হ'ল এমন একটি পরিবর্তনও localsবা globalsপরিবর্তন করতে পারবেন যা প্রতিটি ভেরিয়েবলের সন্ধান করা হয় a ভেরিয়েবলের প্রতিটি একক ব্যবহারের জন্য, যে ক্ষেত্রকে উল্লেখ করা হয়েছে তা স্থিরভাবে নির্ধারিত। যা এটিকে সিদ্ধান্তে অবিচ্ছিন্নভাবে স্কোপযুক্ত করে তোলে। (এবং বিটিডব্লিউ, evalএবং execঅবশ্যই প্রয়োগের বিবরণগুলি নয় - আমার উত্তরটি দেখুন!)

উত্তর:


16

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

পাইথনের 90% (ব্যর্থ মাপদণ্ড 1) বাস্তবায়ন করা এবং এটিতে ধারাবাহিকভাবে দ্রুত হওয়া সহজ। একইভাবে, স্ট্যাটিক টাইপিং (ব্যর্থ মানদণ্ড 2) এর সাথে একটি দ্রুত পাইথন বৈকল্পিক তৈরি করা সহজ) ১০০% বাস্তবায়ন করাও সহজ (অসম্ভব জটিল ভাষা প্রয়োগের ক্ষেত্রে ইনফার) তবে এখন পর্যন্ত এটি কার্যকর করার প্রতিটি সহজ উপায় তুলনামূলকভাবে ধীর হয়ে যায় (ব্যর্থতার মানদণ্ড 3)।

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

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

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

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


4

সবচেয়ে কঠিন সমস্যাটি হ'ল কোনও নির্দিষ্ট সময়ে কি ধরণের জিনিস রয়েছে তা নির্ধারণ করা।

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

পাইথনে, এটি হতে পারে। এটি ভয়ঙ্কর পাইথন, তবে আইনী:

i = 2
x = 3 + i

def prn(s):
    print(s)

i = prn
i(x)

এখন, এই উদাহরণটি বেশ বোকা, তবে এটি সাধারণ ধারণাটি চিত্রিত করে।

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

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

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


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

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

0

অন্য উত্তরটি যেমন বলেছে, মূল সমস্যাটি হ'ল ধরণের তথ্য বের করা। আপনি যে পরিমাণটি স্থিতিশীলভাবে করতে পারেন, আপনি সরাসরি ভাল কোড তৈরি করতে পারবেন।

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

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