ليلة واحدة، في حين مناقشة الصعوبات التي تواجه تطوير اللنت لPHP في الذهاب مع اسكندر quasilyte ، ذكر اسكندر أن اختبارات يستغرق وقتا طويلا عند تشغيل محليا (حوالي دقيقة واحدة، ويبدو لي أن لإذهب أنها طويلة جدا). بدأنا الحفر ، وسرعان ما أصبح واضحًا أن الاختبارات التي تُجري NoVerify (اسم اللنتر) في الوضع مع تشغيل كاشف السباق "تتباطأ" بشكل أساسي . يتم فهرسة مستودع phpstorm-stubs لكل عملية إطلاق، والذي يحتوي على جميع تعريفات الوظائف / الفئات / الثوابت المضمنة الموجودة في PHP ، وتستغرق فهرسة هذا المستودع حوالي 4 ثوانٍ على جهاز رباعي النواة (لاحظ أنه بدون كاشف السباق يكون كل شيء أسرع بكثير). نظرًا لوجود العديد من هذه العمليات ، واحدة لكل مشروع مفتوح المصدر تم اختباره ، يمكن أن يستغرق إجمالي وقت التنفيذ لجميع الاختبارات دقائق. تصنف NoVerify نفسها كنقطة مرور سريعة جدًا لـ PHP ، لذلك ، بالطبع ، هذا الأداء محزن قليلاً وكان من الضروري إيجاد نوع من الحل.
NoVerify العمارة
كبداية ، لا يزال الأمر يستحق الحديث قليلاً عن كيفية عمل NoVerify. ينقسم عمل لينتر إلى مرحلتين واسعتين: الفهرسة والتحليل المباشر.
تعني فهرسة المشروع أن تعريفات وأنواع جميع الوظائف والفئات والطرق والثوابت والمتغيرات العامة يتم استخلاصها من جميع ملفات PHP ، ويتم تخزين كل هذه المعلومات في ذاكرة الوصول العشوائي للوصول السريع. أيضًا ، يتم حفظ هذه المعلومات في ذاكرة التخزين المؤقت على القرص بتنسيق gob لتجنب الحاجة إلى تحليل المشروع بأكمله في كل مرة. من المهم أنه حتى لتحليل ملف واحد ، يجب فهرسة المشروع بأكمله.، لأنه إذا كان هناك تحميل تلقائي للفئات في PHP ، فلن يكون هناك شيء من هذا القبيل للوظائف والثوابت وحتى المتغيرات العامة ، ويمكن تعريفها في أي مكان. بالطبع ، في مشاريع PHP الحديثة ، عادةً ما يتم استخدام الفصول فقط ولا تظهر مثل هذه المشكلات ، ولكن بالنسبة للمشاريع ذات التاريخ الطويل ، لا يزال هذا مناسبًا. كانت الحاجة إلى فهرسة المشروع بأكمله لتحليله هي السبب في كتابة NoVerify in Go ، لأن هذه اللغة تدعم تعدد مؤشرات الترابط بشكل جيد ، مما يعني أنها ستكون قادرة على فهرسة المشروع بشكل أسرع مما هو ممكن في PHP.
يمكن إجراء التحليل للملفات المحددة (على سبيل المثال ، تلك التي تغيرت في الالتزام الحالي) ، وللمشروع بأكمله مرة واحدة. في الحالة الأولى ، يستغرق التحليل وقتًا أقل من بناء الفهرس ، وأحيانًا بشكل ملحوظ (كما في المثال أعلاه مع الاختبارات ، حيث تستغرق فهرسة phpstorm-stubs 90 +٪ من الوقت). يستخدم التحليل معلومات حول أنواع جميع الوظائف / الفئات / الطرق المعلنة ، والتي تم جمعها في مرحلة الفهرسة.
تسريع فهرسة phpstorm-stubs
, , , , phpstorm-stubs, , , «» (.. ) // PHP, 25% , , . , : phpstorm-stubs «» , , , , , , .., , .
«» :
, . , phpstorm-stubs .
phpstorm-stubs , , .
, gob.
, phpstorm-stubs , Go- phpstorm-stubs . , , , 2-3 .
, (2), . , (1), , , . , , Go phpstorm-stubs ~200 (.. 20 ), , 18 , , .
?
, golden- , , , - . , , phpstorm-stubs. , -.
, ( Laravel, composer create-project --prefer-dist laravel/laravel blog, 1.6 PHP) 450 ( 4 ), NoVerify , , , , language server.
/
Go- 1.6 20-60 , , , , . .
: noverifyturbo 20 100 , ~80 1.6 PHP-.
, - NoVerify, , NoVerify. , .
-
: , Go- fmt.Printf("%#v", value).

, , , , GoStringer(), .
PHP- Go-, map[string]func()*PerFileCache, ( PHP- , , ), , PHP-. , , , , map ( - , ), , , , map , .
+ , , - stat() , .
Laravel 1.6 , composer create-project --prefer-dist laravel/laravel blog , :
, 1 : 4
-, 1 : 400
, 12 : 1 (10 )
-, 12 : 240 (800 )
, - , , - map , , . , - , , .
— , , , , ( Google, ).
NoVerify Go, , phpstorm-stubs «» . . , , NoVerify workflow , PHPStorm VS Code , .