Noteworthy Differences from other Languages
Noteworthy differences from MATLAB
على الرغم من أن مستخدمي MATLAB قد يجدون أن بناء جملة جوليا مألوف، إلا أن جوليا ليست نسخة من MATLAB. هناك اختلافات كبيرة في البنية والوظائف. فيما يلي بعض الاختلافات الملحوظة التي قد تسبب مشاكل لمستخدمي جوليا المعتادين على MATLAB:
تُستخدم الأقواس المربعة لفهرسة مصفوفات جوليا،
A[i,j]
.تُعتبر مصفوفات جوليا غير مُنسَخَة عند تعيينها إلى متغير آخر. بعد
A = B
، ستؤدي تغييرات العناصر فيB
إلى تعديلA
أيضًا. لتجنب ذلك، استخدمA = copy(B)
.قيم جوليا لا تُنسخ عند تمريرها إلى دالة. إذا قامت دالة بتعديل مصفوفة، ستظهر التغييرات في المتصل.
جوليا لا تنمو تلقائيًا المصفوفات في عبارة التعيين. بينما في MATLAB
a(4) = 3.2
يمكن أن تنشئ المصفوفةa = [0 0 0 3.2]
وa(5) = 7
يمكن أن تنمو إلىa = [0 0 0 3.2 7]
، فإن العبارة المقابلة في جولياa[5] = 7
ترمي خطأ إذا كان طولa
أقل من 5 أو إذا كانت هذه العبارة هي الاستخدام الأول للمعرفa
. تحتوي جوليا علىpush!
وappend!
، والتي تنموVector
s بكفاءة أكبر بكثير منa(end+1) = val
في MATLAB.وحدة التخيل
sqrt(-1)
تمثل في جوليا كـim
، وليسi
أوj
كما في MATLAB.في جوليا، الأرقام الحرفية بدون نقطة عشرية (مثل
42
) تُنشئ أعداد صحيحة بدلاً من أعداد النقطة العائمة. نتيجة لذلك، يمكن أن تؤدي بعض العمليات إلى حدوث خطأ في النطاق إذا كانت تتوقع عددًا عائمًا؛ على سبيل المثال،julia> a = -1; 2^a
يؤدي إلى حدوث خطأ في النطاق، حيث أن النتيجة ليست عددًا صحيحًا (انظر the FAQ entry on domain errors لمزيد من التفاصيل).في جوليا، يتم إرجاع قيم متعددة وتعيينها كأزواج، مثل
(a, b) = (1, 2)
أوa, b = 1, 2
. لا يوجد ما يعادلnargout
في MATLAB، والذي يُستخدم غالبًا في MATLAB للقيام بأعمال اختيارية بناءً على عدد القيم المعادة، في جوليا. بدلاً من ذلك، يمكن للمستخدمين استخدام المعاملات الاختيارية ومعاملات الكلمات الرئيسية لتحقيق قدرات مماثلة.جوليا لديها مصفوفات حقيقية ذات بعد واحد. متجهات الأعمدة بحجم
N
، وليسNx1
. على سبيل المثال،rand(N)
تصنع مصفوفة ذات بعد واحد.في جوليا،
[x,y,z]
ستقوم دائمًا بإنشاء مصفوفة مكونة من 3 عناصر تحتوي علىx
وy
وz
.- لدمج في البعد الأول ("الرأسي") استخدم إما
vcat(x,y,z)
أو افصل باستخدام الفواصل المنقوطة ([x; y; z]
). - لدمج في البعد الثاني ("الأفقي") استخدم إما
hcat(x,y,z)
أو افصل باستخدام المسافات ([x y z]
). - لإنشاء مصفوفات كتلية (عن طريق الدمج في البعدين الأولين)، استخدم إما
hvcat
أو اجمع المسافات والفواصل المنقوطة ([a b; c d]
).
- لدمج في البعد الأول ("الرأسي") استخدم إما
في جوليا،
a:b
وa:b:c
ينشئان كائنات من نوعAbstractRange
. لإنشاء متجه كامل كما في MATLAB، استخدمcollect(a:b)
. بشكل عام، لا حاجة لاستدعاءcollect
على الرغم من ذلك. سيتصرف كائنAbstractRange
مثل مصفوفة عادية في معظم الحالات ولكنه أكثر كفاءة لأنه يحسب قيمه بشكل كسول. يتم استخدام هذا النمط من إنشاء كائنات متخصصة بدلاً من المصفوفات الكاملة بشكل متكرر، ويظهر أيضًا في وظائف مثلrange
، أو مع المكررات مثلenumerate
وzip
. يمكن استخدام الكائنات الخاصة في الغالب كما لو كانت مصفوفات عادية.تُعيد الدوال في جوليا القيم من آخر تعبير لها أو من كلمة
return
بدلاً من سرد أسماء المتغيرات التي يجب إرجاعها في تعريف الدالة (انظر The return Keyword لمزيد من التفاصيل).يمكن أن يحتوي نص جولي على أي عدد من الدوال، وستكون جميع التعريفات مرئية خارجيًا عند تحميل الملف. يمكن تحميل تعريفات الدوال من ملفات خارج الدليل العامل الحالي.
في جوليا، يتم تنفيذ التخفيضات مثل
sum
،prod
، وmaximum
على كل عنصر من عناصر المصفوفة عند استدعائها بحجة واحدة، كما فيsum(A)
، حتى لو كانتA
تحتوي على أكثر من بعد.في جوليا، يجب استخدام الأقواس لاستدعاء دالة بدون وسائط، مثل في
rand()
.جوليا تنصح بعدم استخدام الفواصل المنقوطة لإنهاء العبارات. نتائج العبارات لا تُطبع تلقائيًا (باستثناء عند الموجه التفاعلي)، ولا تحتاج أسطر الكود إلى أن تنتهي بفواصل منقوطة.
println
أو@printf
يمكن استخدامها لطباعة مخرجات محددة.في جوليا، إذا كانت
A
وB
مصفوفات، فإن عمليات المقارنة المنطقية مثلA == B
لا ترجع مصفوفة من القيم البوليانية. بدلاً من ذلك، استخدمA .== B
، وبالمثل بالنسبة لمشغلات البوليان الأخرى مثل<
،>
.في جوليا، تقوم العوامل
&
،|
، و⊻
(xor
) بتنفيذ العمليات البتية المعادلة لـand
،or
، وxor
على التوالي في MATLAB، ولها أسبقية مشابهة لعوامل البت في بايثون (على عكس C). يمكنها العمل على القيم الفردية أو بشكل عنصر بعنصر عبر المصفوفات ويمكن استخدامها لدمج المصفوفات المنطقية، لكن لاحظ الفرق في ترتيب العمليات: قد تكون الأقواس مطلوبة (على سبيل المثال، لاختيار العناصر منA
التي تساوي 1 أو 2 استخدم(A .== 1) .| (A .== 2)
).في جوليا، يمكن تمرير عناصر مجموعة كوسائط إلى دالة باستخدام عامل التوسيع
...
، كما فيxs=[1,2]; f(xs...)
.تُرجع دالة
svd
في جوليا القيم الفردية كمتجه بدلاً من مصفوفة قطرية كثيفة.في جوليا،
...
لا يُستخدم لاستكمال أسطر الكود. بدلاً من ذلك، يتم استكمال التعبيرات غير المكتملة تلقائيًا إلى السطر التالي.في كل من جوليا و MATLAB، يتم تعيين المتغير
ans
إلى قيمة التعبير الأخير الذي تم إصداره في جلسة تفاعلية. في جوليا، على عكس MATLAB، لا يتم تعيينans
عندما يتم تشغيل كود جوليا في وضع غير تفاعلي.لا تدعم
struct
s في جوليا إضافة حقول ديناميكيًا في وقت التشغيل، على عكسclass
es في ماتلاب. بدلاً من ذلك، استخدمDict
. الـ Dict في جوليا ليس مرتبًا.في جوليا، يحتوي كل وحدة على نطاق/مساحة اسم عالمية خاصة بها، بينما في ماتلاب يوجد نطاق عالمي واحد فقط.
في MATLAB، تعتبر طريقة إلغاء القيم غير المرغوب فيها باستخدام الفهرسة المنطقية، مثل التعبير
x(x>3)
أو في العبارةx(x>3) = []
لتعديلx
في المكان. في المقابل، توفر Julia الدوال ذات الترتيب الأعلىfilter
وfilter!
، مما يسمح للمستخدمين بكتابةfilter(z->z>3, x)
وfilter!(z->z>3, x)
كبدائل للترجمات المقابلةx[x.>3]
وx = x[x.>3]
. استخدام4d61726b646f776e2e436f64652822222c202266696c746572212229_40726566
يقلل من استخدام المصفوفات المؤقتة.التماثل لاستخراج (أو "إلغاء الإشارة") جميع عناصر مصفوفة الخلايا، على سبيل المثال في
vertcat(A{:})
في MATLAB، يُكتب باستخدام عامل التوسيع في جوليا، على سبيل المثال كـvcat(A...)
.في جوليا، تقوم دالة
adjoint
بأداء النقل المرافق؛ في ماتلاب، توفرadjoint
"المرافق" أو المرافق الكلاسيكي، وهو النقل للمصفوفة من العوامل.في جوليا، يتم تقييم a^b^c كـ a^(b^c) بينما في ماتلاب يكون (a^b)^c.
Noteworthy differences from R
أحد أهداف جوليا هو توفير لغة فعالة لتحليل البيانات وبرمجة الإحصاء. بالنسبة للمستخدمين القادمين إلى جوليا من R، هذه بعض الاختلافات الملحوظة:
تحتوي علامات الاقتباس المفردة في جوليا على أحرف، وليس سلاسل.
يمكن لجوليا إنشاء سلاسل فرعية عن طريق الفهرسة في السلاسل. في R، يجب تحويل السلاسل إلى متجهات حرفية قبل إنشاء السلاسل الفرعية.
في جوليا، مثل بايثون ولكن على عكس R، يمكن إنشاء السلاسل النصية باستخدام علامات الاقتباس الثلاثية
""" ... """
. هذه الصيغة مريحة لبناء السلاسل النصية التي تحتوي على فواصل أسطر.في جوليا، يتم تحديد المتغيرات المتغيرة باستخدام عامل التوسيع
...
، الذي يأتي دائمًا بعد اسم متغير محدد، على عكس R، حيث يمكن أن يحدث...
في عزلة.في جوليا، النسبة المئوية هي
mod(a, b)
، وليسa %% b
.%
في جوليا هو عامل الباقي.تقوم جوليا بإنشاء المتجهات باستخدام الأقواس.
[1, 2, 3]
في جوليا تعادلc(1, 2, 3)
في R.في جوليا، ليست جميع هياكل البيانات تدعم الفهرسة المنطقية. علاوة على ذلك، يتم دعم الفهرسة المنطقية في جوليا فقط مع المتجهات التي لها طول يساوي الكائن الذي يتم فهرسته. على سبيل المثال:
- في R،
c(1, 2, 3, 4)[c(TRUE, FALSE)]
يعادلc(1, 3)
. - في R،
c(1, 2, 3, 4)[c(TRUE, FALSE, TRUE, FALSE)]
يعادلc(1, 3)
. - في جوليا،
[1, 2, 3, 4][[true, false]]
يرميBoundsError
. - في جوليا،
[1, 2, 3, 4][[true, false, true, false]]
ينتج[1, 3]
.
- في R،
مثل العديد من اللغات، لا تسمح جوليا دائمًا بالعمليات على المتجهات ذات الأطوال المختلفة، على عكس R حيث تحتاج المتجهات فقط إلى مشاركة نطاق فهارس مشترك. على سبيل المثال،
c(1, 2, 3, 4) + c(1, 2)
هو R صالح ولكن المعادل[1, 2, 3, 4] + [1, 2]
سيتسبب في حدوث خطأ في جوليا.تسمح جوليا بفاصلة اختيارية في النهاية عندما لا تغير تلك الفاصلة معنى الكود. يمكن أن يسبب هذا ارتباكًا بين مستخدمي R عند الفهرسة في المصفوفات. على سبيل المثال،
x[1,]
في R ستعيد الصف الأول من مصفوفة؛ في جوليا، ومع ذلك، يتم تجاهل الفاصلة، لذاx[1,] == x[1]
، وستعيد العنصر الأول. لاستخراج صف، تأكد من استخدام:
، كما فيx[1,:]
.تأخذ دالة
map
في جوليا الدالة أولاً، ثم المعاملات، على عكسlapply(<structure>, function, ...)
في R. وبالمثل، فإن المعادل لجوليا لـapply(X, MARGIN, FUN, ...)
في R هوmapslices
حيث تكون الدالة هي المعامل الأول.تطبيق متعدد المتغيرات في R، على سبيل المثال
mapply(choose, 11:13, 1:3)
، يمكن كتابته كـbroadcast(binomial, 11:13, 1:3)
في جوليا. وبالمثل، تقدم جوليا صيغة نقطية أقصر لتعميم الدوالbinomial.(11:13, 1:3)
.تستخدم جوليا
end
للدلالة على نهاية كتل الشرط، مثلif
، وكتل الحلقات، مثلwhile
/for
، والدوال. بدلاً من جملةif ( cond ) statement
ذات السطر الواحد، تسمح جوليا بجمل من الشكلif cond; statement; end
،cond && statement
و!cond || statement
. يجب أن تكون جمل التعيين في الصيغتين الأخيرتين مغلفة صراحةً بين قوسين، مثلcond && (x = value)
.في جوليا،
<-
و<<-
و->
ليست مشغلات تعيين.تقوم
->
في جوليا بإنشاء دالة مجهولة.يمكن لمشغل
*
في جوليا إجراء ضرب المصفوفات، على عكس R. إذا كانتA
وB
مصفوفتين، فإنA * B
تشير إلى ضرب المصفوفات في جوليا، وهو ما يعادلA %*% B
في R. في R، ستؤدي هذه الصيغة نفسها إلى إجراء عملية ضرب عنصرية (هادامارد). للحصول على عملية الضرب العنصري، تحتاج إلى كتابةA .* B
في جوليا.تقوم جوليا بإجراء تحويل المصفوفات باستخدام دالة
transpose
والتحويل المرافق باستخدام العامل'
أو دالةadjoint
. وبالتالي، فإنtranspose(A)
في جوليا تعادلt(A)
في R. بالإضافة إلى ذلك، يتم توفير تحويل غير تكراري في جوليا بواسطة دالةpermutedims
.جوليا لا تتطلب أقواسًا عند كتابة عبارات
if
أو حلقاتfor
/while
: استخدمfor i in [1, 2, 3]
بدلاً منfor (i in c(1, 2, 3))
وif i == 1
بدلاً منif (i == 1)
.تتعامل جوليا مع الأرقام
0
و1
على أنهما ليسا من نوع Boolean. لا يمكنك كتابةif (1)
في جوليا، لأن جملif
تقبل فقط القيم البوليانية. بدلاً من ذلك، يمكنك كتابةif true
،if Bool(1)
، أوif 1==1
.جوليا لا توفر
nrow
وncol
. بدلاً من ذلك، استخدمsize(M, 1)
لـnrow(M)
وsize(M, 2)
لـncol(M)
.تولي جوليا اهتمامًا خاصًا لتمييز الأعداد الفردية، والمتجهات، والمصفوفات. في R،
1
وc(1)
هما نفس الشيء. في جوليا، لا يمكن استخدامهما بالتبادل.لا يمكن لجوليا تعيين نتائج استدعاءات الدوال على الجانب الأيسر من عملية التعيين: لا يمكنك كتابة
diag(M) = fill(1, n)
.جوليا تنصح بعدم ملء مساحة الأسماء الرئيسية بالوظائف. معظم الوظائف الإحصائية لجوليا موجودة في packages تحت JuliaStats organization. على سبيل المثال:
- تُقدّم الدوال المتعلقة بتوزيعات الاحتمالات من قبل Distributions package.
- يوفر DataFrames package إطارات بيانات.
- تُقدَّم النماذج الخطية المعممة بواسطة GLM package.
تقدم جوليا التوائم وجداول التجزئة الحقيقية، ولكن لا تقدم قوائم على طراز R. عند إرجاع عناصر متعددة، يجب عليك عادةً استخدام زوج أو زوج مسمى: بدلاً من
list(a = 1, b = 2)
، استخدم(1, 2)
أو(a=1, b=2)
.تشجع جوليا المستخدمين على كتابة أنواعهم الخاصة، والتي تكون أسهل في الاستخدام من كائنات S3 أو S4 في R. يعني نظام التوزيع المتعدد في جوليا أن
table(x::TypeA)
وtable(x::TypeB)
تعمل مثلtable.TypeA(x)
وtable.TypeB(x)
في R.في جوليا، لا يتم نسخ القيم عند تعيينها أو تمريرها إلى دالة. إذا قامت دالة بتعديل مصفوفة، ستظهر التغييرات في المتصل. هذا يختلف كثيرًا عن R ويسمح للدوال الجديدة بالعمل على هياكل البيانات الكبيرة بكفاءة أكبر.
في جوليا، يتم دمج المتجهات والمصفوفات باستخدام
hcat
،vcat
وhvcat
، وليسc
،rbind
وcbind
كما في R.في جوليا، النطاق مثل
a:b
ليس اختصارًا لمتجه كما في R، بل هو كائن متخصص من نوعAbstractRange
يُستخدم للتكرار. لتحويل النطاق إلى متجه، استخدمcollect(a:b)
.يتمتع عامل
:
بأسبقية مختلفة في R وJulia. على وجه الخصوص، في Julia، تتمتع عوامل الحساب بأسبقية أعلى من عامل:
، بينما العكس هو الصحيح في R. على سبيل المثال،1:n-1
في Julia يعادل1:(n-1)
في R.جوليا
max
وmin
هما المعادلان لـpmax
وpmin
على التوالي في R، لكن يجب أن تكون كلا الحجتين بنفس الأبعاد. بينماmaximum
وminimum
تحل محلmax
وmin
في R، هناك اختلافات مهمة.تختلف دوال
sum
،prod
،maximum
، وminimum
في جوليا عن نظيراتها في R. جميعها تقبل وسيط كلمة مفتاحية اختياريdims
، الذي يشير إلى الأبعاد التي يتم تنفيذ العملية عليها. على سبيل المثال، دعA = [1 2; 3 4]
في جوليا وB <- rbind(c(1,2),c(3,4))
تكون نفس المصفوفة في R. ثمsum(A)
يعطي نفس النتيجة مثلsum(B)
، لكنsum(A, dims=1)
هو متجه صف يحتوي على المجموع عبر كل عمود وsum(A, dims=2)
هو متجه عمود يحتوي على المجموع عبر كل صف. هذا يتناقض مع سلوك R، حيث توفر دوال منفصلةcolSums(B)
وrowSums(B)
هذه الوظائف. إذا كان وسيط كلمةdims
المفتاحية هو متجه، فإنه يحدد جميع الأبعاد التي يتم فيها تنفيذ المجموع، مع الاحتفاظ بأبعاد المصفوفة المجمعة، على سبيل المثالsum(A, dims=(1,2)) == hcat(10)
. يجب ملاحظة أنه لا يوجد فحص للأخطاء فيما يتعلق بالوسيط الثاني.جوليا لديها العديد من الدوال التي يمكن أن تغير معطياتها. على سبيل المثال، لديها كل من
sort
وsort!
.في R، تتطلب الأداء التوجيه إلى المتجهات. في جوليا، يكون العكس تقريبًا صحيحًا: غالبًا ما يتم تحقيق أفضل أداء من خلال استخدام الحلقات غير الموجهة.
جوليا يتم تقييمها بشغف ولا تدعم التقييم الكسول على طراز R. بالنسبة لمعظم المستخدمين، يعني ذلك أن هناك عددًا قليلاً جدًا من التعبيرات أو أسماء الأعمدة غير المقتبسة.
جوليا لا تدعم نوع
NULL
. أقرب مكافئ هوnothing
، لكنه يتصرف كقيمة عددية بدلاً من كقائمة. استخدمx === nothing
بدلاً منis.null(x)
.في جوليا، يتم تمثيل القيم المفقودة بواسطة كائن
missing
بدلاً منNA
. استخدمismissing(x)
(أوismissing.(x)
لعملية عنصر بعنصر على المتجهات) بدلاً منis.na(x)
. تُستخدم دالةskipmissing
بشكل عام بدلاً منna.rm=TRUE
(على الرغم من أنه في بعض الحالات الخاصة تأخذ الدوال وسيطskipmissing
).تفتقر جوليا إلى ما يعادل
assign
أوget
في R.في جوليا،
return
لا تتطلب أقواس.في R، تعتبر طريقة إلغاء القيم غير المرغوب فيها طريقة تعبيرية باستخدام الفهرسة المنطقية، مثل التعبير
x[x>3]
أو في العبارةx = x[x>3]
لتعديلx
في المكان. في المقابل، توفر Julia الدوال من الدرجة العلياfilter
وfilter!
، مما يسمح للمستخدمين بكتابةfilter(z->z>3, x)
وfilter!(z->z>3, x)
كبدائل للترجمات المقابلةx[x.>3]
وx = x[x.>3]
. استخدام4d61726b646f776e2e436f64652822222c202266696c746572212229_40726566
يقلل من استخدام المصفوفات المؤقتة.
Noteworthy differences from Python
- تُنهي كتل
for
وif
وwhile
في جوليا بكلمةend
. مستوى المسافة البادئة ليس له دلالة كما هو الحال في بايثون. على عكس بايثون، لا تحتوي جوليا على كلمةpass
. - تُشير السلاسل النصية إلى علامات الاقتباس المزدوجة (
"text"
) في جوليا (مع ثلاث علامات اقتباس مزدوجة للسلاسل النصية متعددة الأسطر)، بينما في بايثون يمكن الإشارة إليها إما بعلامات اقتباس مفردة ('text'
) أو علامات اقتباس مزدوجة ("text"
). تُستخدم علامات الاقتباس المفردة للأحرف في جوليا ('c'
). - ت concatenation السلاسل يتم باستخدام
*
في جوليا، وليس+
كما في بايثون. بشكل مشابه، يتم تكرار السلاسل باستخدام^
، وليس*
. الت concatenation الضمني للسلاسل النصية مثلما في بايثون (على سبيل المثال،'ab' 'cd' == 'abcd'
) لا يتم في جوليا. - قوائم بايثون - مرنة ولكن بطيئة - تتوافق مع نوع
Vector{Any}
في جوليا أو بشكل أكثر عموميةVector{T}
حيثT
هو نوع عنصر غير محدد. يمكن تمثيل المصفوفات "السريعة" مثل مصفوفات NumPy التي تخزن العناصر في مكانها (أي أنdtype
هوnp.float64
،[('f1', np.uint64), ('f2', np.int32)]
، إلخ) بواسطةArray{T}
حيثT
هو نوع عنصر محدد وغير قابل للتغيير. يشمل ذلك الأنواع المدمجة مثلFloat64
،Int32
،Int64
ولكن أيضًا أنواع أكثر تعقيدًا مثلTuple{UInt64,Float64}
والعديد من الأنواع المعرفة من قبل المستخدم أيضًا. - في جوليا، يكون فهرسة المصفوفات والسلاسل النصية، إلخ، مبنية على الرقم 1 وليس 0.
- تتضمن فهرسة الشريحة في جوليا العنصر الأخير، على عكس بايثون.
a[2:3]
في جوليا هوa[1:3]
في بايثون. - على عكس بايثون، تسمح جوليا AbstractArrays with arbitrary indexes. يجب كتابة التفسير الخاص لبايثون للترتيب السالب،
a[-1]
وa[-2]
كـa[end]
وa[end-1]
في جوليا. - تتطلب جوليا
end
للفهرسة حتى العنصر الأخير.x[1:]
في بايثون يعادلx[2:end]
في جوليا. - في جوليا،
:
قبل أي كائن ينشئSymbol
أو يقتبس تعبيرًا؛ لذا،x[:5]
هو نفسهx[5]
. إذا كنت تريد الحصول على أولn
عناصر من مصفوفة، فاستخدم فهرسة النطاق. - تستخدم فهرسة النطاق في جوليا التنسيق
x[start:step:stop]
، بينما يستخدم بايثون التنسيقx[start:(stop+1):step]
. وبالتالي، فإنx[0:10:2]
في بايثون يعادلx[1:2:10]
في جوليا. وبالمثل، فإنx[::-1]
في بايثون، الذي يشير إلى المصفوفة المعكوسة، يعادلx[end:-1:1]
في جوليا. - في جوليا، يمكن إنشاء النطاقات بشكل مستقل كـ
start:step:stop
، نفس الصيغة التي تستخدم في فهرسة المصفوفات. كما أن دالةrange
مدعومة أيضًا. - في جوليا، يشير فهرسة مصفوفة باستخدام مصفوفات مثل
X[[1,2], [1,3]]
إلى مصفوفة فرعية تحتوي على تقاطعات الصفين الأول والثاني مع العمودين الأول والثالث. في بايثون،X[[1,2], [1,3]]
تشير إلى متجه يحتوي على قيم الخلية[1,1]
و[2,3]
في المصفوفة.X[[1,2], [1,3]]
في جوليا يعادلX[np.ix_([0,1],[0,2])]
في بايثون.X[[0,1], [0,2]]
في بايثون تعادلX[[CartesianIndex(1,1), CartesianIndex(2,3)]]
في جوليا. - جوليا ليس لديها بناء استمرارية الأسطر: إذا كان في نهاية السطر، المدخل حتى الآن هو تعبير كامل، فإنه يعتبر مكتملًا؛ وإلا فإن المدخل يستمر. إحدى الطرق لإجبار تعبير على الاستمرار هي لفه بين قوسين.
- تعتبر مصفوفات جوليا مرتبة حسب الأعمدة (مرتبة وفق فورتران) بينما تعتبر مصفوفات NumPy مرتبة حسب الصفوف (مرتبة وفق C) بشكل افتراضي. للحصول على أداء مثالي عند التكرار على المصفوفات، يجب عكس ترتيب الحلقات في جوليا بالنسبة إلى NumPy (انظر relevant section of Performance Tips).
- تحديثات المشغلين في جوليا (مثل
+=
،-=
، ...) ليست في المكان بينما في NumPy هي كذلك. هذا يعني أنA = [1, 1]; B = A; B += [3, 3]
لا يغير القيم فيA
، بل يعيد ربط الاسمB
بنتيجة الجانب الأيمنB = B + 3
، وهو مصفوفة جديدة. لاستخدام عملية في المكان، استخدمB .+= 3
(انظر أيضًا dot operators)، الحلقات الصريحة، أوInplaceOps.jl
. - تقوم جوليا بتقييم القيم الافتراضية لوسائط الدالة في كل مرة يتم فيها استدعاء الطريقة، على عكس بايثون حيث يتم تقييم القيم الافتراضية مرة واحدة فقط عند تعريف الدالة. على سبيل المثال، الدالة
f(x=rand()) = x
تعيد رقمًا عشوائيًا جديدًا في كل مرة يتم استدعاؤها بدون وسيط. من ناحية أخرى، الدالةg(x=[1,2]) = push!(x,3)
تعيد[1,2,3]
في كل مرة يتم استدعاؤها كـg()
. - في جوليا، يجب تمرير الوسائط الرئيسية باستخدام الكلمات الرئيسية، على عكس بايثون حيث يكون من الممكن عادةً تمريرها بشكل موضعي. إن محاولة تمرير وسيط رئيسي بشكل موضعي تؤدي إلى تغيير توقيع الطريقة مما يؤدي إلى
MethodError
أو استدعاء الطريقة الخاطئة. - في جوليا
%
هو عامل الباقي، بينما في بايثون هو العامل المودول. - في جوليا، النوع المستخدم عادةً
Int
يتوافق مع نوع العدد الصحيح الآلي (Int32
أوInt64
)، على عكس بايثون، حيثint
هو عدد صحيح بطول غير محدد. هذا يعني أنه في جوليا، سيحدث overflow لنوعInt
، بحيث2^64 == 0
. إذا كنت بحاجة إلى قيم أكبر، استخدم نوعًا مناسبًا آخر، مثلInt128
،BigInt
أو نوع نقطة عائمة مثلFloat64
. - وحدة التخيل
sqrt(-1)
تمثل في جوليا كـim
، وليسj
كما في بايثون. - في جوليا، عامل الأس هو
^
، وليس**
كما في بايثون. - تستخدم جوليا
nothing
من النوعNothing
لتمثيل قيمة فارغة، بينما تستخدم بايثونNone
من النوعNoneType
. - في جوليا، تعتبر العمليات القياسية على نوع المصفوفة عمليات مصفوفة، بينما في بايثون، تعتبر العمليات القياسية عمليات عنصرية. عندما تكون كل من
A
وB
مصفوفتين، فإنA * B
في جوليا ينفذ ضرب المصفوفات، وليس الضرب العنصري كما في بايثون.A * B
في جوليا يعادلA @ B
في بايثون، بينماA * B
في بايثون يعادلA .* B
في جوليا. - يُعيد المشغل المرافق
'
في جوليا المرافق لعنصر (تمثيل كسول لعنصر صف)، بينما يُعيد مشغل النقل.T
على عنصر في بايثون العنصر الأصلي (غير عملية). - في جوليا، قد تحتوي الدالة على عدة تنفيذات ملموسة (تسمى طرق)، والتي يتم اختيارها عبر التوزيع المتعدد بناءً على أنواع جميع المعاملات في الاستدعاء، مقارنةً بالدوال في بايثون، التي تحتوي على تنفيذ واحد فقط ولا تحتوي على تعددية الأشكال (على عكس استدعاءات طرق بايثون التي تستخدم بناء جملة مختلف وتسمح بالتوزيع بناءً على المستلم للطريقة).
- لا توجد فصول في جوليا. بدلاً من ذلك، هناك هياكل (قابلة للتغيير أو غير قابلة للتغيير)، تحتوي على بيانات ولكن لا تحتوي على طرق.
- استدعاء طريقة من مثيل فئة في بايثون (
x = MyClass(*args); x.f(y)
) يتوافق مع استدعاء دالة في جوليا، على سبيل المثالx = MyType(args...); f(x, y)
. بشكل عام، التوزيع المتعدد أكثر مرونة وقوة من نظام الفئات في بايثون. - يمكن أن تحتوي هياكل جوليا على نوع واحد مجرد فقط كنوع أعلى، في حين يمكن أن ترث فئات بايثون من واحد أو أكثر (مجردة أو ملموسة) من الفئات العليا.
- هيكل البرنامج المنطقي لجوليا (الحزم والوحدات) مستقل عن هيكل الملفات، في حين أن هيكل كود بايثون محدد من خلال الدلائل (الحزم) والملفات (الوحدات).
- في جوليا، من المعتاد تقسيم نصوص الوحدات الكبيرة إلى ملفات متعددة، دون إدخال وحدة جديدة لكل ملف. يتم إعادة تجميع الكود داخل وحدة واحدة في ملف رئيسي عبر
include
. بينما المعادل في بايثون (exec
) ليس شائعًا لهذا الاستخدام (سوف يقوم بهدوء بتجاوز التعريفات السابقة)، يتم تعريف برامج جوليا كوحدة على مستوىmodule
باستخدامusing
أوimport
، والتي سيتم تنفيذها مرة واحدة فقط عند الحاجة لأول مرة - مثلinclude
في بايثون. داخل تلك الوحدات، يتم تحميل الملفات الفردية التي تشكل تلك الوحدة باستخدامinclude
من خلال سردها مرة واحدة بالترتيب المقصود. - عامل الثلاثي
x > 0 ? 1 : -1
في جوليا يتوافق مع تعبير شرطي في بايثون1 if x > 0 else -1
. - في جوليا، يشير الرمز
@
إلى ماكرو، بينما في بايثون يشير إلى ديكور. - يتم التعامل مع الاستثناءات في جوليا باستخدام
try
—catch
—finally
، بدلاً منtry
—except
—finally
. على عكس بايثون، لا يُنصح باستخدام معالجة الاستثناءات كجزء من سير العمل العادي في جوليا (مقارنةً ببايثون، جوليا أسرع في تدفق التحكم العادي ولكن أبطأ في التقاط الاستثناءات). - في جوليا، الحلقات سريعة، ولا حاجة لكتابة كود "موجه نحو المتجهات" لأسباب تتعلق بالأداء.
- كن حذرًا مع المتغيرات العالمية غير الثابتة في جوليا، خاصة في الحلقات الضيقة. نظرًا لأنك يمكنك كتابة كود قريب من المعدن في جوليا (على عكس بايثون)، يمكن أن يكون تأثير المتغيرات العالمية كبيرًا (انظر Performance Tips).
- في جوليا، يتم التقريب والقص بشكل صريح. يجب أن يكون
int(3.7)
في بايثون هوfloor(Int, 3.7)
أوInt(floor(3.7))
ويميز عنround(Int, 3.7)
. ترجعfloor(x)
وround(x)
بمفردهما قيمة صحيحة من نفس نوعx
بدلاً من أن ترجع دائمًاInt
. - في جوليا، التحليل صريح.
float("3.7")
في بايثون سيكونparse(Float64, "3.7")
في جوليا. - في بايثون، يمكن استخدام معظم القيم في السياقات المنطقية (على سبيل المثال،
if "a":
يعني أن الكتلة التالية يتم تنفيذها، وif "":
يعني أنه لا يتم تنفيذها). في جوليا، تحتاج إلى تحويل صريح إلىBool
(على سبيل المثال،if "a"
يثير استثناء). إذا كنت تريد اختبار سلسلة غير فارغة في جوليا، يجب أن تكتب صراحةif !isempty("")
. ربما من المدهش، في بايثونif "False"
وbool("False")
كلاهما يقيم إلىTrue
(لأن"False"
هي سلسلة غير فارغة)؛ في جوليا،parse(Bool, "false")
تعيدfalse
. - في جوليا، يتم تقديم نطاق محلي جديد بواسطة معظم كتل الشيفرة، بما في ذلك الحلقات و
try
—catch
—finally
. لاحظ أن الفهم (القائمة، المولد، إلخ) يقدم نطاقًا محليًا جديدًا في كل من بايثون وجوليا، في حين أن كتلif
لا تقدم نطاقًا محليًا جديدًا في كلا اللغتين.
Noteworthy differences from C/C++
- تُستخدم الأقواس المربعة لفهرسة مصفوفات جوليا، ويمكن أن تحتوي على أكثر من بُعد
A[i,j]
. هذه الصيغة ليست مجرد سكر نحوي للإشارة إلى مؤشر أو عنوان كما في C/C++. انظر the manual entry about array construction. - في جوليا، يكون فهرسة المصفوفات والسلاسل النصية، إلخ، مبنية على الرقم 1 وليس على الرقم 0.
- المصفوفات في جوليا لا تُنسخ عند تعيينها إلى متغير آخر. بعد
A = B
، ستؤدي تغييرات العناصر فيB
إلى تعديلA
أيضًا. لا تعمل عوامل التحديث مثل+=
في المكان، بل هي معادلة لـA = A + B
التي تعيد ربط الجانب الأيسر بنتيجة تعبير الجانب الأيمن. - تعتبر مصفوفات جوليا مرتبة حسب الأعمدة (مرتبة وفقًا لفورتران) بينما تكون مصفوفات C/C++ مرتبة حسب الصفوف بشكل افتراضي. للحصول على أداء مثالي عند التكرار على المصفوفات، يجب عكس ترتيب الحلقات في جوليا مقارنةً بـ C/C++ (انظر relevant section of Performance Tips).
- لا تُنسخ قيم جوليا عند تعيينها أو تمريرها إلى دالة. إذا قامت دالة بتعديل مصفوفة، فستكون التغييرات مرئية في المتصل.
- في جوليا، المسافات البيضاء لها دلالة، على عكس C/C++، لذا يجب توخي الحذر عند إضافة/إزالة المسافات البيضاء من برنامج جوليا.
- في جوليا، الأرقام الحرفية بدون نقطة عشرية (مثل
42
) تُنشئ أعداد صحيحة موقعة، من النوعInt
، ولكن الحروف التي تكون كبيرة جدًا بحيث لا تتناسب مع حجم كلمة الآلة سيتم ترقيتها تلقائيًا إلى نوع أكبر، مثلInt64
(إذا كانInt
هوInt32
)، أوInt128
، أو النوع الكبير بشكل تعسفيBigInt
. لا توجد لاحقات حرفية عددية، مثلL
،LL
،U
،UL
،ULL
للإشارة إلى الموقعة و/أو غير الموقعة. الأعداد العشرية دائمًا موقعة، والأعداد السداسية عشر (التي تبدأ بـ0x
مثل C/C++)، غير موقعة، ما لم تكن تشفر أكثر من 128 بت، وفي هذه الحالة تكون من النوعBigInt
. الأعداد السداسية عشر أيضًا، على عكس C/C++/Java وعلى عكس الأعداد العشرية في جوليا، لها نوع يعتمد على طول الحرف، بما في ذلك الأصفار البادئة. على سبيل المثال،0x0
و0x00
لهما نوعUInt8
، و0x000
و0x0000
لهما نوعUInt16
، ثم الحروف التي تحتوي على 5 إلى 8 أرقام سداسية عشر لها نوعUInt32
، و9 إلى 16 رقم سداسي عشر نوعUInt64
، و17 إلى 32 رقم سداسي عشر نوعUInt128
، وأكثر من 32 رقم سداسي عشر نوعBigInt
. يجب أخذ ذلك في الاعتبار عند تعريف الأقنعة السداسية عشر، على سبيل المثال~0xf == 0xf0
يختلف كثيرًا عن~0x000f == 0xfff0
. يتم التعبير عن الأعداد العائمة 64 بتFloat64
و32 بتFloat32
كـ1.0
و1.0f0
على التوالي. يتم تقريب الأعداد العائمة (وليس ترقيتها إلى نوعBigFloat
) إذا لم يكن بالإمكان تمثيلها بدقة. الأعداد العائمة أقرب في السلوك إلى C/C++. الأعداد الثمانية (المقدمة بـ0o
) والأعداد الثنائية (المقدمة بـ0b
) تُعامل أيضًا كغير موقعة (أوBigInt
لأكثر من 128 بت). - في جوليا، يُرجع عامل القسمة
/
رقمًا عشريًا عندما يكون كلا العاملين من نوع صحيح. لأداء القسمة الصحيحة، استخدمdiv
أو÷
. - فهرسة
Array
باستخدام أنواع النقاط العائمة تعتبر عادةً خطأ في جوليا. المعادل لجملة Ca[i / 2]
في جوليا هوa[i ÷ 2 + 1]
، حيث أنi
من نوع صحيح. - يمكن تحديد السلاسل النصية باستخدام إما
"
أو"""
، يمكن أن تحتوي السلاسل المحددة بـ"""
على أحرف"
دون الحاجة إلى اقتباسها مثل"\""
. يمكن أن تحتوي السلاسل النصية على قيم متغيرات أخرى أو تعبيرات مدمجة فيها، مما يشير إليه$variablename
أو$(expression)
، والذي يقوم بتقييم اسم المتغير أو التعبير في سياق الدالة. //
يشير إلى رقمRational
، وليس تعليقًا من سطر واحد (الذي هو#
في جوليا)#=
يشير إلى بداية تعليق متعدد الأسطر، و=#
ينهيه.- تُعيد الدوال في جوليا القيم من آخر تعبير (أو تعبيرات) لها أو من الكلمة الرئيسية
return
. يمكن إرجاع قيم متعددة من الدوال وتعيينها كأزواج مرتبة، على سبيل المثال(a, b) = myfunction()
أوa, b = myfunction()
، بدلاً من الاضطرار إلى تمرير مؤشرات للقيم كما يتعين القيام به في C/C++ (أيa = myfunction(&b)
). - جوليا لا تتطلب استخدام الفواصل المنقوطة لإنهاء العبارات. نتائج التعبيرات لا تُطبع تلقائيًا (باستثناء عند الموجه التفاعلي، أي REPL)، ولا تحتاج أسطر الكود إلى الانتهاء بفواصل منقوطة.
println
أو@printf
يمكن استخدامها لطباعة مخرجات محددة. في REPL، يمكن استخدام;
لكتم المخرجات.;
لها أيضًا معنى مختلف داخل[ ]
، وهو شيء يجب الانتباه له. يمكن استخدام;
لفصل التعبيرات في سطر واحد، لكنها ليست ضرورية بشكل صارم في العديد من الحالات، وهي أكثر مساعدة في تحسين القراءة. - في جوليا، يقوم العامل
⊻
(xor
) بتنفيذ عملية XOR بت bitwise، أي^
في C/C++. أيضًا، لا تمتلك عوامل التشغيل بت bitwise نفس أسبقية C/C++، لذا قد تكون الأقواس مطلوبة. - جوليا
^
هو الأس (pow)، وليس XOR بت bitwise كما في C/C++ (استخدم⊻
، أوxor
، في جوليا) - تحتوي جوليا على عمليتي إزاحة لليمين،
>>
و>>>
. تقوم>>
بإجراء إزاحة حسابية، بينما تقوم>>>
دائمًا بإجراء إزاحة منطقية، على عكس C/C++، حيث يعتمد معنى>>
على نوع القيمة التي يتم إزاحتها. - تقوم
->
في جوليا بإنشاء دالة مجهولة، ولا تصل إلى عضو عبر مؤشر. - جوليا لا تتطلب أقواسًا عند كتابة عبارات
if
أو حلقاتfor
/while
: استخدمfor i in [1, 2, 3]
بدلاً منfor (int i=1; i <= 3; i++)
وif i == 1
بدلاً منif (i == 1)
. - تتعامل جوليا مع الأرقام
0
و1
على أنهما ليسا من نوع Boolean. لا يمكنك كتابةif (1)
في جوليا، لأن جملif
تقبل فقط القيم البوليانية. بدلاً من ذلك، يمكنك كتابةif true
،if Bool(1)
، أوif 1==1
. - تستخدم جوليا
end
للدلالة على نهاية كتل الشرط، مثلif
، وكتل الحلقات، مثلwhile
/for
، والدوال. بدلاً من جملةif ( cond ) statement
ذات السطر الواحد، تسمح جوليا بجمل من الشكلif cond; statement; end
،cond && statement
و!cond || statement
. يجب أن تكون جمل التعيين في الصيغتين الأخيرتين مغلفة صراحةً بين قوسين، مثلcond && (x = value)
، بسبب أسبقية العمليات. - جوليا ليس لديها بناء استمرارية الأسطر: إذا كان في نهاية السطر، التعبير المدخل حتى الآن هو تعبير كامل، فإنه يعتبر مكتملًا؛ وإلا فإن الإدخال يستمر. إحدى الطرق لإجبار التعبير على الاستمرار هي لفه بين قوسين.
- تعمل الماكرو في جوليا على التعبيرات المفسرة، بدلاً من نص البرنامج، مما يسمح لها بإجراء تحويلات معقدة على كود جوليا. تبدأ أسماء الماكرو بحرف
@
، ولها كل من صيغة تشبه الدالة،@mymacro(arg1, arg2, arg3)
، وصيغة تشبه العبارة،@mymacro arg1 arg2 arg3
. الأشكال قابلة للتبادل؛ الشكل الذي يشبه الدالة مفيد بشكل خاص إذا ظهرت الماكرو داخل تعبير آخر، وغالبًا ما يكون أوضح. غالبًا ما تُستخدم الصيغة التي تشبه العبارة لتوضيح الكتل، كما في بناءfor
الموزع:@distributed for i in 1:n; #= body =#; end
. حيث قد يكون من غير الواضح نهاية بناء الماكرو، استخدم الشكل الذي يشبه الدالة. - جوليا لديها نوع تعداد، يتم التعبير عنه باستخدام الماكرو
@enum(name, value1, value2, ...)
على سبيل المثال:@enum(Fruit, banana=1, apple, pear)
- بموجب الاتفاق، فإن الدوال التي تعدل معطياتها تحتوي على
!
في نهاية الاسم، على سبيل المثالpush!
. - في C++، بشكل افتراضي، لديك إرسال ثابت، أي أنك بحاجة إلى وضع علامة على دالة كـ virtual، من أجل الحصول على إرسال ديناميكي. من ناحية أخرى، في جوليا، كل دالة "افتراضية" (على الرغم من أن هذا أكثر عمومية من ذلك لأن الدوال يتم إرسالها بناءً على كل نوع من أنواع المعاملات، وليس فقط
this
، باستخدام قاعدة الإعلان الأكثر تحديدًا).
Julia ⇔ C/C++: Namespaces
C/C++
namespace
s تتوافق تقريبًا معmodule
s في Julia.لا توجد متغيرات أو حقول خاصة في جوليا. كل شيء متاح للجمهور من خلال المسارات المؤهلة بالكامل (أو المسارات النسبية، إذا رغبت).
using MyNamespace::myfun
(C++) يتوافق تقريبًا معimport MyModule: myfun
(Julia).using namespace MyNamespace
(C++) يتوافق تقريبًا معusing MyModule
(Julia)- في جوليا، فقط الرموز التي تم
تصديرها
متاحة للوحدة المستدعية. - في C++، العناصر الموجودة فقط في ملفات الرأس (العامة) المضمنة متاحة.
- في جوليا، فقط الرموز التي تم
تحذير: كلمات المفتاح
import
/using
(جوليا) أيضًا تقوم بتحميل الوحدات (انظر أدناه).تحذير:
import
/using
(جوليا) يعمل فقط على مستوى النطاق العالمي (module
s)- في C++،
using namespace X
يعمل ضمن نطاقات عشوائية (مثل: نطاق الدالة).
- في C++،
Julia ⇔ C/C++: Module loading
عندما تفكر في "مكتبة" C/C++، فمن المحتمل أنك تبحث عن "حزمة" جوليا.
- تحذير: غالبًا ما تحتوي مكتبات C/C++ على عدة "وحدات برمجية" بينما تحتوي "حزم" جوليا عادةً على واحدة.
- تذكير:
module
s في جوليا هي نطاقات عالمية (ليست بالضرورة "وحدات برمجية").
بدلاً من بناء/
make
السكربتات، تستخدم جوليا "بيئات المشاريع" (تسمى أحيانًا "مشروع" أو "بيئة").- تحتاج البرامج النصية للبناء فقط للتطبيقات الأكثر تعقيدًا (مثل تلك التي تحتاج إلى تجميع أو تنزيل تنفيذات C/C++).
- لتطوير تطبيق أو مشروع في جوليا، يمكنك تهيئة دليل الجذر الخاص به كـ "بيئة مشروع"، وتخزين الشيفرة/الحزم الخاصة بالتطبيق هناك. يوفر ذلك تحكمًا جيدًا في تبعيات المشروع، وإمكانية إعادة الإنتاج في المستقبل.
- تتم إضافة الحزم المتاحة إلى "بيئة المشروع" باستخدام دالة
Pkg.add()
أو وضع REPL الخاص بـ Pkg. (هذا لا يحمّل الحزمة المذكورة، مع ذلك). - قائمة الحزم المتاحة (التبعيات المباشرة) لبيئة المشروع محفوظة في ملف
Project.toml
. - تُولَّد معلومات الاعتماد الكاملة لبيئة المشروع تلقائيًا وتُحفظ في ملف
Manifest.toml
بواسطةPkg.resolve()
.
الحزم ("وحدات البرمجيات") المتاحة لـ "بيئة المشروع" يتم تحميلها باستخدام
import
أوusing
.- في C/C++، تستخدم
#include <moduleheader>
للحصول على إعلانات الكائنات/الدوال، وتربط المكتبات عند بناء البرنامج التنفيذي. - في جوليا، استدعاء
using
/import
مرة أخرى يجلب الوحدة الموجودة إلى النطاق، ولكنه لا يقوم بتحميلها مرة أخرى (مشابه لإضافة#pragma once
غير القياسي في C/C++).
- في C/C++، تستخدم
مستودعات الحزم المعتمدة على الدليل (جوليا) يمكن جعلها متاحة عن طريق إضافة مسارات المستودعات إلى مصفوفة
Base.LOAD_PATH
.- الحزم من المستودعات المعتمدة على الدليل لا تتطلب أداة
Pkg.add()
قبل تحميلها باستخدامimport
أوusing
. إنها متاحة ببساطة للمشروع. - تعتبر مستودعات الحزم المعتمدة على الدليل هي أسرع حل لتطوير مكتبات محلية من "وحدات البرمجيات".
- الحزم من المستودعات المعتمدة على الدليل لا تتطلب أداة
Julia ⇔ C/C++: Assembling modules
في C/C++، يتم تجميع ملفات
.c
/.cpp
وإضافتها إلى مكتبة باستخدام سكريبتات البناء/make
.- في جوليا،
import [PkgName]
/using [PkgName]
تعبيرات تقوم بتحميل[PkgName].jl
الموجود في الدليل الفرعي[PkgName]/src/
الخاص بالحزمة. - بدوره،
[PkgName].jl
عادةً ما يحمل الملفات المصدرية المرتبطة من خلال استدعاءات إلىinclude "[someotherfile].jl"
.
- في جوليا،
include "./path/to/somefile.jl"
(جوليا) مشابه جدًا لـ#include "./path/to/somefile.jl"
(C/C++).- ومع ذلك
include "..."
(جوليا) لا يُستخدم لتضمين ملفات الرأس (غير مطلوب). - لا تستخدم
include "..."
(جوليا) لتحميل الشيفرة من "وحدات البرمجيات" الأخرى (استخدمimport
/using
بدلاً من ذلك). include "path/to/some/module.jl"
(جوليا) سيقوم بإنشاء نسخ متعددة من نفس الكود في وحدات مختلفة (مما ينشئ أنواعًا متميزة (وما إلى ذلك) بنفس الأسماء المتطابقة).include "somefile.jl"
يُستخدم عادةً لتجميع ملفات متعددة داخل نفس حزمة جوليا ("وحدة البرمجيات"). لذلك، من السهل نسبيًا التأكد من أن الملفات يتمinclude
d مرة واحدة فقط (لا يوجد ارتباك بسبب#ifdef
).
- ومع ذلك
Julia ⇔ C/C++: Module interface
C++ تعرض الواجهات باستخدام ملفات ".h"/".hpp" "عامة" بينما تحدد وحدات جوليا
module
s الرموز المحددة التي تهدف إلى مستخدميها كـpublic
أوexport
ed.- غالبًا ما تضيف وحدات جوليا
module
s ببساطة وظائف جديدة من خلال إنشاء "طرق" جديدة لدوال موجودة (مثل:Base.push!
). - لذلك لا يمكن لمطوري حزم جوليا الاعتماد على ملفات الرأس لوثائق الواجهة.
- تُوصف الواجهات لحزم جوليا عادةً باستخدام سلاسل الوثائق، README.md، صفحات الويب الثابتة، ...
- غالبًا ما تضيف وحدات جوليا
بعض المطورين يختارون عدم
تصدير
جميع الرموز المطلوبة لاستخدام حزمة/وحدة معينة، ولكن يجب عليهم مع ذلك وضع علامة على الرموز غير المصدرة التي تواجه المستخدمين على أنهاعامة
.- قد يُتوقع من المستخدمين الوصول إلى هذه المكونات عن طريق تأهيل الوظائف/الهياكل/... باسم الحزمة/الوحدة (مثل:
MyModule.run_this_task(...)
).
- قد يُتوقع من المستخدمين الوصول إلى هذه المكونات عن طريق تأهيل الوظائف/الهياكل/... باسم الحزمة/الوحدة (مثل:
Julia ⇔ C/C++: Quick reference
Software Concept | Julia | C/C++ |
---|---|---|
unnamed scope | begin ... end | { ... } |
function scope | function x() ... end | int x() { ... } |
global scope | module MyMod ... end | namespace MyNS { ... } |
software module | A Julia "package" | .h /.hpp files<br>+compiled somelib.a |
assembling<br>software modules | SomePkg.jl : ...<br>import("subfile1.jl") <br>import("subfile2.jl") <br>... | $(AR) *.o ⇒ somelib.a |
import<br>software module | import SomePkg | #include <somelib> <br>+link in somelib.a |
module library | LOAD_PATH[] , *Git repository,<br>**custom package registry | more .h /.hpp files<br>+bigger compiled somebiglib.a |
- The Julia package manager supports registering multiple packages from a single Git repository.<br> * This allows users to house a library of related packages in a single repository.<br> ** Julia registries are primarily designed to provide versioning \& distribution of packages.<br> ** Custom package registries can be used to create a type of module library.
Noteworthy differences from Common Lisp
تستخدم جوليا الفهرسة القائمة على 1 للمصفوفات بشكل افتراضي، ويمكنها أيضًا التعامل مع index offsets.
تشارك الدوال والمتغيرات نفس مساحة الأسماء ("Lisp-1").
هناك نوع
Pair
، لكنه ليس مخصصًا للاستخدام كـCOMMON-LISP:CONS
. يمكن استخدام مجموعات قابلة للتكرار مختلفة بالتبادل في معظم أجزاء اللغة (مثل التمديد، المجموعات، إلخ). تعتبرTuple
s الأقرب إلى قوائم Common Lisp لمجموعات قصيرة من العناصر غير المتجانسة. استخدمNamedTuple
s بدلاً من القوائم المرتبطة. بالنسبة للمجموعات الأكبر من الأنواع المتجانسة، يجب استخدامArray
s وDict
s.تتضمن سير العمل النموذجي لجوليا للتجريب أيضًا التلاعب المستمر بالصورة، والذي يتم تنفيذه باستخدام حزمة Revise.jl.
لأداء أفضل، تفضل جوليا أن تكون العمليات لديها type stability. بينما يقوم Common Lisp بإخفاء العمليات الأساسية عن الآلة، تلتزم جوليا بالاقتراب منها. على سبيل المثال:
القسمة الصحيحة باستخدام
/
دائمًا ما تعيد نتيجة عائمة، حتى لو كانت الحسابات دقيقة.//
دائمًا ما يُرجع نتيجة عقلانية÷
دائمًا ما يُرجع نتيجة صحيحة (مقصوصة)
تدعم الأعداد الكبيرة، لكن التحويل ليس تلقائيًا؛ الأعداد الصحيحة العادية overflow.
الأعداد المركبة مدعومة، ولكن للحصول على نتائج مركبة، you need complex inputs.
هناك أنواع متعددة من الأنواع المركبة والعددية، مع أنواع مكونات مختلفة.
يمكن أن تكون الوحدات (المساحات الاسمية) هرمية.
import
وusing
لهما دور مزدوج: حيث يقومان بتحميل الكود وجعله متاحًا في المساحة الاسمية. من الممكن استخدامimport
لاسم الوحدة فقط (ما يعادل تقريبًاASDF:LOAD-OP
). لا تحتاج أسماء الفتحات إلى أن يتم تصديرها بشكل منفصل. لا يمكن تعيين المتغيرات العالمية من خارج الوحدة (باستثناء استخدامeval(mod, :(var = val))
كوسيلة للهروب).تبدأ الماكروز بـ
@
، وهي ليست مدمجة بسلاسة في اللغة مثل Common Lisp؛ وبالتالي، فإن استخدام الماكروز ليس شائعًا كما هو الحال في الأخيرة. تدعم اللغة شكلًا من أشكال النظافة لـ macros. بسبب اختلاف بناء الجملة السطحي، لا يوجد ما يعادلCOMMON-LISP:&BODY
.جميع الدوال عامة وتستخدم التوزيع المتعدد. لا يتعين أن تتبع قوائم المعاملات نفس القالب، مما يؤدي إلى أسلوب قوي (انظر
do
). يتم التعامل مع المعاملات الاختيارية ومعاملات الكلمات الرئيسية بشكل مختلف. لا يتم حل التداخلات في الطرق كما هو الحال في نظام كائنات Common Lisp، مما يستلزم تعريف طريقة أكثر تحديدًا للتقاطع.الرموز لا تنتمي إلى أي حزمة، ولا تحتوي على أي قيم في حد ذاتها.
M.var
يقيم الرمزvar
في الوحدةM
.يدعم اللغة أسلوب البرمجة الوظيفية بالكامل، بما في ذلك الإغلاقات، ولكنه ليس دائمًا الحل النموذجي لجوليا. قد تكون بعض workarounds ضرورية للأداء عند تعديل المتغيرات الملتقطة.