מהי ג'וליה? גישה חדשה למחשוב מספרי

ג'וליה היא קוד פתוח בחינם, שפת תכנות דינמית ברמה גבוהה וביצועים גבוהים למחשוב מספרי. יש לה נוחות פיתוחית של שפה דינמית עם ביצועים של שפה שהוקלדה סטטית, בין השאר הודות למהדר JIT המבוסס על LLVM המייצר קוד מכונה מקורי, וחלקו לתכנון המיישם יציבות סוג באמצעות התמחות באמצעות מספר רב שיגור, מה שמקל על הידור לקוד יעיל.

בפוסט בבלוג שהודיע ​​על שחרורו הראשוני של ג'וליה בשנת 2012, הצהירו מחברי השפה - ג'ף בזנסון, סטפן קרפינסקי, ויראלי שאה ואלן אדלמן - כי הם השקיעו שלוש שנים ביצירת ג'וליה משום שהיו חמדנים . הם עייפו מהפשרות בין מטלאב, ליספ, פייתון, רובי, פרל, מתמטיקה, R ו- C, ורצו שפה יחידה שתיטיב עם מחשוב מדעי, למידת מכונה, כריית נתונים, אלגברה לינארית בקנה מידה גדול. , מחשוב מקביל ומחשוב מבוזר.

למי מיועדת ג'וליה? בנוסף להיותה אטרקטיבית עבור מדעני ומהנדסי מחקר, ג'וליה אטרקטיבית גם עבור מדעני נתונים וגם עבור אנליסטים ופיננסים פיננסיים.

מעצבי השפה ושניים אחרים הקימו את ג'וליה מחשוב ביולי 2015 כדי "לפתח מוצרים שהופכים את ג'וליה לקלה לשימוש, קלה לפריסה וקלה להרחבה." נכון לכתיבת שורות אלה, החברה מונה 28 עובדים ולקוחות החל ממעבדות לאומיות ועד בנקים וכלכלנים ועד חוקרי רכב אוטונומי. בנוסף לשמירה על מאגרי הקוד הפתוח של ג'וליה ב- GitHub, ג'וליה מחשוב מציעה מוצרים מסחריים, כולל JuliaPro, המגיע בגרסאות בחינם ובתשלום.

למה ג'וליה?

ג'וליה "שואפת ליצור שילוב חסר תקדים של קלות שימוש, כוח ויעילות בשפה יחידה." לעניין היעילות, שקול את התרשים שלהלן:

מחשוב ג'וליה

אמות מידה של ג'וליה

מה שאנחנו רואים כאן הוא שקוד ג'וליה יכול להיות מהיר יותר מ- C לכמה סוגים של פעולות, ולא יותר מכמה פעמים מ- C עבור אחרים. השווה זאת, נניח ל- R, שיכול להיות איטי כמעט פי 1,000 מ- C עבור פעולות מסוימות.

שים לב שאחד המבחנים האיטיים ביותר עבור ג'וליה הוא רקורסיה של פיבונאצ'י; הסיבה לכך היא שלג'וליה אין כיום אופטימיזציה של זנב. רקורסיה מטבעה היא איטית יותר מאשר לולאה. עבור תוכניות ג'וליה אמיתיות שברצונך להריץ בהפקה, תרצה ליישם את צורת הלולאה (איטרציה) של אלגוריתמים כאלה.

אוסף JIT של ג'וליה

יש עלות לגישת המהדר JIT (בדיוק בזמן) לעומת מתורגמן טהור: על המהדר לנתח את קוד המקור וליצור קוד מכונה לפני שהקוד שלך יכול לפעול. זה יכול להיות זמן הפעלה ניכר של תוכניות ג'וליה בפעם הראשונה שכל פונקציה ומקרו פועלות בהפעלה. אז, בצילום המסך למטה, אנו רואים שבפעם השנייה אנו מייצרים מיליון מספרי נקודה צפה אקראית, הזמן שנדרש הוא בסדר גודל פחות מאשר בביצוע הראשון. צריך לקיים את @timeהמאקרו ואת rand()הפונקציה בפעם הראשונה דרך הקוד, מכיוון שספריות ג'וליה כתובות ביוליה.

