প্রোগ্রামিং ভাষার চেয়ে অ্যালগরিদম কি আরও গুরুত্বপূর্ণ?


35

বর্তমান (২০১৩) গুগল কোড জ্যাম প্রতিযোগিতার সময়, পাইথনের লোকের তুলনায় সি ++ এবং জাভা লোকদের 200+ লাইন কোড নিয়েছে এমন একটি সমস্যা ছিল যা কেবলমাত্র 40 লাইনের কোড ব্যবহার করে একই সমস্যা সমাধান করেছিল।

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

ভাষার পছন্দের তুলনায় সঠিক অ্যালগরিদম জানা কতটা গুরুত্বপূর্ণ? সি -+ বা জাভাতে আরও কার্যকরভাবে প্রয়োগ করা পাইথন প্রোগ্রামটি আরও ভাল উপায়ে প্রয়োগ করা যেতে পারে (একই অ্যালগরিদম ব্যবহার করে) এবং এর সাথে কিছু প্রোগ্রামিং ভাষার প্রাকৃতিক ভার্বোসটির কোনও সম্পর্ক আছে কি?


16
এটি বলা হয়েছে (এবং আমি এটি বিশ্বাস করি) আপনি যে প্রোগ্রামিং ল্যাঙ্গুয়েজে কাজ করেন তার কোনও সমস্যা সম্পর্কে আপনি কীভাবে ভাবেন তার প্রভাব ফেলে। এটি বোঝায় যে খুব আলাদা প্রোগ্রামিং ভাষা বিভিন্ন শ্রেণীর সমস্যার জন্য উপযুক্ত হতে পারে।
জরিস টিমারম্যানস

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

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

5
@ ট্র্যাভিস: "ভাষা নির্বিশেষে এসএলওসি হারের প্রতি ত্রুটি স্থির থাকে" যদিও এটি সত্য নয়। জন এর উত্তর দেখুন।
বেন ভয়েগট

এখন আপনি আমাকে ভাষা হিসাবে F # ব্যবহার করে পরবর্তী প্রতিযোগিতায় প্রবেশের কথা ভাবছেন!
কোড

উত্তর:


73

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

প্রাত্যহিক জীবনে, প্রায় এক মিলিয়ন অন্যান্য বিষয়গুলিকেও বিবেচনা করতে হবে, যা প্রশ্নটিকে কালো বনাম সাদা তুলনায় অনেক কম করে তোলে।

কেবলমাত্র একটি পাল্টা উদাহরণ: আপনার যদি জাভাতে আরও 200 টি লাইন প্রয়োজন তবে আপনার সংস্থার প্রত্যেকে জাভা জানেন, এটি কোনও বড় বিষয় নয়। আপনি যদি পাইথন বা অন্য কোনও ভাষার 5 টি লাইনে এটি লিখতে পারতেন, তবে আপনি সেই সংস্থার একমাত্র সেই ভাষাটি জানতেন - এটি একটি বড় বিষয়। আসলে এত বড় চুক্তি, আপনাকে এমনকি এটি করার অনুমতি দেওয়া হবে না এবং তার পরিবর্তে এটি জাভাতে লিখতে হবে।

একজন ক্র্যাফটম্যানের দৃষ্টিকোণ থেকে, আমরা সবসময় কাজের জন্য সঠিক সরঞ্জামের সাথে যোগাযোগ করার চেষ্টা করি, তবে ডানদিকে শব্দটি এতই জটিল যে এটি সহজেই ভুল হয়ে যেতে পারে।

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

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

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


1
"মিলিয়ন অন্যান্য বিষয় বিবেচনা করতে হবে" এর জন্য + 1
ওজ

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

6
শেষ বাক্যটির জন্য +1।
শিবান ড্রাগন

4
কোডের লাইনগুলি নিজেই একটি ভয়ঙ্কর মেট্রিক। আমাদের রক্ষণাবেক্ষণের পরিমাপ করা দরকার , কোডের লাইন নয়। টাইপ-সেফ কোডের 200 লাইন পাইথনের 50 লাইনের চেয়ে অনেক বেশি রক্ষণাবেক্ষণযোগ্য হতে পারে।
ফিল

