بستههای نرمافزاری چه هستند و چرا به آنها نیاز داریم؟
هنگامی که توزیع لینوکس خود را نصب میکنید، اکثر نرمافزارهای مورد نیازتان همراه آن نصب میشود. ولی با این حال پیش میآید که نیاز به بستههای دیگری داشته باشید و یا بستههای نرمافزارهای موجود را بخواهید به نسخههای جدیدتر ارتقا دهید. در چنین مواردی است که باید بستههای جدید را روی CD و یا از اینترنت دریافت نموده و نصب نمایید.
بستههای نرمافزاری کار نصب نرمافزارهای کاربردی را در لینوکس آسان کردهاند. دیگر لازم نیست برای نصب هر نرمافزار، کاربر کدهای منبع را دریافت کرده، آنها را کامپایل نموده و نصب کند. کاری که بسیاری از کاربران از انجام آن ناتوان هستند.
همانطور که متوجه شدید، بستههای نرمافزاری حاوی برنامههای قابل اجرا و آماده برای نصب هستند. ممکن است در اینترنت به انواع مختلفی از بستههای نرمافزاری برخورد نمایید که البته همه آنها حاوی نرمافزارهای آماده برای نصب نیستند که جلوتر درباره آنها توضیح خواهم داد. پر کاربردترین بستههای آماده نصب نرمافزارهای کاربردی، بستههای نوع rpm و deb هستند. در این مقاله ما به بررسی بستههای نرمافزاری با فرمت rpm و مدیریت آنها خواهیم پرداخت و در مقاله جداگانهای، مدیریت بستههای deb را که مخصوص لینوکس debian و توزیعهای مبتنی بر آن است را بررسی خواهیم کرد.
درک نامگذاری و فرمت بسته های نرمافزاری
وقتی بسته ای را از اینترنت دانلود میکنید، میبینید که از یک نام، تعدادی شماره، نقطه، gz و tar تشکیل شده است. خوب اینها چه معنی دارند؟ ابتدا این اعداد و حرفها پیچیده به نظر میرسند در صورتی که اگر برایتان شرح داده شوند، بسیار ساده هستند. پس از مدتی به این شیوه نامگذاری عادت خواهید کرد. بیشتر بسته های نرمافزاری لینوکس از قاعده نامگذاری GNU استفاده میکنند. مثالهای زیر فرمتهای گوناگون بسته های نرمافزاری را نشان میدهد :
mycoolapp-4.2.3.i386.rpm
mycoolapp-4.2.3.tar.gz
mycoolapp-4.2.3.src.tar.gz
mycoolapp-4.2.3.bin.SPARC.tar.gz
mycoolapp-4.2.3.bin.ELF.static.tar.gz
این مثالها بسته های مختلف یک نرمافزار هستند. نام این بسته نرمافزاری mycoolapp است. پس از نام بسته ، شماره نسخه آن که 4.2.3 است قرار دارد. اولین شماره شماره اصلی یا major، دومین شماره شماره فرعی یا minor و آخرین شماره شماره وصله یا patch است. پس از شماره نسخه، نقطه ای قرار دارد که بعد از آن بخش های انتخابی قرار دارند که نشانگر محتوای بسته و چگونگی فشرده سازی آن هستند.
خط نخست یک بسته نرمافزاری rpm را نشان میدهد. rpm مخفف Redhat Package Manager است. i386 که قبل از rpm قرار دارد، نشان دهنده این است که بسته حاوی نرمافزار اجرایی برای کامپیوترهای PC معمولی است. فرمت rpm که ابتدا توسط Redhat ارائه شد، اکنون تبدیل به یک استاندارد برای پخش بسته های نرمافزاری لینوکس شده است. ببیشتر توزیعهای لینوکس مانند ردهت، زوزه، ماندریک و... از این سیستم بسته بندی نرمافزار استفاده میکنند.
rpm در مقابل کد منبع
بسته هایی که بصورت فرمت rpm ارائه میشوند به سادگی قابل نصب بوده و برداشتن آنها نیز به سادگی امکان پذیر است. برای مدیریت بستههای rpm هم ابزارهای گرافیکی و هم ابزارهای متنی وجود دارند. در صورتی که در دنیای لینوکس تازه کار هستید، همیشه سعی کنید از این فرمت برای دریافت نرمافزارها استفاده نمایید.
- RPM: نصب نرمافزارها با استفاده از بستههای rpm بسیار آسان است. برای نصب یک بسته rpm شما نیازی به دانستن اطلاعاتی در مورد makefile ها و کامپایلرها ندارید. همانطور که در بالا نیز اشاره کردم، ابزارهایی نیز برای مدیریت این بستهها فراهم آمده است. هنگامی که یک بسته rpm را نصب میکنید، ابزارهای rpm سایر نرمافزارهای احتمالی مورد نیاز این بسته را نیز بررسی کرده و در صورت نیاز به نصب بسته دیگری به شما اعلام میکنند.
- کد منبع (Source Code) : برخی اوقات تا ایجاد بسته های rpm یک نرمافزار، مدتی طول میکشد. در این مواقع باید از کد منبع آن استفاده کنید. همچنین میتوانید با ایجاد تغییراتی در کد منبع نرمافزار، آنرا برای خود مناسبتر کنید. اکثر کاربران حرفه ای لینوکس کار کردن با کد منبع را ترجیح میدهند.
خوب به مثال بالا برمیگردیم. در دوخط بعدی بستههایی قرار دارند که حاوی کد منبع نرمافزار هستند. هـمـانطور که مـیبـینید، این بستهها توسط دستور tar آرشیو شده (tar) و توسط دستور gzip فشرده شدهاند (gz). شما از این دو فرمان برای باز کردن و خارج کردن از حالت فشردگی بستههای نرمافزاری استفاده خواهید کرد.
بین شماره های نسخه و پسوند های tar.gz بخش های اختیاری میتوانند قرار گیرند. این بخش ها توسط نقطه از هم جدا میشوند و اطلاعات خاصی مانند نوع پردازندهای که کدهای اجرایی بر روی آنها اجرا خواهد شد، نوع کدهای اجرایی و ... را فراهم میکنند. برای مثال bin.SPARC نشان میدهد که بسته حاوی کدهای اجرایی است که بر روی ایستگاههای کاری مبتنی بر پردازندههای SPARC اجرا خواهد شد.
استفاده از انواع گوناگون آرشیوها و فرمت مستندات
بسیاری از بستههای نرمافزاری که به یک توزیع خاص (مانند ردهت، SuSE، Debian و...) وابسته نیستند از روش tar/gzip برای فشرده سازی و آرشیو کردن فایلها استفاده میکنند. البته ممکن است در سایتهای FTP لینوکس به فرمتهای دیگری نیز بر بخورید. لازم به ذکر است که برخی از این فایلها مستندات همراه نرمافزار بوده و کد منبع یا اجرایی نیستند.
جدول ۱ فرمت های مختلف فایلی که شما هنگام چرخش در سایتهای FTP لینوکس مشاهده خواهید کرد و جدول ۲ برخی فرمتهای رایج مستنداتی که همراه با نرمافزارهای لینوکس ارائه میشوند را نشان میدهد.
برای اینکه بدانید یک فایل دارای چه فرمتی است، میتوانید از دستور file استفاده کنید. به مثال زیر توجه کنید :
$ file telnet.htm
telnet.htm: HTML document text
|
فرمت |
پسوند |
شرح |
|
Gzip file |
gz or .z |
این فایل با استفاده از ابزار GNU gzip فشرده شده است. این فایل توسط ابزارهای gzip یا gunzip باز خواهد شد. |
|
Tar File |
tar |
این فایل با استفاده از دستور tar آرشیو شده است. این فرمان برای ایجاد یک بسته از چند فایل بکار میرود. برای باز کردن این آرشیو از خود دستور tar استفاده میشود. |
|
Bzip2 |
bz2 |
این فایل با استفاده از برنامه bzip2 فشرده شده است. میزان فشرده سازی این برنامه از gzip بیشتر است. |
|
Tar/compressed |
taz or .tz |
این فایل توسط دستور compress یونیکس فشرده شده است. |
|
Linux Software Map |
lsm |
این فایل حاوی متنی است که محتویات یک آرشیو را نشان میدهد. |
|
Debian binary package |
deb |
این فایل یک بسته نرمافزاری است که توسط ابزارهای لینوکس debian ایجاد شده است. |
|
Redhat Package Manager |
rpm |
این فایل بسته نرمافزاری است که با استفاده از ابزارهای rpm ایجاد شده است و غیر از ردهت، توسط توزیع کنندگان دیگر لینوکس هم استفاده می شود. |
جدول ۱ انواع فرمت بستههای نرمافزاری لینوکس
نصب برنامه های کاربردی در لینوکس ردهت
بیشتر برنامه هایی که نیاز به نصب آنها دارید، به صورت فرمت rpm موجود هستند. در صورتی که هیچ بسته rpm ای برای نرمافزار مورد نظرتان پیدا نکردید، میتوانید از کد منبع نرمافزار استفاده کنید و خودتان نرمافزار مورد نیاز را کامپایل و نصب کنید.
|
فرمت |
پسوند |
شرح |
|
Hypertext Markup Language |
.html |
این فرمت شناخته شده را میتوانید در هر مرورگر وبی بخوانید. |
|
PostScript |
.ps |
یک فایل پست اسکریپت برای ارسال به یک چاپگر پست اسکریپت. |
|
SGML |
.sgml |
فایلهای SGML برای ایجاد مستنداتی بکار میروند که آنها را میتوان به فرمتهای گوناگون تبدیل کرد. |
|
DVI |
.dvi |
این فرمت خروجی برنامه LaTeX است. با استفاده از فرمان dvilj میتوانید آنرا به PostScript یا HP PCL تبدیل کنید. |
|
Plain Text |
|
فایلهای بدون پسوند معمولا متنهای ساده با فرمت ASCII هستند. |
جدول ۲ انواع فرمت مستندات همراه بسته های نرمافزاری
نصب و مدیریت بسته های rpm
هنگامی که یک برنامه کاربردی که با فرمت rpm است به دستتان میرسد، این بسته معمولا فقط شامل یک فایل است. دستوری که شما برای مدیریت و استفاده از بسته های نرمافزاری rpm استفاده میکنید، دستور rpm است.
برای مدیریت بسته های rpm ، دستور rpm گزینههایی را برای لیست کردن بستههای نصب شده، ارتقا بستههای نصب شده، بدست آوردن اطلاعات از محتویات یک بسته و .... ارائه میکند. همچنین گزینههایی وجود دارند که توسط آنها میتوانید بررسی نمایید که کلیه فایلهای یک بسته نصب شده وجود داشته و تغییر نکرده باشند. دستور rpm در حالتهای زیر کار میکند:
- نصب نرمافزار (install) با گزینه i
-ارتقا نرمافزار (Upgrade) با گزینه U
- کسب اطلاعات از بسته (Query) با گزینه q
- چک کردن بسته (Verify) با گزینه V
- بررسی امضا بسته (Signature check) با گزینه checksig
- برداشتن بسته (Uninstall) با گزینه e
-ساخت بسته (Build) با گزینه b
-ساخت مجدد بانک اطلاعاتی (Rebuild Database) با گزینه rebuilddb
- تصحیح مجوزها (Fix Permissions) با گزینه setperms
- تعیین مالک/گروه (Set Owners/groups) با گزینه setugids
با استفاده از این گزینهها میتوانید بسته های rpm را نصب کرده، صحت نصب بسته ها را بررسی کنید و اشکالات احتمالی را برطرف نمایید.
|
|
استفاده از لیلو
یکی از پر استفادهترین و قدیمیترین برنامههای مدیر بوت لینوکس برنامهای به نام Lilo میباشد که نام آن مخفف Linux Loader میباشد. با وجودی که برنامه مدیر بوت GRUB دارای قابلیتهای بیشتری نسبت به لیلو است، ولی هنوز از لیلو در تعداد زیادی از توزیعهای لینوکس استفاده میشود.
در این مقاله چگونگی تنظیم مدیر بوت لیلو و همچنین چگونگی تغییر مدیر بوت کامپیوتر از لیلو به گراب و بلعکس را خواهید آموخت.
هنگامی که کامپیوتر شما با استفاده از مدیر بوت لیلو بوت میشود، ابتدا صفحهای گرافیکی ظاهر میشود و در آن پارتیشنهای قابل بوت (سیستم عاملهای) سیستمتان نشان داده میشوند. کافی است از کلیدهای بالا و پایین برای انتخاب سیستم عامل مورد نظر استفاده کرده و سپس کلید Enter را فشار دهید. در غیر اینصورت پس از چند ثانیه، سیستم با سیستم عامل پیشگزیده بوت خواهد شد.
در صورتی که مایلید هنگام بوت گزینههایی را به سیستمعامل ارسال نمایید، هنگام بوت کلیدهای Ctrl+X را فشار دهید. اعلان بوت متنی مشابه زیر مشاهده خواهید کرد:
boot:
لیلو چند ثانیه صبر کرده و سپس اولین image بوت را برای بوت شدن انتخاب میکند. در صورتی که مایلید دوباره لیست پارتیشنهای قابل بوت را مشاهده کنید، سریعا کلید Tab را فشار دهید. در اینصورت صفحه ای مشابه زیر مشاهده خواهید کرد:
LILO boot:
linux linux-up windowsxp
boot:
این مثال نشانگر وجود سه پارتیشن قابل بوت روی سیستم است که به ترتیب linux ، linux-up و windowxp نام دارند. دو گزینه اول نشانگر دو image بوت متفاوت هستند که با آنها میتوانید پارتیشن لینوکس خود را بوت کنید. گزینه سوم نشاندهنده پارتیشن ویندوز XP میباشد. در صورتی که هیچ کلیدی را فشار ندهید، پس از چند ثانیه سیستم با استفاده از گزینه اول بوت خواهد شد. برای اینکه سیستم را وادار به بوت با پارتیشن دیگر کنید باید نام آنرا جلوی اعلان بوت تایپ کنید.
در صورتی که در سیستمتان چند image بوت نصب شده است، با فشردن کلید Shift لیلو از شما سوال خواهد کرد که با کدام image بوت شود. Image های موجود و سایر گزینههای لیلو در فایل پیکربندی etc/lilo.conf ذخیره شدهاند.
آماده سازی فایل پیکربندی لیلو
لیلو اطلاعات مورد نیاز جهت پیدا کردن و بوت شدن از پارتیشن های قابل بوت را از فایل etc/lilo.conf بدست میآورد. بوسیله اضافه کردن گزینههایی به این فایل، میتوانید چگونگی بوت شدن سیستمتان را تغییر دهید. مثال زیر برخی از محتویات این فایل را نشان میدهد:
prompt
timeout=50
default=linux
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
message=/boot/message
linear
image=/boot/vmlinuz-2.4.23
label=linux
initrd=/boot/initrd-2.4.23.img
read-only
root=/dev/hda6
append=”hdc=ide-scsi”
other=/dev/hda1
label=windowsxp
با گزینه prompt on اعلان بوت همیشه هنگام بوت سیستم نشان داده خواهد شد و نیازی نیست برای ظاهر شدن آن کلیدی را فشار دهید. زمان انتظار بوت در مثال بالا ۵۰ دهم ثانیه یا ۵ ثانیه است. سیستم قبل از شروع بوت این مدت را برای فشار داده شدن کلید منتظر مانده و در صورتی که هیچ کلیدی فشار داده نشود، با سیستم عامل پیشگزیده بوت خواهد شد. خط بوت نشاندهنده این است که پارتیشن قابل بوت در dev/hda قرار دارد (اولین دیسک سخت).
خط نقشه (map) نشاندهنده محل فایل نقشه که حاوی موقعیت های فایلهای image بوت است، میباشد. خط install نشان میدهد که فایل boot/boot.b به عنوان سکتور بوت جدید مورد استفاده قرار گرفته است. خط message به لیلو اعلام میکند که هنگام بوت محتویات فایل boot/messages را نشان دهد. خط linear باعث فعال شدن آدرس دهی خطی بجای آدرس دهی سکتور/هد/سیلندر میشود. این قابلیت در دیسکهای سخت اسکازی کاربرد دارد.
در فایل مثال بالا دو پارتیشن قابل بوت وجود دارند. نخستین آنها (image=/boot/vmlinuz-2.4.23) نشاندهنده یک image بوت است که به نام linux نامگذاری شده است. سیستم فایل ریشه برای آن image در آدرس dev/hda6 قرار دارد. واژه فقط-خواندنی (Read-Only) نشان میدهد که سیستم فایل ابتدا بصورت فقط خواندنی متصل شده و پس از بررسی شدن امکان خواندن/نوشتن روی آن فعال میشود. خط initrd نشاندهنده محل فایل image مربوط به دیسک RAM که برای بوت سیستم استفاده میشود، است.
پارتیشن دوم قابل بوت که در این مثال با واژه other مشخص شده است، در dev/hda1 قرار دارد و همانطور که از نام آن پیداست پارتیشن مربوط به ویندوز XP میباشد.
سایر image های قابل بوت نیز میتوانند به این فایل اضافه شوند. شما میتوانید یک image جدید نصب کرده و با تغییر فایل پیکربندی لیلو آنرا فعال کنید.
پس از اینکه تغییرات مورد نظر خود را در این فایل اعمال کردید، باید دستور lilo را اجرا کنید تا تغییرات اعمال شوند. همانطور که قبلا گفته شد، داشتن چند فایل image هنگامی لازم است که میخواهید از چند هسته مختلف که دارای قابلیتهای متفاوتی هستند بطور همزمان استفاده نمایید. مراحل تغییرات در فایل پیکربندی لیلو بصورت زیر است:
۱.فایل image جدید را از دایرکتوری که ایجاد شده است (مثلا usr/src/linux/arch/i386/boot) به دایرکتوری boot کپی کنید. سـپـس اـین فـایل را طـوری نـامگذاری کنید که نشاندهنده محتویات آن باشد. مثلا zImage-2.6test11 .
۲.خطوط مربوط به این فایل را در فایل پیکربندی لیلو به نحوی اضافه کنید تا امکان انتخاب و بوت از طریق آن فراهم شود :
image=/boot/zImage-2.6test11
label=newlinux
۳. در حالی که با کاربر ریشه به سیستم وارد شده اید دستور lilo -t را اجرا کنید تا تغییرات داده شده آزمایش شده و صحت آنها تایید شود.
۴. دستور lilo را بدون هیچ سوئیچ و گزینهای اجرا کنید تا تغییرات اعمال شوند.
برای اینکه کامپیوتر با فایل image جدید بوت شود، در صفحه آغازین لیلو، newlinux را انتخاب نمایید و یا جلوی اعلان بوت نام newlinux را تایپ کنید. اگر احساس میکنید که زمان انتظار ۵ ثانیه مدت کمی است، میتوانید با افزایش عدد انتظار به ۱۰۰ مدت زمان انتظار را به ۱۰ ثانیه افزایش دهید.
گزینه هایی که شما میتوانید در فایل پیکربندی لیلو استفاده کنید، به سه دسته گزینههای سراسری (Global)، گزینههای Per-image و گزینههای هسته (Kernel) تقسیم شدهاند. مستندات زیادی برای لیلو تهیه شده است. برای کسب اطلاعات بیـشـتر در مورد گـزیـنههـایـی کــه ایـنـجا شـرح داده شـده اند و سایر گـزیـنـههـا مـیتوانـیـد از راهنـمـای لـیـلـو (دستور man lilo.conf) و یا مستندات موجود در usr/share/doc/lilo/doc استفاده کنید.
در زیر چند مثال برای گزینههای سراسری ارائه شده است. گزینههای سراسری این ویژگی را دارند که تاثیر خود را بر تمام لیلو اعمال میکنند و فقط بر یک image خاص تاثیر ندارند.
از گزینه default میتوانید برای مشخص کردن پارتیشن یا image پیش گزیده برای بوت شدن استفاده کنید. برای مثال:
default = newlinux
از گزینه delay می توانید برای تعیین زمان انتظار لیلو استفاده کنید. توجه داشته باشید که زمان وارد شده به دهم ثانیه میباشد. یعنی عدد ۵۰ نشانگر ۵ ثانیه است:
delay = 50
برای تغییر پیامی که قبل از اعلان لیلو قرار دارد، میتوانید پیامی را در فایلی ذخیره کرده و با افزودن گزینه message به فایل پیکربندی لیلو، آنرا فعال نمایید:
message=/boot/boot.message
تمام گزینههای Per-image بوسیله یک خط image که نشان دهنده یک هسته لینوکس است، یا other که نشاندهنده یک سیستم عامل دیگر – مانند ویندوز XP است، شروع میشوند. این گزینهها تنها بر روی همان هسته یا سیستم عامل تاثیر دارند. برخی گزینه های Per-image عبارتند از:
- Label : این گزینه نشان دهنده نامی است که شما در لیست لیلو مشاهده میکنید. امکان استفاده از نامهای با فاصله وجود ندارد.
- lock : ضبط خودکار، خط فرمان بوت را برای دریافت سایر گزینههای بوت فعال میکند.
- alias=name : با جایگزین کردن name بجای هر نامی میتوانید از آن به عنوان جایگزین نامی که در label تایپ کردهاید استفاده کنید.
- password=password : میتوانید image یا سیستم عامل مورد نظر را با کلمه عبور محافظت کنید. برای این کار جلوی گزینه password کلمه عبور مورد نظر خود را تایپ کنید.
- restricted : این گزینه به همراه گزینه password بکار میرود. در صورتی که آنرا بکار ببرید تنها هنگام ارسال گزینه به هسته از شما کلمه عبور درخواست خواهد شد.
همچنین برای هسته لینوکس گزینههای خاصی وجود دارند. این گزینهها به شما امکان انجام کارهایی مانند شناساندن برخی سخت افزارها، کنترل چگونگی اتصال سیستم فایل ریشه و ... را میدهند. برخی از گزینه های مخصوص هسته لینوکس عبارتند از :
- append : پس از این گزینه اطلاعاتی که میخواهید به هسته ارسال کنید را تایپ نمایید. این اطلاعات میتواند مانند اطلاعات سخت افزاری یاشد که برای شناساندن یک سخت افزار خاص به سیستمعامل بکار میروند.
- ramdiak : با این گزینه میتوانید سایز دیسک رمی که هنگام بوت تشکیل میشود را تعیین کنید تا بجای مقدار پیشگزیده هسته بکار رود.
- read-only : سیستم فایل ریشه را بصورت فقط-خواندنی متصل میکند. سیستم فایل ریشه در حالت عادی پس از چک شدن، بصورت خواندن-نوشتن متصل میشود.
- read-write : سیستم فایل ریشه را بصورت خواندن-نوشتن متصل میکند.
تغییر مدیر بوت کامپیوتر
در صورتی که مایل به استفاده از گراب نیستید و یا لیلو را آزمایش کردهاید و اکنون میخواهید دوباره گراب را فعال کنید، میتوانید به آسانی این کار را انجام دهید. برای تغییر مدیر بوت خود از گراب به لیلو مراحل زیر را انجام دهید:
۱.فایل پیکربندی لیلو را با توجه به مطالبی که گفته شد، تنظیم کنید.
۲. بصورت کاربر ریشه به سیستم وارد شده و در یک پنجره ترمینال دستور زیر را تایپ کنید:
# lilo
با تایپ این دستور رکورد بوت اصلی مجددا نوشته شده و لیلو فعال خواهد شد.
۳. کامپیوتر خود را راه اندازی کنید. اکنون باید صفحه آغازین لیلو را مشاهده کنید.
در صورتی که میخواهید برعکس این کار را انجام دهید، یعنی گراب را به جای لیلو فعال کنید، مراحل زیر را انجام دهید:
۱. فایل پیکربندی گراب را مطابق آنچه در بالا گفته شد تنظیم کنید.
۲. باید نام دیسکی که میخواهید گراب را در آن نصب کنید، بدانید. مثلا اگر میخواهید گراب را در رکورد بوت اصلی دیسک سخت اول نصب کنید، باید بصورت کاربر ریشه وارد سیستم شده و دستور زیر را تایپ کنید:
# grub -install /dev/hda
رکورد اصلی بوت مجددا نوشته شده و اکنون میتوانید از گراب استفاده کنید.
۳. کامپیوتر خود را راه اندازی کنید. اکنون باید صفحه آغازین گراب را مشاهده کنید.
|
در بسیاری کامپیوترها ،اعمال با دقت بالا بیشتر از اعمال با دقت کمتر وقت نمی گیرند .این باعث می شوند که مفاهیم شمارشی بالاترین دقت ممکن را برای اعمال داخلی موقتی به کار ببرند . فلسفه مورد بحث این نیست که زبان را به پائین مقسوم علیه سخت افزاری محدود کنیم بلکه آن را قادر به بهرهبرداری از بهترین توانایی های سخت افزار مورد نظر نماییم .
برای اعمال ممیز شناور و مقادیر واسطه دستورات یک دقت بالاتر می تواند به کار رود . تنها حد پایین دقت توسط نوع عملوندها مشخص می شود نه حد بالای آن . نکته پیاده سازی : در ماشین های اینتل x 86 برای نمونه انتظار می رود ( اما لازم نیست ) که محاسبات واسطه ای در دقت کامل هشتاد بیتی که توسط سخت افزار پیاده سازی می شود انجام شود .
امکان دارد که در مسیر استفاده از مقادیر موقت و زیر عبارات معمول ، کد بهینه شده یک جواب دقیقتر از کد بهینه نشده فراهم سازد .
الگوریتم ها باید طوری نوشته شود که براساس حداقل دقت محاسبات کار کند . آنها نباید در مواقعی که دقت واقعی بالاتر است افت عملکرد یابند یا شکست بخورند . انواع double یا float برخلاف نوع گسترش یافته فقط باید در موارد زیر به کار رود :
۱. کاهش مصرف حافظه برای آرایه های بزرگ .
۲. داده ها و آرگومان های توابع سازگار با C .
در زبان های موجود ، یک تلاش عجیب برای به زور جا دادن انواع مختلط در تسهیلات تعریف نوع موجود مانند قالب ها ،ساختمان ها و … وجود داردو تمام این ها معمولاً در نهایت با شکست مواجه میشود.
شکست می خورند چون مفاهیم اعمال مختلط می تواند بسیار دقیق باشد و کامپایلر نمی داند که برنامه نویس در تلاش برای انجام چه کاری است بنابراین نمی تواند پیاده سازی معنایی را بهینه نماید .
تمام این کارها برای اجتناب از اضافه کردن یک نوع جدید انجام شده است . اضافه کردن یک نوع جدید بدین معناست که کامپایلر می تواند تمامی مفاهیم اعمال مختلط را دقیق پیاده کند . پس برنامه نویس می تواند بر یک پیاده سازی صحیح ( یا حداقل دارای ثبات ) اعداد مختلط اعتماد کند .
همراه بودن با یک بسته نوع مختلط برای یک نوع موهومی مورد نیاز است .یک نوع موهومی برخی از پیامدهای ظریف معنایی را حذف می کند و کارآیی را بهبود می بخشد بدون اینکه مجبور به انجام اعمال اضافی روی قسمت حقیقی واضح صفر ، باشیم . الفاظ موهومی دارای یک پسوند i می باشند .
هیچ املای خاص برای نوع مختلط وجود ندارد فقط یک نوع حقیقی و موهومی را با هم جمع کنید :
افزودن دو نوع جدید به زبان کافی است از این رو انواع مختلط و موهومی دارای دقت توسعه یافته هستند . هیچ نوع اعشاری مختلط و موهومی یا نوع دابل مختلط یا موهومی وجود ندارد ( توجه : راه برای افزودن آنها در آینده باز است ) .
اعداد مختلط دارای دو صفت خاصه هستند :
c . re is 4.5
c . im is 2i
حسابگر ممیز شناور IEEE 754 شامل توانایی تنظیم کردن چهار روش گرد کردن است . D املایی خاص برای دسترسی به آنها افزوده است : [ blah , blah , blah ]
حسابگر ممیز شناور IEEE 754 می تواند پرچمهای مختلف را براساس آن چه در یک محاسبه رخ داده است تنظیم نماید : [ blah , blah , blah ]. این پرچمها می توانند به وسیله املای زبان SET / Reset شوند .
علاوه بر عملگرهای مقایسه معمولی < , < = , > , >= , == , != زبان D تعداد بیشتری که خاص اعداد ممیز شناور است اضافه می کند .
هر برنامه غیر جزیی نیاز به تخصیص و آزاد سازی حافظه دارد . هر چه پیچیدگی ، اندازه و کارآیی برنامه ها افزایش می یابد تکنیکهای مدیریت حافظه مهمتر می شوند . D اختیارات متعددی در زمینه مدیریت حافظه پیشکش می کند .
سه روش پایه تخصیص حافظه در D :
۱. داده استاتیک : در سگمنت داده پیش فرض تخصیص می یابند .
۲. داده پشته : در پشته برنامه CPU تخصیص می یابند .
۳. داده زباله جمع آوری شده : به صورت پویا در heap جمع آوری زباله تخصیص می یابند .
قسمت بعدی تکنیک ها را برای استفاده از آنها توضیح می دهد به همراه برخی قابلیت های پیشرفته:
رشته ها ( و آرایه ها ) copy – on – write
فرستادن یک آرایه به یک تابع را در نظر بگیرید و احتمالاً تغییر دادن آرایه و برگرداندن آرایه جدید . از آنجا که آرایه ها با ارجاع فرستاده می شوند نه با مقدار ، یک پیامد وخیم این است که ندانیم محتویات آرایه از آن کیست ؟ برای مثال تابعی که آرایه ای از کاراکترها را به حروف بزرگ برمی گرداند .
توجه کنید که نسخه []S که فراخوانی شد تغییر هم کرد شاید این اصلاً آن چیز مورد توقع نبود یا بدتر آنکه []S ممکن است تکه ای از حافظه فقط خواندنی باشد .
اگر یک کپی از S همواره توسط تابع ساخته می شد به طور ناکارا و بدون لزوم ،زمان و حافظه برای حروفی که خودشان بزرگ هستند مصرف می شد .
راه حل پیاده سازی copy – on – write است که یعنی یک کپی ساخته می شود فقط اگررشته ها نیاز به تغییر دارند . بعضی زبان های پردازنده رشته ها این عمل را به عنوان پیش فرض انجام می دهند اما هزینه بسیار سنگین است .
در نتیجه آن رشته “abcdwF” پنج مرتبه بوسیله تابع کپی می شود. برای اینکه از این قرارداد به نحوی با حداکثر کارآیی استفاده شود باید به صورت واضح در کد ظاهر شود .
copy – on – write پروتکلی است که به وسیله توابع پردازش آرایه ها در کتابخانه ی زمان اجرای phibo زبان D پیاده سازی شده است .
D زبانی دارای جمع آوی زباله کامل می باشد . بدین معنی که هیچ وقت نیاز به آزادسازی حافظه نیست . فقط به هنگام نیاز حافظه را تخصیص دهید و جمع آور زباله به طور دوره ای تمام حافظه بی استفاده را به توده حافظه آزاد برمی گرداند .
برنامه نویسان C ++ , C که به کنترل دستی حافظه هنگام تخصیص و آزاد سازی آن عادت دارند احتمالاً به مزایا و تأثیر جمع آوری زباله یقین ندارند . تجربهی پروژه های جدید که با در نظر گرفتن جمع آوری زباله نوشته شده اند همچنین پروژه های موجود که به سبک جمع آوری زباله برگردانده شده اند نشان می دهد که :
۱. برنامه های دارای جمع آور زباله سریعتر هستند . این واضح است اما دلایلی قابل بیان است .
۲. شمارش در جاعات یک روش معمول برای حل مسائل تخصیص حافظه آشکار است . کد پیاده سازی اعمال اضافه و تفریق هر جا که انتساب صورت می گیرد یکی از دلایل کندی است .
۳.پنهان کردن کد مذکور در پس کلاسهای اشاره گر هوشمند به افزایش سرعت کمک نمی کند . ( روش شمارش ارجاعات به هیچ وجه راه حل عمومی نیست جایی که ارجاعات حلقه ای هرگز حذف نمی شوند . )
۴. مخرب های کلاس برای آزادسازی منابع مورد نیاز یک شیئ به کار می رود . برای اغلب کلاسها این منابع ، حافظه تخصیص یافته است . با جمع آوری زباله اغلب مخرب ها خالی می شوند و در نهایت می توانند دور انداخته شوند .
۵. تمام مخرب هایی که حافظه را آزاد می کنند می توانند معنی دار شوند در مواقعی که اشیاء ، بر روی پشته تخصیص حافظه می یابند . برای هر کدام مکانیزمی باید در نظر گرفته شود طوری که اگر یک استثناء رخ داد تمام مخربها از هر چارچوب فراخوانی شوند تا هر حافظه تخصیص یافته برای آنها را رها کنند . اگر مخرب ها نامربوط شوند هیچ نیازی برای در نظر گرفتن چارچوب های خاص پشته برای پردازش استثناها نیست در نتیجه کد سریعتر اجرا می شود .
۶. تمام کدهای لازم برای مدیریت حافظه می تواند برای تکامل جزیی اضافه شود . برنامه بزرگتر کمتر در حافظه اصلی و بیشتر آن در حافظه مجازی قرار می گیرد و آرامتر و کندتر اجرا می شود .
۷. جمع آور حافظه هنگامی صورت می گیرد که حافظه تنگ و کم شود . تا وقتی حافظه جا دارد برنامه در حداکثر سرعت ممکن اجرا میشود و هیچ وقتی برای آزاد کردن حافظه ، صرف نمی کند .
۸.جمع آورنده های زباله مدرن ، اکنون به مراتب پیشرفته تر و سریع تر هستند . جمع آورنده های تولید کننده و کپی کننده ، قسمت عمده ناکارایی الگوریتم های جارو کردن و اختصاص دادن را حذف می کنند .
۹.جمع آورنده های زباله مدرن فشرده سازی توده حافظه را انجام می دهند . فشرده سازی توده مراقب است که تعداد صفحاتی که به طور فعال به وسیله یک برنامه ارجاع شده اند را کاهش دهد بدین معنی که دسترسی های حافظه احتمالاً بیشتر به حافظه می رسند تا به مبادله حافظه .
۱۰. جمع آورنده های زباله حافظه استفاده شده را اصلاح می کنند . بنابراین به رخنه های حافظه - که باعث می شوند برنامه های با اجرای طولانی مدت آن قدر حافظه مصرف کننده تا سیستم هنگ کند- تن در نمی دهد .
۱۱. برنامه های دارای جمع آور زباله دارای اشکالات کمتر یافتن اشاره گرها می باشند به این خاطر که هیچ ارجاع سرگردان به حافظه آزاد شده نمی ماند .
۱۲. برنامه های دارای جمع آور زباله برای گسترش و اشکال زدایی سریعترند . چون هیچ نیازی برای گسترش ، اشکال زدایی ، امتحان ، یا ابقاء کد آزاد سازی حافظه دستی وجود ندارد .
۱۳. برنامه های دارای جمع زباله به طور معنی داری کوچکترند چون هیچ کد آزادسازی حافظه وجود ندارد و از این رو نیازی به پردازشگرهای استثناها برای آزاد سازی حافظه وجود ندارد .
جمع آوی زباله یک نوشداروی همه کاره نیست بعضی اشکالات هم دارد :
۱. وقتی یک مجموعه برنامه همزمان اجرا می شود قابل پیشگویی نیست بنابراین برنامه به طور دلخواه می تواند مکث کند.
۲. زمانی که برای اجرای یک مجموعه مصرف می شود نامحدود است با اینکه در عمل بسیار کوتاه است اما ضمانتی وجود ندارد .
۳. تمام رشته های اجرا به غیر از رشته جمع آوری زباله در حالی که جمع آوری در جریان است باید مکث کند .
۱. کنترل نوع قوی تر
۲. مقدار دهی اولیه به صورت واضح مورد نیاز است
۳. مجاز نبودن متغییرهای محلی به کار نرفته
۴. عدم ' ; ' تکی در بدنه حلقه ها
۵. عمل انتساب ،مقادیر بولی بر نمی گرداند.
۶. از رده خارج کردن API های متروک
۱. عبارات اثبات صحت ( )assert
۲. کنترل مرزهای آرایه
۳. case تعریف نشده در استثنای switch
۴. استثنای تجاوز از اندازه حافظه
۵. ورودی ، خروجی و طراحی یکسان کلاس به وسیله کنتراکت
تقدم عملگر و قوانین سنجش
D عملگرهای C و قوانین تقدم آنها را حفظ می کند همچنین ترتیب قوانین سنجش و قوانین تقدم . این از اشکالات ریز که از ابتدای برنامه نمایان می شود جلوگیری می کند .
دسترسی مستقیم به API های C
نه تنها D نوع داده های مطابق با C دارد همچنین دسترسی مستقیم به توابع C را فراهم می سازد . هیچ نیازی به نوشتن توابع بسته بندی شده یا کدی برای کپی کردن اجزای متراکم یک توده به صورت یک به یک نیست.
پشتیبانی از تمام نوع داده های C
ارتباط با هر API زبان C و یا کد کتابخانه ای C ممکن است . این پشتیبانی تمام انواع C 99 را در بر می گیرد . D شامل توانایی صف بندی اعضای ساختمان برای مطمئن شدن از سازگاری با فرمتهای داده خارجی می باشد.
پردازش استثنای سیستم عامل
مکانیسم پردازش استثناهای D متصل به روشی است که سیستم عامل در سطح زیرین استثناها را در یک برنامه کاربردی پردازش می کند .
نسخه سازی
D . D تکنیک if# و نبود هشدار
کامپایلرهای D هشدارهایی برای کدهای نامطمئن تولید نمی کنند . کد یا توسط کامپایلر قابل قبول است یا نیست . این خصوصیت هر گونه بحثی در این زمینه که آیا هشدار خطایی صحیح است یا نه و نیز هر بحثی در این باره که با آن هشدار چه کنیم را از بین می برد . نیاز برای هشدار کامپایلر نشانهی طراحی ضعیف زبان است .
استهلاکDeprecation
به مرور زمان ،بعضی کدهای کهنه کتابخانه با نو تر و نسخه بهتر جایگزین می شود . نسخه قدیمی باید برای پشتیبانی کدهای به جا مانده از قبل موجود باشد اما می تواند لقب مستهلک بگیرد . کدهایی که نسخه های مستهلک را به کار می گیرند ، می توانند به انتخاب برنامه نویس توسط یک سویچ کامپایلر برچسب غیر قانونی بخورند که باعث آسان شدن کار برنامه نویسان برای نشان دادن هر وابستگی به خصوصیات مستهلک می شود .
نمونه برنامه D غربال اراتستن (تست اعداد اول):
import c.stdio ;
کنترل پروژه
bit [8191] flags ;
int main (){
int i , count , prime , k , iter ;
print f(“ 10 iterations
” );
for ( iter = 1 ; iter<=10 ; iter ++ ) {
count = 0 ;
flags [ ] = 1 ;
for ( i = 0 ; i < flags . length ; i ++ ){
if ( flags [i] ) {
prime = i + i +3;
k = i + prime;
while ( k < flags . Length ) {
flags , [ k] = 0 ;
k + = prime ;
}
count + = 1;
}
}
}
print f ( “ % d primes” , count ) ;
return 0 ;
}