یک زبان برنامهنویسی همه-منظوره، کامپایل شونده، و دستوری From Wikipedia, the free encyclopedia
فورترن (به انگلیسی: Fortran، /ˈfɔːrtræn/) یک زبان برنامهنویسی همه-منظوره، کامپایل شونده و دستوری میباشد که مخصوصاً برای محاسبات عددی و علم محاسبه مناسب است. فورترن در گذشته به صورت حروف بزرگ FORTRAN نوشته میشده که کوتهنوشت FORmula TRANslation میباشد.[2]
پارادایم برنامهنویسی | چند الگویی: ساختیافته، دستوری (رویهای، شیءگرا)، همگانی |
---|---|
طراحی شده توسط | جان بکوس |
توسعهدهنده | جان بکوس و آیبیام |
ظهوریافته در | ۱۹۵۷ |
انتشار پایدار | 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,[1] CMS-2, Fortress, PL/I, PACT I, MUMPS, IDL, Ratfor |
فورترن یک زبان برنامهنویسی کامپایل شونده برای محاسبات علمی و عددی است. این زبان در ابتدا برای برنامههای مهندسی و علمی در دهه ۱۹۵۰ توسط شرکت آیبیام ایجاد شد و بیش از شش دهه است که در مسائل محاسباتی پیچیده همانند پیشبینی آب و هوا، تجزیه و تحلیل عناصر محدود، دینامیک سیالات محاسباتی، فیزیک محاسباتی، کریستالوگرافی و شیمی محاسباتی مورد استفاده قرار گرفتهاست. این زبان در محاسبات با کارایی بالا و محک و رتبهبندی سریعترین ابررایانهها رایج است. یکی از ویژگیهای مهم فورترن سرعت بالا در کامپایل کردن کدهای محاسباتی است و دلیل آن بهینه بودن دستورها این زبان نسبت به زبانهای دیگر است و با توجه به کمینه بودن تعداد کاراکترهای مورد نیاز برای ایجاد یک دستور و امکانات ترجیحی و اختیاری فراوان، کدهای نوشتهشده با این زبان از حجم کمی برخوردار هستند و در زمان کوتاه اجرا شده و نتیجه خواهد داد. این امر به خصوص برای محاسبات عددی سنگین از اهمیت دوچندانی برخوردار است.
نام نسخههای قبلی این زبان با حروف بزرگ بیان میشد و FORTRAN 77 آخرین نسخهای بود که در آن استفاده از حروف کوچک در کلمات اصلی غیراستاندارد بشمار میرفت. در نسخههای جدیدتر از fortran90 این استاندارد حذف شد.
دراواخر سال ۱۹۵۳، جان بکوس (John Backus) پیشنهادی جهت جایگزینی یک برنامه عملیتر برای زبان اسمبلی برنامهنویسی IBM 704 ارائه کرد. تیم برنامهنویسان گذشته فورترن شامل ریچارد گلدبرگ، شلدون بهترین، هارلان هریک، پیتر شریدان، روی نوت، رابرت نلسون، ایروینگ زیلر، هارولد استرن، لوییزهایت و دیوید سیر بود. هدف اصلی ورود آسانتر معادلات به رایانه بود که ایده آن توسط J. Halcombe Laning توسعه یافت. پیشنویس مشخصات سیستم ترجمه فرمول ریاضی در نوامبر سال ۱۹۵۲ تکمیل شد و اولین کتابچه راهنمایآن، در اکتبر ۱۹۵۶ آمادهشد و با اولین کامپایلر فورترن در آوریل ارائه شد. این اولین کامپایلر بهینهساز بود. مشتریان زمانی تمایل به استفاده از زبان سطح بالا دارند که عملکرد کد تولید شده توسط کامپایلر مشابه عملکرد کداسمبلی دستنویس باشد. درحالیکه برنامه نویسان در عملکرد بهتر این نوع برنامهنویسی نسبت به کداسمبلی دستنویس تردید داشتند، کاهش بالای تعداد عبارات برنامهنویسی توجه برنامهنویسان را جلب کرد. جان بکوس در طی مصاحبه ای در سال، گفت: "بخش عمدهای از کار من از تنبلی ناشی شدهاست. من نوشتن برنامهها را دوست نداشتم، بنابراین هنگامی که در IBM 701 کار میکردم، برنامههایی برای محاسبات مینوشتم. پس شروع به کار بر روی یک سیستم برنامه نویسی کردم تا نوشتن برنامهها آسانتر شود. " دانشمندان این زبان را بسیار مناسب برای برنامه هایفشرده عددی دانستند و نویسندگان کامپایلر را، برای نوشتن کامپایلر با سرعت و کارامدی بیشتر ترغیب کردند. گنجایش این زبان برای دادههای عددی بسیار پیچیده، آن را برای برنامههای فنی بهخصوص در مهندسی برق مناسب نمودهاست. تا سال ۱۹۶۰ نسخههای فورترن برای رایانههای 1620 IBM ۱۰۹، IBM 650، IBM و 7090 IBM در دسترس بود. محبوبیت روزافزون این زبان، سازندگان آن را تشویقکرد بطوریکه تا سال ۱۹۶۳، بیش از ۴۰ کامپایلر فورترن دردسترس بود.
توسعه فورترن به موازات سیرتکاملی کامپایلر بود و به همین دلیل بسیاری از پیشرفتهای تئوری و طراحی کامپایلر در جهت رفع نیازهای فورترن برای ایجاد کد کارامدتر ایجادشد.
اگرچه نویسندگان بیسیک فورترن را قدیمی توصیف کرده بودند، اکنون چندین دهه است که این زبان مورد استفاده قرار گرفتهاست.
جی پاساکوف در سال ۱۹۸۴ نوشت: «دانشجویان فیزیک و نجوم باید فورترن را بیاموزند و بعید به نظر میرسد دانشمندان به دیگر زبانهای پاسکال، مدولا یا هر چیز دیگری رویآورند.»
در سال ۱۹۹۳، سیسیل لیث، فورترن را «زبان مادری محاسبات علمی» خواند و افزود: «جایگزینی آن با هر زبان دیگر ممکن است یک امید فراموش شده باقی بماند.»
فورترن یک زبان اولیه برای برخی کارهای حجیم در ابرکامپیوترها مانند نجوم، مدلسازی آب و هوا، شیمی محاسباتی، اقتصاد محاسباتی، دینامیک سیالات محاسباتی، فیزیک محاسباتی، تجزیه و تحلیل دادهها، مدلسازی هیدرولوژیکی، جبرخطی عددی و کتابخانههای عددی (LAPACK, IMSL و NAG)، بهینهسازی، شبیهسازی ماهواره، مهندسی سازه و پیشبینی وضعیت هوا است.
کدهای مدرنتر در علوم محاسباتی از کتابخانهها استفاده میکنند، از جمله METIS برای تقسیمبندی نمودار، PETSc یا Trilinos برای جبر خطی و غیره که در سی نیز استفاده میشد.
از اوایل سال ۲۰۰۰ بسیاری از کتابخانههای پشتیبان مورد استفاده قرار گرفتند و ازطرفی زبان هایدیگر مانند متلب، پایتون و آر در برخی حوزههای علوم محاسباتی رایج شدند. به همین دلیل، امکاناتی برای ارتباط سی با Fortran ۲۰۰۳ فراهم شد.
قابلیت حمل در ابتدا با مشکلاتی همراه بود زیرا هیچ استانداردی مورد توافق قرار نمیگرفت. استانداردها قابلیت حمل را بهبود بخشیدهاند.
استاندارد ۱۹۹۶ یک اصطلاح مرجع و معناشناسی را ارائه میداد، اما مجدد به ناسازگاری ادامه دادند. برنامهنویسان متوجه بودند، استفاده از ناسازگاریها سبب بروز مشکلات در حمل میشود، پس از برنامههایی مانند The PFORT Verifier استفاده میکردند.
بعد از استاندارد ۱۹۷۷، دفتر ملی استاندارد FIPS PUB 69 را منتشر کرد که پردازندههای خریداری شده توسط دولت ایالات متحده ملزم به تشخیص استاندارد بودند.
ناسازگاری و عدم رعایت استاندارد تنها مشکل قابلیت حمل نبودند. برای محاسبات عددی، در نظر گرفتن ویژگیهای حساب مهم است. اتخاذ (در حال حاضر تقریباً جهانی) استاندارد IEEE 754 برای حساب ممیزشناور باینری، این مشکل را حل کرد.
دسترسی به محیط محاسبات برای مثال خط فرمان برنامه، متغیرهای محیط و غیره همچنان مشکل ایجاد میکرد که در سال ۲۰۰۳ برطرف شد.
در حال حاضر نوشتن یک برنامهٔ قابل حمل در فورترن امکانپذیر است.
دراواخر دهه ۱۹۷۰و اوایل دهه ۱۹۸۰، برای رایانههای Eclipse, MV و Nova عرضهشد که کامپایلر بهینهساز خوبی برای کامپیوترهای زمان خود بشمار میرفت.
درسال ۱۹۶۸در سریال 6600 CDC عرضه شد و مبتنی بر FORTRAN IV بود.
فورترن۶ یا Visual Fortran 2001 توسط ماکروسافت مجاز شد و رابط محیط Visual Studio 5 را برای Compaq v6 ارائهداد.
عرضهکنندگان کامپیوترهای علمی عملکرد بالا (مثال:باروز، شرکت دادههای کنترل(CDC)، (به انگلیسی Cray)، هانیول، آیبیام، تگزاس اینسترومنتس، و یونیوک) افزونههای فورترن را اضافه کردند تا از قابلیتهای سختافزاری مانند حافظه نهان دستور، خط لولههای (به انگلیسی pipeline) واحد پردازش مرکزی، و آرایههای برداری بهره ببرند. برای مثال، یکی از کامپایلرهای فورترن شرکت آیبیام، سطحی از بهینهسازی را داشت که ترتیب دستورهای را عوض میکرد تا واحدهای محاسباتی داخلی مختلف را همزمان مشغول نگه دارد.
یک مثال دیگر CFD است، یک گونهٔ خاص از فورترن که مخصوص ابرکامپیوتر ایلیاک ۴ (به انگلیسی ILLIAC IV) ساخته شدهاست. این کامپیوتر در مرکز تحقیقات ایمز متعلق به ناسا قرار دارد. هم چنین آزمایشگاههای تحقیقاتی آیبیام، یک نسخهٔ توسعهیافته از یک زبان مبتنی بر فورترن به نام وکترن را برای پردازش بردارها و ماتریسها ایجاد کردند.
فورترن شیءگرا یک افزونه شیءگرا از فورترن بود که در آن میتوانستیم دادهها را در اشیاء مختلف گروهبندی کنیم. نمونههای اشیاء میتوانستند به صورت موازی با یکدیگر ساخته شوند و توابعشان را اجرا کنند. فورترن شیءگرا برای کامپیوترهای سان، آیریس، آیپیاسسی و انکیوب موجود بود، اما الان دیگر پشتیبانی نمیشود.
افزونههای اینچنینی که مختص یک یا چند ماشینند یا در طول زمان از بین رفتند، یا عناصری از آنها در استانداردهای اصلی گنجانده شد. مهمترین افزونهٔ باقیمانده اپن امپی است که یک افزونهٔ چندپلتفرمه برای برنامهنویسی با حافظهٔ مشترک است. کواَرِی فورترن یک افزونه جدید است که برای پشتیبانی برنامهنویسی موازی در نظر گرفته شده.
فور ترنزیت یک نسخهٔ ساده شده از زبان فورترن ماشین آیبیام ۷۰۴بود، که برای ماشین آیبیام ۶۵۰ پیادهسازی شد. برای این کار از یک برنامهٔ مترجم ساخت دهه ۱۹۵۰ دانشگاه کارنگی استفاده شد. توضیح زیر در راهنمای مرجع آیبیام آمدهاست[3] (سیستم خودکار برنامهنویسی فور ترنزیت C28-4038 متعلق به آیبیام، کپی رایت ۱۹۵۷ و ۱۹۵۹)
سیستم فورترن برای ماشینی پیچیدهتر از ماشین آیبیام ۶۵۰ ساخته شده بود، و بنابراین بعضی از ۳۲ دستور موجود در راهنمای برنامهنویسان فورترن برای سیستم فور ترنزیت مورد قبول نیستند. بعلاوه، برخی محدودیتها به زبان فورترن اضافه شدهاند. با این حال، هیچکدام از این محدودیتها موجب آن نمیشوند که یک کد منبع که برای فورترن نوشته شدهاست برای سیستم فورترن ماشین آیبیام ۷۰۴ ناسازگار باشد.
دستورهای مجاز اینها بودند:
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
بود. اف قابلیتهای آرایه را که در فورترن ۹۰ اضافه شده بود حفظ میکند و دستورهای کنترلی ای که توسط مفاهیم برنامهنویسی ساختیافته منسوخ شده بودند را حذف میکند. این دستورهای هم به فورترن ۷۷ اضافه شده بودند هم به فورترن ۹۰. سازندگان زبان اف آن را "یک زبان برنامه نویسی کامپایل شده و ساختاریافته برای آرایهها توصیف کردند که "خصوصاً برای آموزش و محاسبات علمی مناسب است".[4]
لاهی و فوجیتسو تیم مشترک تشکیل دادند تا یک زبان فورترن برای چارچوب داتنت مایکروسافت خلق کنند.[5] زبان Silverfrost FTN95 هم توانایی ایجاد کد داتنت را دارد.[6]
اطلاعات بیشتر در: "مثالهای فورترن" (به انگلیسی).
برنامه زیر تخصیص حافظهٔ پویا و عملیات روی آرایهها را شرح میدهد که دو قابلیت معرفی شده در فورترن ۹۰ هستند. بهطور خاص نبود حلقههای 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
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.