2
@ ফিল: এবং পাইথনের 200 লাইন সম্ভাব্যভাবে টাইপ-সেফ কোডের 50 টি লাইনের চেয়ে অনেক বেশি রক্ষণাবেক্ষণযোগ্য হতে পারে। ভাল-লিখিত কোড ধরে ধরে, টাইপ-নিরাপদ ভাষাগুলিতে আমি এত স্পষ্টতা সুবিধাটি কখনই দেখিনি।
ডেভিড থর্নলি

17

আমি যুক্তি দিয়ে বলব যে প্রতিযোগিতার বাইরেও অ্যালগরিদমিক চিন্তাভাবনা নির্দিষ্ট ভাষার জন্য প্রতিটি কৌশলকে জানার চেয়ে গুরুত্বপূর্ণ।

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

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

আমি স্বীকার করি যে উদাহরণগুলি সরল, তবে তারা পয়েন্টটি জুড়ে আনতে সহায়তা করে।


14

ভাষার বিষয়।

DARPA এবং মার্কিন নৌবাহিনী প্রায় 20 বছর আগে একটি শ্যুটআউট পরীক্ষা করেছিল। অন্ধকার ঘোড়া পলাতক বিজয়ী ছিল হাস্কেল। অ্যাডা এবং সি ++ উভয়ই উপস্থাপিত হয়েছিল; জাভা ছিল না।

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

আটারি ভিডিওগেমগুলি বিকাশের জন্য ফোরথ ব্যবহার করতেন এবং তারা যে ফোর্থ ব্যবহার করছিলেন তা অত্যন্ত স্বত্বাধিকারী হিসাবে বিবেচিত হত।

এলআইএসপি ব্যবহারের বিষয়ে পল গ্রাহামের মন্তব্য সুপরিচিত। জেপিএল-তে এলআইএসপি-র বিষয়ে ইরান গটের মন্তব্য সমান তাত্পর্যপূর্ণ, যদিও ততটা সুপরিচিত নয়।

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

ভাষার বিষয়।


স্পষ্টতই, জাভাটি সেই পরীক্ষার পরে মুক্তি পেয়েছিল যা আপনি লিঙ্ক করছেন।
toasted_flakes

নিবন্ধটি 1994 সালে প্রকাশিত হয়েছিল। জাভা প্রথম প্রকাশিত হয়েছিল 1995.
আলেসান্দ্রো তেরুজি

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

7

কিছু বিষয়:

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

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

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

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

  • ফ্র্যাঙ্ক একটি ভাল পয়েন্ট দেয় - (প্রোগ্রামিং প্রতিযোগিতার বাইরে) আপনার কোম্পানির জন্য পাইথনের কোডিং সম্পর্কে আপনি যেতে পারবেন না যদি তাদের পুরো কোড বেস সি হয় বা যাই হোক না কেন, আপনাকে তাদের ভাষার সাথে মানিয়ে নিতে হবে।

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


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

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

একমত নন যে "সরল সংখ্যক লাইন এত বড় জিনিস নয়।" কোড শত্রু
jk।

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

5

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

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

তবে প্রতিযোগিতাগুলি বাদ দিলে, যদি আমরা বাস্তব জীবনের বড় প্রকল্পগুলির কথা বলি, তবে এটি আর 40 লাইনে বনাম 200 লাইন নয়। বড় প্রকল্পগুলিতে এটি বিশাল কোড বেসটি সমস্যা হতে শুরু করে। কোন মুহুর্তে আপনি এখানে যাবেন:

সি ++ বনাম পাইথন?

এখানে চিত্র বর্ণনা লিখুন

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


আপনি যা লিখছেন তা কেবল পৃষ্ঠকে স্ক্র্যাপ করে। আপনি 'আরও ভাল' একটি ধারণা ধরে নিচ্ছেন যা সবাই ভাগ করে না। কোয়ালিটি সর্বদা নিজের লক্ষ্যের জন্য উপযুক্ততার বিষয়। সি ++ এ প্রোগ্রামিং প্রতিটি লক্ষ্যের জন্য সর্বদা ভাল ফিট নয়।
রিনিয়ারপোস্ট

