API کامپایلر Hyperscan عبارات منظم را می پذیرد و آنها را به یک پایگاه داده الگوی گردآوری تبدیل می کند که می تواند برای اسکن داده ها استفاده شود.
API سه عملکرد را ارائه می دهد که عبارات منظم را در پایگاه داده ها کامپایل می کنند:
تدوین به كتابخانه Hyperscan اجازه می دهد تا الگوی (های) داده شده را تجزیه و تحلیل كند و از قبل تعیین كند كه چگونه می توان این الگوها را به صورت بهینه اسكن كرد كه برای محاسبه در زمان اجرا بسیار گران باشد.
هنگام تهیه عبارات ، باید تصمیمی اتخاذ شود که آیا از الگوهای کامپایل شده حاصل در حالت جریان ، بلوک یا بردار استفاده می شود:
برای تهیه الگوهای مورد استفاده در حالت جریان ، پارامتر حالت HS_COMPILE () باید روی HS_MODE_STREAM تنظیم شود. به طور مشابه ، حالت بلوک نیاز به استفاده از HS_MODE_BLOCK دارد و حالت بردار نیاز به استفاده از HS_MODE_VECTORED دارد. یک پایگاه داده الگوی گردآوری شده برای یک حالت (جریان ، بلوک یا بردار) فقط در آن حالت قابل استفاده است. نسخه Hyperscan که برای تولید یک پایگاه داده الگوی کامپایل شده استفاده می شود ، باید با نسخه Hyperscan که برای اسکن با آن استفاده می شود مطابقت داشته باشد.
Hyperscan پشتیبانی را برای هدف قرار دادن یک پایگاه داده در یک بستر CPU خاص فراهم می کند. برای جزئیات بیشتر به تخصص مجموعه دستورالعمل مراجعه کنید.
تحت اللفظی خالص یک مورد خاص از بیان منظم است. یک دنباله کاراکتر به عنوان یک تحت اللفظی خالص در نظر گرفته می شود اگر و فقط اگر هر شخصیت به طور مستقل خوانده شود و تفسیر شود. هیچ ارتباط نحوی بین هر شخصیت مجاور اتفاق نمی افتد.
به عنوان مثال ، با توجه به عبارتی نوشته شده به عنوان / bc؟ /. می توانیم بگوییم که این یک بیان منظم است ، با این معنی که شخصیت B و به دنبال آن هیچ چیز یا یک شخصیت c. از نظر دیگر ، ما همچنین می توانیم بگوییم که این یک بیان تحت اللفظی خالص است ، با این معنی که این یک توالی کاراکتر از طول 3 بایت است ، حاوی کاراکترهای B ، C و؟بشربه طور منظم ، شخصیت علامت سوال؟دارای نقش نحوی خاصی به نام 0-1 Quantifier است که با شخصیت پیش روی آن ارتباط نحوی دارد. شخصیت های مشابه در گرامر منظم مانند [،] ، (،) ، وجود دارند.<,>، - ، * ، + ، ، |، / ،: ، ^ ،.، $در حالی که در مورد تحت اللفظی خالص ، تمام این شخصیت های متا معانی اضافی را از دست داده اند که انتظار دارند که آنها فقط کدهای ASCII رایج باشند.
Hyperscan در ابتدا برای پردازش عبارات معمولی معمولی طراحی شده است. از این رو برای انجام تفسیر جامع گرامر منظم با یک تجزیه کننده پیچیده تعبیه شده است. به ویژه ، شناسایی شخصیت های فوق متا گام اساسی برای تفسیر گرامرهای منظم بسیار پیچیده تر است.
اما در موارد واقعی ، الگوهای ممکن است همیشه عبارات منظم نباشند. آنها فقط می توانند تحت اللفظی خالص باشند. اگر لفظهای خالص حاوی شخصیت های متا معمولی باشند ، مشکل پیش می آید. با فرض اینکه مستقیماً در API کامپایل Hyperscan سنتی تغذیه شود ، تمام این شخصیت های متا به روش های از پیش تعریف شده تفسیر می شوند ، که غیر ضروری است و نتیجه آن کاملاً از انتظار خارج است. برای جلوگیری از چنین سوء تفاهم توسط API سنتی ، کاربران باید با تبدیل کاراکترهای متا به برخی از قالب های دیگر ، این الگوهای تحت اللفظی را از قبل پردازش کنند: یا با اضافه کردن یک backslash قبل از شخصیت های متا خاص ، یا با تبدیل همه شخصیت ها به یک نمایندگی شش ضلعی.
در v5. 2. 0 ، Hyperscan 2 API کامپایل جدید را برای الگوهای تحت اللفظی خالص معرفی می کند:
این 2 API برای موارد استفاده طراحی شده اند که تمام الگوهای موجود در مجموعه قانون هدف ، تحت اللفظی خالص هستند. کاربران می توانند بدون نگرانی از نوشتن شخصیت های متا معمولی در الگوهای خود ، محتوای تحت اللفظی اولیه را مستقیماً به این API ها منتقل کنند. دیگر هیچ کار پیش پردازش لازم نیست.
برای API های جدید ، طول هر الگوی تحت اللفظی یک پارامتر تازه اضافه شده است. Hyperscan باید از طریق دانستن طول هر لفظی ، موقعیت نهایی عبارت ورودی را پیدا کند ، نه با شناسایی شخصیت 0 یک رشته.
ما از API تلفیقی تحت اللفظی با پارامترهای گسترده پشتیبانی نمی کنیم. و برای اجرای زمان اجرا ، هنوز هم می توان از API های زمان اجرا سنتی برای مطابقت با الگوهای تحت اللفظی خالص استفاده کرد.
اگر مجموعه قانون هدف حداقل یک عبارت معمولی دارد ، لطفاً از API های کامپایل سنتی HS_COMPILE () ، HS_COMPILE_MULTI () و HS_COMPILE_EXT_MULTI () استفاده کنید. API های تحت اللفظی جدید که در اینجا معرفی شده اند برای مجموعه های قانون که فقط عبارات تحت اللفظی خالص دارند ، طراحی شده اند.
Hyperscan از الگوی استفاده شده توسط کتابخانه PCRE ("libpcre") که در آن شرح داده شده است ، پشتیبانی می کند. با این حال ، همه سازه های موجود در libpCre پشتیبانی نمی شوند. استفاده از سازه های پشتیبانی نشده منجر به خطاهای تلفیقی خواهد شد.
نسخه PCRE برای اعتبارسنجی تفسیر Hyperscan از این نحو 8. 41 یا بالاتر است.
سازه های REGEX زیر توسط Hyperscan پشتیبانی می شوند:
به عنوان مثال ، BAR (؟ i) BAR (؟-i) BAZ تطبیق حساس به مورد را فقط برای قسمت نوار مسابقه روشن می کند.
اندازه گیری های تکرار شده محدود با تعداد مکرر بزرگ عبارات دلخواه (به عنوان مثال ([[A-Z] | BC*D | XY؟ z)) منجر به خطای "الگوی خیلی بزرگ" در زمان کامپایل الگوی خواهد شد.
در این زمان ، همه الگوهای را نمی توان با موفقیت با پرچم HS_FLAG_SOM_LEFTS ، که پشتیبانی از هر الگوی را برای شروع مسابقه فراهم می کند ، جمع آوری کرد. الگویی که از این پرچم پشتیبانی می کند ، زیر مجموعه ای از الگوهای است که می تواند با موفقیت با Hyperscan تهیه شود. نکته قابل توجه ، بسیاری از اشکال تکرار محدود که می توانند بدون شروع پرچم مسابقه با Hyperscan تهیه شوند ، نمی توانند با پرچم فعال شده کامپایل شوند.
سازه های REGEX زیر توسط Hyperscan پشتیبانی نمی شوند:
در حالی که Hyperscan از نحو libpcre پیروی می کند ، معناشناسی مختلفی را ارائه می دهد. عزیمتهای اصلی از معناشناسی libpcre با الزامات جریان و تطبیق الگوی همزمان متعدد ایجاد می شود.
عزیمتهای اصلی از معناشناسی libpcre عبارتند از:
برای پشتیبانی از معانی کمیته LibpCre در حالی که گزارش دقیق مسابقات جریان در زمان وقوع آنها غیرممکن است. به عنوان مثال ، الگوی بالا ، /foo. mbar/ را در حالت جریان ، در برابر جریان زیر (سه بلوک اسکن شده به ترتیب) در نظر بگیرید:
| بلوک 1 | بلوک 2 | بلوک 3 |
|---|---|---|
| فوکیزبر | قارچ | qbar |
از آنجا که تکرار در الگوی تکرار حریص در libpcre است ، باید تا حد امکان مطابقت داشته باشد بدون اینکه باعث عدم موفقیت بقیه الگوی شود. با این حال ، در حالت جریان ، این امر به دانش داده در جریان فراتر از بلوک فعلی که اسکن شده است نیاز دارد.
در این مثال ، مسابقه در Offset 9 در بلوک اول فقط مسابقه صحیح (تحت معانی LibPCRE) است اگر هیچ نوار در یک بلوک بعدی وجود نداشته باشد - مانند بلوک 3 - که این یک مسابقه بهتر برای این الگوی است.
در عملکرد استاندارد ، Hyperscan فقط در صورت فراخوانی پاسخ به تماس مسابقه ، جبران نهایی مسابقه را فراهم می کند. اگر پرچم HS_FLAG_SOM_LEFTS برای یک الگوی خاص مشخص شود ، همان مجموعه مسابقات بازگردانده می شود ، اما هر مسابقه همچنین سمت چپ ترین شروع ممکن را مطابق با جبران نهایی آن فراهم می کند.
استفاده از پرچم SOM مستلزم تعدادی از تجارت و محدودیت ها است:
در حالت جریان ، میزان دقت تحویل داده شده توسط SOM با پرچم های SOM Horizon قابل کنترل است. اینها به Hyperscan دستور می دهند تا اطلاعات دقیق SOM را در فاصله مشخصی از انتهای انتهای ارائه دهند و یک جبران ویژه ویژه HS_OFFSET_PAST_HORIZON را برگردانند. مشخص کردن یک افق سام کوچک یا متوسط معمولاً حالت جریان مورد نیاز برای یک پایگاه داده معین را کاهش می دهد.
در حالت جریان ، شروع شروع برای مسابقه ممکن است قبل از اسکن بلوک فعلی به نقطه ای از جریان اشاره کند. Hyperscan هیچ امکاناتی برای دسترسی به بلوک های قبلی فراهم نمی کند. اگر برنامه فراخوانی نیاز به بازرسی از داده های تاریخی دارد ، باید خود آن را ذخیره کند.
در برخی شرایط ، کنترل بیشتر بر رفتار تطبیق یک الگوی مورد نیاز است از آنچه می توان با استفاده از نحو بیان منظم به راحتی مشخص شد. برای این سناریوها ، Hyperscan عملکرد HS_COMPILE_EXT_MULTI () را فراهم می کند که اجازه می دهد مجموعه ای از "پارامترهای گسترده" بر اساس هر الگوی تنظیم شود.
پارامترهای گسترده با استفاده از یک ساختار HS_EXPR_EXT_T مشخص شده است ، که زمینه های زیر را ارائه می دهد:
این پارامترها یا اجازه می دهد تا مجموعه ای از مسابقات تولید شده توسط یک الگوی در زمان کامپایل محدود شود (به جای تکیه بر برنامه برای پردازش مسابقات ناخواسته در زمان اجرا) ، یا اجازه می دهد تا یک الگوی تقریباً (در فاصله ویرایش داده شده) مطابقت داشته باشد تا مسابقات بیشتری ایجاد کندبشر
به عنوان مثال ، الگوی / foo. mbar/ هنگامی که یک min_offset 10 و max_offset از 15 داده می شود ، در صورت اسکن در برابر Foobar یا FOO0123456789BAR ، مسابقه ای ایجاد نمی کند اما در برابر جریان داده های FOO0123BAR یا FOO0123456BAR ایجاد می کند.
به طور مشابه ، الگوی / foobar / هنگامی که به ویرایش_دیت 2 داده می شود ، در هنگام اسکن در برابر Foobar ، F00bar ، Fooba ، FOBR ، FO_BAZ ، FOOOOBAR و هر چیز دیگری که در فاصله ویرایش 2 قرار دارد (همانطور که با فاصله Levenshtein تعریف شده است) ایجاد می شود.
هنگامی که به همان الگوی / foobar / یک hamming_distance 2 داده می شود ، در هنگام اسکن در برابر Foobar ، Boofar ، F00bar و هر چیز دیگری با بیشترین دو شخصیت جایگزین الگوی اصلی می شود. برای اطلاعات بیشتر ، به بخش تقریبی تطبیق مراجعه کنید.
Hyperscan یک پرچم در هر الگوی ، HS_FLAG_PREFILTER را فراهم می کند ، که می تواند برای اجرای پیش نمایش برای یک الگوی استفاده شود تا اینکه Hyperscan معمولاً از آن پشتیبانی نمی کند.
این پرچم به Hyperscan دستور می دهد که نسخه "تقریبی" این الگوی را برای استفاده در یک برنامه پیشینه سازنده کند ، حتی اگر Hyperscan از الگوی در عملکرد عادی پشتیبانی نکند.
مجموعه ای از مسابقات برگشتی هنگام استفاده از این پرچم تضمین می شود که یک سوپراست از مسابقات مشخص شده توسط بیان غیر فیلتر باشد.
اگر این الگوی حاوی سازه های الگوی باشد که توسط hyperscan پشتیبانی نمی شوند (مانند ادعاهای عرض صفر ، مراجعه به پشت یا منابع مشروط) این سازه ها در داخل با سازه های وسیع تر جایگزین می شوند که ممکن است بیشتر مطابقت داشته باشند.
به عنوان مثال ، الگوی / ( w+) دوباره 1 / حاوی برگه برگشت 1 است. در حالت مقدماتی ، این الگوی ممکن است با استفاده از مرجع پشتی خود با مرجع خود ، تقریب شود ، دوباره / w+ دوباره w+ /.
علاوه بر این ، در حالت پیش نویس ، hyperscan ممکن است الگویی را ساده کند که در غیر این صورت خطای "الگوی خیلی بزرگ" را در زمان کامپایل یا به دلایل عملکرد بازگرداند (با توجه به ضمانت تطبیق بالا).
به طور کلی انتظار می رود که برنامه متعاقباً مسابقات مقدماتی را با یک تطابق معمولی بیان کننده دیگری تأیید کند که می تواند مسابقات دقیقی را برای این الگوی فراهم کند.
استفاده از این پرچم در ترکیب با شروع حالت مسابقه (با استفاده از پرچم HS_FLAG_SOM_LEFTSTOST) در حال حاضر پشتیبانی نمی شود و منجر به خطای تدوین الگوی می شود.
Hyperscan قادر به استفاده از چندین ویژگی مجموعه دستورالعمل مدرن است که در پردازنده های x86 یافت می شود تا پیشرفت هایی در عملکرد اسکن ارائه دهد.
برخی از این ویژگی ها هنگام ساخت کتابخانه انتخاب می شوند. به عنوان مثال ، Hyperscan از دستورالعمل های بومی POPCNT در پردازنده هایی که در دسترس است استفاده می کند و کتابخانه برای معماری میزبان بهینه شده است.
به طور پیش فرض ، زمان اجرا Hyperscan با پرچم کامپایل ر-march = بومی ساخته شده است و (در صورت امکان) از کلیه دستورالعمل های شناخته شده توسط کامپایلر C میزبان استفاده می کند.
با این حال ، برای استفاده از برخی از ویژگی های مجموعه دستورالعمل ، Hyperscan باید برای پشتیبانی از آنها یک پایگاه داده تخصصی بسازد. این بدان معنی است که پلت فرم هدف باید در زمان کامپایل الگوی مشخص شود.
توابع API کامپایلر Hyperscan همه یک آرگومان اختیاری HS_PLATFORM_INFO_T را می پذیرند ، که پلت فرم هدف را برای ساخت پایگاه داده توصیف می کند. اگر این آرگومان تهی باشد ، پایگاه داده در بستر میزبان فعلی هدف قرار می گیرد.
ساختار HS_PLATFORM_INFO_T دو قسمت دارد:
یک ساختار HS_PLATFORM_INFO_T که در میزبان فعلی هدف قرار گرفته است می تواند با عملکرد HS_POPULATION_PLATFORM () ساخته شود.
به API مرجع مراجعه کنید: ثابت برای لیست کامل تنظیم CPU و پرچم های ویژگی.
Hyperscan یک حالت تطبیق تقریبی آزمایشی را فراهم می کند ، که با الگوهای در فاصله ویرایش مشخص مطابقت دارد. رفتار دقیق تطبیق به شرح زیر تعریف شده است:
در اینجا چند نمونه از تطبیق تقریبی آورده شده است:
در حال حاضر ، معاملات و محدودیت هایی وجود دارد که با پشتیبانی تقریبی تطبیق ارائه می شود. به طور خلاصه ، آنها در اینجا هستند:
تطبیق تقریبی همیشه به طور پیش فرض غیرفعال است و با استفاده از یک پارامتر گسترده که در پارامترهای گسترده شرح داده شده است ، می توان به صورت هر الگوی فعال کرد.
برای موقعیت هایی که کاربر نیاز به رفتاری دارد که به حضور یا عدم حضور مسابقات از گروه های الگوهای بستگی دارد ، Hyperscan پشتیبانی از ترکیب منطقی الگوهای موجود در یک مجموعه الگوی معین را با سه اپراتور پشتیبانی می کند: نه ، و یا.
مقدار منطقی چنین ترکیبی بر اساس وضعیت تطبیق هر عبارت در یک جبران معین است. وضعیت تطبیق هر عبارت دارای یک مقدار بولی است: اگر این عبارت هنوز هم مطابقت نداشته باشد یا درست باشد ، اگر این عبارت از قبل مطابقت داشته باشد ، نادرست است. به طور خاص ، اگر عبارتی که به آن اشاره دارد در این جبران نادرست است ، مقدار یک عملیات در یک جبران معین صحیح است.
به عنوان مثال ، 101 به این معنی نیست که بیان 101 هنوز در این افست مطابقت ندارد.
یک ترکیب منطقی در زمان کامپایل به عنوان یک عبارت به Hyperscan منتقل می شود. این عبارت ترکیبی در هر جبران ، جایی که یکی از موارد زیر آن مطابقت دارد و مقدار منطقی کل عبارت صادق است ، مسابقات را افزایش می دهد.
برای نشان دادن ، در اینجا یک عبارت ترکیبی نمونه وجود دارد:
((301 OR 302) وت 303) وت (304 OR نه 305)
اگر بیان 301 در افست 10 مطابقت داشته باشد ، مقدار منطقی 301 صحیح است در حالی که مقادیر الگوهای دیگر نادرست است. از این رو ، ارزش کل ترکیب نادرست است.
سپس بیان 303 در افست 20. اکنون مقادیر 301 و 303 صحیح است در حالی که مقادیر الگوهای دیگر هنوز نادرست هستند. در این حالت ، مقدار ترکیب صحیح است ، بنابراین بیان ترکیبی مسابقه را در افست 20 افزایش می دهد.
سرانجام ، بیان 305 دارای مسابقات در افست 30 است. اکنون مقادیر 301 ، 303 و 305 صادق است در حالی که مقادیر دیگر الگوهای هنوز نادرست هستند. در این حالت ، مقدار این ترکیب نادرست است و هیچ مسابقه ای مطرح نمی شود.
با استفاده از ترکیبات منطقی
در نحو ترکیب منطقی ، یک عبارت به عنوان نماد Infix نوشته شده است ، از عملیات ، اپراتورها و پرانتز تشکیل شده است. اپراند ها شناسه های بیان هستند و اپراتورها هستند!(نه) ، & (و) یا |(یا). به عنوان مثال ، ترکیبی که در بخش قبلی شرح داده شده است به این صورت نوشته می شود:
((301 | 302) & 303) & (304 |! 305)
در یک عبارت ترکیبی منطقی:
برای استفاده از یک عبارت ترکیبی منطقی ، باید به یکی از توابع کامپایل Hyperscan (HS_COMPILE_MULTI () ، HS_COMPILE_EXT_MULTI ()) به همراه پرچم HS_FLAG_COMBINATION منتقل شود ، که این الگوی را به عنوان یک عبارت ترکیبی منطقی مشخص می کند. الگوهای ذکر شده در بیان ترکیبی منطقی باید در همان الگوی تنظیم شده به عنوان عبارت ترکیبی جمع شوند.
هنگامی که یک عبارت دارای پرچم HS_FLAG_COMBINATION است ، تمام پرچم های دیگر را به جز پرچم HS_FLAG_SINGLEMATCH و پرچم HS_FLAG_QUIET نادیده می گیرد.
Hyperscan عبارات ترکیبی منطقی را در زمان کامپایل می پذیرد که در صورت مطابقت با الگوی ، به درست ارزیابی می شود و اگر هیچ الگویی با هم مطابقت نداشته باشد ، مسابقه را برای ترکیب در پایان داده ها گزارش می دهد. مثلا:
! 101! 101 | 102! 101 &! 102! (101 و 102)
الگویی که از آنها به عنوان عملیات در یک ترکیب منطقی (به عنوان مثال ، 301 تا 305 در مثالهای بالا) گفته می شود نیز ممکن است از پرچم HS_FLAG_QUIET برای ساکت گزارش های مربوط به مسابقات فردی برای آن الگوهای استفاده کنند. در صورت عدم وجود این پرچم ، تمام مسابقات (هم برای الگوهای فردی و هم برای ترکیب منطقی آنها) گزارش می شود.
هنگامی که یک عبارت دارای پرچم HS_FLAG_COMBINATION و مجموعه پرچم HS_FLAG_QUIET است ، هیچ تطبیقی برای این ترکیب منطقی گزارش نمی شود.
برچسب :
نویسنده : احمد نجفی
بازدید : <-PostHit->