لایه انتزاعی

در رایانش، یک **لایه انتزاعی** یا یک **سطح انتزاعی** راهی برای پنهان کردن جزئیات کاری یک زیرسیستم است که امکان تفکیک دغدغه‌ها را برای تسهیل هم‌کنش‌پذیری و نرم‌افزار چندسکویی فراهم می‌کند. نمونه‌هایی برای مدل‌های نرم‌افزاری که از لایه‌های انتزاعی استفاده می‌کنند عبارتند از مدل اتصال متقابل سامانه‌های باز برای پروتکل ارتباطات، اوپن‌جی‌ال و کتابخانه‌های گرافیکی.

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

یک لایه در صورتی که به لایه دیگری بستگی جفتگری (دانش رایانه) داشته باشد، آن لایه بالای آن در نظر گرفته می‌شود. هر لایه می‌تواند بدون لایه‌های بالای آن وجود داشته باشد وبه لایه‌های زیر برای عملکرد مناسب نیاز دارد. لایه‌های انتزاعی مکرراً می‌توانند در سلسله مراتبی از سطوح انتزاعی تشکیل شوند. مدل مک‌اواس شامل هفت لایه انتزاعی است. هر لایه از این مدل بخش متفاوتی از نیازهای ارتباطات دیجیتال را در بر می‌گیرد و آدرس دهی می‌کند و در نتیجه پیچیدگی راه حل‌های مهندسی مرتبط را کاهش می‌دهد.

جمله معروف دیوید ویلر این است که «همه مشکلات در علوم کامپیوتر را می‌توان از راه غیر مستقیم حل کرد». و این جمله معمولاً به عمد اشتباه نقل می‌شود و «انتزاع» جایگزین «غیر مستقیم» می‌شود. همچنین گاهی اوقات این جمله به اشتباه به باتلر لامپسون نسبت داده می‌شود. نتیجه‌گیری کولین هنی این است: «... به غیر از مشکل لایه‌های غیرمستقیم و زیاد.»

## معماری کامپیوتر
در معماری کامپیوتر، یک سیستم کامپیوتری معمولاً متشکل از چندین سطح انتزاعی مانند:
* نرم‌افزار
* منطق قابل برنامه‌ریزی
* سخت‌افزار

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

## ورودی و خروجی
در سیستم عامل یونیکس، بیشتر عملیات ورودی و خروجی به عنوان جریان بایت‌ها یی در نظر گرفته می‌شوند که از یک دستگاه خوانده می‌شوند یا روی یک دستگاه نوشته می‌شوند. این مدل جریان بایت برای I/O فایل، سوکت I/O و ترمینال I/O برای ایجاد استقلال در دستگاه استفاده می‌شود. برای خواندن و نوشتن در سطح برنامه یک دستگاه، برنامه یک تابع را برای باز کردن دستگاه فراخوانی می‌کند که این دستگاه ممکن است یک دستگاه واقعی مانند یک ترمینال یا یک دستگاه مجازی مانند یک پورت شبکه یا یک فایل در یک سیستم فایل باشد. ویژگی‌های فیزیکی دستگاه توسط سیستم عامل مشخص می‌شود که یک رابط انتزاعی را که به برنامه‌نویس اجازه می‌دهد تا بایت‌ها را از دستگاه بخواند و در دستگاه بنویسد ارائه می‌دهد. سپس سیستم عامل تبدیل نهایی مورد نیاز برای خواندن و نوشتن جریان بایت‌ها در دستگاه را انجام می‌دهد.

## گرافیک
اکثر کتابخانه‌های گرافیکی مانند OpenGL یک مدل دستگاه گرافیکی انتزاعی را به عنوان رابط ارائه می‌دهند. کتابخانه مسئول ترجمه دستورات ارائه شده توسط برنامه‌نویس به دستورات قابل فهم برای دستگاه است که برای ترسیم عناصر و اشیاء گرافیکی به آن نیاز دارد. دستورات قابل فهم برای دستگاهی مانند یک پلاتر با دستورات دستگاه برای مانیتور لامپ پرتوی کاتدی متفاوت است، اما کتابخانه گرافیکی جزئیات وابسته به دستگاه و پیاده‌سازی را با ارائه یک رابط انتزاعی که مجموعه ای از موارد اولیه را ارائه می‌دهد و برای ترسیم اشیاء گرافیکی مفید هستند، پنهان می‌کند.

## بیشتر
* رابط برنامه‌نویسی برنامه (API)
* رابط باینری برنامه (ABI)
* کامپایلر، ابزاری برای انتزاع بین کد منبع و کد ماشین
* انتزاع سخت‌افزاری
* پنهان کردن اطلاعات
* لایه (طراحی شی گرا)
* حلقه محافظ
* سیستم عامل، یک لایه انتزاعی بین یک برنامه و سخت‌افزار کامپیوتر
* مهندسی نرم‌افزار

رده:تجرید
رده:معماری رایانه