جيه (لغة برمجة)

لغة البرمجة جيه J، التي طورها كينيث إي إيفرسون وروجر هوي في التسعينات هي تركيبة من اللغات إيه بي إل(التي طورها إيفرسون أيضا) و FP و FL Function- level اللذان صممهما جون باكوس.

ولتجنب تكرار مشكلة الحروف والأشكال المتأصلة باللغة إيه بي إل، تتطلب لغة جيه مجموعة أحرف وأشكال أسكي ASCII الرئيسية واللجوء إلى استخدام الأشكال الثنائية التي تتكون باستخدام النقطة أو الفاصلة للتوسع في معنى الأشكال أو الأحرف الرئيسية المتاحة. علاوة على ذلك، حتى تظل اللغة بسيطة وللحفاظ على تحليلها، وللتعويض عن عدم نقص الاختلافات بين الأحرف في لغة ASCII، تقوم لغة جيه بمعالجة معظم الأشكال التي ربما تكون في حاجة إلى موازنتها باللغات الأخرى (مثل [] {} "" ``<>)) على أنها رموز مستقلة بذاتها أو (مع الأشكال الثنائية) كجزء من الرموز متعددة الأشكال.

ولغة جي هي لغة برمجة منظمة وموجزة وتلاءم البرمجيات الإحصائية والرياضية بصورة أفضل خاصة عند آداء عمليات حساب المصفوفات. كما تم استخدامها أيضا في البرمجة القصوى وتحليل أداء الشبكة.

ومثل اللغات FP/FL، فإن جيه تدعم البرمجة على المستوى الوظائفي Function- level (الذي تعرف أيضا بالبرمجة الوظائفية عالية النظام) وذلك عبر سمات البرمجة الضمنية بها (لاحظ أن البرمجة على المستوى الوظائفي ليست مثل البرمجة الوظائفية),

وعلى عكس معظم اللغات التي تدعم البرمجة ذات التوجه الموضوعي، فإن موضوع مساحة الاسم namespace التسلسلية المرنة للغة جيه (حيث يتواجد كل اسم في منطقة معينة) يمكن استخدامها بصورة فعال لتكون إطارا لكل من البرمجة ذات التوجه الموضوعي المبنية على النموذج الأصلي والأخرى المبنية على الطبقات.

ولغة جيه ليست لغة برمجة فون نيومان von Neumann، ومع ذلك فمن الممكن استخدام أسلوب برمجة فون نيومان.

منذ مارس 2011، أصبحت لغة جيه برنامج مفتوح المصدر وحر تحت ترخيص GPLv3. يمكن للمرء أيضا أن يشتري مصدرا منها للاستخدام التجاري بموجب رخصة يتم التفاوض عليها.

أمثلة 

تتيح جيه أسلوبا خالي من النقاط وذو تركيب وظيفي، وم ثم يمكن أن تكون برامجها موجزة للغاية ومحمولة على تشويش للشفرة.

برنامج مرحبا بالعالم hello world program في جي0 هو

 'Hello, world!'

تطبيق هذا البرنامج يعكس الاستخدام التقليدي لجيه- يتم إدخال البرامج إلى جلسة ترجمة للجيه، ثم تعرض نتائج ظاهرة. من الممكن أن يتم تدبر أمر تنفيذ مخطوطات الجيه على أن تكون برامج مستقلة بذاتها. ولكن آليات ربط المخطوط بالمترجم تعتمد على النظام. هذا هو الشكل الذي تبدو عليه مع نظام تشغيل يونيكس UNIX:

 #!/bin/jc
 echo 'Hello, world!'
 exit ''

على مر التاريخ كانت لغة إيه بي إل تستخدم الرمز / للإشارة إلى مطوية ما، لذلك فإن +/1 2 3 كانت تكافئ 1+2+3. في نفس الوقت، كان يتم تمثيل الأقسام برموز التقسيم الرياضية (الأوبيلوس obelus، ÷) والذي كانت تنفذ بالضرب على علامة الناقص والنقطتان معا (في كلا النهايتين الورقيتين EBCDIC و ASCII). نظرا لأن ASCII بوجه عام لا تدعم الضربات المزدوجة بطريقة تعتمد على الأداة، ولا تتضمن رمز تقسيم في حد ذاته، ولغة جيه تستعين بعلامة % لتشير على هذا التقسيم، كصورة تقريبية مرئية أو تذكرة. (وهذا يفسر شيئا من الصفات الخاصة بالذاكرة لرموز جيه، وشيئا من المآزق التي تظهر بواسطة استخدام ASCII).

وفيما يلي نوضح برنامجا لحساب متوسط قائمة من الأرقام:

 avg=: +/ % #
 avg 1 2 3 4
 2.5