ג'וליה> @ זמן ראנד (10 ^ 6);

  0.62081 שניות (הקצאות של 14.44 k: 8.415 MiB)

ג'וליה> @ זמן ראנד (10 ^ 6);

  0.004881 שניות (7 הקצאות: 7.630 MiB)

מעריצי ג'וליה טוענים, באופן שונה, שיש להם את קלות השימוש בפייתון, R, או אפילו מטלב. השוואות אלו עושות בדיקה מכיוון ששפת ג'וליה אלגנטית, עוצמתית ומכוונת למחשוב מדעי, והספריות מספקות מגוון רחב של פונקציונליות מתקדמת לתכנות.

דוגמה של ג'וליה

כדוגמה מהירה לשפה של ג'וליה, שקול את קוד המידה הבא של Mandelbrot:

כפי שאתה יכול לראות, חשבון מספר מורכב מובנה בשפה, כמו גם פקודות מאקרו לבדיקות ולעיתוי. כפי שאתה יכול גם לראות, נקודה-פסיקים נגררים הפוגעים בשפות דמויי C, והסוגריים המקוננים הפוקדים שפות דומות ליס, נעדרים מג'וליה. שים לב mandelperf()שנקרא פעמיים, בשורות 61 ו -62. השיחה הראשונה בודקת את התוצאה לתקינות ועושה אוסף JIT; השיחה השנייה מקבלת את התזמון.

תכנות ג'וליה

לג'וליה יש הרבה תכונות אחרות שכדאי להזכיר. ראשית, סוגים המוגדרים על ידי משתמשים הם מהירים וקומפקטיים כמו מובנים. למעשה, אתה יכול להכריז על טיפוסים מופשטים שמתנהגים כמו טיפוסים גנריים, אלא שהם מורכבים עבור סוגי הטיעונים שהם מועברים.

עבור אחרת, וקטור הקוד המובנה של ג'וליה פירושו שאין צורך במתכנת לווכטר קוד לצורך ביצועים; קוד שגרתי רגיל הוא מהיר. המהדר יכול לנצל את הוראות ה- SIMD והרישומים אם הם קיימים במעבד הבסיסי, ולפרוש את הלולאות בתהליך רציף בכדי להפוך אותם לווקטור ככל שהחומרה מאפשרת. אתה יכול לסמן לולאות בתור וקטור בעזרת @simdההערה.

מקביליות של ג'וליה

ג'וליה תוכננה גם להקבלה וחישוב מבוזר, תוך שימוש בשני פרימיטיבים: הפניות מרחוק ושיחות מרחוק. הפניות מרחוק מגיעות בשני טעמים:  Future ו  RemoteChannel. A Futureשווה ערך ל- JavaScript promise; a RemoteChannelניתן לשכתוב וניתן להשתמש בו לתקשורת בין תהליכים, כמו יוניקס pipeאו גו channel. בהנחה שהתחלת ג'וליה עם תהליכים מרובים (למשל julia -p 8עבור מעבד שמונה ליבות כגון מעבד Intel Core i7), אתה יכול @spawnאו remotecall()פונקציה שיחות לבצע על אחר תהליך ג'וליה אסינכרוני, ומאוחר המוחזרות בעת רוצה לסנכרן ולהשתמש תוֹצָאָה.fetch()Future

אם אינך צריך לרוץ על מספר ליבות, אתה יכול להשתמש בהברגה "ירוקה" קלה, הנקראת Task()ב- Julia ו- coroutine בשפות אחרות. A Task()או @taskעובד בשיתוף עם a Channel, שהיא הגרסה בתהליך יחיד של RemoteChannel.

מערכת מסוג ג'וליה

לג'וליה יש מערכת מסוג לא בולטת אך חזקה שהיא דינמית עם הסקת סוג זמן ריצה כברירת מחדל, אך מאפשרת הערות מסוג אופציונאליות. זה דומה ל- TypeScript. לדוגמה:

julia> (1 + 2) :: AbstractFloat

שגיאה: TypeError: typeassert: expected AbstractFloat, קיבל Int64

ג'וליה> (1 + 2) :: Int

3

כאן אנו קובעים סוג לא תואם בפעם הראשונה, גורם לשגיאה, וסוג תואם בפעם השנייה.

