হাস্কেল (জিএইচসি) এত দ্রুত সাজাতে কেন?


246

হাস্কেল ( GHCসংকলক সহ) আপনার প্রত্যাশার চেয়ে অনেক দ্রুত । সঠিকভাবে ব্যবহৃত হয়েছে, এটি নিম্ন-স্তরের ভাষাগুলির কাছাকাছি যেতে পারে। (হাস্কেল্লারদের একটি পছন্দনীয় কাজ হ'ল চেষ্টা করা এবং 5% সি এর মধ্যে পাওয়া (বা এমনকি এটি বীটও করা হয়েছে, তবে এর অর্থ আপনি একটি অদক্ষ সি প্রোগ্রাম ব্যবহার করছেন, যেহেতু জিএইচসি হাস্কেল সি কে সংকলন করেছে) আমার প্রশ্নটি কেন, কেন?

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

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

দুঃখিত, যদি এটি রেন্টি শব্দ করে চলেছে তবে এখানে আমার প্রশ্ন: হাস্কেল কেন তার বিমূর্ত প্রকৃতি এবং শারীরিক মেশিনের পার্থক্য বিবেচনা করে এত তাড়াতাড়ি (জিএইচসি সংকলিত)?

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


27
"যেহেতু জিএইচসি হ্যাস্কেলকে সি তে সংকলন করেছে" - তা হয় না। জিএইচসির একাধিক ব্যাকেন্ড রয়েছে। সবচেয়ে পুরানো (তবে ডিফল্ট নয়) হ'ল সি জেনারেটর। এটি আইআরের জন্য সিএমএম কোড উত্পন্ন করে তবে এটি "সি সংকলন" নয় যা আপনি সাধারণত আশা করতে চান। ( ডাউনলোডস.হেস্কেল.আর.ইউ.সি.সি.এল.স্ট
ডকস

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

94
কেন? 25 বছরের কঠোর পরিশ্রম।
augustss

31
"যদিও এর সত্যিক উত্তর থাকতে পারে, এটি মতামত চাওয়া ছাড়া কিছুই করবে না।" - এটি কোনও প্রশ্ন বন্ধ করার সবচেয়ে খারাপ সম্ভাব্য কারণ। কারণ এটির একটি ভাল উত্তর থাকতে পারে , তবে এটি সম্ভাব্যভাবে নিম্ন-মানেরগুলিও আকর্ষণ করবে। ইশ! আমার তাই একাডেমিক গবেষণা এবং যখন নির্দিষ্ট কিছু ঘটনা ঘটেছিল সে সম্পর্কে একটি ভাল, historicalতিহাসিক, বাস্তব উত্তর সীমাবদ্ধ থাকে। তবে আমি এটি পোস্ট করতে পারছি না কারণ লোকেরা উদ্বিগ্ন এই প্রশ্নটি নিম্নমানের উত্তরও আকর্ষণ করতে পারে। আবার, ইয়াক
sclv

7
@cimmanon আমি এক মাসে বা একাধিক ব্লগ পোস্ট প্রয়োজন বুনিয়াদি ভিতর দিয়ে হেটে যেতে হবে বিবরণ কিভাবে কার্মিক কম্পাইলার কাজ। স্টক হার্ডওয়্যারে কীভাবে গ্রাফ মেশিনটি পরিষ্কারভাবে প্রয়োগ করা যায় এবং আরও পড়ার জন্য সংশ্লিষ্ট উত্সগুলিতে ইঙ্গিত করা যায় ... তার বিস্তৃত রূপরেখায় স্কেচ দেওয়ার জন্য আমার কেবল এসই উত্তর দরকার ...
স্কেলভি

উত্তর:


264

আমি ডায়েটারিচ এপ্পের সাথে একমত: এটি বেশ কয়েকটি জিনিসের সংমিশ্রণ যা জিএইচসি দ্রুত তৈরি করে।

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

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

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

এটি দেখার আরেকটি উপায় হতে পারে… কেন হাস্কেল দ্রুত হওয়া উচিত নয় ? এটি কী করে যা এটি ধীর করে দেয়?

এটি পার্ল বা জাভাস্ক্রিপ্টের মতো ব্যাখ্যা করা ভাষা নয়। এটি জাভা বা সি # এর মতো ভার্চুয়াল মেশিন সিস্টেমও নয়। এটি নেটিভ মেশিন কোডের নিচে সমস্ত উপায়ে সংকলন করে, তাই ওভারহেড নেই।

ওও ভাষাগুলি [জাভা, সি #, জাভাস্ক্রিপ্ট ...] এর বিপরীতে, হাস্কেলের পুরো টাইপ ক্ষয় রয়েছে [যেমন সি, সি ++, পাস্কাল…]। সমস্ত ধরণের চেকিং কেবল সংকলন সময়ে ঘটে happens সুতরাং আপনাকে চালিয়ে দেওয়ার জন্য রান-টাইম টাইপ-চেকিং নেই। (এই বিষয়টির জন্য কোনও নাল পয়েন্টার চেক নেই In এর মধ্যে, জাভা বলতে, জেভিএম অবশ্যই নাল পয়েন্টারগুলির জন্য পরীক্ষা করতে হবে এবং যদি আপনি কোনওটিকে শ্রদ্ধা করেন তবে ব্যতিক্রম ছুঁড়ে ফেলতে হবে Has হাসেলকে এই চেকটি নিয়ে বিরক্ত করার দরকার নেই))

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

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

আমি মনে করি বিষয়টি হ্যাস্কেলকে উন্নত এবং পরিশীলিত এবং উচ্চ স্তরের দেখায় এবং প্রত্যেকেই মনে করে "ওহ বাহ্, এটি সত্যিই শক্তিশালী, এটি অবশ্যই আশ্চর্যজনকভাবে ধীর হতে হবে! " তবে এটি তা নয়। বা কমপক্ষে, এটি আপনি যেভাবে প্রত্যাশা করবেন তা নয়। হ্যাঁ, এটি একটি আশ্চর্যজনক টাইপ সিস্টেম পেয়েছে। তবে আপনি কি জানেন? যে সমস্ত সংকলন সময়ে ঘটে। রান-টাইমে, এটি চলে গেছে। হ্যাঁ, এটি আপনাকে কোডের একটি লাইন দিয়ে জটিল এডিটিগুলি তৈরি করতে দেয়। তবে আপনি কি জানেন? একটি এডিটি শুধু একটি প্লেইন সাধারণ সি unionএর structগুলি। বেশি না.

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

উদাহরণস্বরূপ, আমি একটি ফাইলের মধ্যে প্রতিটি বাইট কতবার প্রদর্শিত হয় তা গণনা করার জন্য একটি তুচ্ছ ছোট্ট প্রোগ্রাম লিখেছি। একটি 25 কেবি ইনপুট ফাইলের জন্য, প্রোগ্রামটি চালাতে 20 মিনিট সময় নিয়েছিল এবং 6 গিগাবাইট র‍্যাম গিলে ফেলেছে ! এটাই অযৌক্তিক !! তবে আমি বুঝতে পারলাম সমস্যাটি কী, একক ঠাঁই-ধাঁচ যুক্ত করেছে এবং রান- টাইমটি 0.02 সেকেন্ডে নেমে গেছে ।

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

হাস্কেল এত তাড়াতাড়ি কী করে? বিশুদ্ধতা. স্থির প্রকারের। আলস্য। তবে সর্বোপরি, পর্যাপ্ত উচ্চ-স্তরের হয়ে যা সংকলকটি আপনার কোডের প্রত্যাশা ভঙ্গ না করে বাস্তবায়নের আমূল পরিবর্তন করতে পারে।

তবে আমার ধারণা এটি আমার মতামত ...


13
@ সিমমানন আমি মনে করি না এটি নিখুঁত মতামত ভিত্তিক। এটি একটি আকর্ষণীয় প্রশ্ন যা অন্যান্য লোকেরা সম্ভবত উত্তর চেয়েছিলেন। তবে আমি অনুমান করি যে আমরা অন্যান্য ভোটাররা কী ভাবছেন তা আমরা দেখব।
গাণিতিক

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

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

4
@ সিমানম্যান: সম্ভবত এটি হ্যাশেল ব্যবহারকারীরা একমাত্র সম্প্রদায় হিসাবে মনে করছেন যা প্রকৃতপক্ষে মুক্তমনা লোকদের একটি বন্ধুত্বপূর্ণ গোছা ... যা আপনি "কৌতুক" হিসাবে বিবেচনা করছেন ... নিয়ম নাজির কুকুর-খাওয়ার কুকুর সম্প্রদায়ের পরিবর্তে তারা যেই সুযোগ পেয়েছে একে অপরকে নতুন করে ছিটিয়ে দিন ... যা আপনি "সাধারণ" বলে মনে করেন বলে মনে হয়।
Evi1M4chine

14
@ ম্যাথমেটিক্যালআরচিড: আপনার কাছে কি আপনার মূল প্রোগ্রামটির একটি অনুলিপি আছে যা চালাতে 20 মিনিট সময় নিয়েছে? আমি মনে করি এটি এত ধীরে কেন পড়াশুনা করা যথেষ্ট শিক্ষামূলক হবে।
জর্জ

79

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

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

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

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

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

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

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

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


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

@ Evi1M4chine আমি চাহিদা বিশ্লেষক সম্পর্কিত কোনও লিঙ্ক দেখতে পাচ্ছি না, সম্ভবত এটি কোনওভাবে হারিয়ে গেছে। কেউ লিঙ্কটি পুনরুদ্ধার করতে পারেন বা রেফারেন্সটি পরিষ্কার করতে পারেন? এটি বেশ আকর্ষণীয় মনে হচ্ছে।
ক্রিস পি

1
@ ক্রিসিপি আমি বিশ্বাস করি যে শেষ লিঙ্কটি উল্লেখ করা হচ্ছে। এটি জিএইচসি-র চাহিদা বিশ্লেষক সম্পর্কে জিএইচসি উইকির একটি পৃষ্ঠায় যায়।
সার্প সি

@ সার্পেনটাইন কুগার, ক্রিস পি: হ্যাঁ, আমি যা বোঝাতে চাইছিলাম এটি তাই।
Evi1M4chine

19

ঠিক আছে, এখানে মন্তব্য করার অনেক আছে। আমি যতটা পারি উত্তর দেওয়ার চেষ্টা করব।

সঠিকভাবে ব্যবহৃত হয়েছে, এটি নিম্ন-স্তরের ভাষাগুলির কাছাকাছি যেতে পারে।

আমার অভিজ্ঞতা হিসাবে, সাধারণত অনেক ক্ষেত্রে রাস্টের পারফরম্যান্স 2x এর মধ্যে পাওয়া সম্ভব। তবে এমন কিছু (বিস্তৃত) ব্যবহারের ক্ষেত্রেও রয়েছে যেখানে নিম্ন স্তরের ভাষার তুলনায় কর্মক্ষমতা দুর্বল।

বা এমনকি এটি হারাতে পারে, তবে এর অর্থ আপনি একটি অদক্ষ সি প্রোগ্রাম ব্যবহার করছেন, যেহেতু জিএইচসি হ্যাস্কেল সি তে সংকলন করেছে)

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

মোটামুটিভাবে ট্যুরিং মেশিনের উপর ভিত্তি করে মেশিন আর্কিটেকচারগুলি স্পষ্টতই আবশ্যক।

এটি সম্পর্কে চিন্তা করার ভাল উপায় নয়, বিশেষত যেহেতু আধুনিক প্রসেসরগুলি নির্দেশাবলীর বাইরে আদেশ এবং সম্ভবত একই সময়ে নির্দেশনাগুলি মূল্যায়ন করবে।

আসলে, হাস্কেলের একটি নির্দিষ্ট মূল্যায়ন আদেশও নেই order

আসলে, হাস্কেল স্পষ্টভাবে একটি মূল্যায়ন আদেশ সংজ্ঞায়িত করে

এছাড়াও, মেশিনের ডেটা ধরণের সাথে মোকাবেলা করার পরিবর্তে আপনি বরাবর বীজগণিত ডেটা টাইপ তৈরি করেন।

আপনার যথেষ্ট পরিমাণে উন্নত সংকলক রয়েছে তবে এগুলি বেশ কয়েকটি ক্ষেত্রে সাফল্য অর্জন করে।

আপনি ভাবেন যে ফ্লাইতে ফাংশন তৈরি করা এবং এগুলি চারপাশে ছড়িয়ে দেওয়া একটি প্রোগ্রামকে ধীর করে দেবে।

হাস্কেল সংকলিত, এবং তাই উচ্চতর-আদেশ ক্রিয়াকলাপগুলি আসলে ফ্লাইতে তৈরি হয় না।

এটি হাস্কেল কোডটি অপ্টিমাইজ করে বলে মনে হচ্ছে, আরও মেশিনের মতো না করে আপনার এটিকে আরও মার্জিত এবং বিমূর্ত করতে হবে।

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

f x = [x]এবং f = pureউদাহরণস্বরূপ, মধ্যে Haskell সঠিক একই জিনিস। একটি ভাল সংকলক আগের ক্ষেত্রে ভাল পারফরম্যান্স দিতে পারে না।

হাস্কেল তার বিমূর্ত প্রকৃতি এবং শারীরিক মেশিনের পার্থক্য বিবেচনা করে এত তাড়াতাড়ি (জিএইচসি দিয়ে সংকলিত) কেন?

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

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

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


3

হাস্কেল (জিএইচসি) এত দ্রুত সাজাতে কেন?

আমি শেষ পর্যন্ত হাস্কেলের অভিনয় পরিমাপ করেছি বলে কিছু নাটকীয়ভাবে অবশ্যই পরিবর্তন হয়েছে। উদাহরণ স্বরূপ:

তাহলে কি পরিবর্তন হয়েছে? আমি প্রশ্ন বা তার বর্তমান উত্তরগুলির চেয়ে কোনওটিই যাচাইযোগ্য কোনও বেঞ্চমার্ক বা এমনকি কোডকে উল্লেখ করে না।

হাস্কেল্লারদের জন্য পছন্দসই জিনিসটি চেষ্টা করে চেষ্টা করা এবং সেগুলি 5% এর মধ্যে পাওয়া যায়

যাচাইযোগ্য ফলাফলগুলির জন্য আপনার কাছে কি কোনও রেফারেন্স রয়েছে যেখানে এর আগে যে কেউ কোথাও পেয়েছে?


6
কেউ কি আবার তিনবার আয়নার সামনে হ্যারোপের নাম বলেছিল?
চক অ্যাডামস

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

1
আমি কেবল এটি পোস্ট করছি কারণ আজ আমি এটি দেখেছি ক্রিস্পেনার.সিএ / পোস্ট / ডাব্লুসি । এটি হাস্কেলের লিখিত ডব্লিউসি ইউটিলিটির একটি বাস্তবায়ন যা সম্ভবত সংস্করণটি মারবে।
গ্যারিসন

3
@ গ্যারিসন লিঙ্কটির জন্য ধন্যবাদ । ৮০ টি লাইনই আমি বলেছি যে "সি-তে প্রোগ্রামিংয়ের চেয়ে লো-লেভেল প্রোগ্রামিংয়ের স্টাইলটি আলাদা নয়" " । "উচ্চ স্তরের কোড", এটি "বোকা" হবে fmap (length &&& length . words &&& length . lines) readFile। তাহলে যে যতো তাড়াতাড়ি ছিল (অথবা এমনকি তুলনীয় করার জন্য) সি, প্রতারণা এখানে সম্পূর্ণই সমর্থনযোগ্য হবে তারপর । আমাদের এখনও সি হিসাবে যেমন হাস্কেল গতির জন্য কঠোর পরিশ্রম করা প্রয়োজন।
নেস

2
রেডডিট reddit.com/r/programming/comments/dj4if3/… এ আলোচনার মাধ্যমে বিচার করে যে হাস্কেল কোডটি সত্যই বগি (উদাহরণস্বরূপ লাইনগুলিতে বিরতি বা হোয়াইটস্পেসের সাথে শেষ হওয়া, break এ বিরতি) এবং অন্যরা দাবি করা পারফরম্যান্স ফলাফলগুলি পুনরুত্পাদন করতে পারে না।
জন হ্যারোপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.