1
@ রিনিয়ারপোস্ট: এজন্য আমি উল্লেখযোগ্যভাবে উচ্চতর প্রচেষ্টা সম্পর্কে লিখেছি। ক্ষেত্রে আপনি উল্লেখ করেছেন যে C ++ ভাল ফিট না, তবে এটি করা যায় না বলে নয়। এটি ভাল ফিট নয়, কারণ এটি অনেক বেশি বিকাশকারী সংস্থান গ্রহণ করবে।
12

আর কি, এটি সেক্ষেত্রে আরও ভাল নয়।
রিনিয়ারপোস্ট

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

4

আমার মতে লোকেরা কথোপকথনে একটি "প্রোগ্রামিং ভাষা" বিবেচনা করে সেগুলি আসলে তিনটি পৃথক জিনিস:

  1. ভাষার ধরণ এবং বাক্য গঠন
  2. ভাষা আইডিই
  3. একটি ভাষার জন্য উপলব্ধ গ্রন্থাগার

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

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

int n, h, w;
cin >> n >> h >> w;

সি # তে থাকা অবস্থায় এটির মতো দেখতে হবে:

int n, h, w;
string[] tokens = Console.ReadLine().Split(' ');
n = int.Parse(tokens[0]);
h = int.Parse(tokens[1]);
w = int.Parse(tokens[2]);

এটি একটি সাধারণ কার্যকারিতার জন্য অনেক বেশি মানসিক ওভারহেড। মাল্টিলাইন ইনপুট সহ সি # তে জিনিসগুলি আরও জটিল হয়ে ওঠে। হয়তো আমি তখন আর ভাল উপায় খুঁজে না। যাইহোক, আমি প্রথম রাউন্ডটি পাস করতে ব্যর্থ হয়েছি কারণ আমার একটি বাগ ছিল যা রাউন্ড শেষ হওয়ার আগে আমি সংশোধন করতে পারিনি। হাস্যকরভাবে ইনপুট রিডিং পদ্ধতিটি বাগটিকে অবিচ্ছিন্ন করেছে। সমস্যাটি সহজ ছিল, ইনপুটটিতে এমন একটি সংখ্যা রয়েছে যা 32 বিট পূর্ণসংখ্যার জন্য খুব বড়। সি # তে int.Parse(string)একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে তবে সি ++ এ ফাইল ইনপুট স্ট্রিমটি একটি নির্দিষ্ট ত্রুটি পতাকা নির্ধারণ করবে এবং নিঃশব্দে অসম্পর্কিত বিকাশকারীকে কোনও সমস্যা সম্পর্কে অজানা করতে ব্যর্থ হবে।

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

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


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

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

আমি স্টিডিনের কাছ থেকে শেষ বার পড়ার কথা মনে করতে পারি না। আমাকে একটি ফাইল দিন যা আমি জেএসএন পার্সারে আটকে রাখতে পারি।
gnasher729

2

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

Integer prev = b.get(k)
if (prev == null) prev = 0
Integer v = a.get(k);
if (v == null) v = 0;
b.put(prev + v);

পরিবর্তে

b[k] += a[k]

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

বিশেষ দ্রষ্টব্য

কোডের 200 লাইনের এবং কোডের 40 লাইনের মধ্যে পার্থক্য বিশাল এবং এটি 200,000 লাইনের প্রোগ্রাম এবং একটি 40,000 লাইন প্রোগ্রামের মধ্যে পার্থক্য থাকা সত্ত্বেও আরও বড়। তারপরে এটি পাঁচটি প্লাস ম্যানেজার এবং একটি বা দু'জনের একটি দলের মধ্যে পার্থক্য।


