فرترن

**فورترن**  یک زبان برنامه‌نویسی همه-منظوره، کامپایل شونده و دستوری می‌باشد که مخصوصاً برای محاسبات عددی و علم محاسبه مناسب است. فورترن در گذشته به صورت حروف بزرگ FORTRAN نوشته می‌شده که کوته‌نوشت FORmula TRANslation می‌باشد.

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

## نامگذاری
نام نسخه‌های قبلی این زبان با حروف بزرگ بیان می‌شد و FORTRAN 77 آخرین نسخه‌ای بود که در آن استفاده از حروف کوچک در کلمات اصلی غیراستاندارد بشمار می‌رفت. در نسخه‌های جدیدتر از fortran90 این استاندارد حذف شد.

## تاریخچه
دراواخر سال ۱۹۵۳، جان بکوس (John Backus) پیشنهادی جهت جایگزینی یک برنامه عملی‌تر برای زبان اسمبلی برنامه‌نویسی IBM 704 ارائه کرد. تیم برنامه‌نویسان گذشته فورترن شامل ریچارد گلدبرگ، شلدون بِست، هارلان هریک، پیتر شریدان، روی نوت، رابرت نلسون، ایروینگ زیلر، هارولد استرن، لوییزهایت و دیوید سیر بود. هدف اصلی ورود آسان‌تر معادلات به رایانه بود که ایده آن توسط J. Halcombe Laning توسعه یافت.
پیشنویس مشخصات سیستم ترجمه فرمول ریاضی در نوامبر سال ۱۹۵۲ تکمیل شد و اولین کتابچه راهنمای‌آن، در اکتبر ۱۹۵۶ آماده‌شد و با اولین کامپایلر فورترن در آوریل ارائه شد. این اولین کامپایلر بهینه‌ساز بود. مشتریان زمانی تمایل به استفاده از زبان سطح بالا دارند که عملکرد کد تولید شده توسط کامپایلر مشابه عملکرد کداسمبلی دست‌نویس باشد.
درحالی‌که برنامه نویسان در عملکرد بهتر این نوع برنامه‌نویسی نسبت به کداسمبلی دست‌نویس تردید داشتند، کاهش بالای تعداد عبارات برنامه‌نویسی توجه برنامه‌نویسان را جلب کرد. جان بکوس در طی مصاحبه ای در سال، گفت: "بخش عمده‌ای از کار من از تنبلی ناشی شده‌است. من نوشتن برنامه‌ها را دوست نداشتم، بنابراین هنگامی که در IBM 701 کار می‌کردم، برنامه‌هایی برای محاسبات می‌نوشتم. پس شروع به کار بر روی یک سیستم برنامه نویسی کردم تا نوشتن برنامه‌ها آسان‌تر شود. "
دانشمندان این زبان را بسیار مناسب برای برنامه های‌فشرده عددی دانستند و نویسندگان کامپایلر را، برای نوشتن کامپایلر با سرعت و کارامدی بیشتر ترغیب کردند. گنجایش این زبان برای داده‌های عددی بسیار پیچیده، آن را برای برنامه‌های فنی به‌خصوص در مهندسی برق مناسب نموده‌است.
تا سال ۱۹۶۰ نسخه‌های فورترن برای رایانه‌های 1620 IBM ۱۰۹، IBM 650، IBM و 7090 IBM در دسترس بود. محبوبیت روزافزون این زبان، سازندگان آن را تشویق‌کرد بطوری‌که تا سال ۱۹۶۳، بیش از ۴۰ کامپایلر فورترن دردسترس بود.

توسعه فورترن به موازات سیرتکاملی کامپایلر بود و به همین دلیل بسیاری از پیشرفت‌های تئوری و طراحی کامپایلر در جهت رفع نیازهای فورترن برای ایجاد کد کارامدتر ایجادشد.

## علم و مهندسی
بندانگشتی|شبیه‌سازی GRMHD با کد Fortran
اگرچه نویسندگان بیسیک فورترن را قدیمی توصیف کرده بودند، اکنون چندین دهه است که این زبان مورد استفاده قرار گرفته‌است.

جی پاساکوف در سال ۱۹۸۴ نوشت: «دانشجویان فیزیک و نجوم باید فورترن را بیاموزند و بعید به نظر می‌رسد دانشمندان به دیگر زبان‌های پاسکال، مدولا یا هر چیز دیگری روی‌آورند.»

