جی (زبان برنامه‌نویسی)

جِی  یکی از زبان‌های برنامه‌نویسی است.

زبان برنامه‌نویسی جی، که اوایل دهه ۱۹۹۰ توسط کنت ای آیورسن و Roger Hui شکل گرفت، یک ترکیب از زبان‌های سطح تابع FP ،APL و FL است.

برای پرهیز از مشکل تکرار کاراکتر مخصوص APL، جی فقط به مجموعه کاراکترهای اسکی پایه‌ای نیازمند است.

علاوه بر این، برای حفظ تجزیه و سادگی زبان و برای جبران کمی تنوع کاراکترهای اسکی، بسیاری از کاراکترهایی که در زبان‌های دیگر نیازمند آن هستند که در تعادل نگه داشته شوند (مثل [] {} "" `` or <>) در جی به صورت یک نشانه در نظر گرفته می‌شوند.

جی یک زبان برنامه‌نویسی آرایه‌ای بسیار مختصر است که اغلب برای برنامه‌نویسی‌های ریاضیاتی و آماری مناسب است؛ مخصوصاً هنگامی که بحث عملیات روی ماتریس باشد.

مانند زبان‌های FP/FL، جی از برنامه‌نویسی سطح تابع (که همچنین با نام برنامه‌نویسی تابعی سطح بالا شناخته شده) از ویژگی‌های برنامه‌نویسی نهان پشتیبانی می‌کند. (توجه داشته باشید که برنامه‌نویسی سطح تابع با برنامه‌نویسی تابعی یکسان نیست)

برخلاف بسیاری از زبان‌هایی که شیئ گرایی را پشتیبانی می‌کنند، طرح فضای نام سلسله مراتب منعطف جی (جایی که اسامی در یک محل مشخص موجودند) می‌تواند به‌طور مؤثر به عنوان یک چهارچوب برای هر نوع برنامه‌نویسی شیئ گرا مبتنی بر کلاس و نمونه اولیه مورد استفاده قرار گیرد.

جی یک زبان برنامه‌نویسی فون نیومن نیست، هر چند می‌تواند از سبک برنامه‌نویسی فون نیومن استفاده کرد.

جی قبلاً یک نرم‌افزار منبع بسته بود، اگر چه رایگان و قابل دسترس برای ویندوز و لینوکس بود ولی از مارچ سال ۲۰۱۱، تحت مجوز پروانه عمومی همگانی گنو قرار گرفت.

مثال‌ها 
جی اجازه ترکیب تابع و سبک نقطه آزاد را می‌دهد؛ بنابراین برنامه‌های آن می‌تواند بسیار مختصر و مفید باشند و ابهام داشته باشند.

برنامهٔ سلام دنیا در جی عبارت است از:

  '!Hello, world'

این پیاده‌سازی از سلام دنیا یک استفاده سنتی از جی را منعکس می‌کند – برنامه‌ها وارد یک عنصر جی می‌شوند و نتایج عبارات نمایش داده می‌شوند. همچنین ممکن است که از اسکریپت‌های جی به صورت برنامه‌های جداگانه استفاده کرد. اما مکانیزم‌های مرتبط کردن یک اسکریپت با عنصر وابسته به ماشین به گونه‌ای است که در یک سیستم یونیکس دیده می‌شود:

  bin/jc/!#

  '!echo 'Hello, world
  ''exit

قبلاً APL از / برای نمایش برابری استفاده می‌کرد؛ بنابراین ۱۲۳/+ برابر با ۳+۲+۱ بود. در همان زمان، تقسیم با همان نماد تقسیم کلاسیک ریاضی نمایش داده می‌شد .(÷) که با overstriking یک علامت منفی و یک دو نقطه ساخته می‌شد. از آن جا که اسکی عموماً overstrikeها را در یک روش وابسته به ماشین پشتیبانی نمی‌کند و یک نماد تقسیم را شامل نمی‌شود، جی از % برای نمایش تقسیم به عنوان یک تقریب یا یادآور استفاده می‌کند. آنچه در زیر آمده یک برنامه جی برای محاسبه میانگین لیستی از اعداد است:

  #%/+:=avg
  avg 1 2 3 4
 ۲٫۵