3
(ক) আমি জানি যে প্রোগ্রামিং প্রতিযোগিতায় সি / সি ++ / জাভা শীর্ষস্থানীয় থাকে। (খ) সি / সি ++ অনেকের দ্বারা "সর্বাধিক শক্তিশালী ভাষা" হিসাবে বিবেচনা করা হয় (অবশ্যই পার্ল / রুবি / পাইথনের উপরে)। (গ) অপারেটর ওভারলোডিংয়ের কারণে, সি ++ কোডটি আপনার দ্বিতীয় উদাহরণের সাথে প্রায় একই রকম দেখতে পারে। (ঘ) এ জাতীয় ব্যাপক চেকিং (জাভাতে, এটি কি?) কেবল তখনই প্রয়োজন হয়: (1) আপনি কী করছেন তা আপনার কোনও ধারণা নেই। (২) তথ্যের প্রকৃতি এমন যে এটি প্রয়োজনীয় (কোডিং প্রতিযোগিতায় ঘটে না)। (3) আপনি অন্য ব্যক্তির দ্বারা ব্যবহার করার জন্য কোড লিখন করছেন (প্রযোজ্য নয়)।
ডিউক্লিং

1
@ ডুকলিং: এই সমীক্ষা অনুসারে (পৃষ্ঠা. mi.fu-berlin.de/prechett/Biblio/jccpprtTR.pdf ) স্ক্রিপ্টিং ভাষাগুলি দ্রুত বিকাশ এবং ছোট উত্স কোডের অনুমতি দেয়। অন্য একটি সমীক্ষা অনুসারে ( flownet.com/gat/papers/lisp-java.pdf ), লিস্প স্ক্রিপ্টিং ভাষার চেয়ে আরও বেশি উত্পাদনশীলতার প্রস্তাব দেয়। উপরোক্ত উদ্ধৃত দ্বিতীয় সমীক্ষা অনুসারে, লিস্প কোডটি সি ++ কোডের মতো প্রায় দ্রুত হতে দেখা গেছে, যদিও এটি লিখতে কম সময় লাগে।
জর্জিও

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

@ জর্জিও আমি বিকাশের সময় বা উত্স কোডের আকার সম্পর্কে তর্ক করছি না , উল্লেখযোগ্য অভিজ্ঞতার ভিত্তিতে প্রোগ্রামিং প্রতিযোগিতায় আসলে কী ঘটে
ডিউক্লিং

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

2

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

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


2

"40 এলওসি বনাম 200 এলওসি" উদাহরণটি বর্জন করার সময়, "ভাল, মোট এলওসির মাত্র পঞ্চমাংশই লেখার জন্য স্পষ্টতই দ্রুততর তাই এটি আরও ভাল হতে পারে" প্ররোচিত মনে হতে পারে, আমি সত্যিই মনে করি সেখানে খুব কম সত্য খুঁজে পাওয়া যায়।

সবচেয়ে কম এলওসি-র জন্য অনুকূলিতকরণ আমার মতে প্রায় কখনও ভাল ধারণা নয়। হ্যাঁ, প্রতিটি এলওসি লিখিত ত্রুটিগুলির জন্য একটি সম্ভাব্য, এবং আপনি কখনই এসটেক লিখেছেন তা কখনও ডিবাগ করতে হবে না। মুল বক্তব্যটি হ'ল পঠনযোগ্যতা এবং ডিকোপ্লেডনেসের জন্য অনুকূলিতকরণ। আপনি 1k এলওসি-র একটি মডিউল লেখার বিপরীতে 20 লাইন বিগ রেজেক্স ব্যবহার করে কোনও সমস্যা সমাধান করেছেন কিনা তা বিবেচ্য নয়। রেজেক্সটি একটি অস্বচ্ছ ওয়াল হবে, বাগের চূড়ান্ত ঝুঁকিপূর্ণ, বোঝা শক্ত, নাইটমারিশকে অযৌক্তিক উপায়ে এর আচরণ পরিবর্তন না করে পরিবর্তন করতে হবে ইত্যাদি etc.

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

একটি খুব তাত্পর্যপূর্ণ তুলনা: আমার পরিবর্তে টেস্ট-কভারড ডিকোপলড সি # কোডের 100k এলওসি থাকতে হবে, "ওভারকিল" স্ট্যাটেজেজি প্যাটার্ন, ফ্যাক্টরি ইত্যাদিতে ভরাট নয় বরং 20k পাইথন অ্যাপের পরিবর্তে কেবল "জিনিস শেষ হয়ে যায়"। 5 গুণ বেশি কোড বা না, আর্কিটেকচারটি প্রতিদিন জিততে থাকে।

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

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