در سال ۱۹۹۳، سیسیل لیث، فورترن را «زبان مادری محاسبات علمی» خواند و افزود: «جایگزینی آن با هر زبان دیگر ممکن است یک امید فراموش شده باقی بماند.»

فورترن یک زبان اولیه برای برخی کارهای حجیم در ابرکامپیوترها مانند نجوم، مدل‌سازی آب و هوا، شیمی محاسباتی، اقتصاد محاسباتی، دینامیک سیالات محاسباتی، فیزیک محاسباتی، تجزیه و تحلیل داده‌ها، مدل‌سازی هیدرولوژیکی، جبرخطی عددی و کتابخانه‌های عددی (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 متعلق به آی‌بی‌ام، کپی رایت ۱۹۵۷ و ۱۹۵۹)

سیستم فورترن برای ماشینی پیچیده‌تر از ماشین آی‌بی‌ام ۶۵۰ ساخته شده بود، و بنابراین بعضی از ۳۲ دستور موجود در راهنمای برنامه‌نویسان فورترن برای سیستم فور ترنزیت مورد قبول نیستند. بعلاوه، برخی محدودیت‌ها به زبان فورترن اضافه شده‌اند. با این حال، هیچ‌کدام از این محدودیت‌ها موجب آن نمی‌شوند که یک کد منبع که برای فورترن نوشته شده‌است برای سیستم فورترن ماشین آی‌بی‌ام ۷۰۴ ناسازگار باشد.

دستورهای مجاز این‌ها بودند:
* دستورهای مقداردهی محاسباتی، مثل `a = b`
* 
* `GO TO (n<sub>1</sub>, n<sub>2</sub>, ..., n<sub>m</sub>), i`
* `IF (a) n<sub>1</sub>, n<sub>2</sub>, n<sub>3</sub>`
* 
* 
* `DO n i = m1, m2`
* 
* 
* 
* 
* 
* 

در هر برنامه استفاده از حداکثر ۱۰ رویه (زیرروال) ممکن بود.
دستورهای FOR TRANSIT به ستون ۷ تا ۵۶ کارت پانچ (به انگلیسی :en:Punched Card) محدود می‌شدند. کارت پانچ‌ها به عنوان ورودی و خروجی آی‌بی‌ام ۶۵۰ استفاده می‌شدند. سه بار عبور لازم بود تا کد منبع به زبان "IT" ترجمه شود، و بعد دستورهای IT کامپایل شده و به زبان اسمبلی سوپ(SOAP) ترجمه شود، و نهایتاً برنامه به زبان مقصد (کد ماشین) تولید شود، بعد می‌توان آن را درون ماشین بارگذاری کرد تا برنامه را اجرا کند (برای داده ورودی از کارت پانچ استفاده می‌شود، نتیجه را هم روی کارت پانچ خروجی می‌دهد)

### زبانهای مبتنی بر فورترن
قبل از فورترن ۷۷، به‌طور معمول تعدادی پیش‌پردازنده برای میسر ساختن یک زبان مناسب تر مورد استفاده قرار می‌گرفتند، با این مزیت که کد پیش پردازش شده می‌توانست روی هر ماشینی که یک کامپایلر استاندارد فورترن داشت کامپایل شود. این پیش پردازنده‌ها معمولاً از برنامه‌نویسی ساختاریافته، اسامی با طول بیش از ۶ کاراکتر برای متغیرها، نوع داده‌های اضافه، کامپایل شرطی برنامه، و حتی قابلیت‌های ماکرو پشتیبانی می‌کردند. پیش‌پردازنده‌های متداول شامل , ایفترن، مورترن، SFtran, S-Fortran, رتفور و رتفیو می‌شدند. برای مثال، رتفور و رتفیو یک زبان شبیه سی پیاده‌سازی می‌کردند و کد پیش‌پردازش‌شده را به زبان فورترن ۶۶ خروجی می‌دادند. علی‌رغم پیشرفت‌ها در زبان فورترن، پیش‌پردازنده‌ها هم چنان برای کامپایل شرطی برنامه‌ها و جایگزینی ماکروها مورد استفاده قرار می‌گیرند.

