اصل ماجرا

اپل مفسر Hinting فونت‌های TrueType را از C به سوئیفت بازنویسی کرد. این نسخه حافظه‌امن است، با پوشش تست ۹۹٫۷٪ و فاز فازر، عملکرد را ۱۳٪ بهبود داد. کد منبع به صورت باز در گیت‌هاب منتشر شد.

متن کامل ترجمه‌شده

Swift at Apple: Migrating the TrueType Hinting Interpreter TrueType یک استاندارد ورق ورق برای rendering متن در صفحات وب، PDFs، سیستم عامل و برنامه های کاربردی است. ورق های معروف مانند Helvetica، Garamond و Monaco همه بر روی ورق های TrueType ساخته شده اند. فرمت یک ورق ورق را مشخص می کند که برای کمک به ورق ها را به طور اعتباری بر روی ورق های با کیفیت پایین استفاده می کند. ورق های مدرن با کیفیت بالا اجازه می دهد تا ورق های زیبا را از ورق ها تنها ایجاد کنند، اما ورق های TrueType که نیاز به ورق برای rendering را به صورت قابل خواندن دارند، در حال استفاده هستند و ما همچنان آنها را پشتیبانی می کنیم. ورق های ورق ها اطلاعات را از منابع غیر قابل اعتماد پردازش می کنند، تا وربرای پیوستن به این پست، ما همچنین کد منبع متون Swift TrueType را منتشر کردیم. ما امیدواریم که به اشتراک گذاری تجربه ما به دیگران کمک کند که کار مشابهی در Swift انجام دهند. TrueType و موتور متون اپل TrueType را در اواخر دهه 1980 توسعه دادند و با راه اندازی سیستم 7 در سال 1991 منتشر کردند. TrueType یک پیشرفت بزرگ برای زمان بود: آن را به توسعه دهندگان کلمات کلیدی کنترل بزرگی در مورد چگونگی نمایش گلیف ها داد، با یک الگوریتم پیشرفته نصب گلیف و یک موتور متون متون پیچیده ساخته شده در اطراف یک متون کلمات با هدف ویژه. TrueType این کار را در کامپیوتر هایی که بسیار کمتر قدرتمند از امروز بودند انجام داد، بنابراین باید برای عملکرد بسیار خوب تنظیم شده بود. سپس اینترنت انقلاب کرد که چگونه کلمات کلیدی مورد استفاده قرار گرفت.اسطوره های TrueType ممکن است شامل برنامه هایی باشند که موتور راهنمایی از طریق یک مترجم بایتکوید اجرا می شود. این مترجم شامل جریان کنترل مبتنی بر واردات، ساختار داده های پیچیده و مدیریت حافظه دقیق است - دقیقاً نوع کدی است که سخت است تا کامل شود و در آن اشتباهات حافظه آسان تر از دست داده شود. این پیچیدگی طبیعی بالا نیز درست بودن را به ویژه مهم می سازد. بازنویس در Swift یک بازنویس نیاز به یک زبان ایمن از حافظه است که می تواند به پایگاه کد موجود درآورده شود و سطح عملکرد مشابهی را به اجرای که آن را جایگزین می کند ارائه دهد. Swift انتخاب آشکار برای این کار بود. سازگاری باینری برای موفقیت این پروژه بسیار مهم بود: برنامه های موجود باید همچنان همانطور که قبلا انجام می دادند، به طور موثر بدون دانستنهشدار می تواند ظاهر گلیف در صفحه نمایش را تغییر دهد، بنابراین یک تغییر کوچک در رفتار مترجم می تواند منجر به تغییرات قابل توجهی برای کاربران شود. برای این پروژه، ما درست بودن را به معنای سازگاری دقیق با تولیدات اجرای C تعریف کردیم. تایید درست بودن برای اطمینان از درست بودن، ما دو مجموعه آزمون را توسعه دادیم. اول یک مجموعه آزمایش واحد بود که می تواند هر دو اجرای را هدف قرار دهد، ارائه پوشش کد کامل (99.7%) برای هر دو. این مجموعه با نسخه منبع باز مترجم Swift شامل شده است. سپس، برای نشان دادن بارگذاری های کار واقعی، ما از یک Fuzzer استفاده کردیم تا یک corpus از 10 میلیون فایل PDF را به 4.200 کاهش دهیم بدون از دست دادن پوشش کد. اسناد در corpus کوچک شده 25,572 فرمت با مجموع 27 میلیون گلیف که با استفاده از چهار تغییرات مختلف انجام دادیم، هردر پایان پروژه، ما تقریباً چهار برابر تعداد خطوط کد تست را برای ترجمهگر Swift نوشتیم. رسیدن به عملکرد بالا هنگامی که اجرای جدید ما تمام آزمایش های خود را از دست داد، ما توجه خود را به عملکرد اختصاص دادیم. ما عملکرد را در سطح بالا با استفاده از زمان rendering PDF ارزیابی کردیم و سپس در بهبود های هدایت شده توسط استانداردهای که تمام گلیف ها را از سه فرمت مختلف نشان می دادیم تکرار کردیم. این بهبود ها به چهار دسته اصلی افتاد. کاهش زمان اجرا بیش از حد Swift از محاسبه اتوماتیک برای مدیریت طول عمر انواع اشاره مشترک استفاده می کند، و بررسی منحصر به فرد زمان اجرا برای جلوگیری از پوشش دسترسی به ساختار داده ها.این منابع فراوانی را می توان از راحتی کپی سازی جلوگیری کرد، با استفاده از انواع ارزش های کپی سازی (به عنوان مثال: struct به جای کلاس) در سراسر معماری، از نوع های اشاره برای اختراع های سطح بالا استفاده می شود. Span، که در Swift 6.2 با پشتیبانی پشتیبان در سراسر راه به macOS 10.14.4 و iOS 12.2 معرفی شده است، به ما اجازه می دهد تا به طور موثر بر روی سلسله های این انواع کار کنیم. انتقال داده ها گاهی اوقات ما می خواهیم شکل داده های ساختار شده را در هنگام عبور از مرزهای زبان تغییر دهیم تا بهتر با آییدومها در طرف دیگر مطابقت داشته باشیم. در Swift، خلاصه های گلیف توسط یک سری نقاط نشان داده می شوند، که هر یک از آنها یک پرچم را برای اینکه آیا آن را در یک حلقه پرچم، برای اینکه آیا آن را در هر اکسی «این از نظر عملکرد خوب است زیرا دوستانه به کیش است: شما می توانید بر روی یک اندازه از بسیاری از نقاط در اجراهای طولانی، که سریع است، کار کنید. اما نشان دادن داده ها در Swift به عنوان یک مجموعه از عناصر نقطه منجر به کد منبع که آسان تر از پیروی شده بود. کد پلنگ چند زبان اولیه که ما نوشتیم، به سرعت، امنیت و ساده تر را با کپی کردن داده های گلیف از ساختار C به Swift و سپس پس از تکمیل برنامه به عقب برمی گردانید. در ابتدا، این کپی ها حدود 20٪ از زمان اجرا مترجم جدید را تشکیل می دادند. در نهایت ما با استفاده از انواع پیش بینی که دسترسی امن به ساختار C زیر را فراهم می کند.به دنبال دستورالعمل های Safer Swift از WebKit، مثال زیر نشان می دهد که چگونه یک ساختار پل شده از C را در یک نوع پیش بینی که از Ref برای امنیت طول عمر استفاده می کند، بروکرها دسترسی امن به داده های زیرزمینی را محدود می کند و انواع Swift را به خوانندگان خود باز می گرداند. همه اشکال غیر امن // SAFETY: نظرات که غیر قابل اطمینان را ثبت می کنند و دلیل را تضمین می کند که آنها درست هستند. @safe struct Zone: ~Copyable, ~Escapable { let _element: Ref\URL_0} @_lifetime(copy element) init(wrapping element: Ref\URL_1) { // SAFETY: the fnt_ElementType passed by the caller must satisfy: // * sp, ~ep at pointep // خطوط زنده طول maxContourCount برای init(wrapping:) محدوده است. بازگشت غیر امن Int(_element.value.sp[index])…Int(_element.value.ep[index] ) } توزیع کوتاه عمر در حالی که بر اساس زمان اجرا هزینه های خود را در مجموع، و کپی کردن داده ها در سراسر مرز زبان به عنوان یک نقطه گرم مشخص ظاهر می شود، هزینه های توزیع حافظه کوتاه عمر می تواند در هر دو راه ظاهر شود. عملیات مانند فیلتر و allocate allocate حافظه، اما این توزیع فقط لازم است اگر ارزش فرار می کند. کتابخانه استاندارد Swift ارائه می دهد .lazy.map و .lazy.filter، اما آنها در هر صورت کار نمی کنند. برای منطق که فقط بر روی نقشه فیلتر یا، آن را تکرار می کند،اجرای آشکار این عمل باید فضای را برای عناصر که آن را باز می گرداند اختصاص دهد (به خاطر این که عملکرد همزمان آنها را حذف می کند) و به نظر می رسد چیزی مانند: تغییر فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآیند فرآینداستخراج(پایان: n)) } مکانیسم اختراع دیانتیک مانند پروتکل ها، ژنرییک ها و میراث بسیار قدرتمند هستند، اما آنها یک روش تماس غیر مستقیم را معرفی می کنند که ممکن است در زمان اجرا به عنوان ارسال دیانتیک ظاهر شود. این فراخوردگی اغلب می تواند توسط اختراع حذف شود، اما این در تمام شرایط امکان پذیر نیست. در مورد ما، ایجاد اختراع های بیشتر ژنریایی از آنچه لازم است و تشویق زنجیره ابزارهایی به نامناسب برای اختراع به اندازه کافی برای اختراع برای بررسی محدودیت ها و تخصص تمام زمینه های ژنرییک ما است. هنگامی که شما کد خود را پروفایل می کنید، اگر شما ژنرییک های غیر تخصصی یا جدول های گواهینامه پروتکل را در مسیر های گرم ببینید، این نشانه ای است که اختراع برای بهینه سازی سایت های تماسدر این نقطه، هر کس که عادت دارد بهبود عملکرد را در یک پروژه انجام دهد، ممکن است به طور منطقی انتظار داشته باشد که بهبود های ما به هزینه خواندن برسد، اما در واقع سیستم نوع Swift و بهینه سازی ما را قادر به استفاده از مفاهیم است که منجر به کد قابل خواندن بالا شد. به عنوان مثال: - FixedPointtypes همان ارگومونیک را ارائه می دهد که نوع های جامع است، بسته بندی پیچیده و تغییر ارگومیک. - StackElementبرای دسترسی به ارزش های 32 بیتی با تبدیل های ساخته شده برای همه هشت نوع شماری که پشتیبانی می شود. - نوع های پیش بینی ما دسترسی امن و طبیعی به داده ها را ارائه می دهد که با توجه به این عوامل ساختار نشده است. سیستم نوع Swift اجازه می دهد تا مفاهیم قدرتمند و بیانگر را تعریف کند.حافظه ای امن و سریع تر از C هدف ما برای این پروژه این بود که مترجم راهنمایی TrueType به طور کامل از حافظه ای محافظت کند، همان رفتار نشان دادن قابل مشاهده را با اجرای C داشته باشد، و سطح عملکردی را به دست آورد که هیچ معیار قابل مشاهده کاربران را رد نکند. ما این اهداف را برآورده کردیم. مترجم Swift شامل تعداد کمی از بیانات غیر امن به طور کامل در مرز interop زبان تایید شده است؛ از آن زمان که آن را فعال کرده است، هیچ اشتباه گزارش نشده است؛ و سریع تر است. به طور متوسط، مترجم Swift 13٪ سریع تر از مترجم C را که آن را جایگزین کرده است اجرا می کند. در اینجا یک گرافیک نشان می دهد که متوسط CPU megacycles را در هر گلیف در اجرای Swift نسبت به اجرای C برای تمام فرمت های راهنمایی که در macOS حمل می شود، علاوهتمام وضعیت داخلی مترجم جدید در مورد ساختارهای غیر کاپی شده که توسط فعالیت های آن قرض شده بودند نوشته شده است، اما نوع سطح بالا خود را یک کلاس @objc است که از یک فایل Objective-C++ از مرز ماژول فراخوانده می شود. مسیرهای گرم سریع است و مسیرهای سرد مناسب است. سریع در عمل زبان Swift این پروژه را امکان پذیر کرد. Swift دارای حافظه ای امن، ارگومونیک عالی است و می تواند به عنوان سریع به عنوان دقت نوشته شده C. این باعث می شود آن را یک زبان عالی برای هر دو برنامه و توسعه سیستم. کد با استفاده از انواع غیر کاپی، انواع ارزش، و Span هر دو به طور استاندارد امن و سریع است، و نوع های ماژول خصوصی می تواند به طور جمعانه برای تعریف یک معماری بدون هزینه اضافی استفاده می شود. همراه با پوشش کامل تست، این محدودیت های رابط داخلی به خوبی تعریف شدهپس از اتمام مهاجرت، ما آنچه را که ما آموخته ایم را به دستورالعمل ها برای کمک کنندگان رمزنگاری LLM متصل کردیم و از آن زمان آنها را با موفقیت در پروژه های دیگر مورد استفاده قرار داده ایم. LLM ها بهره وری کار تیم ما را با تبدیل C/C++ به Swift بهبود بخشیدند و در انجام نوع تحول های کد مورد استفاده در این تلاش ارزشمندی ثابت کرده اند. برای همراهی با این پست، ما کد منبع برای Swift TrueType تسبیح مترجم را در GitHub منتشر کرده ایم. این کد تولیدی است که به عنوان یک اجرای مرجع به جای یک پروژه منبع باز در حال حاضر طراحی شده است. ما امیدواریم ببینیم که چگونه این تکنیک ها در عمل به دیگران کمک می کنند تا نتایج مشابهی به دست آورند.

