java শিখব - নির্দিষ্ট ইউনিকোড অক্ষর দিয়ে মন্তব্যগুলিতে জাভা কোড কার্যকর করা কেন অনুমোদিত?




মেথড কম (8)

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

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

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

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

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

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

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

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

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!");
}

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

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


আমি @ জওয়ালের সাথে একমত যে এটি একটি নকশা ভুল; কিন্তু আমি এটা এমনকি আরো সমালোচনামূলক।

\u পালাবার স্ট্রিং এবং গৃহস্থালি literals দরকারী; এবং এটি একমাত্র জায়গা যে এটি বিদ্যমান থাকা উচিত। এটি একইভাবে পরিচালনা করা উচিত যেভাবে অন্যগুলি পালিয়ে যায় \n ; এবং "\u000A" অর্থ অবশ্যই "\n"

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

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

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

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


ইউনিকোড ডিকোডিং অন্য কোন বাক্যালাপের আগে সঞ্চালিত হয়। এর মূল সুবিধা হল এটি ASCII এবং অন্য কোনও এনকোডিংয়ের মধ্যে পিছনে যাওয়ার জন্য এটি তুচ্ছ। আপনি মন্তব্য শুরু এবং শেষ যেখানে চিন্তা করতে হবে না!

জেএলএস সেকশন 3.3 এ বর্ণিত হিসাবে এটি কোনও ASCII ভিত্তিক সরঞ্জাম উৎস ফাইলগুলিতে প্রক্রিয়া করার অনুমতি দেয়:

[...] জাভা প্রোগ্রামিং ভাষা ইউনিকোড-এ লিখিত একটি প্রোগ্রাম ASCII- এ রূপান্তরিত করার একটি আদর্শ উপায় নির্দিষ্ট করে যা একটি ফর্মকে এমন একটি প্রোগ্রামে রূপান্তরিত করে যা ASCII- ভিত্তিক সরঞ্জামগুলির দ্বারা প্রক্রিয়া করা যেতে পারে। [...]

এটি প্ল্যাটফর্ম স্বাধীনতার জন্য একটি মৌলিক গ্যারান্টি দেয় (সমর্থিত চরিত্র সেটগুলির স্বাধীনতা) যা সবসময় জাভা প্ল্যাটফর্মের জন্য একটি মূল লক্ষ্য।

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

এই থিমটিতে অনেক গোচছা রয়েছে এবং জাভা পাজলরা জোশুয়া ব্লোক এবং নীল গফারের নিম্নলিখিত রূপটি অন্তর্ভুক্ত করেছেন:

এটি একটি আইনি জাভা প্রোগ্রাম? যদি তাই হয়, এটা কি মুদ্রণ করে?

\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020\u0020
\u0063\u006c\u0061\u0073\u0073\u0020\u0055\u0067\u006c\u0079
\u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020
\u0020\u0020\u0020\u0020\u0073\u0074\u0061\u0074\u0069\u0063
\u0076\u006f\u0069\u0064\u0020\u006d\u0061\u0069\u006e\u0028
\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0020
\u0020\u0020\u0020\u0020\u0061\u0072\u0067\u0073\u0029\u007b
\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074
\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0020
\u0022\u0048\u0065\u006c\u006c\u006f\u0020\u0077\u0022\u002b
\u0022\u006f\u0072\u006c\u0064\u0022\u0029\u003b\u007d\u007d

(এই প্রোগ্রামটি একটি সরল "হ্যালো ওয়ার্ল্ড" প্রোগ্রাম হিসাবে পরিণত হয়।)

বিভ্রান্তিকর সমাধানগুলির মধ্যে, তারা নিচের দিকে নির্দেশ করে:

আরো গুরুত্ব সহকারে, এই ধাঁধা পূর্ববর্তী তিনটি পাঠকে শক্তিশালী করতে সহায়তা করে: যখন আপনি আপনার প্রোগ্রামগুলিতে অন্য কোনো উপায়ে প্রতিনিধিত্ব করতে পারে এমন অক্ষরগুলি সন্নিবেশ করতে হবে তখন ইউনিকোড পাল্টা আবশ্যক। অন্যান্য ক্ষেত্রে তাদের এড়িয়ে চলুন।

উত্স: জাভা: মন্তব্য কোড কোড নির্বাহ ?!


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

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

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

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

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

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


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

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

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


ইউনিকোড পালিয়ে যাওয়ার কারণেই উত্তর দিতে পারেন এমন একমাত্র ব্যক্তিই এগুলি প্রয়োগ করেছিলেন যারা স্পেসিফিকেশন লিখেছেন।

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

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

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

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

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

নেতিবাচক, ভাল, আপনার উদাহরণ।


এখানে ডেনিস Tulskiy answer জন্য একটি ছোটখাট উন্নতি। এটা অর্ধেক সময় কাটা

public static long[] generateSeed(String goal, long start, long finish) {
    char[] input = goal.toCharArray();

    int[] dif = new int[input.length - 1];
    for (int i = 1; i < input.length; i++) {
        dif[i - 1] = input[i] - input[i - 1];
    }

    mainLoop:
    for (long seed = start; seed < finish; seed++) {
        Random random = new Random(seed);
        int lastChar = random.nextInt(27);
        int base = input[0] - lastChar;
        for (int d : dif) {
            int nextChar = random.nextInt(27);
            if (nextChar - lastChar != d) {
                continue mainLoop;
            }
            lastChar = nextChar;
        }
        if(random.nextInt(27) == 0){
            return new long[]{seed, base};
        }
    }

    throw new NoSuchElementException("Sorry :/");
}




java unicode comments