تشير # إلى عدد العناصر في المصفوفة. +/ تلخص عناصر المصفوفة. %تقسم المجموع على عدد العناصر. ملحوظة: avg معرفة سابقا باستخدام سلسلة من ثلاث أفعال ("+/"، "%"و "#") والتي تعرف باسم الشوكة forkز خاصة أن (V0 V1 V2) Ny هي نفسها مثل (V0 Ny) V1 (V2 Ny) والتي توضح بعض نقاط القوة لدى لغة جيه.
 (V0 V1 V2 هنا تشير إلى الأفعال و Ny تشير إلى الأسماء)
بعض الأمثلة على استخدام avg :

 v=: ?. 20 $ 100 ملاحظة: متجه عشوائي
 v
 46 55 79 52 54 39 60 57 60 94 46 78 13 18 51 92 78 60 90 62
 avg v
 59.2

 4 avg\ 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.5

 m=: ?. 4 5 $ 50 ملاحظة: مصفوفة عشوائية
 m
 46 5 29 2 4
 39 10 7 10 44
 46 28 13 18 1
 42 28 10 40 12

 avg"1 m  ملاحظة: تطبيق الدالة avg على كل مصفوفة فرعية برتبة 1 (كل صف) في m
 17.2 22 21.2 26.4

المرتبة rank: هي مفهوم حتمي في لغة الجيه. دلالته في لغة الجيه شبيهة بالاختيار "select" في لغة SQL و"while" في لغة السي.

فيما يلي تطبيق لquicksort، من قاموس لغة جيه:

 sel=: adverb def 'u # ['
 
 quicksort=: verb define
 if. 1>: #y do. y
 else.
 (quicksort y <sel e),(y =sel e),quicksort y>sel e=.y(~?#y
 end.
)