علامت # تعداد عناصر یک آرایه را می‌شمارد. /+ عناصر آرایه را باهم جمع می‌کند. % مجموع را بر تعداد عناصر تقسیم می‌کند.
چند مثال از استفاده میانگین:

  v=: ?. ۲۰ $ 100 NB. a random vector
  v
  ۴۶ ۵۵ ۷۹ ۵۲ ۵۴ ۳۹ ۶۰ ۵۷ ۶۰ ۹۴ ۴۶ ۷۸ ۱۳ ۱۸ ۵۱ ۹۲ ۷۸ ۶۰ ۹۰ ۶۲
  avg v
  ۵۹٫۲

  4avg\ v NB. moving average on periods of size ۴
  ۵۸ ۶۰ ۵۶ ۵۱٫۲۵ ۵۲٫۵ ۵۴ ۶۷٫۷۵ ۶۴٫۲۵ ۶۹٫۵ ۵۷٫۷۵ ۳۸٫۷۵ ۴۰ ۴۳٫۵ ۵۹٫۷۵ ۷۰٫۲۵ ۸۰ ۷۲٫۵

  m=: ?. ۴ ۵ $ 50 NB. a random matrix
  m
  ۴۶ ۵ ۲۹ ۲ ۴
  ۳۹ ۱۰ ۷ ۱۰ ۴۴
  ۴۶ ۲۸ ۱۳ ۱۸ ۱
  ۴۲ ۲۸ ۱۰ ۴۰ ۱۲

  avg"1 m NB. apply avg to each rank 1 subarray (each row) of m
  ۱۷٫۲ ۲۲ ۲۱٫۲ ۲۶٫۴

Rank مفهومی حیاتی در جی دارد. اهمیت آن در جی شبیه به اهمیت "select" در SQL و "while" در سی است.
در این جا مرتب‌سازی سریع در زبان جی اجرا می‌شود:

  '#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.
)

انواع داده و ساختمان‌ها 
جی از سه نوع داده‌ای ساده پشتیبانی می‌کند:
 Numeric عددی
 Literal (Character) :حروف (کاراکتر)
 Boxed: جعبه

که اولین آن‌ها Numeric بیشترین تنوع را دارد.
یکی از انواع داده‌ای عددی در جی، بیت (bit) است. دو مقدار برای بیت وجود دارد: صفر و یک. به علاوه بیت‌ها می‌توانند در لیست‌ها شکل بگیرند. برای مثال ۱ ۰ ۱ ۰ ۱ ۱ ۰ ۰ یک لیست از هشت بیت است؛ و قواعد جداکننده جی که با آن‌ها مانند یک کلمه ساده رفتار می‌کند، از لیست‌هایی با طول دلخواه پشتیبانی می‌شود.

افزون بر این‌ها جی ازهمه عملیات دودویی معمول روی این لیست‌ها، مثل AND, OR, XOR، چرخش، شیفت، NOT و غیره پشتیبانی می‌کند.

برای مثال:

  1 0 0 1 0 0 1 0 +. 0 1 0 1 1 0 1 0 NB. or
 ۱ ۱ ۰ ۱ ۱ ۰ ۱ ۰

  3 |. 1 0 1 1 0 0 1 1 1 1 1 NB. rotate
 ۱ ۰ ۰ ۱ ۱ ۱ ۱ ۱ ۱ ۰ ۱

توجه کنید که جی همچنین از آرایه‌های مراتب بالاتر بیت‌ها نیز پشتیبانی می‌کند.
آن‌ها می‌توانند به صورت آرایه‌های دو بعدی، سه بعدی یا چند بعدی شکل بگیرند.
عملیات فوق روی این آرایه‌ها نیز به خوبی کار می‌کند.

انواع دیگر داده عددی شامل اعداد صحیح، اعداد اعشاری، اعداد مختلط، اعداد صحیح بزرگ و کسر گویا است. مانند بیت‌ها این انواع نیز می‌توانند در لیست‌ها یا آرایه‌های چند بعدی دلخواه قرار بگیرند.

لیست بیت‌ها می‌تواند با استفاده از # تبدیل یه یک عدد صحیح شوند. اعداد صحیح نیز می‌توانند با استفاده از #:verb به لیست‌هایی از بیت‌ها تبدیل شوند.

جی همچنین از نوع Literal (حروف) پشتیبانی می‌کنند. حروف در کوتیشن قرار می‌گیرند. برای مثال: 'a' یا 'b'. لیست حروف نیز همچنین با استفاده از قرار دادن چند حروف در کوتیشن مانند 'abcdefg' پشتیبانی می‌شود. عمدتاً یک تک حرف هشت بیت فضا نیاز دارد (اسکی).
اما جی همچنین از دیگر حروف (یونی کد) پشتیبانی می‌کند.

عملیات عددی و منطقی روی حروف تعریف نشده‌اند، اما عملیات‌های مجموعه‌ای (مانند چرخش) تعریف شده‌اند.

