پرل
مرور > پیاده‌سازی

پرل به عنوان یک مترجم اصلی، نوشته شده در C، همراه با مجموعه‌ای بزرگ از ماژول‌ها، نوشته شده در Perl و C اجرا می‌شود. مترجم را می‌توان به کتابخانه پیوند داد. تقریباً ۵۰۰ ماژول در توزیع وجود دارد که شامل ۲۰۰٬۰۰۰ خط Perl و ۳۵۰٬۰۰۰ خط دیگر از کد C است (بسیاری از کد C در ماژول‌ها شامل جداول رمزگذاری کاراکتر هستند).
مترجم یک معماری شی گرا دارد. تمام عناصر زبان اسکالر Perl، آرایه‌ها، هش‌ها، coderefs، دسته‌های فایل - در مفسر توسط C ساختار نشان داده شده‌است. عملیات در این ساختارها توسط مجموعه‌ای بزرگ از ماکرو، تایپدیف و توابع تعریف شده‌است. این API Perl C را تشکیل می‌دهد. API Perl می‌تواند به uninitiated خجالت بکشد، اما نقاط ورود آن یک طرح نامگذاری سازگار را دنبال می‌کنند که راهنمایی را برای کسانی که از آن استفاده می‌کنند هدایت می‌کند.
زندگی یک مترجم پرل تقریباً به یک فاز کامپایل و مرحله اجرا تقسیم می‌شود. در Perl، مراحل اصلی مراحل زندگی مترجم است. هر مترجم فقط یک بار در هر فاز می‌رود و مراحل در دنباله ثابت دنبال می‌شوند.
اغلب آنچه در فرایند کامپیوتر پرل اتفاق می‌افتد کامپیوتر است و اکثر آنچه که در مرحله اجرا در پرو رخ می‌دهد اعدام است اما استثنائاً قابل توجهی وجود دارد. پرل استفاده مهمی از قابلیت آن برای اجرای کد پرل در طی مرحله کامپایل می‌کند. پرل همچنین کامپایل را به مرحله اجرا متوقف می‌کند. شرایطی که نشان دهنده نوع پردازش است که در هر لحظه اتفاق می‌افتد. Perl در زمان کامپایل بیشترین امتیاز را در طی مرحله کامپایل دارد، اما زمان کامپایل نیز می‌تواند در طول مرحله اجرا وارد شود. زمان کامپایل برای کد در یک آرگومان رشته به داخل eval ساخته شده‌است که در مرحله اجرا رخ می‌دهد. Perl اغلب در زمان اجرا در مرحله فشرده‌سازی قرار دارد و بیشترین دوره اجرا را در زمان اجرا صرف می‌کند. کد در بلوک‌های BEGIN اجرا می‌شود.
در زمان کامپایل، مترجم، کد پپرل را به یک درخت نحو تجزیه می‌کند. در زمان اجرا، برنامه را با راه رفتن درخت اجرا می‌کند. متن فقط یک بار تجزیه می‌شود و درخت نحوی برای بهینه‌سازی از قبل اجرا می‌شود، به‌طوری‌که اجرا نسبتاً کارآمد است. بهینه‌سازی زمان‌بندی کامپایل در درخت نحو شامل انتشار ثابت و لغزش است، اما بهینه‌سازی peephole نیز انجام می‌شود.
پرل یک گرامر تورینگ کامل است، زیرا تجزیه می‌تواند توسط کد زمان اجرای اجرا شده در طول مرحله کامپایل اجرا شود؛ بنابراین، Perl را نمی‌توان با استفاده از ترکیبی Lex / Yacc Lexer / Parser پردازش کرد. در عوض، مترجم لکسور خود را اجرا می‌کند، که با یک اصلاح‌کننده گنو اصلاح شده و برای حل ابهامات در زبان هماهنگ شده‌است.
اغلب گفته می‌شود «تنها perl می‌تواند Perl را تجزیه کند»، به این معنی است که تنها مترجم پرل (perl) می‌تواند زبان پرل (Perl) را تجزیه کند، اما حتی این‌طور نیست، به‌طور کلی درست است. از آنجا که مترجم پرل می‌تواند یک ماشین تورینگ را در فاز کامپایل خود شبیه‌سازی کند، باید به منظور تکمیل تجزیه در هر مورد، مشکل تصمیم‌گیری را حل کند. این یک نتیجه طولانی مدت است که مشکل متوقف کردن غیرقابل تشخیص است و بنابراین حتی Perl هم همیشه می‌تواند Perl را تجزیه کند. Perl گزینه غیرمعمولی برای دسترسی کاربر به قدرت برنامه‌نویسی کامل خود را در فاز کامپایل خود می‌دهد. هزینه در نظر خلوص نظری بالا است، اما نارسایی عملی به نظر می‌رسد نادر است.
برنامه‌های دیگری که به تجزیه Perl پرداخته‌اند، مانند تجزیه و تحلیل‌های منبع کد و تکرار خودکار، باید نه تنها با ساختارهای مبهم نحو، بلکه با عدم پذیرفتگی تجزیه Perl در مورد کلی بحث می‌کنند.
پرل با بیش از ۲۵۰٬۰۰۰ آزمون عملکردی برای زبان اصلی Perl و بیش از ۲۵۰٬۰۰۰ آزمون عملکردی برای ماژول‌های اصلی توزیع شده‌است. اینها به عنوان بخشی از فرایند ساخت و ساز طبیعی عمل می‌کنند و تمرین مترجم و ماژول‌های اصلی آن را به‌طور گسترده‌ای انجام می‌دهند. توسعه دهندگان پرل بر تست‌های عملکردی تکیه می‌کنند تا اطمینان حاصل شود که تغییرات به مترجم، اشکالات نرم‌افزاری را ارائه نمی‌دهند؛ علاوه بر این، کاربران پرل که می‌بینند که مترجم آزمون‌های عملکردی خود را بر روی سیستم خود می‌گذارد می‌تواند سطح بالایی از اعتماد به نفس داشته باشد که به درستی کار می‌کند.