یکی از افزونه‌های فورترن که برای پشتیبانی برنامه‌نویسی سیستم‌ها عرضه شد، زبان LRLTRAN در آزمایشگاه ملی لارنس برکلی و با هدف پشتیبانی از محاسبات برداری و ذخیره‌سازی پویا ایجاد شد. این توزیع، سیستم عامل LTSS را شامل می‌شد.
بسیاری از کامپایلرهای فورترن، بخش‌هایی ازپیش‌پردازندهٔ سی را در خود ادغام کرده‌اند. سیم‌اسکریپت یک پیش‌پردازندهٔ فورترن مخصوص کاربردهای خاص برای مدلسازی و شبیه‌سازی سیستم‌های گسسته (به انگلیسی :en:Discrete System) بزرگ است.

زبان برنامه‌نویسی F طراحی شد تا زیرمجموعه مرتبی از فورترن ۹۵ باشد که هدفش حذف کردن قابلیت‌های زائد، بدون‌ساختار و منسوخ‌شدهٔ فورترن، مثل دستور  بود. اف قابلیت‌های آرایه را که در فورترن ۹۰ اضافه شده بود حفظ می‌کند و دستورهای کنترلی ای که توسط مفاهیم برنامه‌نویسی ساخت‌یافته منسوخ شده بودند را حذف می‌کند. این دستورهای هم به فورترن ۷۷ اضافه شده بودند هم به فورترن ۹۰. سازندگان زبان اف آن را "یک زبان برنامه نویسی کامپایل شده و ساختاریافته برای آرایه‌ها توصیف کردند که "خصوصاً برای آموزش و محاسبات علمی مناسب است".

لاهی و فوجیتسو تیم مشترک تشکیل دادند تا یک زبان فورترن برای چارچوب دات‌نت مایکروسافت خلق کنند.
زبان Silverfrost FTN95 هم توانایی ایجاد کد دات‌نت را دارد.

### نمونه کد
اطلاعات بیشتر در: 

برنامه زیر تخصیص حافظهٔ پویا و عملیات روی آرایه‌ها را شرح می‌دهد که دو قابلیت معرفی شده در فورترن ۹۰ هستند. به‌طور خاص نبود حلقه‌های  و دستورهای  برای تغییر دادن آرایه شایان ذکر است که در عوض عملیات ریاضی روی کل آرایه به عنوان یک موجودیت اعمال می‌شود. بعلاوه، نامگذاری متغیرها به گونه ای که نام متغیر، آن را توصیف کند، و قالب کلی کد که مطابق با شیوه برنامه‌نویسی امروزی است نیز آشکار است. این مثال، میانگین داده‌هایی که در تعامل با کاربر از ورودی گرفته می‌شود را محاسبه می‌کند.


```fortran
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
```


## جستارهای وابسته
* اختراع‌ها در ایالات متحده (۱۹۴۶–۱۹۹۱)

## منابع

* پرویز جبه‌دار مارالانی، منصور نیکخواه بهرامی، برنامه‌نویسی فرترن ۷۷، نشر: صفار (۲۱ بهمن، ۱۳۸۶)، شابک: ۹۷۸-۹۶۴-۵۹۷۳-۵۱-۱

رده:ابزارهای برنامه‌نویسی یونیکس
رده:اختراع‌های آمریکایی
رده:استانداردهای رایانه
رده:زبان‌های برنامه‌نویسی آرایه‌ای
رده:زبان‌های برنامه‌نویسی آکادمیک
رده:زبان‌های برنامه‌نویسی ایستا
رده:زبان‌های برنامه‌نویسی خانواده فورترن
رده:زبان‌های برنامه‌نویسی دارای استاندارد ایزو
رده:زبان‌های برنامه‌نویسی رویه‌ای
رده:زبان‌های برنامه‌نویسی ساخته‌شده در ۱۹۵۷ (میلادی)
رده:زبان‌های برنامه‌نویسی سطح بالا
رده:زبان‌های برنامه‌نویسی شیءگرا
رده:زبان‌های برنامه‌نویسی عددی
رده:زبان‌های برنامه‌نویسی
رده:فورترن
رده:معرفی‌شده‌های مرتبط با رایانه در ۱۹۵۷ (میلادی)
رده:نرم‌افزارهای ۱۹۵۷ (میلادی)
رده:نرم‌افزارهای آی‌بی‌ام