إطلاق لغة البرمجة جوليا 1.8

يتوفر إصدار لغة البرمجة Julia 1.8، التي تجمع بين صفات مثل الأداء العالي ودعم الكتابة الديناميكية والأدوات المدمجة للبرمجة المتوازية. بناء جملة جوليا قريب من MATLAB، حيث يستعير بعض العناصر من Ruby وLisp. طريقة معالجة السلسلة تذكرنا بـ Perl. يتم توزيع رمز المشروع بموجب ترخيص MIT.

السمات الرئيسية للغة:

  • الأداء العالي: أحد الأهداف الرئيسية للمشروع هو تحقيق أداء قريب من برامج سي. يعتمد برنامج التحويل البرمجي Julia على مشروع LLVM ويقوم بإنشاء رمز آلة أصلية فعال للعديد من الأنظمة الأساسية المستهدفة ؛
  • دعم نماذج البرمجة المختلفة ، بما في ذلك عناصر البرمجة الشيئية والوظيفية. توفر المكتبة القياسية وظائف للإدخال / الإخراج غير المتزامن ، وإدارة العمليات ، والتسجيل ، والتنميط ، وإدارة الحزم ، من بين أشياء أخرى ؛
  • الكتابة الديناميكية: لا تتطلب اللغة تعريفًا واضحًا لأنواع المتغيرات بالقياس مع لغات البرمجة النصية. يدعم الوضع التفاعلي ؛
  • القدرة الاختيارية على تحديد الأنواع صراحة ؛
  • بناء جملة ممتاز للحسابات العددية والحسابات العلمية وأنظمة التعلم الآلي وتصور البيانات. دعم العديد من أنواع البيانات الرقمية والأدوات الخاصة بالتوازي مع العمليات الحسابية.
  • القدرة على استدعاء الوظائف مباشرة من مكتبات C بدون طبقات إضافية.

