java - সি প্রোগ্রামিং কোড




নির্দিষ্ট ইউনিকোড অক্ষর সহ মন্তব্যে জাভা কোড কার্যকর করার অনুমতি কেন? (6)

আমি @zwol এর সাথে একমত যে এটি একটি ডিজাইনের ভুল; তবে আমি এর চেয়ে আরও সমালোচিত।

escape \u পলায়ন স্ট্রিং এবং চর অক্ষরে কার্যকর; এবং এটিই একমাত্র জায়গা যেখানে এটির অস্তিত্ব থাকা উচিত। Escap \n মতো অন্যান্য পালানো যেমন একইভাবে পরিচালনা করা উচিত; এবং "\u000A" অর্থ "\u000A" "\n" হওয়া উচিত

মন্তব্যগুলিতে \uxxxx থাকার একেবারেই বিন্দু নেই - কেউ এটি পড়তে পারে না।

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

1995 সালে ডিজাইনারদের তাদের কারণ ছিল, তবে 20 বছর পরে, এটি একটি ভুল পছন্দ বলে মনে হয়।

(পাঠকদের কাছে প্রশ্ন - কেন এই প্রশ্নটি নতুন ভোট পেতে থাকে? এই প্রশ্নটি কোনও জনপ্রিয় স্থান থেকে যুক্ত?)

নিম্নলিখিত কোডটি আউটপুট তৈরি করে "হ্যালো ওয়ার্ল্ড!" (আসলেই না, চেষ্টা করে দেখুন)।

public static void main(String... args) {

   // The comment below is not a typo.
   // \u000d System.out.println("Hello World!");
}

এর কারণ হ'ল জাভা \u000d ইউনিকোড অক্ষরটিকে একটি নতুন লাইন হিসাবে পার্স করে এবং এতে রূপান্তরিত হয়:

public static void main(String... args) {

   // The comment below is not a typo.
   //
   System.out.println("Hello World!");
}

সুতরাং একটি মন্তব্য "মৃত্যুদন্ড কার্যকর" হওয়ার ফলস্বরূপ।

যেহেতু এটি দূষিত কোড "লুকানোর" জন্য ব্যবহার করা যেতে পারে বা কোনও অশুভ প্রোগ্রামার যা ধারণা করতে পারে তাই মন্তব্যে কেন এটি অনুমোদিত ?

কেন জাভা স্পেসিফিকেশন দ্বারা অনুমোদিত?


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

জাভা উত্স কোড \ u000d একটি ASCII সিআর চরিত্রের প্রতিটি উপায়ে সমান। এটি যেখানেই ঘটে সেখানে লাইন সমাপ্ত, সরল এবং সরল। প্রশ্নের বিন্যাসটি বিভ্রান্তিমূলক, অক্ষরের সেই ক্রমটি আসলে সিন্টেক্সিকভাবে কীসের সাথে মিলে যায়:

public static void main(String... args) {
   // The comment below is no typo. 
   // 
 System.out.println("Hello World!");
}

আইএমএইচও সবচেয়ে সঠিক উত্তর তাই: কোডটি কার্যকর করে কারণ এটি একটি মন্তব্যে নেই; এটা পরের লাইনে জাভাতে "মন্তব্যে কোড কার্যকর করা" অনুমোদিত নয়, যেমনটি আপনি আশা করেছিলেন।

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


এটি ছিল ইচ্ছাকৃত ডিজাইনের পছন্দ যা জাভাটির মূল নকশায় ফিরে যায়।

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

এটি উত্সাহক্রমে প্রোগ্রামগুলির মধ্যে একটি সংকট (আইডিইগুলির মতো) উত্স পাঠ দেখতে ব্যবহৃত হয় যে এই জাতীয় প্রোগ্রামগুলি ইউনিকোড পলায়নের ব্যাখ্যা করতে পারে না এবং সংশ্লিষ্ট গ্লাইফটি প্রদর্শন করতে পারে।


যেহেতু এটি এখনও লক্ষ করা যায় নি, এখানে একটি ব্যাখ্যা, কেন ইউনিকোড অনুবাদ অন্য যে কোনও উত্স কোড প্রসেসিংয়ের আগে ঘটে না:

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

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

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

এটি অন্য একটি অদ্ভুত বৈশিষ্ট্যের কারণ যা এমনকি উল্লেখ করা হয়নি: \uuuuuuxxxx সিনট্যাক্স:

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


স্পষ্টকরণটি লিখেছেন এমন লোকেরা শুধুমাত্র ইউনিকোড কেন পালাতে পেরেছিল তার উত্তর দিতে পারে।

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

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

