מבוא לתכנות של קבוצת בטא/המדריך המהיר של עופר לשפת פורטרן/המדריך המהיר של עופר לFortran מודרנית
קישקושים מקדימים
[עריכה]מי בכלל משתמש בפורטרן מודרנית?
[עריכה]מאגרי הקוד הענקיים שמכוני מחקר אקדמיים בעולם משתפים ביניהם, מדענים וכו'.
למשל:
- ספריית המכניקה המקרומולקולרית של הרווארד משתמשים בFortran95.
- הקונסורציום האירופי למידול האוקיינוסים משתמשים בFortran95.
- חבילת קוואנטום אספרסו לחישובי מבנה אלקטרוני ומידול חומרים ברמת הנאנו בנויה מ70% של Fortran90.
- ארגון התשתית החישובית לגיאודינמיקות משתמשים בFortran90.
- במעבדת לוס אלאמוס של משרד האנרגיה האמריקאי יש כמה מליוני שורות קוד בפורטרן.
- ואונדריי צ'רטיק גם כתב בפורטרן GPT-2 שיותר מהיר מזה של פייתון. סתם כי בא לו.
איך הקהילה של פורטרן שרדה כל הזמן הזה?
[עריכה]האמת, לא כל כך שרדה. אבל מ2017 ועד 2021 כמה אנשים, ובעיקר אונדריי צ'רטיק, החליטו להחיות את הקהילה של Fortran, כולל אתר, כולל כנס. והצליח להם לא רע. אז עכשיו יש קהילה של משהו כמו 70 איש, שהם הגרעין לכל נושא הפורטרן המודרני.
לומדים פורטרן
[עריכה]--צריך להשלים.--
הערות
[עריכה]בפורטרן 66 הגיעו למסקנה שהערות זה מועיל. אז כל שורה שמתחילה בc עם רווח היא הערה.
PROGRAM FOO
C A COMMENT
END
בפורטרן 90 קלטו שבעצם ככה לא ניתן לעשות משתנה שנקרא c, ולא ניתן לשים הערות בסוף שורות. אז זרקו את הc מהחלון, ועכשיו סימן קריאה (!) מתחיל הערה, גם אם זה באמצע השורה.
program foo
! a comment
integer :: bar !another comment
end program foo
מערכים
[עריכה]--צריך להשלים.--
מחרוזות
[עריכה]--צריך להשלים.--
תת-מחרוזות
[עריכה]בדיוק כמו חיתוך מערכים:
program foo
implicit none
character(10) :: str
integer :: array1(10)
str = "lorem ipsu"
array1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] !This is fortran2003 notation for arrays
print *, str(2:5)
print *, array1(2:5)
end program foo
orem
2 3 4 5
עד שזה מגיע לקפיצות. שם לא כמו מערכים. לא יודע למה.
!Would not compile.
print *, str(2:10:2)
!Would happily compile.
print *, array1(2:10:2)
!wtf
המכוער - מוקשים בפורטרן
[עריכה]חשבתם שהשארנו את ההפתעות בשנת 77? מה פתאום, פורטרן תדאג שלעולם לא ישעמם לך עם באגים סבירים. ארץ הפלאות זה פה.
רווחים בסטנדרט
[עריכה]אז הרצתם gfortran והתוכנה התקמפלה. יופי. ועכשיו הוספתם דרישה להיצמד לסטנדרט החביב עליכם, נגיד לFortran2018:
gfortran test.f90 -o test.exe -std=f2018
הופ, לא מתקמפל. מה קרה?
זה מה שקרה:
Warning: Nonconforming tab character at (1) [-Wtabs]
כברירת מחדל gfortran משתמש בסטנדרט שנקרא gnu, שהוא לא סטנדרט אלא סתם מה שהיה כיף לאנשי פרויקט גנו.
אבל פורטרן סטנדרטית אמיתית לא באמת בקטע של טאבים. רק רווחים. הטאב אפילו לא נמצא בסט התוים של פורטרן.
כיף עד עכשיו? לפחות כאן הקומפיילר סיפר לנו מה הבעיה. קלטו את החוכא ואיטלולא הבא.
אז תשנו את כל התוכנה שלכם להשתמש עכשיו ברווחים במקום טאבים.
או שתשתמשו בדגל Wtabs- של gfortran כמו שכתוב בשגיאה. אה, לא רגע, הם שינו את זה בגירסה 5 של gfortran: עכשיו הדגל Wno-tabs- מונע שגיאות טאבים וWtabs- דווקא גורם לשגיאות באגים. אה, לא רגע, כשמשתמשים בסטנדרטים של פורטרן הקומפיילר מתעלם בכל מקרה מדרישות בענייני טאבים ודורש רווחים, תצעקו עד מחר. יודעים מה, תשכחו מזה, פשוט תחליפו הכל לרווחים.
IO רקורסיבי
[עריכה]בואו נסתכל על תוכנה לגיטימית לגמרי שקוראת לפונקציה שמדפיסה משהו, ואז מדפיסה את הערך המוחזר של הפונקציה:
program main
implicit none
integer :: foo
integer :: bar
foo = bar(3)
write (*, '(I0)') foo
end program main
function bar(num)
implicit none
integer, intent(in) :: num
integer :: bar
bar = num + 3
write (*, '(A)') "dandy"
end function bar
יחשוב הבטאי הסביר ויגיד "רגע, למה שנבזבז פה זיכרון על משתנה מתווך, בואו נחסוך את המשתנה ונעשה את הקריאה לפונקציה ישירות מתוך הprint." ככה:
program main
implicit none
integer :: bar
write (*, '(I0)') bar(3)
end program main
פורטרן בתגובה:
כי אם אתה בפונקציה שמשתתפת בהדפסה למסך, ואז אתה עושה מתוכה הדפסה למסך יוצא "IO רקורסיבי" שיגרום לתוכנה שלך לרוץ לנצח נצחים בלי להוציא שום פלט. על זה נאמר מקום רע מאוד: מקום לחכות.
אל תחכו. תעשו איזה CTRL-C ותתקנו את הקוד כך שישתמש במשתנה מתווך.
אגב, האגדות מספרות שבFortran2018 יש טריקים לעקוף את זה, אבל עדיין לא יצא לי לקמפל את האגדות האלו, אז בהצלחה עם זה.
מקורות
[עריכה]- https://fortran-lang.org/
- https://fortranwiki.org/
- שגיאות מפתיעות בFortran90.
- [1]
- האתר של סטיב "דוקטור פורטרן" ליונל. מתכנת מקצועי בפורטרן כבר 45 שנה ומעלה, כותב טיפים על פורטרן מאז שהציאו את windows, וראש ועדת התקנים של פורטרן (WG5) מאז 2017.
- learn Frortran in Y minutes
- הhandouts של אוניברסיטת הוואי וההרצאות.
- מדריך פורטרן 95 של אן פויו מאוניברסיטת אוסלו.