নিজের ভাষাটি প্রথমে সি কোডে সংকলন করার অর্থ কী?


34

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



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

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

1
সি কোড উত্পন্ন করে বেশ কয়েকটি ফ্রি সফটওয়্যার বাস্তবায়ন দেখুন। এবং আমি আশা করি আপনি আপনার ভাষা বাস্তবায়ন বিনামূল্যে সফ্টওয়্যার বানাবেন।
বেসাইল স্টারিনকিভিচ

2
এখানে @ রবার্ট হার্ভির মন্তব্য থেকে আপডেট হওয়া লিঙ্কটি রয়েছে: yosefk.com/blog/c-as-an-interedia-language.html
খ্রিস্টান ডিন

উত্তর:


52

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

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

আরেকটি বিষয় হ'ল আবর্জনা সংগ্রহ । বেশ কয়েকটি বাস্তবায়ন কেবল বোহম রক্ষণশীল আবর্জনা সংগ্রহকারী (যা সি বান্ধব ...) ব্যবহার করে। আপনি যদি আবর্জনা কোড সংগ্রহ করতে চেয়েছিলেন (যেমন বেশ কয়েকটি লিস্প বাস্তবায়ন যেমন, এসবিসিএল) যা দুঃস্বপ্ন হতে পারে (আপনি dlcloseপজিক্সে যেতে চান )।

তবুও আরেকটি সমস্যা প্রথম শ্রেণির ধারাবাহিকতা এবং কল / সিসি নিয়ে কাজ করছে । তবে চতুর কৌশলগুলি সম্ভব (চিকেন স্কিমের ভিতরে দেখুন)। কল-স্ট্যাক অ্যাক্সেস করতে প্রচুর কৌশল অবলম্বন করতে পারে (তবে জিএনইউ ব্যাকট্র্যাস ইত্যাদি দেখুন))। ধারাবাহিকতার অ र्थোগোনাল অধ্যবসায় (যেমন স্ট্যাক বা থ্রেড) সিটিতে কঠিন হবে would

ব্যতিক্রম হ্যান্ডলিং প্রায়শই লংজ্যাম্প ইত্যাদিতে চালাক কল নির্গত করার বিষয় ...

আপনি যথাযথ #lineদিকনির্দেশনা (আপনার নির্গত সি কোডে) উত্পন্ন করতে চাইতে পারেন । এটি বিরক্তিকর এবং প্রচুর gdbপরিশ্রম লাগে (আপনি এটি চাইবেন উদাহরণস্বরূপ আরও সহজে- ডিবেজযোগ্য কোড তৈরি করা)।

