مدتی بود که موقع کد زدن توی VS Code توجهم به این جلب شده بود که بهصورت خودکار انتهای هر فایل یک خط خالی اضافه ایجاد میشه. اولش فکر کردم اشتباه از منه و بعد نوشتن خط آخر اینتر زدم، برای همین سعی کردم خط خالی اضافی رو پاک کنم. اما تلاشهام جواب نداد، چون هر دفعه دوباره سروکلۀ این خط کذایی پیدا میشد. دیگه بیخیالش شدم تا اینکه چند روز پیش کدی رو کامیت کرده بود و بازبین کدم بهم پیام داد و گفت امین، آخر این فایلها خط خالی نذاشتی. پرسیدم اصلاً چرا باید همچین کاری کنیم؟ که قرار شد خودم بگردم و علتش رو پیدا کنم. بیاین ببینیم این قاعده از کجا اومده.
خط جدیدی که خط جدید نیست!
ما برای رفتن به خط جدید از کاراکتر خط جدید (newline) استفاده میکنیم که در سیستمهای یونیکسی یا شبهیونیکسی با n\ مشخص میشه. این کاراکتر در ظاهر دقیقاً همون کاری رو میکنه که از اسمش بر میآد و ما رو به خط جدید میبره، اما در واقع این کاراکتر خط جدید رو مشخص نمیکIنه، بلکه انتهای خط قبلی رو مشخص میکنه (که بهش End of Line یا بهاختصار EOL هم گفته میشه). این دقیقاً چیزیه که توی استاندارد POSIX توی تعریف خط (Line) بهش اشاره شده:
مجموعهای از صفر کاراکتر یا بیشتر که newline نیستند و به یک کاراکتر newline ختم میشوند.
در واقع کاراکتر newline مشخص میکنه که یک خط کجا تموم میشه و از اونجا به بعد باید یک خط جدید در نظر گرفته بشه.
حالا بر اساس همین استاندارد POSIX توی سیستمعامل یونیکس، یک فایل متنی به فایلی گفته میشه که از مجموعهای خط تشکیل شده که هرکدوم به یک کاراکتر newline ختم شدند. در نتیجه اگر یک فایل متنی داشته باشیم که به newline ختم نشده باشه، میشه اون رو فایل متنی در نظر نگرفت. همین ممکنه حین کار با بعضی ابزارها مشکل ایجاد کنه، چون شاید اون فایل رو یک فایل متنی تشخیص ندن یا اینکه خط پایانی به کل تشخیص داده نشه (چون کاراکتر newline رو در انتهاش نداره) و نادیده گرفته بشه.
برخی کامپایلرهای قدیمی ++C، اگر فایلی با newline تموم نشه، هنگام کامپایل با خطا مواجه میشن، هرچند توی کامپایلرهای مدرن این مشکل وجود نداره. از طرفی توی زبان C همچنان رعایت این قاعده که هر خط باید با یک newline تموم بشه، الزامیه (استاندارد C24 – بخش 7.23.2§). زبانهای دیگه احتمالاً مشکلی با این موضوع ندارند، اما برای یکدستی و سازگاری با نسخههای قبلی، همچنان بین برنامهنویسها این قاعده رعایت میشه.
جدا از اینها، رعایت این نکته هنگام کار با بعضی ابزارها، مثل cat، کار رو راحتتر و احتمال اشتباه رو کمتر میکنه. برای نمونه فرض کنید دو فایل file1.txt و file2.txt رو داشته باشیم که با یک خط خالی تموم نشده باشند. اگر دستور cat رو برای هر کدام جداگانه اجرا کنیم، خروجی درستی میگیریم، اما اگر بخوایم دستور اجرای گروهی بدیم، نتیجه چیزی متفاوت از انتظار ما خواهد بود:
$ cat file1.txt this is file 1 $ cat file2.txt this is file2 $ cat file1.txt file2.txt This is file1this is file2
حالا شما هم مثل من میدونین که چرا این قاعده بین برنامهنویسها رواج داره و من هم دیگه فکر نمیکنم مشکل از VS Code بیچاره است که آخر هر فایل یک خط خالی ایجاد میکنه 😁
دیدگاهتان را بنویسید