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

لغة البرمجة جيه 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            ملاحظة: تحريك المتوسط على فترات بطول 458 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 (كل صف) في m17.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

التوثيق

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