এটি অবিশ্বাস্যরূপে কঠিন যখন ইউনিকোড পলায়ন করে মাঠে প্রবেশ করে: এটি সম্পূর্ণ নতুন লেক্সারের নিয়ম তৈরি করে।

সহজ উপায়টি হ'ল দুটি ধাপে লেক্সিং করা: প্রথমে সমস্ত ইউনিকোড পলাতককে এটি প্রদর্শিত চরিত্রের সাথে অনুসন্ধান করুন এবং প্রতিস্থাপন করুন এবং তারপরে ফলাফল নথিকে পার্স করুন যেনো ইউনিকোড পলায়নের অস্তিত্ব নেই।

এর উল্টোটি এটি নির্দিষ্ট করা সহজ, সুতরাং এটি স্পেসিফিকেশনটিকে সহজ করে তোলে এবং এটি কার্যকর করা সহজ।

খারাপ দিকটি হ'ল, আপনার উদাহরণ well


\u000d এস্কেপ একটি মন্তব্য বন্ধ করে দেয় কারণ আপনি প্রোগ্রামটি টোকানাইজড হওয়ার আগে পালিয়ে যাওয়া ইউনিকোড অক্ষরগুলিতে অভিন্নভাবে রূপান্তরিত হয়। আপনি কোনও মন্তব্য শুরু করতে // পরিবর্তে \u0057\u0057 সমানভাবে ব্যবহার করতে পারেন।

এটি আপনার \u000d একটি বাগ, যা লাইনটি সিনট্যাক্স-হাইলাইট করে এটি পরিষ্কার করতে হবে যে the \u000d মন্তব্যটি শেষ করেছে।

এটি ভাষাতেও একটি ডিজাইনের ত্রুটি। এটি এখনই সংশোধন করা যায় না, কারণ এটি এতে নির্ভর করে এমন প্রোগ্রামগুলিকে ভেঙে দেবে। \u পালিয়ে যাওয়াগুলিকে সংকলক দ্বারা কেবল প্রাসঙ্গিকভাবে সম্পর্কিত ইউনিকোড চরিত্রে রূপান্তর করতে হবে যেখানে "বোধ হয়" (স্ট্রিং আক্ষরিক এবং শনাক্তকারী এবং সম্ভবত অন্য কোথাও নেই) অথবা তাদের ইউ + 0000–-তে অক্ষর তৈরি করতে নিষেধ করা উচিত ছিল 007F পরিসীমা, বা উভয়ই। এই শব্দার্থবিজ্ঞানের যে কোনও একটি মন্তব্য \u000d পলায়ন দ্বারা সমাপ্ত হওয়া থেকে বিরত \u000d পারে, যেখানে আপনি \u000d দরকারী সে ক্ষেত্রে হস্তক্ষেপ না করে \u000d মন্তব্যগুলি এনকোড করার উপায় হিসাবে মন্তব্যগুলির অভ্যন্তরে পলায়নের ব্যবহার অন্তর্ভুক্ত রয়েছে — মনে রাখবেন -ল্যাটিন স্ক্রিপ্ট, কারণ পাঠ্য সম্পাদকটি আপনি যেখানে কম্পাইলার চেয়ে তার থেকে বেশি পালাতে পারে তার একটি বিস্তৃত দর্শন নিতে পারে। (আমি এমন কোনও সম্পাদক বা আইডিই সম্পর্কে অবগত নই যা আপনি যে কোনও প্রসঙ্গে সংশ্লিষ্ট চরিত্র হিসাবে পালাতে পারবেন display

সি পরিবারে অনুরূপ ডিজাইনের ত্রুটি রয়েছে, 1 যেখানে মন্তব্য সীমা নির্ধারণের আগে ব্যাকস্ল্যাশ-নিউলাইন প্রক্রিয়া করা হয়, সুতরাং যেমন

// this is a comment \
   this is still in the comment!

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

1 প্যাডেন্টদের জন্য: আমি জানি যে সি এর এই দিকটি 100% ইচ্ছাকৃত ছিল, যুক্তি দিয়ে - আমি এটি তৈরি করছি না - এটি আপনাকে পাঞ্চ কার্ডগুলিতে যথেচ্ছভাবে দীর্ঘ লাইনের সাথে যান্ত্রিকভাবে জোর করে ফিট করার অনুমতি দেয়। এটি এখনও একটি ভুল ডিজাইনের সিদ্ধান্ত ছিল।







comments