تم نشر إصدار لغة البرمجة Julia 1.9 ، التي تجمع بين صفات مثل الأداء العالي ودعم الكتابة الديناميكية والأدوات المدمجة للبرمجة المتوازية. صيغة جوليا قريبة من MATLAB ، مع بعض العناصر المستعارة من Ruby و Lisp. طريقة التلاعب بالسلسلة تذكرنا بلغة بيرل. يتم توزيع كود المشروع بموجب ترخيص معهد ماساتشوستس للتكنولوجيا.
السمات الرئيسية للغة:
- الأداء العالي: أحد الأهداف الرئيسية للمشروع هو تحقيق أداء قريب من برامج سي. يعتمد برنامج التحويل البرمجي Julia على مشروع LLVM ويقوم بإنشاء رمز آلة أصلية فعال للعديد من الأنظمة الأساسية المستهدفة ؛
- دعم نماذج البرمجة المختلفة ، بما في ذلك عناصر البرمجة الشيئية والوظيفية. توفر المكتبة القياسية وظائف للإدخال / الإخراج غير المتزامن ، وإدارة العمليات ، والتسجيل ، والتنميط ، وإدارة الحزم ، من بين أشياء أخرى ؛
- الكتابة الديناميكية: لا تتطلب اللغة تعريفًا واضحًا لأنواع المتغيرات بالقياس مع لغات البرمجة النصية. يدعم الوضع التفاعلي ؛
- القدرة الاختيارية على تحديد الأنواع صراحة ؛
- بناء جملة ممتاز للحسابات العددية والحسابات العلمية وأنظمة التعلم الآلي وتصور البيانات. دعم العديد من أنواع البيانات الرقمية والأدوات الخاصة بالتوازي مع العمليات الحسابية.
- القدرة على استدعاء الوظائف مباشرة من مكتبات C بدون طبقات إضافية.
التغييرات الرئيسية في Julia 1.9:
- ميزات اللغة الجديدة
- اسمح بإجراء التخصيصات في وحدة نمطية أخرى باستخدام "setproperty! (:: Module، :: Symbol، x)".
- يُسمح بمهمة متعددة ليست في الموضع النهائي. على سبيل المثال ، ستتم معالجة السلسلة "أ ، ب ... ، ج = 1 ، 2 ، 3 ، 4" على أنها "أ = 1 ؛ ب ... ، = 2 ، 3 ؛ ج = 4 ". يتم التعامل مع هذا عبر Base.split_rest.
- تدعم القيم الحرفية للحرف الفردي الآن نفس بناء الجملة مثل السلاسل الحرفية ؛ أولئك. يمكن أن يمثل بناء الجملة تسلسلات UTF-8 غير صالحة ، كما يسمح به نوع Char.
- دعم إضافي لمواصفات Unicode 15.
- يمكن الآن استخدام مجموعات متداخلة من المجموعات والمجموعة المسماة من الأحرف كمعلمات كتابة.
- وظائف مدمجة جديدة "getglobal (:: Module، :: Symbol [، order])" و "setglobal! (:: Module، :: Symbol، x [، order])" للقراءة والكتابة حصريًا للمتغيرات العامة. يجب الآن تفضيل طريقة getglobal على طريقة getfield للوصول إلى المتغيرات العامة.
- تغيرات اللغة
- يتم الآن تصدير الماكرو "invoke" المقدم في الإصدار 1.7 ومتاح للاستخدام. أيضًا ، يستخدم الآن طريقة "Core.Typeof (x)" بدلاً من "Any" عندما يتم حذف التعليق التوضيحي للنوع للوسيطة "x". يعد هذا ضروريًا حتى تتم معالجة الأنواع التي تم تمريرها كوسيطات بشكل صحيح.
- تم تمكين تصدير وظيفة "invokelatest" و "invokelatest" في الإصدار 1.7.
- المترجم / تحسينات وقت التشغيل
- تقليل وقت التنفيذ الأول بشكل كبير (TTFX - الوقت حتى أول تنفيذ). يحفظ التجميع المسبق للحزمة الآن الكود الأصلي في "pkgimage" ، مما يعني أن الشفرة التي تم إنشاؤها أثناء التجميع المسبق لن تحتاج إلى إعادة تجميعها بعد تحميل الحزمة. يمكن تعطيل استخدام وضع pkgimages باستخدام الخيار "--pkgimages = no".
- تم إصلاح المشكلة المعروفة للتعقيد التربيعي لاستدلال النوع ، وبشكل عام يستخدم الاستدلال ذاكرة أقل. يتم تجميع بعض حالات الحافة ذات الوظائف الطويلة التي يتم إنشاؤها تلقائيًا (مثل ModelingToolkit.jl مع المعادلات التفاضلية الجزئية والنماذج السببية الكبيرة) بشكل أسرع.
- يمكن الآن أن تكون المكالمات التي تحتوي على وسيطات غير خاصة بالنوع مُحسّنة لتقسيم الاتحاد للحقن أو الدقة الثابتة ، حتى إذا كانت هناك عدة أنواع مختلفة من مرشحي الإرسال. يمكن أن يؤدي ذلك إلى تحسين الأداء في مواقف معينة حيث لا يتم حل أنواع الكائنات بشكل ثابت بشكل كامل ، عن طريق الحل الثابت لمواقع الاتصال "@ nospecialize-d" وتجنب إعادة الترجمة.
- تم استبدال كافة استخدامات الماكرو @pure في الوحدة النمطية Base بـ Base.@assume_effets.
- لم تعد الاستدعاءات لاستدعاء (f ، invokesig ، args ...) بأنواع أقل تحديدًا من تلك المستخدمة عادةً لـ f (args ...) تتسبب في إعادة تجميع الحزمة.
- تغيير معلمة سطر الأوامر
- في نظامي Linux و Windows ، يحاول الخيار "--threads = auto" الآن تحديد العدد المتاح من المعالجات بناءً على تقارب وحدة المعالجة المركزية ، وهو قناع يتم تعيينه عادةً في HPC والبيئات السحابية.
- تم تعطيل الخيار "--math-mode = fast" ، وبدلاً من ذلك يوصى باستخدام الماكرو "fastmath" ، الذي يحتوي على دلالات محددة جيدًا.
- المعلمة "--threads" لها الآن التنسيق "auto | N [، auto | M] "، حيث يحدد M عدد سلاسل الرسائل التفاعلية التي سيتم إنشاؤها (الوسائل التلقائية حاليًا 1).
- خيار مضاف "- heap-size-hint = "، والذي يحدد الحد الذي يبدأ بعده جمع البيانات المهملة النشط. يمكن تحديد الحجم بالبايت أو الكيلو بايت (1000 كيلوبايت) أو الميجابايت (300 ميجابايت) أو الجيجابايت (1,5 جيجابايت).
- تعدد التغييرات
- يحتوي "Threads.@spawn" الآن على وسيطة أولى اختيارية بالقيمة ":default" أو ":interactive". تتطلب المهمة التفاعلية زمن استجابة منخفضًا وهي مصممة لتكون قصيرة أو يتم تنفيذها بشكل متكرر. سيتم تشغيل المهام التفاعلية على سلاسل الرسائل التفاعلية إذا تم تحديدها عند بدء تشغيل Julia.
- الخيوط التي تم إطلاقها خارج وقت تشغيل Julia (على سبيل المثال ، من C أو Java) يمكنها الآن استدعاء رمز Julia باستخدام "jl_adopt_thread". يحدث هذا تلقائيًا عند إدخال رمز Julia من خلال "cfunction" أو نقطة الدخول "ccallable". نتيجة لذلك ، يمكن الآن تغيير عدد سلاسل الرسائل في وقت التشغيل.
- وظائف المكتبة الجديدة
- وظيفة "Iterators.flatmap" الجديدة.
- وظيفة "pkgversion (m :: Module)" الجديدة للحصول على نسخة الحزمة التي حملت وحدة معينة ، على غرار "pkgdir (m :: Module)".
- وظيفة "المكدس (x)" الجديدة التي تعمم "تقليل (hcat، x :: Vector {<: Vector})" إلى أي بُعد وتسمح بأي مكرر للمكررات. طريقة "المكدس (f ، x)" تعمم "mapreduce (f ، hcat ، x)" وهي أكثر كفاءة.
- ماكرو جديد لتحليل الذاكرة المخصصة "allocations" ، على غرار "allocated" ، باستثناء أنه يُرجع عدد عمليات تخصيص الذاكرة ، وليس الحجم الإجمالي للذاكرة المخصصة.
- الميزات الجديدة للمكتبة
- يعمل "RoundFromZero" الآن مع أنواع أخرى غير "BigFloat".
- يمكن الآن تصغير "Dict" يدويًا باستخدام "sizehint!".
- يشير الآن "time" بشكل منفصل إلى النسبة المئوية للوقت المنقضي في إعادة تجميع الطرق غير الصالحة.
- التغييرات في المكتبة القياسية
- تم إصلاح مشكلة التزامن في طرق التكرار لـ Dict والكائنات المشتقة الأخرى مثل المفاتيح (:: Dict) والقيم (:: Dict) والمجموعة. يمكن الآن استدعاء طرق التكرار هذه على Dict أو Set بالتوازي على عدد غير محدود من سلاسل الرسائل ، طالما لا توجد إجراءات لتعديل القاموس أو المجموعة.
- يؤدي نفي الدالة الأصلية "! f" الآن إلى إرجاع دالة مركبة "(!) ∘ f" بدلاً من دالة مجهولة.
- تعمل وظائف شريحة البعد الآن عبر أبعاد متعددة: "كل شريحة" ، و "كل شريحة" ، و "كل مجموعة" ترجع كائن "شرائح" الذي يسمح بالإرسال لتوفير أساليب أكثر كفاءة.
- تمت إضافة ماكرو "kwdef" إلى واجهة برمجة التطبيقات العامة.
- تم إصلاح مشكلة ترتيب العمليات في "fld1".
- أصبح الفرز الآن دائمًا مستقرًا للوقت (تم إعادة تصميم QuickSort).
- يتم الآن تصدير "Base.splat". قيمة الإرجاع من النوع "Base.Splat" بدلاً من دالة مجهولة ، مما يسمح بالاستدلال عليها بشكل جيد.
- مدير مجموعة
- "ملحقات الحزمة": دعم لتحميل مقتطف رمز من حزم أخرى تم تحميلها في جلسة Julia. التطبيق مشابه لحزمة "يتطلب.jl" ، لكن الترجمة المسبقة وتوافق التكوين مدعومان.
- مكتبة الجبر الخطي
- نظرًا لخطر الالتباس مع القسمة الأولية ، تمت إزالة الطرق "a / b" و "b \ a" ذات العددية "a" والمتجه "b" ، والتي كانت تعادل "a * pinv (b)".
- تستخدم مكالمات BLAS و LAPACK الآن "libblastrampoline (LBT)". يتم توفير OpenBLAS افتراضيًا ، ولكن إنشاء صورة نظام باستخدام مكتبات BLAS / LAPACK أخرى غير مدعوم. بدلاً من ذلك ، يوصى باستخدام آلية LBT لاستبدال BLAS / LAPACK بمجموعة أخرى متاحة من المكتبات.
- تدعم "lu" إستراتيجية دوران المصفوفة الجديدة "RowNonZero ()" ، والتي تحدد أول عنصر دوران غير صفري للاستخدام مع الأنواع الحسابية الجديدة وللأغراض التعليمية.
- تدعم "normalize (x، p = 2)" الآن أي مسافة متجهية "x" ، بما في ذلك الحجميات.
- العدد الافتراضي لسلاسل BLAS يساوي الآن عدد خيوط وحدة المعالجة المركزية في بنية ARM ونصف عدد سلاسل عمليات وحدة المعالجة المركزية في البنى الأخرى.
- Printf: تمت إعادة صياغة رسائل الخطأ للسلاسل المشوهة لتحسين إمكانية القراءة.
- الملف الشخصي: وظيفة جديدة "Profile.take_heap_snapshot (ملف)" تلتقط ملفًا بتنسيق ".heapsnapshot" المستند إلى JSON والمدعوم من Chrome.
- Random: يعمل randn و randexp الآن مع أي نوع AbstractFloat يحدد rand.
- ردل
- يؤدي الضغط على مجموعة المفاتيح "Alt-e" إلى فتح الإدخال الحالي في المحرر. سيتم تنفيذ المحتوى (إذا تم تغييره) عند خروج المحرر.
- يمكن تغيير سياق الوحدة النمطية الحالي النشط في REPL (افتراضيًا يكون رئيسيًا) باستخدام وظيفة "REPL.activate (:: Module)" أو عن طريق إدخال الوحدة النمطية في REPL والضغط على مفتاح "Alt-m" مزيج.
- يمكن تنشيط وضع "الموجه المرقّم" ، الذي يطبع الأرقام لكل إدخال ومخرج ويخزن النتائج المقيمة في Out ، باستخدام "REPL.numbered_prompt! ()".
- يعرض إكمال علامة التبويب وسيطات الكلمات الأساسية المتاحة.
- SuiteSparse: تم نقل رمز حلال "SuiteSparse" إلى "SparseArrays.jl". يتم الآن إعادة تصدير الحلول بواسطة "SuiteSparse.jl".
- المصفوفات المتفرقة
- تتوفر الآن أدوات حل SuiteSparse كوحدات فرعية من SparseArrays.
- تم تحسين أوضاع حماية تدفق UMFPACK و CHOLMOD من خلال التخلص من المتغيرات العالمية واستخدام الأقفال. متعدد مؤشرات الترابط "ldiv!" يمكن الآن تنفيذ كائنات UMFPACK بأمان.
- تسمح لك الوظيفة التجريبية "SparseArrays.allowscalar (:: Bool)" بتعطيل أو تمكين الفهرسة العددية للمصفوفات المتفرقة. تم تصميم هذه الوظيفة لاكتشاف الفهرسة العددية العشوائية لكائنات "SparseMatrixCSC" ، والتي تعد مصدرًا شائعًا لمشاكل الأداء.
- وضع تجاوز الفشل الجديد لمجموعات الاختبار الذي ينهي التشغيل التجريبي مبكرًا في حالة حدوث فشل أو خطأ. قم بتعيين إما عبر "testset kwarg failfast = true" أو "تصدير JULIA_TEST_FAILFAST = true". قد يكون هذا ضروريًا في عمليات إطلاق CI لتلقي رسائل خطأ مبكرة.
- التواريخ: لم تعد السلاسل الفارغة يتم تحليلها بشكل غير صحيح على أنها قيم صالحة "DateTime" أو "Dates" أو "Times" وبدلاً من ذلك تلقي خطأ "ArgumentError" في المنشئات والتحليل ، بينما لا تُرجع "tryparse" شيئًا.
- الحزمة الموزعة
- يتم الآن نشر تكوين الحزمة (مشروع نشط ، "LOAD_PATH" ، "DEPOT_PATH") عند إضافة عمليات عاملة محلية (على سبيل المثال مع "addprocs (N :: Int)" أو مع علامة سطر الأوامر "-procs = N").
- تأخذ "addprocs" لعمليات العمال المحليين الآن وسيطة تسمى "env" لتمرير متغيرات البيئة إلى العمليات العاملة.
- Unicode: "graphemes (s، m: n)" ترجع السلسلة الفرعية من mth إلى nth graphemes في "s".
- تمت إزالة حزمة DelimitedFiles من مكتبات النظام ويتم توزيعها الآن كحزمة منفصلة يجب تثبيتها بشكل صريح لاستخدامها.
- التبعيات الخارجية
- يكتشف Linux تلقائيًا إصدار مكتبة النظام libstdc ++ ويقوم بتحميله إذا كان أحدث. يمكن استعادة السلوك القديم لتحميل libstdc ++ المدمج بغض النظر عن إصدار النظام عن طريق تعيين متغير البيئة "JULIA_PROBE_LIBSTDCXX = 0".
- تمت إزالة "RPATH" من ملف julia الثنائي ، والذي يمكن أن يكسر المكتبات على Linux التي تفشل في تحديد متغير "RUNPATH".
- تحسينات الأداة: ناتج "MethodError" وطرق (على سبيل المثال ، من "methods (my_func)") يتم تنسيقه وتلوينه وفقًا لكيفية إخراج الأساليب في تتبعات المكدس.
المصدر: opennet.ru