আমার মেল্ট লিসি ডোমেন নির্দিষ্ট ভাষা (কাস্টমাইজ করতে বা জিসিসি প্রসারিত করতে) সিতে অনুবাদ করা হয়েছে (আসলে দরিদ্র সি ++ তে এখন)। এটির নিজস্ব প্রজন্মের অনুলিপি আবর্জনা সংগ্রহকারী রয়েছে। (আপনি দ্বারা আগ্রহী হতে পারে Qish বা Ravenbrook এমপিদের )। প্রকৃতপক্ষে, হাতে লিখিত সি কোডের চেয়ে মেশিন উত্পন্ন সি কোডে প্রজন্মের জিসি সহজ (

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

আজ মজার বিষয়টি হ'ল (বর্তমান লিনাক্স ডেস্কটপগুলিতে) সি সংকলকগুলি সি তে অনুবাদ করা একটি ইন্টারেক্টিভ শীর্ষ স্তরের রিড-ইভাল-প্রিন্ট-লুপটি প্রয়োগ করতে যথেষ্ট দ্রুত হতে পারে : আপনি প্রতিটি ব্যবহারকারীর সি সি (কয়েকশ লাইন) নির্গত করবেন you'll মিথস্ক্রিয়া, আপনি forkএটি একটি ভাগ করা অবজেক্টে এর একটি সংকলন, যা আপনি তারপর করতে হবে dlopen। (মেল্ট এটি প্রস্তুত যা সমস্ত প্রস্তুত, এবং এটি সাধারণত যথেষ্ট দ্রুত হয়)। এগুলি হতে পারে এক সেকেন্ডের কয়েক দশমাংশ এবং শেষ ব্যবহারকারীদের দ্বারা গ্রহণযোগ্য হতে পারে।

সম্ভব হলে, আমি সি অনুবাদ করব, বিশেষত সি ++ তে নয়, কারণ সি ++ সংকলন ধীর।

আপনি আপনার ভাষা বাস্তবায়ন হয়, আপনি এছাড়াও (গ কোড emitting পরিবর্তে) কিছু বিবেচনা করতে পারেন জে আই টি JIT মত লাইব্রেরি libjit , গনুহ বাজ , asmjit , অথবা এমনকি LLVM বা GCCJIT । আপনি যদি সি অনুবাদ করতে চান, আপনি কখনও কখনও tinycc ব্যবহার করতে পারেন : এটি খুব শীঘ্রই উত্পাদিত সি কোড (এমনকি মেমরিতেও ) মেশিন কোডটি ধীর করতে সংকলন করে । তবে সাধারণভাবে আপনি জিসিসির মতো বাস্তব সি সংকলক দ্বারা করা অপ্টিমাইজেশনের সুবিধা নিতে চান

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

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

যদি সি ভাষায় অনুবাদ করার জন্য কোনও ভাষা নকশা তৈরি করে থাকেন তবে আপনার ভাষার সাথে সি এর মিশ্রণ তৈরি করতে আপনি সম্ভবত কয়েকটি কৌশল (বা নির্মাণ) করতে চান। আমার ডিএসএল ২০১১১ এর কাগজ মেল্ট: জিসিসি সংকলকটিতে এম্বেড করা একটি অনুবাদকৃত ডোমেন নির্দিষ্ট ভাষা আপনাকে কার্যকর ইঙ্গিত দেবে।


আপনি কি "চিকেন স্কিম" উল্লেখ করছেন?
রবার্ট হার্ভে

1
হ্যাঁ.আমি ইউআরএল দিয়েছি।
বেসাইল স্টারিনকিভিচ

জাভা বা কোনও কিছুর মতো ভার্চুয়াল মেশিনটি কি সি-তে বাইকোড সংকলন করা, তারপরে জেআইটি সংকলনের জন্য জিসিসি ব্যবহার করা কি অপেক্ষাকৃত বাস্তব? অথবা তাদের কেবল বাইটোকড থেকে অ্যাসেমব্লিতে যেতে হবে?
Panzercrisis

1
@ পাঞ্জেরিসিসিস বেশিরভাগ জেআইটি সংকলককে কোনও ফাংশন প্রতিস্থাপন এবং বিদ্যমান কোডটিকে জাম্প / ট্র্যাপের দরজা দিয়ে প্যাচ করা ইত্যাদির মতো সমর্থন করার জন্য তাদের মেশিন কোড ব্যাকেন্ডের প্রয়োজন। এ ছাড়া জিসিসি বিশেষত ... জেআইটি সংকলন এবং অন্যান্য ব্যবহারের ক্ষেত্রে স্থাপত্যগতভাবে কম উপযুক্ত ly যদিও libgccjit দেখুন: gcc.gnu.org/ML/gcc-patches/2013-10/msg00228.html এবং gcc.gnu.org/wiki/JIT

1
দুর্দান্ত অভিমুখী উপাদান material ধন্যবাদ!
ক্যাপচার

7

পূর্ণ মেশিন কোড উত্পন্ন করার সময় যখন সি "সংকলকটি ব্যবহার করে আপনার" আইএল "মেশিন কোডে সংকলনের মধ্যবর্তী পদক্ষেপের অসুবিধা ছাড়িয়ে যায় তখন তা বোঝা যায়।

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

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


লাইব্রেরিগুলির মতো মনে হয় এটিও বিবেচনা করার জন্য বেশ বাধ্যযোগ্য কারণ।
কেসি 16

আপনি যখন "আপনার 'আইএল' বলছেন, আপনি কী উল্লেখ করছেন? একটি বিমূর্ত সিনট্যাক্স গাছ?
রবার্ট হার্ভে

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

2

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

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

uint32_t dat = *(__packed uint32_t*)p;
return (dat >> 24) | (dat >> 8) | ((uint32_t)dat << 8) | ((uint32_t)dat << 24));