وفيما يلي مثالا على الكويكسورت quicksort يظهر البرمجة الضمنية tacit programming. تتضمن البرمجة الضمنية تركيبة من بعض الوظائف معا ولا تشير بشكل صريح إلى أي من لمتغيرات. دعم لغة الجيه لforks و hooks يشير إلى القواعد بشأن كيف أن المناقشات التي تطبق على هذه الوظيفة ستطبق على وظائف محتواها.

 quicksort=: (($:@(<#[)، (=#[)، $:@(>#[)) ({~ ?@#)) ^: (1<#)

التعبير التالي يبين pi مع أرقام n ويعرض إمكانات الدقة المتوسعة لجيه:
 n=: 50   ملاحظة: n هي عدد الأرقام المطلوب
 <.@o. 10x^n   ملاحظة: دقة إضافية بمقدار 10 للقوة النونية
 314159265358979323846264338327950288419716939937510

أنواع وهياكل البيانات 
تدعم لغة الجيه ثلاث أنواع بسيطة:
 الرقمية numeric.
 الأحرف Literal (character)
 الصندوقية boxed
من بين هذه الثلاثة تتميز الرقيمة بكثرة تنوعها.

أحد الأنماط الرقمية للغة الجيه هي البايت. يوجد قيمتين للبايت وهما صفر ووواحد. إضافة إلى ذلك يمكن تصنيف البايتات في قوائم. على سبيل المثال تكون 10101100 قائمة من ثماني بايتات. ومن الناحية التركيبية/ نجد أن محلل الجيه يتعامل مع ذلك على أنه كلمة واحدة (أحرف المسافات تعرف بأنها كلمة تشكل حرفا أو كيانا حين تفصل بين اثنين يمكن اعتبارهما من ناحية أخرى كلمات رقمية). كما يدعم أيضا قوائم ذات طول اعتباطي.

علاوة على ذلك، فإن جيه تدعم كل العمليات المزدوجة المعتادة في هذه القوائم، مثل and, or, exclusive or, rotate, shift, not....الخ، على سبيل المثال.

 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

وعلينا أن نعرف أن جيه أيضا تدعم مصفوفات نظامية أعلى من البايتات- ويمكن أن تتكون من مصفوفات ثنائية الأبعاد وثلاثية الأبعاد.. الخ. تلك العمليات المذكورة سابقا تؤدي عملا جيدا في هذه المصفوفات.

الأنماط الرقمية الأخرى تتضمن الأعداد الصحيحة (3، 42)، النقاط العائمة (3.14، 8.8e22)، التركيبات (oj1, 2.5j3e88)، الأرقام الصحيحة الدقيقة المتوسعة (12345678901234567890x)، الكسر المنطقي (الدقة المتوسعة) (1r2, 3r4). وفيما يتعلق بالبايتات، يمكن أن يتم تشكيل تلك في قوائم أو مصفوفات ذات أبعاد اعتباطية. وفيما يتعلق بالبايتات، تتم العمليات على كافة الأرقام الموجودة بالمصفوفة.

يمكن تحويل قوائم البايتات لأرقام صحيحة باستخدام العلامة.verb#. يمكن تحويل الأرقام الصحيحة إلى قوائم من البايتات باستخدام العلامة #:verb. (وعند التحليل تكون كل من J,. و: كيانات تكون كلمات. لا يمكن اعتبارها مطلقا كرموز في حد ذاتها إلا إذا سبقتها مسافة.)

تدعم لغة جيه أيضا النوع الحرفي (الرمزي الحرفي). تدرج الحروف بين علامات اقتباس 'a' أو "b". كما يتم دعم قائمة من الأحرف أيضا باستخدام تقليد وضع تلك الأحرف الرمزية المتعددة بين علامات اقتباس مثل 'abcdefg'عادة ما يكون عرض الأحرف الرمزية الفردية 8 بايت (ascii)، ولكن جيه أيضا تدعم أحرف مكتوبة أخرى وهي (Unicode). العمليات الرقمية والبوليانية غير مدعومة بالأحرف، ولكن العمليات ذات التوجه التجميعي (مثل rotate) فهي مدعومة.

وفي النهاية، هناك نوع البيانات الصندوقية. عادة يتم وضع البيانات في صندوق باستخدام عملية> (بدون أي برهان أو معطى على اليسار- وإذا ما كان هناك أحد المعطيات على اليسار فسوف تكون تلك عملية «أقل من»). وهذا هو نظير عملية & بلغة السي (بدون أي معطيات يسارية). ومع ذلك حين تكون نتيجة & السي ذات دلالات مرجعية، فإن نتيجة عملية> للجي تكون ذات دلالات قيمة. بمعنى آخر فإن> هي وظيفة وينتج عنها نتيجة. النتيجة هي أبعاد صفرية بغض النظر عن هيكل البيانات المتضمنة. من وجهة نظر مبرمج الجيه،> «تضع البيانات في صندوق» وتدع المبرمج يعمل بمصفوفة من الصناديق (ويمكن دمجها مع صناديق أخرى، أو يمكن عمل نسخ أخرى من هذا الصندوق). البيانات الموجودة بالصندوق يمكن عرضها بلغة جيه، إلى حد ما بعد النمط، يقوم بعض مترجمي لغة SQL بتزيين الجداول الناتجة عن بيانات مختارة.

 <1 0 0 1 0
 +----+
 |1 0 0 1 0|
 +----+

النمط الجماعي الوحيد الذي تقدمه لغة الجيه هي المصفوفة ذات الأبعاد الاعتباطية. معظم اللوغاريتمات يمكن أن يتم التعبير عنها بدقة باستخدام عمليات على هذه المصفوفات.

مصفوفات جيه ذات أنماط متجانسة، على سبيل المثال القائمة 123 هي قائمة من الأعداد الصحيحة بالرغم من أن العدد 1 هو بايت. لمعظم الأجزاء، هذه المشاكل في أنواع الأنماط شفافة بالنسبة للمبرمج. فقط بعض العمليات المتخصصة الخاصة تكشف عن اختلافات في النوع. على سبيل المثال، القائمة 1.0 0.0 1.0 0.0 يتم التعامل معها بنفس الطريقة، بواسطة معظم العمليات، مثل القائمة 1 0 1 0.

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

التوثيق 
توثيق لغة الجيه، على عكس معظم لغات البرمجة الأخرى، يتم تنظيمها في هيئة قاموس، حيث يتم تحديد الكلمات في لغة الجيه بأسماء وأفعال وظروف وروابط، وما إلى ذلك. يتم الإشارة إلى أجزاء لكلام باستخدام علامة. ولنلاحظ أن الأفعال لها صيغتين: monads أحادية الخلية (تعطى البراهين ناحية اليمين فقط) و dyads ثنائية (تكون البراهين على اليمين واليسار). على سبيل المثال / في "-1" رمز الواصلة monad، وفي "2-3" الواصلة dyad. تعريف الأحادية غالبا ما يكون مستقلا عن تعريف المزدوجة، بغض النظر عما إذا كان الفعل أولي أو مشتق.

هياكل التحكم 
توفر لغة الجيه هياكل تحكم (مفصلة فيما يلي) شبيهة باللغات الإجرائية الأخرى. هذه الضوابط التحكمية هي:
 assert. T
 break.
 continue.
 for. T do. B end.
 for_xyz. T do. B end.
 goto_name.
 label_name.
 if. T do. B end.
 if. T do. B else. B1 end.
 if. T do. B
 elseif. T1 do. B1
 elseif. T2 do. B2
 end.
 return.
 select. T
 case. T0 do. B0
 fcase. T1 do. B1
 case. T2 do. B2
 end.
 throw.
 try. B catch. B1 catchd. B2 catcht. B3 end.
 while. T do. B end.
 whilst. T do. B end.

انظر أيضا 
- an APL dialect
- another APL-influenced language

مراجع

وصلات خارجية 
 JSoftware - Creators of J, currently مجان (اقتصاد) for all uses
 J Wiki - Showcase, documentation, articles, etc.
 J Forum Archives - Discussion of the language
 Cliff Reiter - Chaos, fractals, and mathematical symmetries, in J
 Ewart Shaw - Bayesian inference, medical statistics, and numerical methods, using J
 Keith Smillie - Statistical applications of array programming languages, especially J
 John Howland - Research on parallelization of array programming languages, especially J

لغات برمجة ديناميكية النمط
لغات برمجة عددية
لغات برمجة كائنية التوجه
لغات برمجة وظيفية