یک نکتهی تکمیلی: آشنایی با مفهوم «C# Lowering»
در این مطلب، جهت بررسی درک علت یکسان بودن کارآیی حلقههایی که از دیدگاه ما یکی نیستند، از قابلیت نمایش #Low-level C استفاده شد که نام اصلی آن «C# Lowering» است. Lowering به معنای ترجمهی امکانات سطح بالای یک زبان به امکانات سطح پایین آن است. یعنی حاصل عملیات صورت گرفته نیز باز به همان زبان اولیه است که نمونهی آن، تبدیل یک حلقهی foreach سطح بالا به نمونهی سطح پایینی است که توسط NET Runtime. بهتر درک شده و سادهتر اجرا میشود.
مزایای Lowering
- بهبود کارآیی برنامه: برای مثال یکی از کارهایی که در این بین عموما انجام میشود «Loop unrolling» است. یعنی یک حلقه به چندین حلقهی کوچکتر تقسیم میشود تا سربار instructions کنترلی حلقه کاهش پیدا کنند.
- طراحی سادهتر زبان: اینکار به تیم طراحی زبان امکان نوشتن کدهای اضافهتری را میدهد که کار برنامه نویسها را کمتر میکند. برای مثال یک record واقعا چیزی نیست بجز یک کلاس پیاده سازی کنندهی IEquatable به صورت خودکار و در پشت صحنه.
Lowering چه زمانی رخ میدهد؟
Lowering جزئی از عملیات صورت گرفتهی در حین کامپایل است. زمانیکه دستور dotnet build را صادر میکنیم، ابتدا semantics & syntax analysis صورت میگیرد تا اگر برای مثال خطای دستوری وجود دارد، مشخص شود. سپس کدها به CIL یا Common intermediate language تبدیل میشوند. در حین این قسمت است که عملیات lowering نیز انجام میشود.
اگر علاقمند به مشاهدهی این کد #C ثانویهی تولید شدهی توسط کامپایلر هستید، میتوان از ابزار https://sharplab.io نیز استفاده کرد. برای مثال در سمت چپ آن کدهای زیر را قرار دهید:
using System;
using System.Collections.Generic;
var list = new List<int> { 1, 2 };
foreach(var item in list)
Console.Write(item);
سپس در سمت راست آن، گزینهی #Results C را انتخاب کنید تا بتوانید نمونهی معادل تبدیل شدهی توسط کامپایلر را مشاهده نمائید.