فرترن
فورترن (به انگلیسی: Fortran، /ˈfɔːrtræn/) یک زبان برنامه نویسی همه-منظوره، کامپایل شونده و دستوری میباشد که مخصوصا برای محاسبات عددی و علم محاسبه مناسب است. فورترن در گذشته به صورت حروف بزرگ FORTRAN نوشته میشده که کوتهنوشت FORmula TRANslation میباشد.
پارادایم برنامهنویسی | چند الگویی: ساختیافته، دستوری (رویهای، شیءگرا)، همگانی |
---|---|
طراحی شده توسط | جان بکوس |
توسعهدهنده | جان بکوس و آیبیام |
ظهوریافته در | ۱۹۵۷ |
انتشار پایدار | Fortran 2018 (ISO/IEC 1539-1:2018)
۲۸ نوامبر ۲۰۱۸ |
نیرومند، ایستا، آشکار | |
.f , .for , .f90 | |
وبگاه | |
پیادهسازیهای بزرگ | |
Absoft, Cray, GFortran, G95, IBM XL Fortran, Intel, Hitachi, Lahey/Fujitsu, Numerical Algorithms Group, Open Watcom, PathScale, PGI, Silverfrost, Oracle Solaris Studio, Visual Fortran, others | |
متأثر از | |
Speedcoding | |
تأثیر گذاشته بر | |
ALGOL 58, BASIC, C, Chapel, CMS-2, Fortress, PL/I, PACT I, MUMPS, IDL, Ratfor |
فورترن یک زبان برنامهنویسی کامپایل شونده برای محاسبات علمی و عددی است. این زبان در ابتدا برای برنامههای مهندسی و علمی در دهه ۱۹۵۰ توسط شرکت آیبیام ایجاد شد و بیش از شش دهه است که در مسائل محاسباتی پیچیده همانند پیشبینی آب و هوا، تجزیه و تحلیل عناصر محدود، دینامیک سیالات محاسباتی، فیزیک محاسباتی، کریستالوگرافی و شیمی محاسباتی مورد استفاده قرار گرفتهاست. این زبان در محاسبات با کارایی بالا و محک و رتبهبندی سریعترین ابررایانهها رایج است. یکی از ویژگیهای مهم فورترن سرعت بالا در کامپایل کردن کدهای محاسباتی است و دلیل آن بهینه بودن دستورها این زبان نسبت به زبانهای دیگر است و با توجه به کمینه بودن تعداد کاراکترهای مورد نیاز برای ایجاد یک دستور و امکانات ترجیحی و اختیاری فراوان، کدهای نوشتهشده با این زبان از حجم کمی برخوردار هستند و در زمان کوتاه اجرا شده و نتیجه خواهد داد. این امر به خصوص برای محاسبات عددی سنگین از اهمیت دوچندانی برخوردار است.
نامگذاری
نام نسخههای قبلی این زبان با حروف بزرگ بیان میشد و FORTRAN 77 آخرین نسخهای بود که در آن استفاده از حروف کوچک در کلمات اصلی غیراستاندارد بشمار میرفت. در نسخههای جدیدتر از fortran90 این استاندارد حذف شد.
تاریخچه
دراواخر سال 1953، جان بکوس (John Backus) پیشنهادی جهت جایگزینی یک برنامه عملیتر برای زبان اسمبلی برنامه نویسی IBM 704 ارائه کرد. تیم برنامهنویسان گذشته فورترن شامل ریچارد گلدبرگ، شلدون بهترین، هارلان هریک، پیتر شریدان، روی نوت، رابرت نلسون، ایروینگ زیلر، هارولد استرن، لوییزهایت و دیوید سیر بود. هدف اصلی ورود آسانتر معادلات به رایانه بود که ایده آن توسط J. Halcombe Laning توسعه یافت. پیشنویس مشخصات سیستم ترجمه فرمول ریاضی در نوامبر سال ۱۹۵۲ تکمیل شد و اولین کتابچه راهنمایآن، در اکتبر ۱۹۵۶ آمادهشد و با اولین کامپایلر فورترن در آوریل ارائه شد. این اولین کامپایلر بهینهساز بود. مشتریان زمانی تمایل به استفاده از زبان سطح بالا دارند که عملکرد کد تولید شده توسط کامپایلر مشابه عملکرد کداسمبلی دستنویس باشد. درحالیکه برنامه نویسان در عملکرد بهتر این نوع برنامهنویسی نسبت به کداسمبلی دستنویس تردید داشتند، کاهش بالای تعداد عبارات برنامه نویسی توجه برنامهنویسان را جلب کرد. جان بکوس در طی مصاحبه ای در سال ،گفت: "بخش عمدهای از کار من از تنبلی ناشی شدهاست. من نوشتن برنامهها را دوست نداشتم، بنابراین هنگامی که در IBM 701 کار میکردم، برنامه هایی برای محاسبات مینوشتم. پس شروع به کار بر روی یک سیستم برنامه نویسی کردم تا نوشتن برنامهها آسانتر شود. " دانشمندان این زبان را بسیار مناسب برای برنامه هایفشرده عددی دانستند و نویسندگان کامپایلر را، برای نوشتن کامپایلر با سرعت و کارامدی بیشتر ترغیب کردند. گنجایش این زبان برای دادههای عددی بسیار پیچیده، آن را برای برنامه های فنی بهخصوص در مهندسی برق مناسب نمودهاست. تا سال ۱۹۶۰ نسخههای فورترن برای رایانههای 1620 IBM 109، IBM 650 ، IBM و 7090 IBM در دسترس بود. محبوبیت روزافزون این زبان، سازندگان آن را تشویقکرد بطوریکه تا سال ۱۹۶۳، بیش از ۴۰ کامپایلر فورترن دردسترس بود.
توسعه فورترن به موازات سیرتکاملی کامپایلر بود و به همین دلیل بسیاری از پیشرفت های تئوری و طراحی کامپایلر در جهت رفع نیازهای فورترن برای ایجاد کد کارامدتر ایجادشد.
علم و مهندسی
اگرچه نویسندگان بیسیک فورترن را قدیمی توصیف کرده بودند، اکنون چندین دهه است که این زبان مورد استفاده قرار گرفته است.
جی پاساکوف در سال ۱۹۸۴ نوشت: «دانشجویان فیزیک و نجوم باید فورترن را بیاموزند و بعید به نظر میرسد دانشمندان به دیگر زبانهای پاسکال، مدولا یا هر چیز دیگری رویآورند.»
در سال ۱۹۹۳، سیسیل لیث، فورترن را «زبان مادری محاسبات علمی» خواند و افزود: «جایگزینی آن با هر زبان دیگر ممکن است یک امید فراموش شده باقی بماند.»
فورترن یک زبان اولیه برای برخی کارهای حجیم در ابرکامپیوترها مانند نجوم، مدلسازی آب و هوا، شیمی محاسباتی، اقتصاد محاسباتی، دینامیک سیالات محاسباتی، فیزیک محاسباتی، تجزیه و تحلیل دادهها، مدلسازی هیدرولوژیکی، جبرخطی عددی و کتابخانههای عددی ( LAPACK، IMSL و NAG)، بهینهسازی، شبیهسازی ماهواره، مهندسی سازه و پیشبینی وضعیت هوا است.
کدهای مدرنتر در علوم محاسباتی از کتابخانهها استفاده میکنند، از جمله METIS برای تقسیمبندی نمودار، PETSc یا Trilinos برای جبر خطی و غیره که در سی نیز استفاده میشد.
از اوایل سال ۲۰۰۰ بسیاری از کتابخانههای پشتیبان مورد استفاده قرار گرفتند و ازطرفی زبان هایدیگر مانند متلب ، پایتون و آر در برخی حوزههای علوم محاسباتی رایج شدند. به همین دلیل، امکاناتی برای ارتباط سی با Fortran ۲۰۰۳ فراهم شد.
ویژگیهای زبان
قابلیت حمل
قابلیت حمل در ابتدا با مشکلاتی همراه بود زیرا هیچ استانداردی مورد توافق قرار نمیگرفت. استانداردها قابلیت حمل را بهبود بخشیدهاند.
استاندارد ۱۹۹۶ یک اصطلاح مرجع و معناشناسی را ارائه میداد، اما مجدد به ناسازگاری ادامه دادند. برنامهنویسان متوجه بودند، استفاده از ناسازگاریها سبب بروز مشکلات در حمل میشود، پس از برنامههایی مانند The PFORT Verifier استفاده میکردند؛
بعد از استاندارد ۱۹۷۷، دفتر ملی استاندارد FIPS PUB 69 را منتشر کرد که پردازندههای خریداری شده توسط دولت ایالات متحده ملزم به تشخیص استاندارد بودند.
ناسازگاری و عدم رعایت استاندارد تنها مشکل قابلیت حمل نبودند. برای محاسبات عددی، در نظر گرفتن ویژگیهای حساب مهم است. اتخاذ (در حال حاضر تقریبا جهانی) استاندارد IEEE 754 برای حساب ممیزشناور باینری، این مشکل را حل کرد.
دسترسی به محیط محاسبات برای مثال خط فرمان برنامه، متغیرهای محیط و غیره همچنان مشکل ایجاد میکرد که در سال ۲۰۰۳ برطرف شد.
در حال حاضر نوشتن یک برنامهٔ قابل حمل در فورترن امکانپذیر است.
انواع
Fortran 5
دراواخر دهه ۱۹۷۰و اوایل دهه ۱۹۸۰، برای رایانههای Eclipse, MV و Nova عرضهشد که کامپایلر بهینه ساز خوبی برای کامپیوترهای زمان خود بشمار میرفت.
FORTRAN V
درسال ۱۹۶۸در سریال 6600 CDC عرضه شد و مبتنی بر FORTRAN IV بود.
Fortran 6
فورترن۶ یا Visual Fortran 2001 توسط ماکروسافت مجاز شد و رابط محیط Visual Studio 5 را برای Compaq v6 ارائهداد.
گونههای مختلف
عرضهکنندگان کامپیوترهای علمی عملکرد بالا(مثال:باروز، شرکت دادههای کنترل(CDC)،(به انگلیسی Cray)، هانیول، آیبیام، تگزاس اینسترومنتس، و یونیوک) افزونههای فورترن را اضافه کردند تا از قابلیتهای سختافزاری مانند حافظه نهان دستور، خط لولههای (به انگلیسی pipeline) واحد پردازش مرکزی ، و آرایههای برداری بهره ببرند. برای مثال، یکی از کامپایلرهای فورترن شرکت آیبیام، سطحی از بهینهسازی را داشت که ترتیب دستورهای را عوض میکرد تا واحدهای محاسباتی داخلی مختلف را همزمان مشغول نگه دارد.
یک مثال دیگر CFD است، یک گونهی خاص از فورترن که مخصوص ابرکامپیوتر ایلیاک ۴ (به انگلیسی ILLIAC IV) ساخته شده است. این کامپیوتر در مرکز تحقیقات ایمز متعلق به ناسا قرار دارد.هم چنین آزمایشگاههای تحقیقاتی آیبیام، یک نسخهی توسعهیافته از یک زبان مبتنی بر فورترن به نام وکترن را برای پردازش بردارها و ماتریسها ایجاد کردند.
فورترن شیءگرا یک افزونه شیءگرا از فورترن بود که در آن می توانستیم دادهها را در اشیاء مختلف گروهبندی کنیم. نمونههای اشیاء میتوانستند به صورت موازی با یکدیگر ساخته شوند و توابعشان را اجرا کنند. فورترن شیءگرا برای کامپیوترهای سان، آیریس، آیپیاسسی و انکیوب موجود بود، اما الان دیگر پشتیبانی نمیشود.
افزونههای اینچنینی که مختص یک یا چند ماشینند یا در طول زمان از بین رفتند، یا عناصری از آنها در استانداردهای اصلی گنجانده شد. مهمترین افزونهی باقیمانده اپن امپی است که یک افزونهی چندپلتفرمه برای برنامهنویسی با حافظهی مشترک است. کواَرِی فورترن یک افزونه جدید است که برای پشتیبانی برنامهنویسی موازی در نظر گرفته شده.
FOR TRANSIT برای ماشین آیبیام ۶۵۰
فور ترنزیت یک نسخهی ساده شده از زبان فورترن ماشین آیبیام ۷۰۴بود، که برای ماشین آیبیام ۶۵۰ پیادهسازی شد. برای این کار از یک برنامهی مترجم ساخت دهه ۱۹۵۰ دانشگاه کارنگی استفاده شد. توضیح زیر در راهنمای مرجع آیبیام آمده است ( سیستم خودکار برنامهنویسی فور ترنزیت C28-4038 متعلق به آیبیام، کپی رایت 1957 و 1959)
سیستم فورترن برای ماشینی پیچیدهتر از ماشین آیبیام ۶۵۰ ساخته شده بود، و بنابراین بعضی از ۳۲ دستور موجود در راهنمای برنامهنویسان فورترن برای سیستم فور ترنزیت مورد قبول نیستند. بعلاوه، برخی محدودیتها به زبان فورترن اضافه شدهاند. با این حال، هیچ کدام از این محدودیتها موجب آن نمیشوند که یک کد منبع که برای فورترن نوشته شده است برای سیستم فورترن ماشین آیبیام ۷۰۴ ناسازگار باشد.
دستورهای مجاز این ها بودند:
- دستورهای مقداردهی محاسباتی، مثل
a = b
GO to n
GO TO (n1, n2, ..., nm), i
IF (a) n1, n2, n3
PAUSE
STOP
DO n i = m1, m2
CONTINUE
END
READ n, list
PUNCH n, list
DIMENSION V, V, V, ...
EQUIVALENCE (a,b,c), (d,c), ...
در هر برنامه استفاده از حداکثر ۱۰ رویه (زیرروال) ممکن بود. دستورهای FOR TRANSIT به ستون ۷ تا ۵۶ کارت پانچ (به انگلیسی en:Punched Card) محدود می شدند.کارت پانچها به عنوان ورودی و خروجی آیبیام ۶۵۰ استفاده می شدند. سه بار عبور لازم بود تا کد منبع به زبان "IT" ترجمه شود، و بعد دستورهای IT کامپایل شده و به زبان اسمبلی سوپ(SOAP) ترجمه شود، و نهایتا برنامه به زبان مقصد (کد ماشین) تولید شود، بعد می توان آن را درون ماشین بارگذاری کرد تا برنامه را اجرا کند (برای داده ورودی از کارت پانچ استفاده می شود، نتیجه را هم روی کارت پانچ خروجی میدهد)
زبانهای مبتنی بر فورترن
قبل از فورترن ۷۷، به طور معمول تعدادی پیشپردازنده برای میسر ساختن یک زبان مناسب تر مورد استفاده قرار می گرفتند، با این مزیت که کد پیش پردازش شده می توانست روی هر ماشینی که یک کامپایلر استاندارد فورترن داشت کامپایل شود. این پیش پردازنده ها معمولا از برنامه نویسی ساختاریافته، اسامی با طول بیش از ۶ کاراکتر برای متغیرها، نوع دادههای اضافه، کامپایل شرطی برنامه، و حتی قابلیتهای ماکرو پشتیبانی می کردند. پیشپردازندههای متداول شامل "FLECS" (به انگلیسی)., ایفترن ,مورترن, SFtran, S-Fortran, رتفور و رتفیو میشدند. برای مثال، رتفور و رتفیو یک زبان شبیه سی پیاده سازی میکردند و کد پیشپردازششده را به زبان فورترن ۶۶ خروجی میدادند. علی رغم پیشرفتها در زبان فورترن، پیشپردازندهها هم چنان برای کامپایل شرطی برنامهها و جایگزینی ماکروها مورد استفاده قرار میگیرند.
یکی از افزونه های فورترن که برای پشتیبانی برنامه نویسی سیستم ها عرضه شد، زبان LRLTRAN در آزمایشگاه ملی لارنس برکلی و با هدف پشتیبانی از محاسبات برداری و ذخیرهسازی پویا ایجاد شد. این توزیع، سیستم عامل LTSS را شامل می شد. بسیاری از کامپایلرهای فورترن، بخش هایی ازپیشپردازندهی سی را در خود ادغام کردهاند.سیماسکریپت یک پیشپردازندهی فورترن مخصوص کاربردهای خاص برای مدلسازی و شبیهسازی سیستمهای گسسته (به انگلیسی en:Discrete System) بزرگ است.
زبان برنامه نویسی F طراحی شد تا زیرمجموعه مرتبی از فورترن ۹۵ باشد که هدفش حذف کردن قابلیت های زائد، بدونساختار و منسوخشدهی فورترن، مثل دستور EQUIVALENCE
بود. اف قابلیت های آرایه را که در فورترن ۹۰ اضافه شده بود حفظ می کند و دستورهای کنترلی ای که توسط مفاهیم برنامهنویسی ساختیافته منسوخ شده بودند را حذف می کند. این دستورهای هم به فورترن ۷۷ اضافه شده بودند هم به فورترن ۹۰. سازندگان زبان اف آن را "یک زبان برنامه نویسی کامپایل شده و ساختاریافته برای آرایهها توصیف کردند که "خصوصا برای آموزش و محاسبات علمی مناسب است".
لاهی و فوجیتسو تیم مشترک تشکیل دادند تا یک زبان فورترن برای چارچوب داتنت مایکروسافت خلق کنند. زبان Silverfrost FTN95 هم توانایی ایجاد کد داتنت را دارد.
نمونه کد
اطلاعات بیشتر در: "مثالهای فورترن" (به انگلیسی).
برنامه زیر تخصیص حافظهی پویا و عملیات روی آرایهها را شرح میدهد که دو قابلیت معرفی شده در فورترن ۹۰ هستند. به طور خاص نبود حلقههای DO
و دستورهای IF/THEN
برای تغییر دادن آرایه شایان ذکر است که در عوض عملیات ریاضی روی کل آرایه به عنوان یک موجودیت اعمال میشود. بعلاوه، نامگذاری متغیرها به گونه ای که نام متغیر، آن را توصیف کند، و قالب کلی کد که مطابق با شیوه برنامهنویسی امروزی است نیز آشکار است. این مثال، میانگین دادههایی که در تعامل با کاربر از ورودی گرفته میشود را محاسبه میکند.
program average
! تعدادی عدد را از ورودی میخواند و میانگینش را میدهد
! همانطور که نوشته شده، اگر هیچ دادهای موجود نباشد، صفر را به عنوان میانگین برمیگرداند
! ممکن است در آن حالت برگرداندن میانگین صفر رفتار مطلوب برنامه نباشد، اما این کار باعث سادگی برنامه می شود
implicit none
real, dimension(:), allocatable :: points
integer :: number_of_points=0.0
real :: average_points=0., positive_average=0., negative_average=0.
! تعداد اعداد را از ورودی دریافت میکند و در متغیر number_of_points می ریزد
write (*,*) "Input number of points to average:"
read (*,*) number_of_points
allocate (points(number_of_points))
write (*,*) "Enter the points to average:"
read (*,*) points
! با بدست آوردن مجموع اعداد و تقسیم آن بر تعدادشان، میانگینشان را به دست میآورد
if (number_of_points > 0) average_points = sum(points) / number_of_points
! مجموع اعداد بزرگتر از صفر را پیدا می کند و تقسیم بر تعدادشان میکند که می شود میانگین اعداد مثبت
if (count(points > 0.) > 0) then
positive_average = sum(points, points > 0.) / count(points > 0.)
end if
! مجموع اعداد کوچکتر از صفر را پیدا می کند و تقسیم بر تعدادشان میکند که می شود میانگین اعداد منفی
if (count(points < 0.) > 0) then
negative_average = sum(points, points < 0.) / count(points < 0.)
end if
deallocate (points)
! حالا نتیجه رادر خروجی چاپ میکند
write (*,'(a,g12.4)') 'Average = ', average_points
write (*,'(a,g12.4)') 'Average of positive points = ', positive_average
write (*,'(a,g12.4)') 'Average of negative points = ', negative_average
end program average
جستارهای وابسته
منابع
- ↑ "Chapel spec (Acknowledgements)" (PDF). Cray Inc. 2015-10-01. Retrieved 2016-01-14.
- ↑ "Fortran". Wikipedia (به انگلیسی). 2020-01-29.
- ↑ "Internal Translator (IT) A Compiler for the IBM 650", by A. J. Perlis, J. W. Smith, and H. R. Van Zoeren, Computation Center, Carnegie Institute of Technology
- ↑ "F Programming Language Homepage". Fortran.com. Archived from the original on 9 January 2015. Retrieved 19 November 2014.
- ↑ "Fortran for .NET Language System". Archived from the original on 18 October 2014.
- ↑ "FTN95: Fortran 95 for Windows". Silverfrost.com. Retrieved 19 November 2014.
- پرویز جبهدار مارالانی، منصور نیکخواه بهرامی، برنامهنویسی فرترن ۷۷، نشر: صفار (۲۱ بهمن، ۱۳۸۶)، شابک: ۹۷۸-۹۶۴-۵۹۷۳-۵۱-۱