زبان برنامه نویسی جولیا به طور خاص با هدف کار در بخشهای مربوط به مصورسازیدادهها، یادگیری ماشین، محاسبات علمی و غیره طراحی شده است. به همین دلیل بیشتر در حوزههای تخصصی استفاده میشود. زبان برنامهنویسی جولیا با هدف ترکیب مزایای زبانهای C و ++C و زبان برنامه نویسی پایتون و R طراحی و تولید شده است. در این مطلب از مجله فرادرس نگاهی به تاریخ زبان برنامه نویسی جولیا کرده و مراحل ابتدایی کدنویسی با جولیا را تمرین کردهایم. سپس ویژگیهای کلیدی آن را بررسی کردیم. در نهایت هم بعضی از حوزههای کاربردی را نامبرده و توضیح دادهایم که جولیا در حال حاضر با استقبال زیادی در آن حوزهها روبهرو شده است.
زبان برنامه نویسی جولیا چیست؟
جولیا زبان برنامه نویسی سطح بالا، پویا و چند منظورهای با ویژگیهای بسیار زیاد است. اصلیترین کاربردهای جولیا در علوم کامپیوتری، محاسبات علمی و اپلیکیشنهای هوش مصنوعی است. زبان جولیا با هدف کارآمد بودن و کاربری ساده طراحی شده و دارای مجموعه غنی از کتابخانهها و ابزار مختلف برای انجام پروژههای گوناگون در حوزههایی مانند مصورسازی و تحلیل داده است.
توسعه جولیا با استفاده از رویکرد تازهای برای انجام محاسبات تکنیکی و ترکیب سادگی استفاده از پایتون و زبان R، همراه با كارایی ++C و زبان برنامه نویسی فرترن انجام شده است. علاوه بر موارد گفته شده، کدهای جولیا سینتکس بسیار ساده و روانی را فراهم کرده که کمک میکند ایدههای جدید ریاضی را با بیان سادهتری پیادهسازی کنیم.
نکته مثبت قابل ذکر دیگر درباره جولیا اوپن سورس بودن آن است. به کمک این ویژگی هرکسی میتواند بدون مشکل و به صورت رایگان کدنویسی با آن را شروع کند. از آنجا که جولیا برای انجام محاسبات با کیفیت بالا طراحی شده به گزینه بسیار خوبی برای انجام پروژههای «تحلیلِ داده» (Data Analysis) در مقیاس بزرگ تبدیل شده است. بنابراین اگر به دنبال زبان برنامهنویسی قدرتمندی میگردید که اوپن سورس بوده و استفاده سادهای هم داشته باشد، جولیا یکی از بهترین انتخابهای پیشرو است.
تاریخچه جولیا
زبان برنامه نویسی جولیا اولین بار در سال ۲۰۱۲ میلادی توسط تیمی از توسعهدهندگان با رهبری «جف بزانسون» (Jeff Bezanson)، «استفان کارپینسکی» (Stefan Karpinski)، «ویرال بی.شاه» (Viral B. Shah) و «الن ادلمن» (Alan Edelman) معرفی شد. از بدو پیدایش، جولیا در رشتههای متنوع و زیادی مانند یادگیری ماشین، علم داده و محاسبات علمی به کار برده شده است.
فقط به دلیل اینکه یکی از طراحان آن – یعنی آقای جف بزنسون – در مصاحبهای این زبان را با نام جولیا نامید، بدون هیچ دلیل خاصی، به نام جولیا نامگذاری شد. برعکس بقیه زبانهای برنامه نویسی فنی که در آن زمان برای انجام محاسبات استفاده میشدند، جولیا با این هدف طراحی شد که زبان برنامهنویسی مستقل، با کاربردهای گوناگون و دارای توانایی مدیریت وظایف مختلف باشد.
طراحی جولیا در سال ۲۰۰۹ با هدف ساخت زبان متن باز، با کارایی بالا و مناسب برای محاسبات عددی و علمی، شروع شد.
فلسفه طراحی این زبان بر روی عملکرد بهتر برنامه نویسی و خوانایی بیشتر کدها تاکید میکند. علاوه بر برنامه نویسی شیءگرایی و دستورات سنتی، جولیا از برنامه نویسی تابعی و «فرا برنامه نویسی» (Metaprogramming) نیز پشتیبانی می کند. هدف اصلی در تمام نسخههای زبان جولیا افزایش کیفیت بیشتر، نزدیکتر شدن به فلسفه طراحی و کاهش خطاها است.
آموزش اصولی انواع زبان های برنامه نویسی
آموزش اصولی انواع زبانهای برنامه نویسی یکی از نکاتی است که قبل از شروع به یادگیری باید در نظر داشته باشید. اصول این آموزش بعد از انتخاب زبان صحیح، توجه منظم به موارد مهم و پایهای است. زبانهای برنامهنویسی در بعضی از نکات با هم مشترک و در بعضی دیگر اختلاف قابل توجهی دارند. به همین منظور فیلمهای آموزشی مناسبی را در فرادرس تولید کردهایم.
وبسایت فرادرس تلاش کرده که دانشجویان و دانشآموزان هر حوزهای بتوانند از فیلمهای این وبسایت استفاده کرده و نیازهای علمی خود را برآورده کنند. تمام فیلمهای فرادرس با بهترین کیفیت و نظم تهیه و تولید شدهاند. در پایین چند مورد از فیلمهای آموزشی مربوط به زبانهای برنامهنویسی مختلف را معرفی کردهایم. اما در صورت تمایل با کلیک بر روی تصویر زیر میتوانید به صفحه اصلی این مجموعه آموزش هدایت شده و از فیلمهای بیشتری دیدن کنید.
کدنویسی با زبان برنامه نویسی جولیا
جولیا یکی از زبانهای سطح بالا و پویایی است که با هدف فراهم کردن سرعت پردازش زبانهای C و ++C در کنار سادگی استفاده از زبان پایتون طراحی شده. یعنی اینکه توسعهدهندگان میتوانند مسائل را با سرعت بالاتر و کیفیت بیشتری حل کنند.
جولیا برای حل کردن مسائل پیچیده محاسباتی گزینه بسیار خوبی است. بسیاری از کاربران جولیا بر روی کار در حوزههای علمی مانند شیمی، زیست شناسی و یادگیری ماشین متمرکز شدهاند.
علیرغم اینکه جولیا با هدف انجام محاسبات علمی طراحی شده، اما زبانی با کاربردهای عمومی است. زبان برنامه نویسی جولیا میتواند انواع وظایف متنوع مانند توسعه اپلیکیشنهای تحت وب، توسعه بازی و غیره را نیز برعهده بگیرد. متخصصان زیادی، به دلایل فهرست شده در پایین زبان جولیا را به عنوان نسل بعدی زبانهای مورد استفاده در رشتههای یادگیری ماشین و علم داده معرفی میکنند.
- سرعت بالا
- انعطافپذیری
- روند روبه رشد اکوسیستم کتابخانههای تخصصی برای کار بر روی حجم انبوه دادهها
- و غیره
به همین دلیل در این قسمت از مطلب، برای مخاطبین مجله، آموزشهای ابتدایی را به جهت آشنا شدن با کدهای زبان جولیا فراهم کردهایم.
زبان برنامه نویسی جولیا را چگونه دانلود کنیم؟
دو روش اصلی برای اجرای کدهای جولیا وجود دارند که در فهرست زیر معرفی کردهایم.
- اجرای فایلهای کد جولیا با پسوند .jl در IDE-هایی مانند VSCode
- اجرای دستورهای زبان جولیا با استفاده از REPL مخصوص این زبان
نکته: کلمه REPL سرنام عبارتهای «Read Evaluate Print Loop» به معنای «خواندن، ارزیابی، چاپ، حلقه» است. این کلمه به محیطی بومی مختص به کدنویسی این زبان اشاره دارد. در بعضی از زبانهای دیگر نیز به این محیط REPL گفته میشود.
در این مطلب، به صورت عمده از REPL زبان جولیا استفاده میکنیم. اما قبل از استفاده از این محیط کدنویسی باید زبان جولیا را دانلود کنیم.
برای دانلود زبان جولیا کافی است که به سایت رسمی این زبان برنامهنویسی رفته – لینک (+) – و نسخه مورد نظر خود را دانلود کنیم. البته با زدن کد زیر در «خط فرمان» (Command Prompt) ویندوز هم میتوان آخرین نسخه جولیا را از Microsoft Store دانلود کرد.
winget install julia -s msstore
بعد از اینکه جولیا دانلود و نصب شد، میتوان به سادگی آن را اجرا کرد. در نتیجه باید با صفحه زیر روبهرو شویم.
همراه با نصب جولیا، REPL هم بر روی کامپیوتر نصب میشود.
اصول ابتدایی کدنویسی زبان برنامه نویسی جولیا
قبل از استفاده از جولیا برای انجام انواع پروژههای هیجانانگیز، این زبان با هدف کار بر روی پروژههایی مانند یادگیری ماشین یا علم داده ساخته شده بود. ولی بههرحال برای اجرای هر نوع پروژهای، اولین کار، آشنایی با اصول ابتدایی کدنویسی زبان برنامه نویسی جولیا است.
در این قسمت از مطلب، کار خود را با بررسی متغیرها، نوعها و عبارتهای شرطی در برنامه نویسی شروع میکنیم. بعد از آن هم این بخش را با صحبت درباره حلقههای برنامهنویسی، توابع و پکیجها به پایان میرسانیم.
متغیرها و انواع در زبان جولیا
در زبان جولیا، متغیرها به صورت پویا نوعدهی میشوند. به این معنا که برنامه نویسان در زمان تعریف متغیر نیازی به مشخص کردن نوع آن ندارند.
در کادر زیر، نمونه تعریف متغیر در زبان جولیا را با روش ساده و تخصیص مستقیم مقدار به متغیر، پیادهسازی کردهایم.
1julia> a = 10
210
3julia> a + 10
420
نکته: توجه کنید که در قطعه کدهای استفاده شده، وقتی که عبارت julia> نمایش داده میشود، به معنی نوشتن کدهای جولیا درون REPL است.
همینطور که در کدهای بالا قابل مشاهده است، متغیری را تعریف کرده و مقداری را با نوع Integer به آن اختصاص دادهایم. نوع Integer در برنامه نویسی نمایانگر عدد کامل یا عدد صحیح و بدون قسمت اعشار است.
نمونه کاری که در بالا انجام دادیم را به همین روش برای متغیرهایی با نوع استرینگ در برنامهنویسی یا سایر انواع متغیرها نیز میتوان انجام داد.
1julia> my_string = "Hello FaradarsBlogTeam" #string
2"Hello FaradarsBlogTeam"
3
4julia> balance = 238.19 #float
5238.19
در زمان تعریف متغیر در زبان جولیا، همیشه نام متغیر در سمت چپ مساوی قرار گرفته و مقدار متغیر هم باید در سمت راست این علامت قرار بگیرد. یکی از دیگر کارها ساخت متغیر جدید با استفاده از مقادیر ذخیره شده در سایر متغیرهاست.
1julia> new_balance = balance + a
2248.19
در کادر بالا میتوانیم مشاهده کنیم که مقدار متغیر new_balance اکنون برابر با مجموع مقدارهای 238.19 و 10 است. یعنی متغیر جدیدی را با استفاده از دو متغیر دیگر تعریف و مقداردهی کردیم. به این نکته توجه کنید که نوع متغیر new_balance از نوع Float در برنامه نویسی – عدد شامل بخش اعشار – است. زیرا وقتی که متغیری از نوع Float را با متغیر Int در برنامه نویسی جمع میزنیم، جواب به صورت خودکار، نوع با دقت بالاتر را به خود میگیرد. در این مورد خاص، دقت نوع Float بالاتر است.
برای بررسی نوع تخصیص داده شده به هر متغیر میتوانیم از روش زیر استفاده کنیم.
1julia> typeof(new_balance)
2Float64
به دلیل ماهیت نوعدهی پویا، تمام متغیرها در زبان جولیا میتوانند نوع خود را در زمان اجرا تغییر دهند. به این معنا که متغیر holder_balance در زمان مشخصی میتواند حاوی مقداری با نوع عدد اعشار باشد و کمی بعدتر ممکن است مقداری با نوع رشته به آن تخصیص داده شود.
1julia> holder_balance = 100.34
2100.34
3
4julia> holder_balance = "The Type has changed"
5"The Type has changed"
6
7julia> typeof(holder_balance)
8String
نکته جالب درباره زبان جولیا این است که انعطافپذیری بالایی در نامگذاری متغیرها وجود دارد. در واقع برنامهنویسان میتوانند حتی از کدهای زیر نیز استفاده کنند.
1julia> 😀 = 10
210
3
4julia> 🥲 = -10
5-10
6
7julia> 😀 + 🥲
80
علاوه بر نام متغیری که به شکل ایموجی تعریف شده، میتوانیم از سایر انواع کاراکترهای Unicode نیز به عنوان نام متغیر استفاده کنیم. چنین آزادی عملی در زمان نمایش نمادهای ریاضی میتواند بسیار مفید باشد. به راحتی و با گذاشتن علامت \ قبل از نام نماد مورد نظر میتوان از هر کاراکتری در Unicode استفاده کرد. در نهایت هم باید دکمه «Tab» را بزنیم.
در کد زیر روش استفاده از این تکنیک را نمایش دادهایم.
1julia> \sigma # press tab and it will render the symbol
2
3julia> σ = 10
تمام سیستم مربوط به متغیرها در زبان جولیا انعطافپذیر است و مجموعه بزرگی از ویژگیها را فراهم میکند. پس نوشتن کدهای جولیا در عین واضح بودن، ساده است.
روش نوشتن عبارت های شرطی در جولیا
در برنامهنویسی بعضی از اوقات برای اجرای مجموعه کدهای خاصی باید برقرار بودن شرط مشخصی را بررسی کنیم. برای مثال، اگر در حال نوشتن برنامهای برای بانک هستیم، احتمالا باید که فقط به شرطی به مشتریها اجازه برداشت پول را بدهیم که میزان مبلغ مورد نظر برای برداشت کمتر یا مساوی میزان مبلغ موجودی حساب آنها باشد.
در کادر زیر، مثال سادهای را درباره استفاده از عبارت شرطی در زبان برنامه نویسی جولیا پیادهسازی کردهایم.
1julia> bank_balance = 4583.11
24583.11
3
4julia> withdraw_amount = 250
5250
6
7julia> if withdraw_amount bank_balance
8 bank_balance -= withdraw_amount
9 print("Withdrew ", withdraw_amount, " from your account")
10 end
11Withdrew 250 from your account
اکنون با بررسی و توضیح کدهای بالا، نگاه دقیقتری به عبارت شرطی if در جولیا خواهیم داشت. زیرا در کادر بالا ممکن است بعضی بخشها با سایر زبانهای برنامه نویسی که قبلا دیدهایم تفاوت داشته باشند.
- در ابتدا برای نشان دادن انتهای خط از علامت : استفاده نکردهایم. همچنین برای محصور کردن عبارت شرطی نیز نیازی به استفاده از پرانتزهای باز و بسته نداریم. البته استفاده از پرانتزهای () برای عبارتهای شرطی نه تنها ممنوع نیست، بلکه به دلیل افزایش خوانایی کدها توصیه هم میشود.
- در انتها هم از آکولادهای باز و بسته {} برای نمایش انتهای بلوک شرطی استفاده نکردهایم. بهجای {} در زبان جولیا از کلمه کلیدی end استفاده میشود.
دقیقا به همین صورت که از عبارت شرطی if استفاده کردیم، با استفاده از عبارتهای else یا elseif در انتها میتوانیم عبارتهای شرطی بیشتری را هم اضافه کرده و آن را گسترش دهیم.
1julia> withdraw_amount = 4600
24600
3
4julia> if withdraw_amount bank_balance
5 bank_balance -= withdraw_amount
6 print("Withdrew ", withdraw_amount, " from your account")
7 else
8 print("Insufficent balance")
9 end
10Insufficent balance
برای مطالعه بیشتر درباره جریان کنترل برنامه و عبارتهای شرطی میتوانید از مستندات خود جولیا استفاده کنید.
روش استفاده از حلقه ها در زبان جولیا
ساختار کلی حلقه در زبانهای برنامه نویسی مختلف تقریبا به شکل یکسانی تعریف شده است. در زبان جولیا نیز مانند بقیه زبانها دو نوع حلقه اصلی وجود دارند.
- حلقه for: این حلقه بر روی تعداد مشخصی از عناصر مانند محدوده دادههای درون ساختار پیمایشپذیری شمارش میکند. این حلقه زمانی مفید است که تعداد تکرارها یا پیمایش مورد نظر را از قبل بدانیم.
- حلقه while: از این حلقه معمولا برای اجرای کدهای مشخص شده تا زمانی استفاده میکنند که شرط خاصی برقرار True باشد. به طور خاص استفاده از حلقه while زمانی مناسب است که تعداد تکرار حلقه را نتوان از قبل تشخصی داد. زمان توقف حلقه نه تنها ربطی به تکرار معینی ندارد، بلکه بر اساس تغییر شرایط خاصی مشخص میشود.
این حلقهها به میزان زیادی شبیه به حلقههای همسان خود در سایر زبانهای برنامه نویسی کار کرده و برای انواع تکرارهای مورد نیاز در برنامه، انعطافپذیری لازم را فراهم میکنند.
طبق قواعد نوشتاری، حلقهها در زبان جولیا بسیار شبیه به ساختار کنترلی if هستند که در بخش بالا بررسی کردیم. در کادر زیر، نمونه کد سادهای را درباره استفاده از حلقهها پیادهسازی کردهایم.
1julia> greeting = ["Hello", "world", "and", "welcome", "to", "freeCodeCamp"]
26-element Vector{String}:
3 "Hello"
4 "world"
5 "and"
6 "welcome"
7 "to"
8 "freeCodeCamp"
9
10julia> for word in greeting
11 print(word, " ")
12 end
13Hello world and welcome to freeCodeCamp
در مثال بالا اول از همه، نوع جدیدی را تعریف کردیم. نوع «نمودار» (Vector) که در زبان جولیا با نام آرایه نیز شناخته میشود را با نام greeting در خط اول ساختهایم. این آرایه در حال نگهداری تعدادی مقدار با نوع رشته است که خودمان به صورت اختیاری تعریف کردهایم. رفتار این آرایه شباهت بسیار زیادی به رفتار نوع آرایه در سایر زبانهای برنامه نویسی دارد. اما لازم به اشاره است که آرایهها در زبان جولیا «قابل تغییر» (Mutable) هستند. به این معنا که بعد از ساختن آرایه، هر زمان که بخواهیم میتوان تعداد عناصر درون آن را تغییر داد.
بعد از نگاه به ساختار حلقه for قابل تشخیص است که این حلقه بر روی عناصر درون متغیر greeting پیمایش میکند. با هر قدم در پیمایش- در مورد این آرایه – به کلمه جدیدی برخورده و آن را به متغیر موقتی به نام word اختصاص میدهیم. سپس مقدار این متغیر را در خروجی چاپ میکنیم. با مشاهده ساختار این حلقه میتوان متوجه شباهت آن با عبارت شرطی if شد. مخصوصا اینکه در انتها هم کار حلقه با استفاده از کلمه کلیدی end به پایان میرسد.
تا اینجای کار، حلقههای for را در زبان برنامه نویسی جولیا بررسی کردهایم. از این جا به بعد نوبت به بررسی حلقه while میرسد. البته در ابتدا مثال سادهای را درباره استفاده از حلقه while در زبان برنامه نویسی Julia پیادهسازی کرده و در کادر زیر، نمایش دادهایم.
1julia> while user_input != "End"
2 print("Enter some input, or End to quit: ")
3 user_input = readline()
4 end
5Enter some input, or End to quit: hi
6Enter some input, or End to quit: test
7Enter some input, or End to quit: no
8Enter some input, or End to quit: End
در مثال بالا، حلقه while به صورتی تنظیم شده که دائما کار خود را ادامه دهد تا زمانی که کاربر کلمه «End» را چاپ کند. اما ساختار این حلقه نیز با توجه به کدهایی که تا به اینجا مشاهده کردهاید باید کمی برایتان آشنا باشد.
روش استفاده از توابع در زبان برنامه نویسی جولیا
توابع با هدف ساخت چندین خط کد متصل و مرتبط به هم ایجاد میشوند. این کدها با هربار فراخوانی نام تابع، اجرا میشوند. در ابتدا مثال سادهای را از تعریف و استفاده تابع در زبان برنامه نویسی Julia کدنویسی کرده و در کادر پایین نمایش دادهایم.
1julia> function greet()
2 print("Hello new Julia user!")
3 end
4greet (generic function with 1 method)
5
6julia> greet()
7Hello new Julia user!
توابع زبان جولیا دقیقا مانند بقیه زبانهای برنامهنویسی، امکان دریافت آرگومان نیز دارند. در کادر زیر، مثالی از تابع با قابلیت پذیرش آرگومان را پیادهسازی کردهایم.
1julia> function greetuser(user_name)
2 print("Hello ", user_name, ", welcome to the Julia Community")
3 end
4greetuser (generic function with 1 method)
5
6julia> greetuser("Logan")
7Hello Logan, welcome to the Julia Community
در مثال بالا، فقط یک آرگومان توسط تابع دریافت شده و سپس آن آرگومان را به پیام متنی برای چاپ در کنسول خروجی اضافه کردهایم. اما در جولیا میتوان آرگومان ورودی به غیر از نوع رشته در برنامه نویسی را به این نوع از توابع ارسال کرد.
1julia> greetuser(true)
2Hello true, welcome to the Julia Community
در مورد بالا، از آنجا که تنها کار تابع چاپ مقدار مورد نظر در خروجی بود، علیرغم اینکه آرگومان ورودی از جنس رشته نیست اما عملیات انجام شده و متن نمایش داده میشود. تابع بالا به سادگی کار خود را با آرگومانی از جنس Boolean – یعنی True یا False - انجام داده است. برای جلوگیری کردن از بروز چنین خطاهایی، میتوان به صورت صریح نوع آرگومان ورودی را مشخص کرد.
1julia> function greetuser(user_name::String)
2 print("Hello ", user_name, ", welcome to the Julia Community")
3 end
4greetuser (generic function with 2 methods)
5
6julia> greetuser("Logan")
7Hello Logan, welcome to the Julia Community
اکنون در کد بالا، تابع را به صورتی تعریف کردهایم که فقط مقدار با نوع رشته را در ورودی بپذیرد. در کد زیر، این تابع را برای بررسی محدودیت پذیرش نوع رشته در ورودی آزمایش کردهایم.
1julia> greetuser(true)
2Hello true, welcome to the Julia Community
در کد بالا مشاهده میکنیم که بازهم تابع تعریف شده greetuser آرگومان True را پذیرفته است. در حالی که طبق تعریف تابع فقط باید آرگومانهایی با نوع رشته را میپذیرفت.
چیزی که در این بخش مشاهده میشود یکی از قدرتمندترین ویژگیهای زیربنایی زبان برنامه نویسی Julia یعنی «ارسال چندگانه» (Multiple Dispatch) است. جولیا به توسعهدهندگان کمک میکند که توابعی با همان نام و همان تعداد آرگومان ورودی تعریف کنند که انواع مختلفی را بپذیرند. این مسئله به معنای آن است که میتوان توابعی را با اهداف عمومی در کنار نسخههایی از آنها برای نوعهای خاصی تعریف کرده و به صورت همزمان در کنار هم استفاده کنید. ویژگی مورد اشاره به خواناتر شدن کدهای نوشته شده کمک میکند. زیرا برای مدیریت تمام شرایط به صورت یکجا هر تابع فقط نیاز به تمرکز بر روی نوع خاصی از سناریوها دارد.
باید ببینیم که آیا واقعا هر دو تابع را تعریف کردهایم یا نه. این مسئله که جولیا در زمان ارسال مقادیر با نوعها مختلف، نسخه تابع صحیح و مرتبط را انتخاب میکند، توسط روش زیر تایید میشود.
1julia> methods(greetuser)
2# 2 methods for generic function "greetuser":
3[1] greetuser(user_name::String) in Main at REPL[34]:1
4[2] greetuser(user_name) in Main at REPL[30]:1
برای انجام اینکار استفاده از تابع درونی methods گزینه مناسبی است. تابع methods اعلام میکند که دو تابع تعریف شده به صورت جدا از هم وجود دارند. تنها تفاوت این دو تابع اینجاست که یکی هر نوع دادهای را میپذیرد و دیگری فقط نوع داده رشته را قبول میکند.
شایان ذکر است از زمانی که نسخه اختصاصیسازی شدهای از تابع را با قابلیت پذیرش فقط نوع رشته تعریف کردهایم، به بعد، هر وقت تابع greetuser را با متغیر ورودی از نوع استرینگ فراخوانی کنیم، نسخه اختصاصیسازی شده تابع فراخوانی خواهد شد. از این به بعد هر زمان که به تابع متغیری با نوع رشته ارسال کنیم، نسخه عمومی آن اجرا نمیشود.
استرینگ یکی از اصلیترین نوعها در برنامهنویسی است و در تمام زبانهای سطح بالا به کار برده میشود. در صورتی که نیاز به کسب اطلاعات کافی درباره این نوع دارید، پیشنهاد میکنیم که مطلب استرینگ در برنامه نویسی چیست؟ مفهوم رشته یا String به زبان ساده را از مجله فرادرس مطالعه کنید.
در مرحله بعد به صحبت درباره مقدارهای برگشتی از توابع پرداختهایم.
مقدارهای برگشتی تابع در زبان جولیا
در زبان برنامه نویسی Julia برای برگشت دادن مقدار از تابع، دو گزینه مختلف در مقابل برنامهنویس قرار دارد. هم میتواند از کلمه کلیدی و صریح return استفاده کند، هم میتواند از طریق تبدیل کردن آخرین عبارت درون تابع به مقدار برگشتی، آن را به صورت غیرمستقیم به بیرون از تابع ارسال کند.
در کد زیر روش ارسال مقدار برگشتی به خروجی را نمایش دادهایم.
1julia> function sayhi()
2 "This is a test"
3 "hi"
4 end
5sayhi (generic function with 1 method)
6
7julia> sayhi()
8"hi"
در مثال بالا، مقدار رشتهای hi از تابع به بیرون برگشت داده شده است. زیرا این مقدار دارای دو شرط مطرح شده در زیر است.
- مقدار hi آخرین عبارت در داخل تعریف تابع است.
- کلمه کلیدی return برای اشاره صریح به مقدار برگشتی در این تابع وجود ندارد.
البته میتوان تابع بالا را به شکل زیر نیز تعریف کرد.
1julia> function sayhi()
2 "This is a test"
3 return "hi"
4 end
5sayhi (generic function with 1 method)
6
7julia> sayhi()
8"hi"
به طورکلی و از نقطه نظر خوانایی کدها، منطقیتر است که از کلمه کلیدی return برای اعلام صریح مقدار برگشتی استفاده کنیم. مخصوصا اینکه شاید افرادی برای مطالعه به کدها رجوع کنند که درباره تکنیک مقدار برگشتی به صورت غیرمستقیم در جولیا مطلع نیستند.
یکی دیگر از ویژگیهای مفید توابع، توانایی فراهم کردن چندین آرگومان به صورت اختیاری است. در ابتدا این روش را با کمک مثال زیر نمایش داده و سپس به بررسی آن پرداختهایم.
1julia> function sayhello(response="hello")
2 return response
3 end
4sayhello (generic function with 2 methods)
5
6julia> sayhello()
7"hello"
8
9julia> sayhello("hi")
10"hi"
در مثال بالا، متغیر response را به عنوان آرگومان اختیاری تعریف کردهایم. بنابراین هم به آن اجازه میدهیم که از رفتار پیشفرض تعریف شده تبعیت کند و هم در زمانهای مورد نیاز، میتوانیم به صورت دستی آن را «بازتعریف» (Override) کنیم. این مثالها فقط نمونه بسیار کوچکی از امکانات و تواناییهای موجود در زمان کار با توابع را در زبان برنامه نویسی جولیا نشان میدهند. برای آموزش دقیقتر میتوانید به مستندات خود جولیا مراجعه کنید.
روش استفاده از پکیج ها در زبان جولیا
سامانه «مدیریت بسته» (Package Manager) و اکوسیستم پکیجها در جولیا یکی از مهمترین ویژگیهای این زبان برنامهنویسی هستند. از این رو برای تعامل با پکیجها دو روش اصلی در جولیا تعریف شدهاند.
- روش اول بر اساس کار با REPL است.
- و روش دوم استفاده از پکیج Pkg است.
از آنجا که استفاده از REPL سادهتر است، بهخصوص برای افراد تازهکار، در این مطلب به بررسی روش استفاده از پکیجها با استفاده از REPL میپردازیم.
بعد از اینکه زبان برنامهنویسی جولیا را در کامپیوتر خود نصب کردیم. از طریق نوشتن [ در REPL به سادگی میتوانیم وارد سامانه مدیریت بستهها یا Package Manager شویم.
بعد از ورود به این سیستم، تصویر فضای کدنویسی به شکل زیر خواهد بود.
اکنون که با موفقیت به سیستم Package Manager وارد شدیم، چندکار رایجی وجود دارند که معمولا انجام میشوند.
- اضافه کردن پیکجهای کاربردی
- حذف پکیجهای درون سیستم
- بررسی پکیجهایی که از قبل یا در حال حاضر بر روی سیستم نصب شدهاند.
برای دیدن همه دستورهای ممکن در REPL، فقط کافیست که از طریق نوشتن ] وارد حالت pkg> شوید، سپس کاراکتر ? را نوشته و دکمه «Enter» را بزنید.
اضافه کردن پیکج های کاربردی به زبان برنامه نویسی جولیا
در این قسمت از مطلب میخواهیم که اضافه کردن پیکجهای کاربردی به زبان برنامه نویسی Julia را بیاموزیم. تصور کنید که پیکج مورد نظر Example.jl نام دارد. بنابراین باید طبق کد نوشته شده در کادر زیر، عمل کنیم.
1(@v1.7) pkg> add Example
بعد از زدن کد بالا، خروجی مانند مورد پایین باید به کاربر نشان داده شود.
(@v1.7) pkg> add Example Updating registry at `~/.julia/registries/General` Updating git-repo `https://github.com/JuliaRegistries/General.git` Updating registry at `~/.julia/registries/JuliaPOMDP` Updating git-repo `https://github.com/JuliaPOMDP/Registry` Resolving package versions... Installed Example ─ v0.5.3 Updating `~/.julia/environments/v1.7/Project.toml` [7876af07] + Example v0.5.3 Updating `~/.julia/environments/v1.7/Manifest.toml` [7876af07] + Example v0.5.3 Precompiling project... 1 dependency successfully precompiled in 1 seconds (69 already precompiled) (@v1.7) pkg>
با این فرض که همه مراحل را طی میکنید، ادامه مطلب را پی میگیریم و از نمایش خروجیهای اضافی، صرفنظر میکنیم.
روش بررسی وضعیت پکیج ها در زبان جولیا
اکنون فرض میکنیم که پیکیجی را با موفقیت بر روی سیستم خود نصب کردهایم. برای بررسی وجود داشتن این پکیج در Package Manager باید از نوشتن کلمات کلیدی status یا st - به منظور مختصرنویسی – استفاده کنیم. البته این کلمات را فقط در محیط pkg> میتوان نوشتن و بازخورد گرفت.
1(@v1.7) pkg> st
2Status `~/.julia/environments/v1.7/Project.toml`
3[7876af07] Example v0.5.3
4[587475ba] Flux v0.12.8
در کد بالا میتوان مشاهده کرد که دو پکیج مختلف با نامهای Flux و Example به صورت نصب شده در سیستم وجود دارند. این کدها علاوه بر نام پکیجها مسیر فایلی که نسخه راهاندازی شده ما را مدیریت میکند – در این مورد نسخه «Global Julia v1.7» است – را همراه با نسخه پکیجهای نصب شده بر روی سیستم نشان میدهد.
روش حذف پکیج های جولیا
اگر بخواهیم که پکیجهای نصب شده در جولیا را حذف کنیم، برای مثال پکیج Flux ، فقط کافیست که کد remove Flux یا rm - به منظور مختصرنویسی – را تایپ کنیم. در کادر زیر، برای حذف پکیج در جولیا مثال سادهای را کدنویسی کردهایم.
1(@v1.7) pkg> rm Flux
2Updating `~/.julia/environments/v1.7/Project.toml`
3[587475ba] - Flux v0.12.8
بعد از اجرای دستور بالا، بررسی با استفاده از دستور status، نشان میدهد که عملیات حذف با موفقیت انجام شده است.
1(@v1.7) pkg> st
2Status `~/.julia/environments/v1.7/Project.toml`
3[7876af07] Example v0.5.3
اکنون اطلاعات ابتدایی را درباره کار با پکیجها در جولیا بدست آوردهایم. اما با استفاده از محیط پکیج سراسری خود، مرتکب اشتباه بزرگی شدیم.
چگونه از پکیج ها در جولیا استفاده کنیم؟
حالا که روش مدیریت پیکجها در زبان برنامه نویسی Julia را آموختیم باید با روش استفاده از این پکیجها نیز آشنا شویم. برای استفاده از پکیج خاصی، فقط کافی است که عبارت using packageName را بنویسیم.
در کدهای زیر، یکی از بهترین ویژگیهای زبان Julia نسخه ۱٫۷ – که در این مطلب با آن کار میکنیم – را نمایش دادهایم.
1julia> using Flux
2
3Package Flux not found, but a package named Flux is available from a
4registry.
5Install package?
6
7(@v1.7) pkg> add Flux
8
9(y/n) [y]:
اگر به خاطر سپرده باشید در بخش قبلی پیکیج Flux را از سیستم حذف کرده بودیم. اما در کدهای بالا تلاش کردیم تا از آن پکیج حذف شده دوباره استفاده کنیم. به همین دلیل برای وارد کردن این پکیج به محیط کدنویسی دستور using Flux را نوشتیم. چون این پکیج قبلا از سیستم حذف شده بود، REPL این مسئله را عنوان کرد و از ما خواست که فقط با انتخاب سادهای بین گزینههای y یا n در خط آخر – با کد (y/n) [y]: - پکیج را دوباره بر روی سیستم خود نصب کنیم. این ویژگی بسیار ساده و کوچک است، اما کمک زیادی برای صرفهجویی در زمان و دوری کردن از سردرگمی میکند.
دو روش مختلف با استفاده از دستورات using و import برای دسترسی به توابع هر پکیج وجود دارد. تفاوت اصلی اینجاست که استفاده از کد دستوری using باعث میشود تمام توابع و عملکردهای تعریف شده در پکیج به صورت خودکار به محیط کار برنامهنویسی وارد شوند. برای درک این موضوع به اضافه شدن فهرست بزرگی از توابع به کدهای جولیا فکر کنید که همگی آماده استفاده هستند. در حالی که کد دستوری import نیز دسترسی مورد نظر به همه توابع را فراهم میکند، اما با این شرط که قبل از نام تابع، نام پکیج را به عنوان پیشوند همراه با یک نقطه به آن اضافه کنید. برای مثال Flux.gradient() کد مربوط به فراخوانی تابع gradient و کلمه Flux هم نشاندهنده نام پکیج است. بین نام پکیج و نام تابع با یک نقطه، فاصلهای قرار گرفته است.
ویژگی های زبان برنامه نویسی جولیا
زبان برنامه نویسی جولیا نیز مانند بسیاری از دیگر زبانها با هدف برطرف کردن نیاز خاصی ایجاد شده است. در نتیجه دارای مزایای زیادی است که باعث شده به یکی از گزینههای آینده برای رهبری تکنولوژیهای مدرن تبدیل شود. برای آموزش این زبان فیلم آموزش برنامه نویسی جولیا Julia همراه با اصول برنامه نویسی را از فرادرس مشاهده کنید. لینک مربوط به این فیلم را در پایین قرار دادهایم.
در این قسمت از مطلب، مزایا و ویژگیهای برتری دهنده به زبان برنامهنویسی جولیا را در کنار نقاط ضعف آن بیان کردهایم تا به شکل بهتری با این زبان آشنا شده و درباره آموزش و استفاده از آن تصمیم بگیرید.
مزایا و ویژگی های برجسته کننده جولیا
با اینکه زبان برنامه نویسی جولیا به عنوان زبانی برای استفادههای عمومی و محاسبات عددی و تکنیکی توسعه داده شده، اما برای استفاده در حوزههای تخصصی مانند علم داده و یادگیری ماشین نیز گزینه بسیار مناسبی است. بعضی از ویژگیهای کلیدی که باعث شدهاند جولیا به انتخاب مناسبی برای کار در این حوزهها تبدیل شود شامل موارد فهرست شده در زیر هستند.
- سیستم نوع دهی خودکار: جولیا دارای سیستمی است که بر اساس آن نوعها به جای تخصیص داده شدن به متغیرها به مقادیر اختصاص داده میشوند. به این معنا که نوع متغیرها در طول زمان اجرای برنامه ممکن است تغییر کند.
- «ارسال چندگانه» (Multiple Dispatch) یا «چندروشی» (Multimethod): نوعی از پلی مورفیسم در برنامه نویسی که امکان استفاده از چندین روش مختلف را برای فراخوانده شدن یک یا چند آرگومان در زمان اجرا فراهم کرده است. این روش برای پیادهسازی مفاهیم شیءگرایی سنتی مانند وراثت و رابطها به کار برده میشود. اما همچنین، در سایر مسائلی مانند ارسال بر اساس نوع آرگومانها نیز قابل استفاده است.
- شباهت به سایر زبانها: کارایی این زبان مانند زبان برنامه نویسی لیسپ است.
- Package Manager: سامانه مدیریت پکیجها به صورت ادغام شده و درونی وجود دارد.
- پشتیبانی از محاسبات موازی: با استفاده از محاسبات موازی و توزیع شده میتواند عملکردهای خود را ارائه دهد.
- کار با شل: فرایندهای این زبان را از درون شل هم میتوان مدیریت کرد.
- انعطافپذیری در انواع: از انواع تعریف شده توسط کاربر هم پشتیبانی میکند.
- مدیریت غیرهمزمان: دارای رابطی است که برای مدیریت غیرهمزمان عملیات ورودی و خروجی به کار برده میشود.
- Logging: جولیا دارای ماژولی به نام «Logging» است. این ماژول به توسعهدهندگان کمک میکند که گزارشات اتفاقات، خطاها و فرایندهای جاری در کدها را ذخیره کنند.
- Profiling: جولیا دارای ماژولی به نام «Profiling» است. این ماژول ابزاری است که از طریق افزایش کارایی به توسعهدهندگان برای بهینهسازی کدها کمک میکند. ماژول «Profiling» هر خط کد را دنبال کرده و زمان مورد نیاز برای انجام هر فرایند را اندازهگیری میکند. در نتیجه موفق به شناسایی مشکلات احتمالی و عوامل موثر در کارکرد ضعیف برنامه میشود.
نقاط ضعف زبان برنامه نویسی جولیا
با اینکه ویژگیهای زیادی در این زبان برنامهنویسی پیادهسازی شدهاند. اما لازم است که قبل از کار با جولیا نسبت به بعضی از کمبودها در جولیا نیز مطلع باشیم.
- ادغام جولیا با سایر زبانهای برنامهنویسی مشکل است. در نتیجه اجرای برنامه با کندی روبهرو شده و کدها برای اجرا به فضای ذخیرهسازی بیشتری در حافظه نیاز خواهند داشت. کدهای نوشته شده در جولیا، باید فقط توسط مفسر زبان برنامهنویسی جولیا اجرا شود. این مسئله منجر به کندی عملکرد در زمان اجرا میشود.
- همچنین این زبان گزینه مناسبی برای توسعه برنامههای موبایل یا اپلیکیشنهای تحت وب نیست. با اینکه میتوان جولیا را برای اسکریپتنویسی در سمت سرور به کار برد، اما به صورت کلی برای انجام این دسته از وظایف زبانهای برنامهنویسی بهتری نیز مانند پایتون، روبی و زبان PHP وجود دارند.
- از آنجا که جولیا نسبتا زبان تازهای است، هنوز در این زبان باگهایی وجود دارند که باید برطرف شوند. به دلیل وجود این باگها شاید در بعضی از کدها رفتار مورد نظر مشاهده نشده یا رفتارهای غیرمنتظرهای روی دهند. اگرچه تیم توسعه جولیا به صورت فعالی در حال کار برای برطرف کردن این مشکلات هستند. اما به هرحال این فرایند زمانبر و طولانیست.
- اکوسیستم برنامهنویسی زبان جولیا را نمیتوان با زبانهایی مانند پایتون یا زبان برنامه نویسی R مقایسه کرد. زبان R به بیش از ۱۸۰۰۰ پکیجی که برای استفاده کاربران خود در دسترس قرارداده، میبالد. در حالی که جولیا چیزی در حدود ۷۴۰۰ پکیج را برای استفاده کاربران فراهم کرده است. البته هرچه که زبان با محبوبیت و مقبولیت بیشتری در بین توسعهدهندگان روبهرو شود، این عدد هم رشد خواهد کرد. اما فعلا نسبت به سایر زبانهای برنامهنویسی همرده خود عقبمانده است.
- اگر در حال کار در زمینه خاصی باشیم، احتمالا لازم است که پکیجهای جولیا مورد نیاز خود را تولید کرده یا فقط به آموزش و استفاده از زبان R بسنده کنیم. زیرا کتابخانههای جا افتاده و مناسبی برای استفاده از ابزار و منابع در این زبان تعبیه شدهاند.
علی رغم نقاط ضعفی که در فهرست بالا شمردهایم، جولیا زبان برنامهنویسی قدرتمندی است که پتانسیل بالایی برای انجام کارهای بزرگ دارد. فرایند آموزش استفاده از این زبان برای برنامهنویسان با تجربه ساده است و همراه با خود ویژگیهای زیادی را برای انجام مسائل علمی ارائه میدهد.
فیلم های آموزش پروژه محور برنامه نویسی در فرادرس
بهترین راه برای درک زبان برنامه نویسی جولیا بررسی فیلمهای آموزشی پروژهمحور است. مهمتر از همه اینکه برای آموزش بهتر باید پروژههای نزدیک به دنیای واقعی را انتخاب کنیم. این پروژههای هدفمند کمک میکنند که مطالب آموزشی درون ذهن دانشجویان نهادینه شده و روش ارتباط تکنولوژیهای مختلف با یکدیگر را نیز تجربه کنند. در این بخش به معرفی چند مورد از فیلمهای پروژهمحوری پرداختهایم که یا توسط زبان جولیا یا توسط زبانهای برنامهنویسی دیگر پیادهسازی و اجرا میشوند.
در صورت تمایل بر روی تصویر زیر کلیک کرده و از فیلمهای آموزشی بیشتری دیدن کنید.
اکوسیستم و پکیج های جولیا
با توجه به نقاط ضعفی که در بخش قبلی درباره جولیا مطرح شدند، چرا باید از جولیا استفاده کنیم؟ مسئله اینجاست که این زبان به منظور استفاده در چندین اکوسیستم مختلف، طراحی شده و چند کاربرد اصلی دارد.
در این بخش از مطلب به بررسی حوزههای تخصصی فعالیت جولیا پرداخته و علت گرایش به استفاده از آن را بیان میکنیم.
مصورسازی
یکی از اهداف اصلی استفاده از جولیا، مصورسازی دادهها است. به این منظور در جولیا چندین پکیج مختلف فراهم شده که توسعهدهندگان میتوانند از میان آنها انتخاب کنند. پکیجهای مختلفی که از نمایش دادهها به صورت پویا یا ایستا پشتیبانی میکنند. جولیا حتی دارای پکیجی برای نمایش آنی تغییرات در دادهها بر روی نمودار – بهروزرسانی بیدرنگ مصورسازی دادهها – است.
اهداف عمومی
با استفاده از جولیا، برنامهنویسان میتوانند کارهای مختلفی مانند موارد فهرست شده در پایین را انجام دهند.
- ساخت اپلیکیشنهای مستقل
- ساخت رابط کاربری برای اپلیکیشنهای تحت وب یا برنامههای بومی
- خواندن و استفاده از دادهها از انواع پایگاههای داده
- استفاده از ابزارهایی مانند «PackageComplier» برای ساخت فایلهای اجرایی
- توسعهدهندگان جولیا پکیج «HTTP.jl» را برای بارگذاری سرورهای اینترنتی به کار میبرند.
- جولیا همچنین برای برقراری ارتباط با زبانهای برنامهنویسی مانند جاوا، پایتون، C و ++C و R دارای رابطهای مخصوصی است.
به دلیل وجود تواناییهای بالا جولیا در پروژههای متنوعی قابل استفاده است.
علم داده
در جولیا ابزارهایی مانند «DataFrames.jl» و «CSV.jl» برای کاربرانی فراهم شده که میخواهند بر روی مجموعه دادههای بزرگ پردازش کرده و با پایگاههای داده مختلف کار کنند. تمام نتایج بدست آمده به دلیل تحلیل و کار بر روی دادهها را میتوان با کمک پکیج JuliaGraphs به تصویر کشید.
نکته: جولیا میتواند با طیف وسیعی از پایگاههای داده کار کند. بنابراین به گزینه بسیار مناسبی برای استفاده در تمام مسائل مربوط به علم داده تبدیل شده است.
یادگیری ماشین
پکیجهای مربوط به یادگیری ماشین در جولیا شامل پکیج رابطی میشوند که با الگوریتمهای تخصصی این حوزه مانند «درختهای تصمیم گیری» (Decision Trees)، «مدلهای خطی تعمیمیافته» (Generalized Linear Models) و «خوشه بندی» (Clustering) ارتباط برقرار میکند. همچنین جولیا برای کار در حوزههای زیر نیز دارای پکیجهای تخصصی است.
- «یادگیری عمیق» (Deep Learning)
- «مدلهای از پیش آموزش داده شده» (Pre-Trained Models) با توانایی پردازش وظایف معمولی
- و چند مورد از بهترین موارد برای «برنامهنویسی احتمالی» (Probabilistic Programming)
موقعیتهای شغلی مربوط به یادگیری ماشین، اغلب نیازمند به داشتن حداقل دانش پایه درباره زبان جولیا یا سایر زبانهای برنامهنویسی همسان با آن هستند.
حوزه های علمی
یکی از نقاط قوت زبان برنامه نویسی جولیا در پردازش معادلات دیفرانسیل و انجام سایر محاسبات علمی است. به عنوان مثال، پکیج «DifferentialEquations.jl» یکی از گزینههای بسیار خوبی است که به صورت خودکار برای حل انواع مسائل، بهترین الگوریتمها را انتخاب میکند. به عنوان مثال دیگر میتوان به پیکیج «Optim.jl» اشاره کرد. این پکیج دارای رابطهایی برای کار با «روشهای غیرخطی بهینهسازی» (Nonlinear Optimization Methods) است.
علاوه بر موارد بیان شده، جولیا در رشتههای مختلفی مانند زیستشناسی، «پردازش تصویر» (Image Processing)، فیزیک کوانتوم، «بومشناسی» (Ecology) و ستارهشناسی، اکوسیستمهای اختصاصیسازیشدهای را ارائه میدهد که باعث شده در حوزه تحقیقات علمی به ابزاری همه فن حریف تبدیل شود.
محاسبات موازی
اجرای برنامهنویسی موازی یکی از اهداف اصلی در کدنویسی با زبان جولیا است. این زبان به صورت ذاتی دارای توانایی توزیع محاسبات بر روی چندین پردازندهی مختلف است. همچنین جولیا به صورت درونی از «رابط ارسال پیام» (Message Passing Interface) پشتیبانی میکند. یکی دیگر از تواناییهای جولیا پشتیبانی از موازی کردن اجرای فرایندها در GPU است. این توانایی در سایر زبانهای برنامهنویسی رایج نیست.
جمعبندی
زبان برنامه نویسی جولیا یکی از زبانهای بسیار جدید و مدرن است که با هدف کنار هم قراردادن سرعت زبانهای C و ++C در کنار عملکرد و سادهگی استفاده پایتون به وجود آمده است.
در این مطلب از مجله فرادرس با زبان برنامه نویسی Julia آشنا شده و مسائل ابتدایی مربوط به روش کدنویسی با آن را فراگرفتیم. این زبان یکی از زبانهای آیندهدار بخصوص در حوزه هوش مصنوعی است. بنابراین توصیه میشود افراد فعال یا علاقهمند به این حوزه مهارت خود را در بهکارگیری این زبان افزایش دهند.
منبع