آخرین نوع داده‌ای Boxed (جعبه) است. اغلب داده به وسیله یک عملگر> (بدون هیچ آرگومان سمت چپ) در یک Box قرار می‌گیرد. (اگر سمت چپ عملگر> آرگومانی وجود داشته باشد، یک عملگر «کوچک‌تر از» خواهد بود ) این مشابه عملگر& در سی (بدون هیچ آرگومان سمت چپ) می‌شود. با این حال نتیجه & در سی معنای آدرس دارد، نتیجه> در جی، معنای ارزش می‌دهد.

از دیدگاه یک برنامه‌نویس جی ،> داده را در یک جعبه قرار می‌دهد و به برنامه‌نویس اجازه می‌دهد تا با یک آرایه از جعبه‌ها کار کند. (می‌توان آن را با جعبه‌های دیگر سر هم کرد، و/ یا نسخه‌های دیگر از روی یک جعبه ساخته شود ). داده‌های نمایش داده شده در جعبه به وسیله جی به گونه‌ای مشابه مدل‌هایی که برخی از مفسرهای SQL جدول نتایج عبارت انتخاب را می‌چیند، است.

  <۱ ۰ ۰ ۱ ۰
 +----+
 |۱ ۰ ۰ ۱ ۰|
 +----+

تنها نوع مجموعه ارائه شده در جی آرایه چند بعدی است. بسیاری از الگوریتم‌ها می‌توانند با استفاده از عملگرهایی روی این آرایه‌ها تشریح شوند.

آرایه‌های جی نوع‌های همگن هستند. برای مثال لیست ۱۲۳ یک لیست صحیح است. با وجود این که در حقیقت ۱، یک بیت است. در اکثر موارد این گونه مسائل وابسته به برنامه‌نویس است. فقط برخی از عملیات‌های تخصصی تفاوت در نوع را نشان می‌دهند. برای مثال با لیست ۱٫۰ ۰٫۰ ۱٫۰ ۰٫۰ توسط بیشتر عملگرها دقیقاً مشابه لیست ۱ ۰ ۱ ۰ رفتار می‌شود.

جی هم چنین از آرایه‌های عددی خلوت هنگامی که مقادیر غیر صفر و اندیس‌های آن‌ها وجود داشته باشد، پشتیبانی می‌کند. این مکانیزم مؤثر برای زمانی است که مقادیر مرتبط کمی غیر صفرند.

جی همچنین اشیاء کلاس‌ها نیز پشتیبانی می‌کند. اما این‌ها یک سری روش‌های مصنوعی هستند که نامیده می‌شود، و نوع داده‌ای نیستند. در عوض حروف بسته‌بندی شده برای اشاره به اشیاء (و کلاس‌ها) استفاده می‌شود. داده جی معنای ارزش دارد ولی اشیاء و کلاس‌ها نیازمند معنای ارجاعی هستند.

یک شبه نوع دیگر مرتبط با نام که به جای مقدار مشخص می‌شود، یک فایل نگاشت شده در حافظه است.

مستندات 
مستندسازی جی برخلاف بیش تر زبان‌های برنامه سازی دیگر، به صورت یک فرهنگ لغت با معانی که در جی به عنوان نام، فعل، قید، حرف ربط و غیره مشخص می‌شوند، سازماندهی شده‌است. توجه کنید که افعال دو شکل دارند: موناد (monads) (آرگومان‌ها فقط در سمت راست) و دیاد (dyads) (آرگومان‌ها در سمت چپ و راست). برای مثال در '۱-' علامت منفی یک موناد و در '۲–۳' علامت منفی یک دیاد است.

ساختارهای کنترلی 
جی ساختارهای کنترلی را مشابه زبان‌های تابعی دیگر فراهم می‌کند. کنترل‌ها عبارتند از:
 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. B۱ end.
 if. T do. B
 elseif. T۱ do. B۱
 elseif. T۲ do. B۲
 end.
 return.
 select. T
 case. T۰ do. B۰
 fcase. T۱ do. B۱
 case. T۲ do. B۲
 end.
 throw.
 try. B catch. B۱ catchd. B۲ catcht. B۳ end.
 while. T do. B end.
 whilst. T do. B end.

منابع 

ویکی‌پدیای انگلیسی: j programming language

ای‌پی‌ال
زبان‌های برنامه‌نویسی
زبان‌های برنامه‌نویسی آرایه‌ای
زبان‌های برنامه‌نویسی آکادمیک
زبان‌های برنامه‌نویسی شیءگرا
زبان‌های برنامه‌نویسی عددی
زبان‌های برنامه‌نویسی کلاس محور
زبان‌های برنامه‌نویسی ماشینی پویا
زبان‌های تابعی