ג'וליה מיתרת

לג'וליה תמיכה יעילה במחרוזות ותווים של Unicode, המאוחסנות בפורמט UTF-8, כמו גם תמיכה יעילה בתווי ASCII, מכיוון שב- UTF-8 נקודות הקוד פחות מ- 0x80 (128) מקודדות בתו יחיד. אחרת, UTF-8 הוא קידוד באורך משתנה, כך שאינך יכול להניח שאורכו של מחרוזת ג'וליה שווה לאינדקס התווים האחרון.

תמיכה מלאה ב- UTF-8 פירושה, בין היתר, שאתה יכול להגדיר משתנים בקלות בעזרת אותיות יווניות, מה שיכול לגרום לקוד ג'וליה המדעי להיראות מאוד כמו הסברי הנוסחאות בספר הלימוד, למשל sin(2π). transcode()פונקציה מסופקת UTF-8 להמיר אל ומאת קידודי Unicode אחרים.

פונקציות C ו- Fortran

ג'וליה יכולה להתקשר ישירות לפונקציות C ו- Fortran, ללא צורך בעטיפות או ממשקי API מיוחדים, אם כי אתה צריך לדעת את שם הפונקציה "המעוטר" שנפלט על ידי מהדר Fortran. הפונקציה החיצונית C או Fortran חייבת להיות בספריה משותפת; אתה משתמש ccall()בפונקציה ג'וליה לצורך השיחה בפועל. לדוגמא, במערכת דמוית יוניקס תוכלו להשתמש בקוד ג'וליה זה בכדי לקבל ערך של משתנה סביבה באמצעות getenvהפונקציה ב- libc:

function getenv (var :: AbstractString)

     val = ccall ((: getenv, "libc"),

                 מיתר, (מיתר,), var)

     אם val == C_NULL

         שגיאה ("getenv: משתנה לא מוגדר:", var)

     סוֹף

     מחרוזת לא בטוחה (val)

סוֹף

julia> getenv ("SHELL")

"/ bin / bash"

ג'וליה מאקרו

לג'וליה יש פקודות מאקרו דומות ליספ, להבדיל ממעבדי המקרו המשמשים C ו- C ++. לג'וליה יש גם מתקני מטה-תכנות אחרים, כגון השתקפות, יצירת קוד, אובייקטים של סמל (למשל :foo) וביטוי (למשל :(a+b*c+1)) eval()ופונקציות שנוצרו. מאקרו של ג'וליה מוערכים בזמן הניתוח.

לעומת זאת, פונקציות שנוצרו מורחבות כאשר ידועים סוגי הפרמטרים שלהם לפני הידור פונקציות. לפונקציות שנוצרות יש את הגמישות של פונקציות גנריות (כפי שהן מיושמות ב- C ++ ו- Java) ויעילותן של פונקציות שהוקלדו חזק, על ידי ביטול הצורך בהעברת זמן ריצה לתמיכה בפולימורפיזם פרמטרי.

תמיכה ב- GPU

לג'וליה יש תמיכה ב- GPU תוך שימוש בין השאר בחבילת הלמידה העמוקה של MXNet, בספריית מערכי ה- GPU ArrayFire, בספריות הרשת העצבית העמוקה cuBLAS ו- cuDNN, ובמסגרת CUDA למחשוב GPU למטרות כלליות. עטיפות יוליה וספריותיהן בהתאמה מוצגות בתרשים שלהלן.

מחשוב ג'וליה

ג'וליאפרו וג'ונו IDE

אתה יכול להוריד את שורת הפקודה בחינם של קוד פתוח של ג'וליה עבור Windows, MacOS, Linux כללי או FreeBSD כללי מאתר השפה ג'וליה. אתה יכול לשכפל את מאגר קוד המקור של ג'וליה מ- GitHub.

לחלופין תוכלו להוריד את ג'וליאפרו ממחשוב ג'וליה. בנוסף למהדר, ג'וליאפרו מעניקה לך את ג'ונו IDE המבוסס על אטום (מוצג להלן) ויותר מ -160 חבילות באוצרות, כולל הדמיה ותכנון.

