সি কে সংকলন / ব্যাখ্যা / জেআইটি করা থেকে বাধা দেয় কী?


9

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

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


আপনার প্রশ্নের ইতিমধ্যে এখানে খুব ভাল উত্তর রয়েছে: স্ট্যাকওভারফ্লো.com
ডক ব্রাউন

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

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

2
আমি এই বিটটি নিয়ে বিস্মিত হই: "কি সি সঙ্কলন করা থেকে থামায় / [...]"। আহ, কিছুই না?
আন্দ্রেস এফ।

1
সি সংকলকগুলি আজকাল বেশ তাত্পর্যপূর্ণ তাই সম্ভবত "মাইপ্রোগ.সি করুন; মাইপ্রোগ" সম্ভবত বেশিরভাগ দোভাষীর চেয়ে দ্রুত চলবে।
জেমস অ্যান্ডারসন

উত্তর:


18

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

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

সি এর ব্যাখ্যা বা জিট করা থেকে বাধা দেয় কী? কিছুই নেই। তবে এটি সি এর রেইসন ডি'ত্রে নয়।


6

প্রথমত, এটি লক্ষণীয় যে সান এর জেভিএম সি লেখা হয়েছিল সি যখন খুব বহুল প্রচারিত ভাষা হয় তখন বহনযোগ্যতার প্রয়োজন হয়।

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

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

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

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


5

তুমি বলেছিলে:

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

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

উদাহরণস্বরূপ, জাভাতে দুটি ধরণের "ইন্ট" (স্বাক্ষরিত 32 বিট পূর্ণসংখ্যা) এবং "দীর্ঘ" (স্বাক্ষরিত 64 বিট পূর্ণসংখ্যার) রয়েছে। সি এবং সি ++ এর "ইনট" (কমপক্ষে 16 বিট স্বাক্ষরিত), "লং" (কমপক্ষে 32 বিট স্বাক্ষরিত) এবং "দীর্ঘ দীর্ঘ" (স্বাক্ষরিত হয়েছে কমপক্ষে bit৪ বিট) have এটি কারণ সি অনেকগুলি বিভিন্ন প্রসেসরের উপর চালানোর কথা বলে এবং তাদের আলাদা আচরণ করতে দেয়।

সি এই ধরণের জন্য নির্দিষ্ট আকারের সংজ্ঞা দিতে পারত। যদি এটি থাকে, তবে 36 বিট প্রসেসরগুলি সি ভাষা প্রয়োগ করতে পারত না। এবং তারা সত্যিই জাভা বাস্তবায়ন করতে পারবেন না! সুতরাং সি বিভিন্ন কম্পিউটারের সাথে বিভিন্ন ভাষাতে কাজ করতে দেয়। এটি অনিবার্য যে এটি পোর্টেবল নয় এমন কোড তৈরির অনুমতি দেয়। এটি ভাষার বিষয়।


৩x-বিট মেশিনে ৩২-বিট গাণিতিক অনুকরণ করা সম্ভব এবং 0xFFFFFFFF এর সাথে প্রতিটি অপারেশনের ফলাফলকে 32-বিট হিসাবে ছাঁটাই করা সম্ভব। সুতরাং, এই মেশিনগুলি জাভা প্রয়োগ করতে পারে , এটি জাভা নন-ভিত্তিক প্রকারের অনুমতি দেওয়ার চেয়ে ধীর হবে।
dan04

4

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

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


7
সি অত্যন্ত পোর্টেবল। আপনাকে কেবল লক্ষ্য প্ল্যাটফর্মে পুনরায় সংকলন করতে হবে, এবং নির্দিষ্ট কয়েকটি এবং ইচ্ছাকৃতভাবে পোর্টেবল নয় এমন কয়েকটি বিট এড়ানো উচিত।
রবার্ট হার্ভে

5
@ রবার্টহারভে: ... বিভিন্ন আদিম আকারের মতো মৌলিক বিষয়গুলি ? ;)
ম্যাসন হুইলারের

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

3
@ রবার্টহারভে: আমি বলব সি পোর্টেবল প্রোগ্রামগুলি লেখার পক্ষে সম্ভব করে তোলে, তবে এটি অন্তর্নিহিতভাবে সহজ করে না।
ডক ব্রাউন

2
@ রবার্টহারভে: আপনি কি ধর্মীয় যুদ্ধ শুরু করতে চান? ;-) আমার প্রিয় পোর্টেবল ভাষা পাইথন।
ডক ব্রাউন

3

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

এগুলি সাধারণ নয়, কারণ সর্বোপরি, আপনি যদি একটি ছোট, দ্রুত এবং স্থির সম্পাদনযোগ্য না পান তবে আপনি সমস্ত সি আইডিয়াসিনক্রিজিকে কেন ভোগ করবেন?


3

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

সিটি ভার্চুয়াল মেশিনে সংকলিত না হওয়ার প্রযুক্তিগত কারণটি হ'ল কোনও আদর্শ ভার্চুয়াল সি মেশিন নেই।

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


1

আসলে, এটি করা হয়েছে। এখানে বড় বড় সংকলক রয়েছে যা এলএলভিএম-এর সংকলন সমর্থন করে (আমি জানি ঝনঝনির কাজটি করে, এবং আমি বিশ্বাস করি জিসিসিও এটি করে)। যে এলএলভিএমটি জেআইটি'র মতো হতে পারে জাভা কোডটি বাইটকোডে সংকলিত হয় যা জেআইটি'র হয়।

যাইহোক, সি এর তুলনায় যা জাভাটিকে "ক্রস প্ল্যাটফর্ম" করে তোলে তা হ'ল জাভাতে একটি বড় রানটাইম লাইব্রেরি রয়েছে যা অনেক প্ল্যাটফর্মে পোর্ট করা হয়েছে। সি স্পষ্টতই এই দৃষ্টান্ত অনুসরণ করে না।


POSIX সহ সি যথেষ্ট পোর্টেবল হতে পারে (যে কোনও POSIX সিস্টেমে), আপনি যত্নের সাথে কোড দিলে।
বেসিল স্টারিনকিভিচ

0

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

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


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

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