المسارات
/
Julia
Julia
/
المنهج
/
الأساسيات
ال

الأساسيات في Julia

تمرينان

نبذة عن الأساسيات

Julia لغة برمجة ديناميكية ذات أنواع قوية. أسلوب البرمجة فيها وظيفي في الأساس، وإن كان أكثر مرونة مما هو عليه في لغات مثل Haskell.

فيها نظام أنواع قوي ومتعدد الاستخدامات، وسيصبح مهمًا في المفاهيم اللاحقة. عمليًا، ستستنتج Julia عادةً قيمة افتراضية مناسبة من السياق.

ورغم تركيزها على سهولة القراءة، ما يجعلها تبدو كلغة برمجة نصية مثل Python وRuby، فإن كود Julia يُترجم قبل تشغيله. وينتج المترجم الآني (JIT) كودًا عالي التحسين لكل دالة عند مواجهتها، ما يؤدي إلى سرعة عالية في وقت التشغيل.

Julia ليست لغة كائنية التوجه، ولا يوجد فيها تسلسل هرمي للأصناف كما هو محوري في لغات أخرى كثيرة.

بل (ولا داعي للذعر وأنت تقرأ هذا!)، تعتمد Julia على:

  • تسلسل هرمي للأنواع.
  • دوال قابلة للتركيب (مصمّمة لتُدمج بسهولة، بطرق متعددة الاستخدامات وقوية).
  • الإرسال المتعدد، أي أن الدوال يمكن استدعاؤها بعدد متغير وأنواع متغيرة من الوسائط.

ستتضح هذه المصطلحات المربكة نوعًا ما مع تقدمنا في المنهج.

تحتوي الوثائق الرسمية على الكثير من المعلومات القيمة للإصدار الحالي، وإن كانت قد تكون مربكة قليلًا للمبتدئين.

ومن الفيديوهات:

التعليقات

إضافة التعليقات إلى الكود مهمة للغاية لمساعدة البشر على قراءة كودك وفهم مقاصدك: ربما أشخاص آخرون، ولكن أيضًا أنت في المستقبل. ويتجاهلها المترجم (في الأغلب).

يتوفر خياران في Julia:

  • تبدأ التعليقات أحادية السطر بـ #
  • وتبدأ التعليقات متعددة الأسطر بـ #= وتنتهي بـ =#. ويُسمح بالتداخل.
# This is a single-line comment

x = 3  # This is an inline comment

#=
	Multi-line comments can be used for longer explanations.

	They are especially useful to comment out blocks of code during debugging.
=#

المتغيرات والإسناد

لإنشاء متغير، ما عليك سوى إسناد قيمة إليه:

julia> myvar = 42  # an integer (in fact, Int64)
42

julia> bigint = 1_234_567_890  # optionally use underscore as digit separator, for readability
1234567890

julia> name = "Maria"  # strings are surrounded by double-quotes ""
"Maria"

الإسناد "يربط" قيمة بالمتغير.

تحديد النوع اختياري، وفي الأغلب ستستنتج Julia قيمة افتراضية مناسبة من السياق.

الأنواع موضوع مهم في Julia. وسنتناولها بمزيد من التفصيل في المفاهيم اللاحقة. وفي الوقت الحالي، من الأفضل ألا تقلق بشأنها.

وعلى عكس كثير من اللغات الوظيفية، يمكن إعادة إسناد المتغيرات في Julia، ولك حرية تغيير كل من القيمة والنوع المرتبطين بالمتغير:

julia> myvar = 3
3

julia> myvar = "now a string"
"now a string"

الثوابت

المتغيرات العامة، التي تُنشأ خارج أي دالة، هي:

  • مسموح بها.
  • ومطلوبة أحيانًا.
  • وغالبًا ما يُنصح بتجنبها (لكن داخل ملفات *.jl فقط؛ إذ تعمل بيئة REPL بطريقة مختلفة).

وإذا احتجت إلى قيمة متاحة في البرنامج كله، دون أن يُتوقع تغييرها، فاستخدم ثابتًا بدلًا من ذلك.

ووضع الكلمة المفتاحية const قبل الإسناد يتيح للمترجم توليد كود أكثر كفاءة.

ومحاولة تغيير قيمة const عن غير قصد ستُصدر تحذيرًا:

