كلوجر (لغة برمجة): الفرق بين النسختين

من ويكيبيديا، الموسوعة الحرة
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب' {{Infobox programming language | name = Clojure | logo = 100px | paradigm = functional, [[multi-paradigm programming...')
(لا فرق)

نسخة 19:07، 20 مايو 2011

Clojure
معلومات عامة
التصنيف
التنميط
ظهرت في
صممها
المنصة
الرخصة
التطوير
المطور
الإصدار الأول
الإصدار الأخير
المستودع
التأثير
مشتقة من
متأثرة بـ
متفرقات
امتدادات الملفات
 Incomplete list.svg القائمة ...
clj — cljs — cljc — edn — cljr عدل القيمة على Wikidata
موقع الويب


كلوچر[3] هي لهجة حديثة من ليسب لغة برمجة. وهي لغة عامة الهدف تدعم التطور التفاعلي الذي يُشجع أسلوب برمجة وظيفية و يُبسّط برمجة خيط (حاسوب) تعمل لغة كلوچر علي آلة جافا الافتراضية و وقت تشغيل اللغة المشترك. ومثل لغات ليسب فإن لغة كلوچر تعتبر الشفيرات كبيانات ولها نظام ماكرو معقد.


الفلسفة

وضع (ريتش هيكي) لغة كلوچر لأنه أراد لغة ليسب حديثة للـ برمجة وظيفية تتوافق مع جافا (منصة برمجية) وتم تصميمها لتحقيق التزامن.[4][5]

يتسم أسلوب لغة كلوچر في تحقيق التزامن بمفهوم الهويات,[6] الذي يُمثل سلسلة من الحالات الثابتة مع مرور الوقت. وبما أن الحالات قيم ثابتة لا تتغير فيمكن أن يعمل عليها أي عدد من العاملين في نفس الوقت ويُصبح التزامن مسألة إدارة التغيرات من حالة إلي أخري. لهذا الغرض تتيح لغة كلوچر العديد من أنواع المراجع المتغيرة لكل منها معاني محددة جيدا للانتقال بين الحالات.

البنية

مثل غيرها من لغات ليسب فإن بنية اللغة كلوچر قائمة علي اللغات الرمزية S-expressions التي يتم تحليلها أولا إلي هياكل بيانات بواسطة قارئ قبل تجميعها. يدعم قارئ لغة كلوچر البنية النصية للخرائط والمجموعات والمتجهات بالإضافة إلي القوائم. ثم يتم إعطاء كل ذلك إلي المُجمع كما هي. بمعني آخر لا يقوم جامع لغة كلوچر بجمع هياكل البيانات فقط ولكنه يدعم كل الأنواع المذكورة مباشرة. لغة كلوچر هي لغة ليسب-1 وليس المقصود منها أن تتوافق من ناحية الشفرة مع لهجات ليسب الأخري.

الماكرو