التغييرات الرئيسية في جوليا 1.8:

  • ميزات اللغة الجديدة
    • يمكن الآن إضافة تعليقات توضيحية إلى حقول البنية القابلة للتغيير كثوابت لمنع تغييرها والسماح بالتحسين.
    • يمكن إضافة التعليقات التوضيحية للنوع إلى المتغيرات العامة.
    • يمكن إنشاء مصفوفات فارغة ذات أبعاد n باستخدام فواصل منقوطة متعددة داخل أقواس مربعة، على سبيل المثال "[؛؛؛]" ينشئ مصفوفة 0x0x0.
    • يمكن أن تحتوي كتل المحاولة الآن بشكل اختياري على كتلة أخرى، والتي يتم تنفيذها مباشرة بعد النص الرئيسي إذا لم يتم طرح أي أخطاء.
    • يمكن وضع @inline وnoinline داخل نص الوظيفة، مما يسمح لك بالتعليق على وظيفة مجهولة.
    • يمكن الآن تطبيق @inline وnoinline على وظيفة في موقع اتصال أو حظر لفرض تضمين استدعاءات الوظائف المقابلة (أو عدم تضمينها).
    • يُسمح بـ ∀ و ∃ و ∄ كأحرف معرفية.
    • دعم إضافي لمواصفات Unicode 14.0.0.
    • يمكن استخدام الأسلوب Module(:name, false, false) لإنشاء وحدة نمطية لا تحتوي على أسماء، ولا تستورد Base أو Core، ولا تحتوي على مرجع لنفسها.
  • تغيرات اللغة
    • كائنات المهام التي تم إنشاؤها حديثًا (@spawn، @async، وما إلى ذلك) تتمتع الآن بعمر عالمي للأساليب من المهمة الأصلية عند إنشائها، مما يسمح بالتنفيذ الأمثل. يتوفر خيار التنشيط السابق باستخدام طريقة Base.invocatetest.
    • توجيهات التنسيق ثنائية الاتجاه غير المتوازنة لـ Unicode محظورة الآن في السلاسل والتعليقات لتجنب الحقن.
    • يتم تعريف Base.ifelse الآن على أنها دالة عامة وليست مدمجة، مما يسمح للحزم بتوسيع تعريفها.
    • كل تعيين لمتغير عام يمر الآن أولاً باستدعاء تحويل (Any, x) أو تحويل (T, x) إذا تم الإعلان عن أن المتغير العام من النوع T. قبل استخدام المتغيرات العامة، تأكد من أن التحويل الثابت (Any , x) === x دائمًا صحيح، وإلا فقد يؤدي إلى سلوك غير متوقع.
    • أصبحت الوظائف المضمنة الآن مشابهة للوظائف العامة ويمكن تعدادها برمجيًا باستخدام الطرق.
  • المترجم / تحسينات وقت التشغيل
    • تم تقليل وقت التمهيد بنسبة 25% تقريبًا.
    • تم فصل المترجم المعتمد على LLVM عن مكتبة وقت التشغيل إلى مكتبة جديدة، libjulia-codegen. يتم تحميله بشكل افتراضي، لذلك يجب ألا يكون هناك أي تغييرات أثناء الاستخدام العادي. في عمليات النشر التي لا تحتاج إلى مترجم (على سبيل المثال، صور النظام التي يتم فيها ترجمة جميع التعليمات البرمجية الضرورية مسبقًا)، يمكن ببساطة حذف هذه المكتبة (وتبعيات LLVM الخاصة بها).
    • أصبح الآن استنتاج النوع الشرطي ممكنًا عن طريق تمرير وسيطة إلى إحدى الطرق. على سبيل المثال، بالنسبة إلى Base.ifelse(isa(x, Int), x, 0) تُرجع ::Int حتى إذا كان نوع x غير معروف.
    • تم تحسين SROA (الاستبدال العددي للمجاميع): يزيل مكالمات getfield ذات الحقول العالمية المستمرة، ويزيل الهياكل القابلة للتغيير مع الحقول غير المهيأة، ويحسن الأداء والتعامل مع مكالمات getfield المتداخلة.
    • يتتبع استنتاج الكتابة التأثيرات المختلفة — الآثار الجانبية وعدم الإسقاط. يتم أخذ النشر المستمر في الاعتبار، مما يؤدي إلى تحسين أداء وقت الترجمة بشكل ملحوظ. في بعض الحالات، على سبيل المثال، سيتم تجاهل استدعاءات الوظائف التي لا يمكن تضمينها ولكنها لا تؤثر على النتيجة في وقت التشغيل. يمكن الكتابة فوق قواعد التأثيرات يدويًا باستخدام الماكرو Base.@assume_effacts.
    • الترجمة المسبقة (مع توجيهات الترجمة المسبقة الصريحة أو أعباء العمل المحددة) توفر الآن المزيد من التعليمات البرمجية المحددة من النوع، مما يؤدي إلى تنفيذ أسرع لأول مرة. يمكن الآن تخزين أي مجموعات جديدة من الأساليب/الأنواع التي تحتاجها الحزمة الخاصة بك، بغض النظر عن مكان تعريف هذه الأساليب، مؤقتًا في ملف الترجمة المسبقة إذا تم استدعاؤها بواسطة طريقة تنتمي إلى الحزمة الخاصة بك.
  • تغيير معلمة سطر الأوامر
    • السلوك الافتراضي لمراقبة إعلانات @inbounds هو الآن الخيار التلقائي في "--check-bounds=yes|no|auto".
    • خيار "--strip-metadata" الجديد لإزالة سلاسل المستندات ومعلومات موقع المصدر وأسماء المتغيرات المحلية عند إنشاء صورة النظام.
    • خيار جديد "--strip-ir" للسماح للمترجم بإزالة تمثيل كود المصدر الوسيط عند إنشاء صورة النظام. لن تعمل الصورة الناتجة إلا إذا تم استخدام "--compile=all" أو إذا تم تجميع كافة التعليمات البرمجية المطلوبة مسبقًا.
    • إذا تم تحديد الحرف "-" بدلاً من اسم الملف، فسيتم قراءة التعليمات البرمجية القابلة للتنفيذ من دفق الإدخال القياسي.
  • تغييرات دعم مؤشرات الترابط المتعددة
    • تستخدم Threads.@threads بشكل افتراضي خيار الجدولة الجديد:dynamic، والذي يختلف عن الوضع السابق حيث ستتم جدولة التكرارات ديناميكيًا عبر سلاسل العمليات العاملة المتوفرة بدلاً من تعيينها لكل مؤشر ترابط. يسمح هذا الوضع بتوزيع الحلقات المتداخلة بشكل أفضل باستخدام @spawn و@threads.
  • وظائف المكتبة الجديدة
    • everysplit(str) لتنفيذ الانقسام (str) عدة مرات.
    • allequal(itr) لاختبار ما إذا كانت جميع العناصر في المكرر متساوية.
    • يمكن استخدام الرابط الثابت (src، dst) لإنشاء روابط ثابتة.
    • setcpuaffinity(cmd, cpus) لتعيين تقارب قلب المعالج للعمليات التي تم إطلاقها.
    • diskstat(path=pwd()) للحصول على إحصائيات القرص.
    • ماكرو @showtime جديد لعرض كل من الخط الذي يتم تقييمه وتقرير @time.
    • تمت إضافة LazyString والماكرو "str" ​​البطيء لدعم الإنشاء البطيء لرسائل الخطأ في مسارات الخطأ.
    • تم إصلاح مشكلة التزامن في Dict والكائنات المشتقة الأخرى مثل المفاتيح(::Dict) والقيم(::Dict) وSet. يمكن الآن استدعاء أساليب التكرار على قاموس أو مجموعة، طالما لا توجد استدعاءات لتعديل القاموس أو المجموعة.
    • لدى @time و@timev الآن وصف اختياري، مما يسمح لك بتعليق مصدر تقارير الوقت، على سبيل المثال. @ الوقت "تقييم foo" foo ().
    • يأخذ range إما التوقف أو الطول كوسيطة الكلمة الرئيسية الوحيدة.
    • الدقة وsetprecision تقبلان الآن القاعدة ككلمة رئيسية
    • توفر كائنات مأخذ توصيل TCP الآن طريقة كتابة قريبة وتدعم استخدام الوضع نصف المفتوح.
    • يقبل extrema الآن وسيطة init.
    • يقبل Iterators.countfrom الآن أي نوع يحدد طريقة +.
    • يخصص @time الآن النسبة المئوية للوقت المستغرق في إعادة ترجمة الأساليب باستخدام الأنواع المتغيرة.
  • تغييرات المكتبة القياسية
    • المفاتيح ذات القيمة لا تتم الآن إزالة أي شيء من البيئة في addenv.
    • Iterators.reverse (وبالتالي الأخير) يدعم كل سطر.
    • لم تعد وظيفة الطول لنطاقات من أنواع معينة تتحقق من تجاوز عدد صحيح. تتوفر وظيفة جديدة، check_length، وهي تحتوي على منطق التحكم في نقل البتات. إذا لزم الأمر، استخدم SaferIntegers.jl لإنشاء نوع النطاق.
    • يقوم المكرر Iterators.Reverse بتنفيذ كل انعكاس للفهرس إن أمكن.
  • مدير مجموعة
    • مؤشرات ⌃ و⌅ جديدة بجوار الحزم في حالة "pkg>" والتي تتوفر لها إصدارات جديدة. ⌅ يشير إلى أنه لا يمكن تثبيت الإصدارات الجديدة.
    • وسيطة قديمة جديدة::Bool إلى Pkg.status (--outdated أو -o في وضع REPL) لعرض معلومات حول الحزم من الإصدارات السابقة.
    • وسيطة compat::Bool الجديدة إلى Pkg.status (--compat أو -c في وضع REPL) لإظهار أي إدخالات [compat] في Project.toml.
    • وضع "pkg>compat" (وPkg.compat) الجديد لإعداد إدخالات توافق المشروع. يوفر محررًا تفاعليًا عبر "pkg>compat" أو التحكم المباشر في السجل عبر "pkg>Foo 0.4,0.5"، والذي يمكنه تحميل السجلات الحالية عبر إكمال علامة التبويب. وهذا يعني أن "pkg> compat Fo " يتم تحديثه تلقائيًا إلى "pkg>Foo 0.4,0.5" للسماح بتحرير الإدخال الموجود.
    • يحاول Pkg الآن تنزيل الحزم من خادم الحزمة فقط إذا كان الخادم يراقب السجل الذي يحتوي على الحزمة.
    • سيُصدر Pkg.insantiate الآن تحذيرًا عندما يكون Project.toml غير متزامن مع Manifest.toml. يقوم بذلك بناءً على تجزئة سجلات المشروع والسجلات المتوافقة (يتم تجاهل الحقول الأخرى) في البيان عند حلها، بحيث يمكن اكتشاف أي تغيير في سجلات Project.toml أو السجلات المتوافقة دون إعادة الحل.
    • إذا لم يتمكن "pkg>add" من العثور على حزمة بالاسم المحدد، فسوف يقترح الآن حزمًا ذات أسماء مشابهة يمكن إضافتها.
    • لم تعد نسخة julia المخزنة في البيان تتضمن رقم الإصدار، مما يعني أنه سيتم الآن كتابة الملف الرئيسي كـ 1.9.0-DEV.
    • سيتم الآن اكتشاف إحباط الاختبار "pkg>" بشكل أكثر اتساقًا، وسيتم إعادته بشكل صحيح إلى REPL.
  • InteractiveUtils
    • ماكرو @time_imports جديد للإبلاغ عن الوقت المستغرق في استيراد الحزم وتبعياتها، مع تسليط الضوء على وقت الترجمة وإعادة الترجمة كنسبة مئوية من الواردات.
  • الجبر الخطي
    • تدعم الوحدة الفرعية BLAS الآن وظائف المستوى 2 BLAS spr!.
    • أصبحت مكتبة LinearAlgebra.jl القياسية الآن مستقلة تمامًا عن SparseArrays.jl، سواء من خلال الكود المصدري أو من منظور اختبار الوحدة. ونتيجة لذلك، لم يعد يتم إرجاع المصفوفات المتفرقة (ضمنيًا) من خلال أساليب من LinearAlgebra المطبقة على كائنات Base أو LinearAlgebra. على وجه الخصوص، يؤدي هذا إلى التغييرات العاجلة التالية:
      • التسلسلات التي تستخدم مصفوفات "متفرقة" خاصة (على سبيل المثال، قطرية) تُرجع الآن مصفوفات كثيفة؛ ونتيجة لذلك، فإن الحقول D1 وD2 لكائنات SVD التي تم إنشاؤها بواسطة استدعاءات getproperty أصبحت الآن مصفوفات كثيفة.
      • تقوم الطريقة المماثلة(::SpecialSparseMatrix,:Type,::Dims) بإرجاع مصفوفة فارغة كثيفة. ونتيجة لذلك، فإن منتجات المصفوفات الثنائية والثلاثية والمتماثلة مع بعضها البعض تؤدي إلى توليد مصفوفة كثيفة. بالإضافة إلى ذلك، يفشل الآن إنشاء مصفوفات مماثلة بثلاث وسيطات من مصفوفات "متفرقة" خاصة من مصفوفات (غير ثابتة) بسبب "zero(::Type{Matrix{T}})".
  • برنتف
    • يستخدم %s و%c الآن وسيطة عرض النص لتنسيق العرض.
  • ملفي الشخصي
    • يقوم الآن ملف تعريف تحميل وحدة المعالجة المركزية بتسجيل البيانات التعريفية بما في ذلك المواضيع والمهام. يحتوي Profile.print() على وسيطة تجميع جديدة تسمح لك بتجميع المواضيع والمهام أو المواضيع الفرعية/المهام والمهام/سلاسل الرسائل والخيوط ووسائط المهام لتوفير التصفية. بالإضافة إلى ذلك، يتم الآن الإبلاغ عن النسبة المئوية للاستخدام إما كمؤشر إجمالي أو لكل مؤشر ترابط، اعتمادًا على ما إذا كان مؤشر الترابط خاملاً أم لا في كل عينة. يتضمن Profile.fetch() البيانات الوصفية الجديدة افتراضيًا. للتوافق مع الإصدارات السابقة مع المستهلكين الخارجيين لبيانات ملفات التعريف، يمكن استبعادها عن طريق تمرير include_meta=false.
    • تسمح لك الوحدة النمطية Profile.Allocs الجديدة بتخصيص تخصيصات الذاكرة. يتم تسجيل تتبع المكدس لنوع وحجم كل تخصيص للذاكرة، وتسمح الوسيطة Sample_rate بتخطي عدد قابل للتكوين من التخصيصات، مما يقلل من حمل الأداء.
    • يمكن الآن للمستخدم تشغيل ملفات تعريف وحدة المعالجة المركزية ذات المدة الثابتة أثناء تشغيل المهام دون تحميل ملف التعريف أولاً، وسيتم عرض التقرير أثناء التشغيل. في نظامي التشغيل MacOS وFreeBSD، اضغط على ctrl-t أو اتصل بـ SIGINFO. بالنسبة للمنصات الأخرى، قم بتفعيل SIGUSR1، أي. % قتل -USR1 $julia_pid. وهذا غير متوفر على نظام التشغيل Windows.
  • ردل
    • يدعم RadioMenu الآن اختصارات لوحة المفاتيح الإضافية للاختيار المباشر للخيارات.
    • يعرض التسلسل "?(x, y" متبوعًا بالضغط على TAB كافة الأساليب التي يمكن استدعاؤها باستخدام الوسائط x, y, .... (تمنعك المسافة البادئة من الدخول إلى وضع المساعدة.) "MyModule.?(x, y " يقيد البحث على "MyModule". يتطلب الضغط على TAB أن تكون وسيطة واحدة على الأقل من نوع أكثر تحديدًا من أي نوع. أو استخدم SHIFT-TAB بدلاً من TAB للسماح بأي طرق متوافقة.
    • يتيح لك المتغير العام الجديد err الحصول على أحدث استثناء، على غرار سلوك ans مع الاستجابة الأخيرة. يؤدي إدخال خطأ إلى إعادة طباعة معلومات الاستثناء.
  • المصفوفات المتفرقة
    • تم نقل كود SparseArrays من مستودع Julia إلى مستودع SparseArrays.jl الخارجي.
    • تقوم وظائف التسلسل الجديدة، sparse_hcat، وsparse_vcat، وsparse_hvcat بإرجاع نوع SparseMatrixCSC بغض النظر عن أنواع وسيطات الإدخال. وأصبح ذلك ضروريًا لتوحيد آلية لصق المصفوفات بعد فصل كود LinearAlgebra.jl وSparseArrays.jl.
  • تسجيل
    • يتم الآن تصدير مستويات التسجيل القياسية belowMinLevel وDebug وInfo وWarn وError وAboveMaxLevel من مكتبة التسجيل القياسية.
  • يونيكود
    • تمت إضافة دالة isequal_normalized للتحقق من تكافؤ Unicode دون إنشاء سلاسل تمت تسويتها بشكل صريح.
    • تقبل الدالة Unicode.normalize الآن الكلمة الأساسية Charttransform، والتي يمكن استخدامها لتوفير تعيينات أحرف مخصصة، كما يتم توفير الدالة Unicode.julia_chartransform أيضًا لإعادة إنتاج التعيين المستخدم عندما يقوم المحلل اللغوي Julia بتسوية المعرفات.
  • اختبار
    • يمكن الآن استخدام '@test_throws "بعض الرسائل" مشغلات_خطأ ()' لاختبار ما إذا كان نص الخطأ المعروض يحتوي على خطأ "بعض الرسائل"، بغض النظر عن نوع الاستثناء المحدد. يتم أيضًا دعم التعبيرات العادية وقوائم السلاسل والوظائف المطابقة.
    • يمكن الآن استخدام @testset foo() لإنشاء مجموعة اختبار من دالة معينة. اسم حالة الاختبار هو اسم الوظيفة التي يتم استدعاؤها. قد تحتوي الوظيفة المطلوبة على @test وتعريفات @testset الأخرى، بما في ذلك المكالمات إلى وظائف أخرى، أثناء تسجيل جميع نتائج الاختبار المتوسطة.
    • يتم الآن تصدير TestLogger وLogRecord من مكتبة الاختبار القياسية.
  • وزعت
    • يدعم SSHManager الآن سلاسل العمليات العاملة باستخدام غلاف csh/tcsh عبر طريقة addprocs() والمعلمة shell=:csh.
  • تغييرات أخرى
    • يمكن استخدام GC.enable_logging(true) لتسجيل كل عملية جمع البيانات المهملة مع تحديد الوقت وحجم الذاكرة المجمعة.

المصدر: opennet.ru

إضافة تعليق