এবং সংকলকটি একটি বিপরীত-বাইটস-ইন-শব্দ নির্দেশের পরে একটি শব্দ-লোড ক্রিয়াকলাপ তৈরি করুন। কিছু সংকলক অবশ্য __ প্যাকযুক্ত সংশোধকটিকে সমর্থন করবে না এবং এর অনুপস্থিতিতে এমন কোড তৈরি করবে যা কাজ করবে না।

বিকল্পভাবে, কেউ কোডটি লিখতে পারে:

return dat[3] | ((uint16_t)dat[2] << 8) | ((uint32_t)dat[1] << 16) | ((uint32_t)dat[0] << 24);

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

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

uint32_t result = 1u*x*y;

এটি ছাড়াই 1u, একটি সিস্টেমে INT_BITS যেখানে 33 থেকে 64 অবধি রয়েছে তার x এবং y এর পণ্যটি 2,147,483,647 এর চেয়ে বড় হয় এবং কিছু সংকলক এই জাতীয় সুযোগের সদ্ব্যবহার করার ঝুঁকির সাথে বৈধভাবে যা কিছু করতে চায় তা করতে পারে।


1

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

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

আপনার নিজের মেশিন কোড জেনারেটরটি লেখা একটি দুর্দান্ত উল্লেখযোগ্য কাজ যা আপনি সি কোডটি সংকলন করে এড়াতে পারবেন, যদি এটি প্রাথমিকভাবে আগ্রহী না হয়!

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


-7

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

আপনার প্রশ্নে ফিরে আসা যখন আপনি নিজের ভাষা ডিজাইন করার সময় আপনার জন্য আলাদা সংকলক বা দোভাষী করা উচিত কারণ মেশিন উচ্চ স্তরের ভাষা জানে না। আপনার কোডটিকে মেশিনের জন্য দরকারী করতে মেশিন কোডে সংকলন করা উচিত


2
Your code should be compiled into machine code to make it useful for machine- আপনার সংকলক যদি আউটপুট হিসাবে সি কোড তৈরি করে, আপনি মেশিনের কোড তৈরি করতে সি কোডটি এসি সংকলকটিতে রেখে দিতে পারেন, তাই না?
রবার্ট হার্ভে

হ্যাঁ। কারণ মেশিন সি ভাষা করে না
তাইয়ব গুলশার ভোহরা

2
ঠিক। সুতরাং প্রশ্নটি ছিল "সরাসরি মেশিনের ভাষা বা বাইট কোড নির্গমন করার পরিবর্তে সি সি নির্গমন এবং এসি সংকলক ব্যবহার করার অর্থ কী?"
রবার্ট হার্ভে

আসলে তিনি তার প্রোগ্রামিং ল্যাঙ্গুয়েজটি ডিজাইন করতে বলছেন যাতে তিনি "এটিকে সি বা সি ++ কোডে রূপান্তরিত করে" জিজ্ঞাসা করছেন। সুতরাং আমি এটি ব্যাখ্যা করছি যদি আপনি নিজের প্রোগ্রামিং ভাষাটি ডিজাইন করে থাকেন তবে আপনার সি সংকলক বা সি ++ কেন ব্যবহার করা উচিত। আপনি যদি যথেষ্ট বুদ্ধিমান হন তবে আপনার নিজের ডিজাইন করা উচিত
তৈয়ব গুলশার ভোহরা

8
আমি মনে করি না আপনি প্রশ্নটি বুঝতে পেরেছেন। Yosefk.com/blog/c-as-an-interedia-language.html
রবার্ট হার্ভে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.