ماكرو لغة كلوچر يشبه كثيرا الماكرو الخاص بلغة ليسب العادية ماعدا أن في لغة كلوچر فإن الفاصلة العليا المائلة (التي تسمي الفاصلة البنائية تصف الرموز بحيزها الإسمي. يساعد ذلك علي منع إتخاذ الأسماء غير المقصودة كإرتباط بالأسماء المؤهل حيزها الاسمي . من الممكن إجبار حصر بيانات إمتداد الماكرو ولكن يجب أن يتم ذلك بوضوح. كما أن لغة كلوچر لا تسمح بإعادة إرتباط الأسماء العالمية في حيز اسمي آخر تم استيراد بياناته إلي الحيز الاسمي الحالي.

السمات اللغوية

  • لغة تجميع ينتج عنها شفرة ثمانية لـ آلة جافا الافتراضية
    • تكامل وثيق مع جافا (لغة برمجة) : من خلال جمعها في آلة جافا الافتراضية و شفرة ثمانية, يمكن ربط تطبيقات لغة كلوچر بسهولة واستخدامها في آلة جافا الافتراضية وخوادم التطبيقات بدون إضافة تعقيد. كما تقدم اللغة وحدات ماكرو تجعل من السهل استخدام واجهة برمجة تطبيقات الجافا الموجودة. جميع هياكل بيانات لغة كلوچرتطبق واجهات جافا موحدة مما يجعل من السهل تشغيل شفرة تم تنفيذها في لغة كلوچر من جافا.
  • تطوير تفاعلي لحلقة قراءة ـ تقييم ـ طباعة.
  • الدوال كائنات من الفئة الأولي.
  • التأكيد علي الاستدعاء الذاتي والدوال عالية الرتبة بدلا من التكرار القائم علي الأثر الجانبي.
  • التتابعات الكسولة
  • تتيح مجموعة غنية من هياكل البيانات الثابتة اللامتغيرة.
  • البرمجة المتزامنة من خلال ذاكرة أعمال البرمجيات وهو نظام مساعد ونظام متغير تفاعلي.
  • طرق متعددة للسماح بالإرسال التفاعلي علي أنواع وقيم أي مجموعة من المتغيرات (تقنية تعدد الوجهيات المعتادة التي ترسل نوع المتغير من الطريقة الأولي)


أمثلة

برنامج_أهلا_بالعالم:

(println "Hello, world!")

مولد خيط آمن من أعداد متسلسلة فريدة:

(javax.swing.JOptionPane/showMessageDialog nil "Hello World" )

فئة فرعية مجهولة من كاتي جافا آى أو والتي لا تكتب علي أي شئ و الماكرو يستخدم ذلك لإسكات كافة المطبوعات بداخله:

(let [i (atom 0)]
  (defn generate-unique-id
    "Returns a distinct numeric ID for each call."
    []
    (swap! i inc)))

فئة فرعية مجهولة من java.io.Writer that والتي لا تكتب علي أي شئ و الماكرو يستخدم ذلك لإسكات كافة المطبوعات بداخله:

(def bit-bucket-writer
  (proxy [java.io.Writer] []
    (write [buf] nil)
    (close []    nil)
    (flush []    nil)))

(defmacro noprint
  "Evaluates the given expressions with all printing to *out* silenced."
  [& forms]
  `(binding [*out* bit-bucket-writer]
     ~@forms))

(noprint
 (println "Hello, nobody!"))

10 خيوط تستخدم هيكل بيانات مشترك واحد يتكون من 100 متجه يحتوي كل منها عي 10 أعداد فريدة (متتابعة أولياً) . يتكرر اختيار كل خيط لموضعين عشوائيين في متجهين عشوائيين ويقوم بتبديلهما. كافة التغييرات علي المتجهات تحدث في التعاملات عن طريق الاستفادة من نظام ذاكرة أعمال البرمجيات الخصة بلغة كلوچر, ولهذا السبب فإنه حتي بعد 100.000 تكرار لكل خيط , لا يضيع أي حرف.

(defn run [nvecs nitems nthreads niters]
  (let [vec-refs (vec (map (comp ref vec)
                           (partition nitems (range (* nvecs nitems)))))
        swap #(let [v1 (rand-int nvecs)
                    v2 (rand-int nvecs)
                    i1 (rand-int nitems)
                    i2 (rand-int nitems)]
                (dosync
                 (let [temp (nth @(vec-refs v1) i1)]
                   (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2))
                   (alter (vec-refs v2) assoc i2 temp))))
        report #(do
                 (prn (map deref vec-refs))
                 (println "Distinct:"
                          (count (distinct (apply concat (map deref vec-refs))))))]
    (report)
    (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap)))))
    (report)))

(run 100 10 10 100000)

مخرجات المثال السابق:

([0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19] ...
 [990 991 992 993 994 995 996 997 998 999])
Distinct: 1000
 
([382 318 466 963 619 22 21 273 45 596] [808 639 804 471 394 904 952 75 289 778] ...
 [484 216 622 139 651 592 379 228 242 355])
Distinct: 1000

المراجع

  1. ^ Rich Hickey (30 يونيو 2009)، "Books that influenced Clojure"، اطلع عليه بتاريخ 11 سبتمبر 2009.
  2. أ ب "Release 1.10.3"، 4 مارس 2021، اطلع عليه بتاريخ 10 مارس 2021. {{استشهاد ويب}}: تحقق من التاريخ في: |access-date= و|date= (مساعدة)
  3. ^ http://groups.google.com/group/clojure/msg/766b75baa7987850?
  4. ^ "Rationale"، Rich Hickey، clojure.org، اطلع عليه بتاريخ 17 أكتوبر 2008.
  5. ^ http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure/
  6. ^ "On State and Identity"، Rich Hickey، clojure.org، اطلع عليه بتاريخ 01 مارس 2010.

قراءات أخرى

وصلات خارجية