لغة البرمجة J
لغة البرمجة J ، التي تم تطويرها في أوائل التسعينيات بواسطة كينيث إي. إيفرسون وروجر هوي ، [ 5 ] [ 6 ] هي لغة برمجة المصفوفات تعتمد بشكل أساسي على APL (أيضًا بواسطة إيفرسون).
لتجنب تكرار مشكلة الأحرف الخاصة في لغة APL، تستخدم لغة J مجموعة أحرف ASCII الأساسية فقط ، معتمدةً على النقطة والنقطتين الرأسيتين كعلامات تصريف [ 7 ] لتكوين كلمات قصيرة مشابهة للثنائيات . معظم هذه الكلمات الأولية (أو البدائية ) في لغة J تُستخدم كرموز رياضية، حيث تُوسّع النقطة أو النقطتان الرأسيتان معنى الأحرف الأساسية المتاحة. كذلك، فإن العديد من الأحرف التي غالبًا ما تُقترن في لغات أخرى (مثل [] {} "" ``أو <>) تُعامل في لغة J ككلمات مستقلة، أو عند تصريفها، كجذور أحادية الحرف لكلمات متعددة الأحرف.
لغة J هي لغة برمجة مصفوفات مختصرة للغاية ، وهي الأنسب للبرمجة الرياضية والإحصائية ، وخاصة عند إجراء العمليات على المصفوفات . كما تم استخدامها في البرمجة المتطرفة [ 8 ] وتحليل أداء الشبكات . [ 9 ]
مثل لغات جون باكوس FP و FL ، تدعم لغة J البرمجة على مستوى الوظائف من خلال ميزات البرمجة الضمنية الخاصة بها .
على عكس معظم اللغات التي تدعم البرمجة الموجهة للكائنات ، يمكن استخدام مخطط مساحة الأسماء الهرمي المرن في J (حيث يوجد كل اسم في بيئة محلية محددة ) بشكل فعال كإطار عمل لكل من البرمجة الموجهة للكائنات القائمة على الفئات والبرمجة الموجهة للكائنات القائمة على النماذج الأولية .
منذ مارس 2011، أصبح برنامج J برنامجًا مجانيًا ومفتوح المصدر بموجب رخصة جنو العمومية العامة الإصدار 3 (GPLv3). [ 10 ] [ 11 ] [ 12 ] كما يمكن شراء شفرة المصدر بموجب ترخيص متفق عليه. [ 13 ]
أمثلة
تسمح لغة J بأسلوب كتابة خالٍ من النقاط وتركيب الدوال . وبالتالي، يمكن أن تكون برامجها مختصرة للغاية ويعتبرها بعض المبرمجين صعبة القراءة.
برنامج "Hello, World!" في لغة J هو:
'مرحبا بالعالم!'يعكس هذا التطبيق لبرنامج "مرحباً بالعالم" الاستخدام التقليدي للغة J، حيث تُدخل البرامج في جلسة مترجم J، وتُعرض نتائج التعبيرات. كما يُمكن أيضاً إعداد نصوص J البرمجية لتنفيذها كبرامج مستقلة. إليك كيف سيبدو ذلك على نظام يونكس :
#!/bin/jc echo 'Hello, world!' exit ''(لاحظ أن تطبيقات j الحالية تُثبّت إما jconsole jconsoleأو jconsole (لأن java تستخدم java)، ijconsoleومن المرجح أن تُثبّت jconsole في /usr/bin أو في دليل آخر (ربما دليل التطبيقات على macOS). لذا، توجد هنا تبعية نظامية يتعين على المستخدم حلها.)
تاريخياً، كان يُستخدم APL /للإشارة إلى الطي ، لذا +/1 2 3كان مكافئاً لـ 1+2+3. في الوقت نفسه، كان يتم تمثيل القسمة برمز القسمة الرياضي ( ÷).
لأن نظام ASCII لا يتضمن رمز القسمة بحد ذاته ، يستخدم J رمز النسبة المئوية (%) لتمثيل القسمة، كتقريب بصري أو للتذكير. (يوضح هذا بعضًا من الطابع التذكيري لرموز J، وبعض المعضلات التي يفرضها استخدام ASCII).
تعريف دالة J باسم avgلحساب متوسط قائمة من الأرقام ينتج عنه:
avg=:+/%#+/يجمع عناصر المصفوفة.#يحسب عدد العناصر في المصفوفة.%يقسم المجموع على عدد العناصر.
هذا اختبار لتنفيذ الدالة:
avg12342.5أعلاه، تم تعريف المتوسط باستخدام سلسلة من ثلاثة أفعال ( +/، %و، و #) تسمى شوكة . على وجه التحديد، (V0 V1 V2) Nyهو نفسه (V0(Ny)) V1 (V2(Ny))الذي يُظهر بعض قوة J. (هنا V0 وV1 وV2 تشير إلى أفعال وNy تشير إلى اسم.)
بعض الأمثلة على استخدام avg:
v=:?.20$100ملاحظة: متجه عشوائيv46 55 79 52 54 39 60 57 60 94 46 78 13 18 51 92 78 60 90 62 59.2avgv
4avg\vملاحظة: المتوسط المتحرك على فترات زمنية بحجم 4 58 60 56 51.25 52.5 54 67.75 64.25 69.5 57.75 38.75 40 43.5 59.75 70.25 80 72.5m=:?.45$50ملاحظة: مصفوفة عشوائيةm46 5 29 2 4 39 10 7 10 44 46 28 13 18 1 42 28 10 40 12
avg"1mملاحظة: قم بتطبيق المتوسط على كل مصفوفة فرعية من الرتبة 1 (كل صف) من m 17.2 22 21.2 26.4يُعدّ الترتيب مفهومًا أساسيًا في J.
يؤدي تطبيق خوارزمية الفرز السريع من قاموس J إلى ما يلي:
sel =: ظرف def 'u # [' فرز سريع =: فعل تعريف if. 1 >: # ذ افعل. وغيرها . ( الفرز السريع y < sel e ) , ( y = sel e ) , الفرز السريع y > sel e =. ذ {~؟# نهاية ذ . )فيما يلي تطبيق لخوارزمية الفرز السريع يوضح البرمجة الضمنية . تتضمن هذه البرمجة دمج الدوال معًا دون الإشارة صراحةً إلى أي متغيرات. يدعم J التفرعات والخطافات ، مما يحدد قواعد كيفية تطبيق الوسائط المُطبقة على هذه الدالة على الدوال المكونة لها.
فرز سريع =: (( $:@ ( <#[ ) , ( =#[ ) , $:@ ( >#[ )) ( {~ ?@# )) ^: ( 1 <# )عادةً ما يتم فرز البيانات في J باستخدام الأفعال المدمجة (الأساسية) /:(فرز لأعلى) و \:(فرز لأسفل). أما عمليات الفرز التي يُعرّفها المستخدم، مثل الفرز السريع المذكور أعلاه، فهي عادةً لأغراض التوضيح فقط.
يوضح المثال التالي استخدام فعل الإشارة الذاتية $:لحساب أعداد فيبوناتشي بشكل متكرر:
1 :` ( $:@-& 2 +$:@<: ) @. ( >& 2 )يمكن تحقيق هذا التكرار أيضًا عن طريق الإشارة إلى الفعل بالاسم، على الرغم من أن هذا ممكن بالطبع فقط إذا تم تسمية الفعل:
فيبوناتشي =: 1 :` ( فيبوناتشي @-& 2 + فيبوناتشي @<: ) @. ( >& 2 )يوضح التعبير التالي قيمة باي (π ) برقم n، ويُظهر قدرات الدقة الموسعة للدالة J:
n=:50ملاحظة: حدد n كعدد الأرقام المطلوبة . ملاحظة: الدقة الموسعة 10 أس ن * باي 314159265358979323846264338327950288419716939937510<.@o.10x^n
الأفعال والصفات
يُطلق على البرنامج أو الروتين - وهو ما يأخذ البيانات كمدخلات ويُنتج بيانات كمخرجات - اسم " فعل" . يحتوي J على مجموعة غنية من الأفعال المُعرّفة مسبقًا، والتي تعمل جميعها تلقائيًا على أنواع بيانات متعددة: على سبيل المثال، يبحث الفعل i. داخل مصفوفات بأي حجم للعثور على التطابقات.
3 1 4 1 5 9 i . 3 1 ملاحظة: أوجد دليل أول ظهور للعدد 3، ودليل أول ظهور للعدد 1 0 1 3 1 4 1 5 9 i : 3 1 ملاحظة: أوجد دليل آخر ظهور للعدد 3، ودليل آخر ظهور للعدد 1 0 3يمكن تسمية برامج المستخدم واستخدامها أينما يُسمح باستخدام العناصر الأساسية.
تكمن قوة J بشكل كبير في مُعدِّلاتها : وهي رموز تأخذ أسماءً وأفعالًا كمعاملات وتُطبِّق هذه المعاملات بطريقة مُحدَّدة. على سبيل المثال، يأخذ المُعدِّل / معاملًا واحدًا، وهو فعل على يساره، ويُنتج فعلًا يُطبِّق هذا الفعل بين كل عنصر من عناصر معامله. أي أنَّ +/ فعل، يُعرَّف بأنه "تطبيق + بين عناصر معاملك". وبالتالي، فإنَّ الجملة
+/ 1 2 3 4 5ينتج عنه تأثير
1 + 2 + 3 + 4 + 5+/ 1 2 3 4 5 15يحتوي J على ما يقارب عشرين مُعدِّلاً من هذه المُعدِّلات. يمكن تطبيق جميعها على أي فعل، حتى الأفعال التي يكتبها المستخدم، ويمكن للمستخدمين كتابة مُعدِّلاتهم الخاصة. على الرغم من أن المُعدِّلات قوية بشكل فردي، إلا أنها تسمح
- التنفيذ المتكرر، أي حلقة التكرار do-while
- التنفيذ المشروط، أي إذا
- تنفيذ مجموعات فرعية منتظمة أو غير منتظمة من الوسائط
تتحكم بعض المُعدِّلات في ترتيب تنفيذ المكونات، مما يسمح بدمج المُعدِّلات بأي ترتيب لإنتاج مجموعة متنوعة غير محدودة من العمليات اللازمة للبرمجة العملية.
أنواع البيانات وهياكلها
يدعم J ثلاثة أنواع بسيطة:
- رقمي
- حرفي (شخصية)
- معبأ في صندوق
ومن بين هذه الأنواع، يحتوي النوع الرقمي على أكبر عدد من المتغيرات.
أحد أنواع البيانات الرقمية في لغة J هو البت . توجد قيمتان للبت: 0 و 1 . كما يمكن تكوين قوائم من البتات. على سبيل المثال، 1 0 1 0 1 1 0 0 هي قائمة من ثمانية بتات. من الناحية التركيبية، يتعامل محلل J معها ككلمة واحدة. (يتم التعرف على المسافة كحرف لتكوين الكلمات بين ما يُفترض أن تكون كلمات رقمية). تدعم لغة J قوائم ذات أطوال مختلفة.
علاوة على ذلك، يدعم J جميع العمليات الثنائية المعتادة على هذه القوائم، مثل " و" ، و" أو" ، و"أو الحصرية" ، و"تدوير" ، و"إزاحة" ، و " ليس "، وما إلى ذلك. على سبيل المثال،
1 0 0 1 0 0 1 0 +. 0 1 0 1 1 0 1 0 ملاحظة. أو 1 1 0 1 1 0 1 0
3 |. 1 0 1 1 0 0 1 1 1 1 1 ملاحظة: تدوير 1 0 0 1 1 1 1 1 1 0 1
يدعم J أيضًا مصفوفات البتات ذات الرتب الأعلى. يمكن تشكيلها في مصفوفات ثنائية الأبعاد، وثلاثية الأبعاد، وما إلى ذلك. وتؤدي العمليات المذكورة أعلاه أداءً جيدًا بنفس القدر على هذه المصفوفات.
تشمل الأنواع العددية الأخرى الأعداد الصحيحة (مثل 3، 42)، والأعداد العشرية (3.14، 8.8e22)، والأعداد المركبة (0j1، 2.5j3e88)، والأعداد الصحيحة ذات الدقة الموسعة (12345678901234567890x)، والكسور النسبية (ذات الدقة الموسعة) (1r2، 3r4). وكما هو الحال مع البتات، يمكن تمثيل هذه الأنواع في قوائم أو مصفوفات ذات أبعاد عشوائية. وكما هو الحال مع البتات، تُجرى العمليات على جميع الأرقام في المصفوفة.
يمكن تحويل قوائم البتات إلى أعداد صحيحة باستخدام #.الفعل. ويمكن تحويل الأعداد الصحيحة إلى قوائم بتات باستخدام #:الفعل. (عند تحليل J، تُعتبر .النقطة (.) والنقطتان :الرأسيتان (.) أحرفًا مُكوِّنة للكلمات. ولا تُعتبر رموزًا منفردة أبدًا، إلا إذا سُبقت بمسافات بيضاء .)
يدعم J أيضًا نوع البيانات الحرفية (الأحرف). تُحاط البيانات الحرفية بعلامات اقتباس، على سبيل المثال، 'a'أو 'b'. كما يدعم قوائم البيانات الحرفية باستخدام الاصطلاح المعتاد بوضع عدة أحرف بين علامتي اقتباس، مثل 'abcdefg'. عادةً، يكون عرض كل قيمة حرفية 8 بت (ASCII)، لكن J يدعم أيضًا أنواعًا أخرى من البيانات الحرفية ( Unicode ). لا يدعم J العمليات العددية والمنطقية على البيانات الحرفية، ولكنه يدعم العمليات الموجهة نحو المجموعات (مثل التدوير).
أخيرًا، يوجد نوع بيانات مُغلّف. عادةً، تُوضع البيانات في صندوق باستخدام <عملية (بدون وسيط أيسر؛ إذا وُجد وسيط أيسر، فستكون هذه عملية أصغر من ). هذا يُشابه عملية في لغة C& (بدون وسيط أيسر). مع ذلك، بينما تحمل نتيجة C &دلالات مرجعية، فإن نتيجة J <تحمل دلالات قيمة. بعبارة أخرى، <هي دالة تُنتج نتيجة. هذه النتيجة لها أبعاد صفرية، بغض النظر عن بنية البيانات المُضمنة. من وجهة نظر مُبرمج J، <تضع البيانات في صندوق وتسمح بالتعامل مع مصفوفة من الصناديق (يمكن تجميعها مع صناديق أخرى أو إنشاء نسخ إضافية من الصندوق).
<1 0 0 1 0 +---------+ |1 0 0 1 0| +---------+النوع الوحيد من المجموعات الذي توفره لغة J هو المصفوفة ذات الأبعاد العشوائية. ويمكن التعبير عن معظم الخوارزميات بإيجاز شديد باستخدام العمليات على هذه المصفوفات.
تتميز مصفوفات J بتجانس أنواعها، فعلى سبيل المثال، تُعتبر القائمة 1 2 3 قائمةً من الأعداد الصحيحة رغم 1 كونها بتًا. في معظم الأحيان، تكون هذه الأنواع من مشكلات الأنواع غير مرئية للمبرمجين. فقط بعض العمليات المتخصصة تكشف عن اختلافات في النوع. على سبيل المثال، 1.0 0.0 1.0 0.0 ستُعامل القائمة بنفس الطريقة تمامًا، من قِبل معظم العمليات، كما تُعامل القائمة 1 0 1 0 .
يدعم J أيضًا المصفوفات الرقمية المتفرقة حيث تُخزَّن القيم غير الصفرية مع مؤشراتها. هذه آلية فعالة عندما يكون عدد القيم غير الصفرية قليلًا نسبيًا.
يدعم J أيضًا الكائنات والفئات، [ 14 ] لكن هذه مجرد نتاج لطريقة تسمية الأشياء، وليست أنواع بيانات. بدلًا من ذلك، تُستخدم القيم الحرفية المُغلّفة للإشارة إلى الكائنات (والفئات). بيانات J لها دلالات قيمة، لكن الكائنات والفئات تحتاج إلى دلالات مرجعية.
نوع زائف آخر - مرتبط بالاسم بدلاً من القيمة - هو الملف المُرتبط بالذاكرة.
تصحيح الأخطاء

تتمتع لغة J بالإمكانيات المعتادة للتوقف عند حدوث خطأ أو في مواضع محددة داخل الأفعال. كما أنها تحتوي على مصحح أخطاء مرئي فريد من نوعه، يُسمى Dissect ، والذي يوفر عرضًا تفاعليًا ثنائي الأبعاد لتنفيذ جملة J واحدة. ونظرًا لأن جملة J واحدة تُجري عمليات حسابية تُعادل ما يُجريه روتين فرعي كامل في لغات البرمجة منخفضة المستوى، فإن العرض المرئي يُعد مفيدًا للغاية.
الوثائق
تتضمن وثائق لغة J قاموسًا ، حيث تُصنَّف الكلمات في J إلى أسماء وأفعال وصفات ، وما إلى ذلك. تُدرَج الكلمات الأساسية في المعجم ، حيث تُحدَّد أجزاء الكلام الخاصة بها باستخدام علامات الترميز. لاحظ أن للأفعال شكلين: أحادي (بمعاملات على اليمين فقط) وثنائي (بمعاملات على اليسار واليمين). على سبيل المثال، في ' -1'، الواصلة فعل أحادي، وفي ' 3-2'، الواصلة فعل ثنائي. تعريف الفعل الأحادي مستقل في الغالب عن تعريفه الثنائي، بغض النظر عما إذا كان الفعل أصليًا أم مشتقًا.
هياكل التحكم
توفر لغة J هياكل تحكم مشابهة للغات الإجرائية الأخرى. [ 15 ]
assert.break.continue.for.goto_label.if. else. elseif.return.select. case.throw.try. catch.while. whilst.
انظر أيضاً
- لغة البرمجة K – لغة أخرى متأثرة بلغة APL
- س – لغة KDB+ وإصدار جديد مدمج من K و KSQL.
مراجع
- ↑ "ملاحظات الإصدار J9.7" .
- ↑ "Jsoftware" .
- ↑ ويس ماكيني في اجتماع عام 2012 حول استخدام بايثون في تحليل البيانات
- ↑ وثائق SuperCollider، ظروف المعاملات الثنائية
- ↑ نظرة شخصية على APL ، مقال بقلم كي إي إيفرسون عام 1991 (رابط مؤرشف)
- ↑ نظرة عامة على تاريخ حرف J بقلم روجر هوي (19 مارس 2002)
- ↑ كلمات نيو فوك
- ↑ بوسيل، برايان؛ تايلور، ستيفن (2006). تطوير البرمجيات كمشروع كتابة تعاوني . البرمجة المتطرفة والعمليات الرشيقة في هندسة البرمجيات. أولو، فنلندا: سبرينغر . ص 21-31 . ISBN 978-3-540-35094-1.
- ↑ هولت، آلان (2007). تحليل أداء الشبكة: باستخدام لغة البرمجة J. سبرينغر . ISBN 978-1-84628-822-7.
- ↑ صفحة تنزيل المصدر من Jsoftware
- ↑ إريك إيفرسون (1 مارس 2011). "J Source GPL" . قائمة بريدية لبرمجة J. مؤرشف من الأصل في 23 سبتمبر 2016. تم الاطلاع عليه في 24 يونيو 2015 .
- ↑ openj على GitHub
- ↑ سياسة التوريد الخاصة بشركة Jsoftware
- ↑ الفصل 25: البرمجة الكائنية التوجه
- ↑ (التفاصيل هنا)
روابط خارجية
- الموقع الرسمي – شركة JSoftware، مطورو برنامج J
- jsource على GitHub – مستودع المصدر
- ويكيبيديا
- تعلم لغة البرمجة J - مقدمة إلى لغة البرمجة J بقلم روجر ستوكس
- عائلة لغات البرمجة APL
- لغات برمجة المصفوفات
- لغات البرمجة القائمة على الفئات
- لغات البرمجة ذات الكتابة الديناميكية
- لغات مستوى الوظائف
- اللغات الوظيفية
- لغات البرمجة متعددة الأنماط
- لغات البرمجة العددية
- لغات البرمجة الكائنية التوجه
- لغات البرمجة