چرا مهمه؟

پیشین، مفسر C در معرض خطاهای حافظه بود و می‌توانست به حملات منجر شود. حالا سوئیفت با ایمنی حافظه این خطر را حذف کرد؛ توسعه‌دهندگان فونت، تیم‌های امنیت و کاربران نهایی تحت تأثیر قرار گرفتند. خواننده باید به این خبر اهمیت بده چون امنیت سیستم‌های macOS و iOS ارتقا یافت و سرعت رندر متن در برنامه‌ها بهتر شد.

به درد کی می‌خوره؟

• توسعه‌دهندگان فونت • مهندسان امنیت • تیم‌های iOS/macOS • برنامه‌نویسان سوئیفت • مدیران فنی

تو عمل چی کار کنیم؟

با دانستن این تغییر، می‌توانید به‌روز رسانی‌های سیستم‌عامل را سریع‌تر نصب کنید و از بهبود امنیت و سرعت رندر متن بهره‌مند شوید. اگر در پروژه‌های خود از فونت‌های TrueType استفاده می‌کنید، نیازی به نگرانی دربارهٔ خطاهای حافظه ندارید و می‌توانید به سادگی به سوئیفت مهاجرت کنید.

نظر Blue IT News

این گام نشان می‌دهد سوئیفت دیگر فقط برای برنامه‌های سطح کاربری نیست؛ می‌تواند به‌عنوان زبان سیستمی برای بخش‌های حساس هم به کار رود.

این صفحه ترجمه و تفسیر کاملی از گزارش اصلی Swift است که توسط تیم تحریریه بلو آی تی نیوز به فارسی ترجمه و تحلیل شده. برای مشاهده نسخه اصلی، به منبع مراجعه کنید.