টাইপ নলের মান কেন একটি লুপের অভ্যন্তরে পরিবর্তিত হয়?


109

ক্রোম কনসোলে এই স্নিপেটটি কার্যকর করা হচ্ছে:

function foo() {
    return typeof null === 'undefined';
}
for(var i = 0; i < 1000; i++) console.log(foo());

1000 বার মুদ্রণ করা উচিত false, তবে কিছু মেশিনে কয়েকটি falseপুনরাবৃত্তির জন্য মুদ্রণ করবে , তারপরে trueবাকী অংশগুলির জন্য।

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

এটি কেন ঘটছে? এটা কি শুধুই বাগ?


4
এটি আমার জন্য 1000 বার সত্য ফিরে আসছে ...
হোয়াং লং

2
আমি মনে করি এটি বাগ, আমার 262 টি মিথ্যা / 738 সত্য
জ্যাক্স টেলার

1
এটি ক্রোমের কনসোল সহ কিছু অদ্ভুত: আপনি যদি একটি অ্যারের দিকে এগিয়ে যান এবং অ্যারে লগ করেন তবে এটি সমস্ত false। যেমনটি হ'ল, trueক্রমের ক্রমের ওঠানামার সংখ্যা ।
ডান্ডাভিস

1
@ হোওংলং যেমন আমি প্রশ্নে বলেছি, এটি কেবলমাত্র কিছু মেশিনেই ঘটে। এটিও সম্ভব যে এটি ক্রোমের কয়েকটি সংস্করণে ঘটে
Agos

2
@ হোওংলং নিশ্চিত করুন যে আপনি এটি ক্রোমে চালাচ্ছেন
নোবিতা

উত্তর:


74

এর জন্য একটি ক্রোমিয়াম বাগ খোলা রয়েছে:

604033 ইস্যু - জেআইটি সংকলক পদ্ধতি আচরণ সংরক্ষণ করে না

তো হ্যাঁ এটি কেবল একটি বাগ!


5
"জাস্ট"? বিশ্বব্যাপী এই বিরতি স্বেচ্ছাসেবক ওয়েব অ্যাপ্লিকেশন কি করতে পারেন না?
jpmc26

6
"শুধু" বলতে গেলে এটি কোনও বৈশিষ্ট্য বা অদ্ভুত কিছু নয়। একটি গুরুতর বাগ, কিন্তু কেবল একটি বাগ!
স্লুম্বর 86

37

এটি আসলে একটি ভি 8 জাভাস্ক্রিপ্ট ইঞ্জিন ( উইকি ) বাগ

এই ইঞ্জিনটি ক্রোমিয়াম, ম্যাক্সথ্রন, অ্যান্ড্রয়েড ওএস, নোড.জেএস ইত্যাদিতে ব্যবহৃত হয়

তুলনামূলকভাবে সহজ বাগ বর্ণনা আপনি এই রেডডিট বিষয়টিতে দেখতে পাবেন :

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

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

এই বাগটি ভি 8 নিজেই ( কমিট ) স্থির করা হয়েছে বলে মনে হয় পাশাপাশি ক্রোমিয়াম ( বাগ রিপোর্ট ) এবং নোডজেএস ( কমিট ) হিসাবে রয়েছে।


আমি নিশ্চিত করেছি যে বাগটি এখনও নোড.জেজেজে রয়েছে .2.২.২ যা আমার উদ্বেগজনক।
মাইকেল শপসিন

এটি আজ ভি 8 ইঞ্জিনে স্থির করা হয়েছিল (21.06), আমি বিশ্বাস করি শীঘ্রই সম্পর্কিত সফ্টওয়্যার আপডেট করা হবে।
সের্গে নোভিকভ

নোড.জেএস .2.২.x এ ভি 8 ফিক্সের ব্যাকপোর্টিং ইতিমধ্যে থ্যাল্যাফনার্ডের মালিকানাধীন # 7348 ইস্যু হিসাবে প্রক্রিয়াধীন রয়েছে
মাইকেল শপসিন

18

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

এই ক্ষেত্রে, লুপটিতে বারবার সম্পাদনের পরে, জেআইটি সংকলক ফাংশনটি বিশ্লেষণ করে এবং এটি একটি অনুকূলিত সংস্করণ দিয়ে প্রতিস্থাপন করে। দুর্ভাগ্যক্রমে, বিশ্লেষণটি একটি ভুল ধারণা তৈরি করে এবং অনুকূলিত সংস্করণটি আসলে সঠিক ফলাফল দেয় না।

বিশেষত, রেডডিট ব্যবহারকারী রেইনহ্যাপেন্স পরামর্শ দেয় যে এটি টাইপ প্রচারে একটি ত্রুটি :

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

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


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