julia> const answer = 42
42

julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24

العوامل الحسابية

الحساب يعمل في الأغلب بالطريقة المعتادة:

2 + 3  # 5 (addition)
2 - 3  # -1 (subtraction)
2 * 3  # 6 (multiplication)
8 / 2  # 4.0 (division)
8 % 3  # 2 (remainder)
2 ^ 3  # 8 (exponentiation)

لاحظ أن القسمة بـ / تعطي دائمًا قيمة ذات فاصلة عائمة.

وسنعود إلى هذا في المفاهيم اللاحقة، حيث سنتناول القسمة الصحيحة باستخدام div() أو ÷ للاقتطاع، و// للحصول على عدد كسري.

الدوال

للحصول على أفضل أداء في وقت التشغيل، من الأفضل وضع معظم الكود داخل الدوال. ولا مشكلة في وجود دوال صغيرة كثيرة، على عكس بعض اللغات الأخرى.

هناك طريقتان شائعتان لتعريف دالة مُسمّاة في Julia:

  1. باستخدام الكلمة المفتاحية function

    function muladd(x, y, z)
        x * y + z
    end
    

    المسافة البادئة بمقدار 4 مسافات عُرف متّبع لسهولة القراءة، لكن المترجم يتجاهلها. والكلمة المفتاحية end ضرورية: أشبه بـ Ruby منها بـ Python.

    لاحظ أنه كان بإمكاننا كتابة return x * y + z. لكن دوال Julia تُرجع دائمًا آخر تعبير يُقيَّم، لذا فإن الكلمة المفتاحية return اختيارية. ويفضّل كثير من المبرمجين تضمينها لإيضاح مقاصدهم.

  2. باستخدام "صيغة الإسناد"

    muladd(x, y, z) = x * y + z
    

    وتُستخدم هذه غالبًا لتعريف الدوال في سطر واحد أو للدوال الرياضية، حيث يكون جسم الدالة تعبيرًا واحدًا. ولا تُستخدم الكلمة المفتاحية return أبدًا في صيغة الإسناد.

الصيغتان متكافئتان، وتُستخدمان بالطريقة نفسها تمامًا، فاختر أيًّهما أكثر وضوحًا في القراءة.

ويتم استدعاء الدالة بتحديد اسمها وتمرير وسائط لكل معامل من معاملات الدالة:

# invoking a function
muladd(10, 5, 1)

# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)

ومن كوننا نسمي هذه الدوال "مُسمّاة"، قد تخمّن أن هناك أيضًا دوال "مجهولة". وسنتناولها في مفهوم لاحق.

اصطلاحات التسمية

مثل لغات كثيرة، تشترط Julia أن تبدأ الأسماء (للمتغيرات والدوال وأشياء أخرى كثيرة) بحرف، يتبعه أي مزيج من الحروف والأرقام والشرطات السفلية.

وبحسب العُرف، تُكتب أسماء المتغيرات والثوابت والدوال بحروف صغيرة، مع تجنّب الشرطات السفلية إلا عند الحاجة إليها لتفادي الالتباس.

لكن Julia تستخدم يونيكود في كل مكان، لذا يُفسَّر معنى "الحرف" بمرونة كبيرة.

فاللغات غير الإنجليزية مدعومة، وكذلك الرموز التعبيرية (مع مراعاة الذوق السليم واختيار ما هو مناسب).

وعلى وجه الخصوص، تتوفر جميع الحروف اليونانية التي يحبها علماء الرياضيات (كما أن عدة قيم مفيدة معرّفة مسبقًا):

julia> π   # a built-in constant
π = 3.1415926535897...

ومحررات Julia، بما فيها REPL وPluto.jl وVS Code مع إضافة Julia، تجعل إدخال هذه الأحرف سهلًا.

لإدخال π، اكتب \pi ثم اضغط <Tab>. وسيُستبدل ما كتبته بالحرف اليوناني.

وسترى أمثلة أخرى كثيرة على هذا في المفاهيم اللاحقة.

في الواقع، ليست اختصارات الشرطة المائلة العكسية شيئًا خاصًا بـ Julia. فهي مأخوذة من LaTeX، وهو نظام تنضيد يستخدمه كثير من العلماء والمهندسين يوميًا تقريبًا لكتابة التقارير.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم الأساسيات