מעבר למה שיש ב- JuliaPro החינמי, אתה יכול להוסיף מנויים לתמיכה ארגונית, פונקציונליות פיננסית כמותית, תמיכה במסדי נתונים וניתוח סדרות זמן. JuliaRun הוא שרת מדרגי עבור אשכול או ענן.

מחברות Jupyter ו- IJulia

בנוסף לשימוש ב- Juno בתור ה- Julia IDE שלך, אתה יכול להשתמש בקוד Visual Studio עם הסיומת Julia (מוצג ישירות למטה), ובמחברות Jupyter עם ליבת IJulia (מוצג בתמונות המסך השנייה והשלישית למטה). יתכן שתצטרך להתקין מחברות Jupyter עבור Python 2 או (רצוי) Python 3 עם Anaconda או pip.

ג'וליבוקס

אתה יכול להריץ את ג'וליה במחברות Jupyter באופן מקוון באמצעות JuliaBox (מוצג להלן), מוצר אחר של ג'וליה מחשוב, מבלי לבצע התקנה במחשב המקומי שלך. JuliaBox כולל כיום יותר מ -300 חבילות, מריץ את Julia 0.6.2 ומכיל עשרות מחברות Jupyter הדרכות. הרשימה העליונה של תיקיות הדרכה מוצגת למטה. הרמה החופשית של גישה ל- JuliaBox מעניקה לך הפעלות של 90 דקות עם שלוש ליבות מעבד; המנוי האישי של $ 14 לחודש מעניק לך הפעלות של ארבע שעות עם חמש ליבות; והמנוי המקצועי של $ 70 לחודש נותן לך הפעלות של שמונה שעות עם 32 ליבות. גישה ל- GPU עדיין לא זמינה החל מיוני 2018.

חבילות ג'וליה

ג'וליה "הולכת כמו פייתון, אבל רצה כמו סי." כפי שכתב חברי סרדר יגולאלפ בדצמבר 2017, ג'וליה מתחילה לאתגר את פייתון לתכנות מדעי הנתונים, ולשתי השפות יתרונות. כאינדיקציה לתמיכה המתבגרת במהירות במדעי הנתונים ביוליה, קחו בחשבון שכבר ישנם שני ספרים שכותרתם ג'וליה למדעי נתונים , אחד מאת זכריאס וולגריס, והשני מאת אנשול ג'ושי, אם כי אני לא יכול לדבר על האיכות של אף אחד מהם אחד.

אם תסתכל על חבילות ג'וליה המדורגות ברמה הגבוהה ביותר של ג'וליה אובזרבר, המוצגת למטה, תראה גרעין ג'וליה למחשבי Jupyter, חבילת הגרפיקה Gadfly (בדומה ל- ggplot2R), ממשק לרישום כללי, מספר למידה עמוקה ומכונה חבילות למידה, פותרים של משוואות דיפרנציאליות, DataFrames, מודלים של שיווי משקל כללי דינמי (DSGE) בניו יורק, שפת דוגמנות אופטימיזציה וממשקים לפייתון ו- C ++. אם תרחיק קצת יותר את הרשימה הכללית הזו, תמצא גם את QuantEcon, PyPlot, ScikitLearn, חבילת ביואינפורמטיקה, ויישום רשימות עצלות לתכנות פונקציונלי.

אם חבילות ג'וליה אינן מספיקות לצרכים שלך, וממשק ה- Python לא מביא אותך לאן שאתה רוצה להגיע, אתה יכול גם להתקין חבילה שנותנת לך ממשקים כלליים ל- R (RCall) ו- Matlab.

ג'וליה לאנליסטים ופיננסים פיננסיים

קוונטים ואנליסטים פיננסיים ימצאו חבילות רבות בחינם כדי להאיץ את עבודתם, כפי שמוצג בצילום המסך למטה. בנוסף, ג'וליה מחשוב מציעה את חבילת JuliaFin, המורכבת מ- Miletus (DSL לחוזים פיננסיים),  JuliaDB (ביצועים גבוהים בזיכרון ובסיס נתונים מבוזר),  JuliaInXL (התקשר לג'וליה מגיליונות Excel)  וקישוריות בלומברג (גישה ל נתוני שוק היסטוריים בזמן).