رضا ثقفی
رضا ثقفی
خواندن ۴ دقیقه·۲ سال پیش

C در مقابل Fortran برای محاسبات علمی

وقتی به مردم می گویم که از Fortran برای پروژه ای استفاده کرده ام، اغلب تعجب می کنند. یکی از دلایل احتمالاً عادت آنها به Fortran 77 است که با استانداردهای امروزی آنقدرها هم کاربر پسند نیست.

با این حال، فرترن در طول سال‌ها شاهد توسعه بسیار فعالی بوده است، فرترن 90، 95، 2003، 2008 و حتی 2011 وجود دارد. تغییر از F77 به F95 احتمالاً شدیدترین تغییر بود. فقط برای اینکه به شما ایده بدهم: در آخرین نسخه‌ها، می‌توانید اشیاء انتزاعی (یک کلاس پایه مجازی در C++) ایجاد کنید که نشان می‌دهد از F77 با کد منبع ثابت آن چقدر تغییر کرده است.

در هر صورت، ممکن است تعجب کنید که آیا باید از C از فرترن برای پروژه محاسباتی علمی بعدی خود استفاده کنید.

مقایسه در هر موضوع

برای هر موضوع نظرم را در مورد مزایا و معایب C و Fortran می‌گویم. آنها همچنین امتیازی بین ++ (خیلی خوب) و – (بد) می گیرند.

عملکرد (C: ++، F: ++)

من معتقدم هیچ تفاوت (قابل توجهی) در عملکرد بین زبان ها وجود ندارد. اگر می‌دانید چه کار می‌کنید، می‌توانید در هر دو کد سریع بنویسید، و تفاوت‌ها بیشتر به دلیل کامپایلر است.

دانستن کاری که انجام می دهید در واقع بسیار دشوار است (به نظر من). شما باید از مواردی مانند:

Pointer_aliasing (بیشتر برای C مهم است)

بهینه‌سازی‌ها برای اعداد صحیح بدون علامت (چون در فرترن Uint ندارید، بنابراین i/2 معمولاً به شیفت تبدیل نمی‌شود، در حالی که کامپایلر می‌تواند این کار را به طور خودکار در C انجام دهد)

درون خطی کد (من حدس می زنم که برای اکثر کامپایلرهای فرترن، کد باید در همان فایل منبع باشد، در حالی که در C معمولاً چنین کدی را در فایل های هدر قرار می دهید)

کارایی انواع مختلف آرگومان های آرایه (مرتبط با فرترن، به عنوان مثال به این راهنمای عالی توسط اینتل مراجعه کنید)

ترتیب صحیح نمایه سازی آرایه (برای C و Fortran متفاوت است)

این لیست فقط شامل چند مثال است، البته چیزهای بیشتری وجود دارد که برای نوشتن کد کارآمد باید بدانید.

سهولت استفاده (C:+/-، F:+)

سهولت استفاده ذهنی است. آنچه برای شما آسان است احتمالاً بیشتر به آنچه عادت دارید بستگی دارد.

با این حال، مواردی وجود دارد که استفاده از فرترن را برای محاسبات علمی آسان‌تر می‌کند. این نباید تعجب آور باشد، زیرا محاسبات علمی هدف فرترن است، در حالی که C زبان برنامه نویسی یک سیستم است.


به هر حال، بیایید به چند نمونه از مواردی که در فرترن راحت تر هستند نگاه کنیم!

نماد برداری/ماتریس

به عنوان مثال، می توانید بخشی از یک ماتریس را در فرترن به صورت زیر کپی کنید:


A(1:5، :) = B(6:10، :)

پخش خودکار نیز وجود دارد، بنابراین می توانید کارهایی مانند این را انجام دهید:


A(1:5، :) = 0

کرانه ها در حال بررسی آرایه ها هستند

در فرترن، آرایه ها معمولاً اندازه خود را با آنها مرتبط می کنند. احتمالاً بسیاری از شما می‌دانید که رشته‌های تهی در C چند مشکل ایمنی ایجاد کرده‌اند. داشتن اندازه یک آرایه امن‌تر و راحت‌تر از نداشتن آن است، زیرا به شما امکان می‌دهد بررسی کنید که آیا از محدوده خارج می‌شوید یا خیر.


به عنوان مثال، می توانید بررسی های زمان اجرا را برای مشکلات خارج از محدوده با -fbounds-check در gfortran فعال کنید. این نیز اجازه می دهد

توابع ریاضی داخلی

Fortran شامل بسیاری از توابع است که هنگام انجام محاسبات مفید هستند. مثلا:


هنجار2! 2-هنجار

هیپوت ! محاسبه فرضیه

متمول ! ضرب ماتریس

bessel_j0 ! تابع بسل از نوع اول مرتبه 0

لیست کامل تر را می توانید در اینجا پیدا کنید.


رویه های عنصری

در فرترن، می‌توانید رویه‌های عنصری را تعریف کنید که بر روی آرگومان‌های هر شکلی عمل می‌کنند. تابع داخلی sin عنصری است، اما فرض کنید می خواهید تابعی داشته باشید که 1 - sin(x)^2 را محاسبه کند:


تابع عنصری my_sin(x) نتیجه(y)

واقعی، قصد (در) :: x

y = 1 - sin(x)**2

تابع پایان my_sin

این همچنین استفاده از intent(in) را نشان می دهد.


کتابخانه ها (فرترن: +/-، C: ++)

در رابطه با کتابخانه ها، باید بین کتابخانه های عددی و کتابخانه های مخصوص محاسبات علمی تفاوت قائل شد.

فرترن کتابخانه های زیادی برای محاسبات علمی دارد. اگرچه برخی از آنها کاملا قدیمی هستند. به عنوان مثال، مانند LAPACK، نگاهی به سایت نیک آموز بیندازید.

از طرفی C برای مدت طولانی زبان اصلی برنامه نویسی سیستم ها بوده است. بنابراین شما به بسیاری از کتابخانه های عمومی با هدف دسترسی دارید. همچنین کمبود کتابخانه های محاسباتی علمی برای C وجود ندارد.

سازگاری به عقب (Fortran: ++، C: ++)

من فکر می کنم که هر دو زبان کار بسیار خوبی را در سازگاری با عقب انجام می دهند. اغلب می توانید کدهای مربوط به 25 سال پیش را بدون مشکل کامپایل کنید.

محاسبات علمیبرنامه نویسینیک آموز
شاید از این پست‌ها خوشتان بیاید