نيم (لغة برمجة)
نيم هي لغة برمجة أنظمة عالية المستوى ، متعددة الأغراض ، ومتعددة الأنماط ، ذات كتابة ثابتة ، ومترجمة . [ 9 ] صُممت وطُورت بواسطة فريق بقيادة أندرياس رومبف. تهدف نيم إلى أن تكون "فعّالة، ومعبرة، وأنيقة"، [ 10 ] وتدعم البرمجة الوصفية ، والبرمجة الوظيفية ، وتمرير الرسائل ، [ 11 ] والبرمجة الإجرائية ، والبرمجة كائنية التوجه . تتضمن نيم ميزات مثل توليد الكود في وقت الترجمة ، وأنواع البيانات الجبرية ، وواجهة وظائف خارجية (FFI) للتفاعل مع لغات C و C++ و Objective-C و JavaScript . كما تدعم الترجمة إلى هذه اللغات نفسها كتمثيلات وسيطة .
وصف
لغة Nim ذات كتابة ثابتة. [ 12 ] تدعم ميزات البرمجة الوصفية في وقت الترجمة ، مثل وحدات الماكرو النحوية ووحدات إعادة كتابة المصطلحات . [ 13 ] تُمكّن وحدات إعادة كتابة المصطلحات من تنفيذ تطبيقات المكتبات لهياكل البيانات الشائعة، مثل الأعداد الكبيرة والمصفوفات، بكفاءة وتكامل نحوي، كما لو كانت ميزات مُدمجة في اللغة. [ 14 ] تدعم Nim المُكرِّرات ويمكن استخدامها ككيانات من الدرجة الأولى، [ 13 ] وكذلك الدوال، مما يسمح باستخدام أساليب البرمجة الوظيفية . كما تدعم البرمجة كائنية التوجه من خلال الوراثة والإرسال المتعدد . يمكن أن تكون الدوال عامة ومُحمَّلة بشكل زائد، ويتم تعزيز الدوال العامة بشكل أكبر من خلال دعم Nim لفئات الأنواع . كما تدعم Nim تحميل المعاملات الزائد . [ 13 ] تتضمن لغة Nim استراتيجيات متعددة قابلة للتعديل لإدارة الذاكرة، بما في ذلك تتبع جمع البيانات المهملة ، وعدّ المراجع ، والأنظمة اليدوية بالكامل ، مع كون الإعداد الافتراضي هو عدّ المراجع الحتمي مع تحسينات عبر دلالات النقل وجمع الدورات عبر حذف التجارب. [ 15 ]
[Nim] ... يقدم تصميمًا أصليًا للغاية يجمع بين لغتي باسكال وبايثون ويتم تجميعه إلى كود C أو جافا سكريبت. [ 16 ]
— أندرو بينستوك، رئيس تحرير مجلة دكتور دوبز ، 2014
اعتبارًا من أغسطس 2023 ، يتم تجميع Nim إلى C و C++ و JavaScript و Objective-C، [ 17 ] و LLVM. [ 18 ]
تاريخ
| فرع | إصدار | تاريخ الإصدار [ 19 ] |
|---|---|---|
| 0.x | غير مدعوم: 0.10.2 | 2014-12-29 |
| غير مدعوم: 0.11.2 | 2015-05-04 | |
| غير مدعوم: 0.12.0 | 2015-10-27 | |
| غير مدعوم: 0.13.0 | 2016-01-18 | |
| غير مدعوم: 0.14.2 | 2016-06-09 | |
| غير مدعوم: 0.15.2 | 2016-10-23 | |
| غير مدعوم: 0.16.0 | 2017-01-08 | |
| غير مدعوم: 0.17.2 | 2017-09-07 | |
| غير مدعوم: 0.18.0 | 2018-03-01 | |
| غير مدعوم: 0.19.6 | 2019-05-13 | |
| غير مدعوم: 0.20.2 | 2019-06-17 | |
| 1.0 | غير مدعوم: 1.0.0 | 2019-09-23 |
| غير مدعوم: 1.0.10 | 2020-10-27 | |
| 1.2 | غير مدعوم: 1.2.0 | 2020-04-03 |
| غير مدعوم: 1.2.18 | 2022-02-09 | |
| 1.4 | غير مدعوم: 1.4.0 | 2020-10-16 |
| غير مدعوم: 1.4.8 | 2021-05-25 | |
| 1.6 | غير مدعوم: 1.6.0 | 2021-10-19 |
| غير مدعوم: 1.6.20 | 2024-04-16 | |
| 2.0 | غير مدعوم: 2.0.0 | 2023-08-01 |
| الإصدار المدعوم: 2.0.16 | 2025-04-22 | |
| 2.2 | غير مدعوم: 2.2.0 | 2024-10-02 |
| أحدث إصدار: 2.2.10 | 2026-04-24 | |
أسطورة: غير مدعوم مدعوم أحدث إصدار نسخة معاينة الإصدار المستقبلي | ||
| لكل فرع من فروع الإصدار 0.x، يتم عرض أحدث إصدار فرعي فقط. أما بالنسبة للفروع اللاحقة، فيتم عرض أول إصدار فرعي وأحدث إصدار فرعي. | ||
أندرياس رومبف هو مصمم ومطور لغة نيم الأصلية. حصل على دبلوم في علوم الحاسوب من جامعة كايزرسلاوترن التقنية في ألمانيا . تشمل اهتماماته البحثية أنظمة الوقت الحقيقي الصارمة ، والأنظمة المدمجة ، وبناء المترجمات ، والذكاء الاصطناعي . [ 20 ]
بدأ تطوير برنامج نيم الأولي في عام 2005 تحت اسم نمرود، وتم نشره للجمهور في عام 2008. [ 21 ] : 4-11
كُتبت النسخة الأولى من مُترجم لغة نيم بلغة باسكال باستخدام مُترجم فري باسكال . [ 22 ] وفي عام 2008، صدرت نسخة من المُترجم مكتوبة بلغة نيم. [ 23 ] المُترجم برنامج مجاني ومفتوح المصدر ، ويجري تطويره بواسطة مجتمع من المتطوعين بالتعاون مع أندرياس رومبف. [ 24 ] أُعيد تسمية اللغة رسميًا من نمرود إلى نيم مع إصدار النسخة 0.10.2 في ديسمبر 2014. [ 25 ] وفي 23 سبتمبر 2019، صدرت النسخة 1.0 من نيم، مما يدل على نضوج اللغة ومجموعة أدواتها. وفي 1 أغسطس 2023، صدرت النسخة 2.0 من نيم، مما يدل على اكتمال نموذج ذاكرة ARC/ORC واستقراره والتحول إليه. [ 26 ]
تصميم اللغة
بناء الجملة
يشبه بناء جملة Nim بناء جملة Python . [ 27 ] يتم تحديد كتل التعليمات البرمجية والعبارات المتداخلة باستخدام المسافات البيضاء ، وفقًا لقاعدة التداخل . العديد من الكلمات المفتاحية مطابقة لنظيراتها في Python، وهي في الغالب كلمات مفتاحية إنجليزية، بينما تستخدم لغات البرمجة الأخرى علامات الترقيم. بهدف التفوق على اللغات التي أثرت فيها، وعلى الرغم من أن Nim تدعم بناء الجملة القائم على المسافة البادئة مثل Python، إلا أنها أضافت مرونة إضافية. على سبيل المثال، قد تمتد عبارة واحدة على عدة أسطر إذا كانت الفاصلة أو عامل التشغيل الثنائي في نهاية كل سطر. كما تدعم Nim عوامل التشغيل التي يُعرّفها المستخدم.
على عكس بايثون، تُطبّق لغة نيم نظام الكتابة الثابتة (الأصلي). يُتيح نظام أنواع نيم سهولة تحويل الأنواع ، والتحويل بين الأنواع، كما يُوفّر صيغةً للبرمجة العامة. وتُوفّر نيم بشكلٍ خاص فئات أنواع يُمكنها أن تُمثّل أنواعًا مُتعددة، كما تُوفّر العديد من هذه الفئات بشكلٍ افتراضي. تُتيح فئات الأنواع التعامل مع أنواع مُتعددة كما لو كانت نوعًا واحدًا. على سبيل المثال:
openarray- يمثل مصفوفات بأحجام وتسلسلات وسلاسل نصية مختلفةSomeSignedInt– يمثل جميع أنواع الأعداد الصحيحة الموقعةSomeInteger– يمثل جميع أنواع الأعداد الصحيحة، سواء كانت ذات إشارة أم لاSomeOrdinal- يمثل جميع الأنواع الأساسية القابلة للعد والترتيب، باستثناء الأعداد غير الصحيحة
يوضح نموذج التعليمات البرمجية هذا استخدام فئات الأنواع في لغة Nim:
# لنُعرّف دالةً تأخذ أي نوع من الأرقام وتعرض ضعفه # في لغة Nim، تُسمى الدوال ذات التأثير الجانبي "proc" proc timesTwo ( i : SomeNumber ) = echo i * 2# لنكتب دالة أخرى تأخذ أي نوع ترتيبي، وتعيد # ضعف المدخل بنوعه الأصلي، إذا كان عددًا؛ # أو تعيد المدخل نفسه في غير ذلك. # نستخدم النوع العام Type(T)، ونحدد أنه لا يمكن أن يكون إلا ترتيبيًا func twiceIfIsNumber [ T : SomeOrdinal ] ( i : T ): T = when T is SomeNumber : # `when` هي `if` يتم تقييمها أثناء وقت الترجمة result = i * 2 # يمكنك أيضًا كتابة `return i * 2` else : # إذا لم يكن الترتيبي عددًا، فسيتم تحويله إلى عدد صحيح، # ثم ضربه في اثنين، ثم إعادة تحويله إلى نوعه الأصلي result = ( i . int * 2 ). TechotwiceIfIsNumber(67)# Passes an int to the functionecho twiceIfIsNumber(67u8) # Passes an uint8echotwiceIfIsNumber(true)# Passes a bool (Which is also an Ordinal)
تأثير
بحسب مبتكر اللغة، تم تصميم لغة نيم لدمج أفضل أجزاء نظام الكتابة في لغة آدا، ومرونة لغة بايثون ، ونظام الماكرو القوي في لغة ليسب . [ 28 ]
تأثرت لغة نيم بخصائص محددة للغات الموجودة، بما في ذلك ما يلي:
- Modula-3 : المؤشرات المتعقبة مقابل المؤشرات غير المتعقبة
- لغة أوبجكت باسكال : مجموعات بتات آمنة من حيث النوع ( مجموعة من الأحرف )، وبنية جملة الحالة، وأسماء أنواع وأسماء ملفات متنوعة في المكتبة القياسية
- لغة أدا : أنواع النطاقات الفرعية، والأنواع المميزة، والمتغيرات الآمنة - كائنات الحالة
- لغة C++ : تحميل المعاملات الزائدة ، البرمجة العامة
- بايثون : قاعدة التسلل
- لغة ليسب : نظام الماكرو ، معالجة شجرة بناء الجملة المجردة ، التماثل الأيقوني
- أوبرون : علامة التصدير
- لغة سي شارب : async/await ، وحدات ماكرو لامدا
- ParaSail : البرمجة بدون مؤشرات [ 8 ]
صيغة استدعاء الدالة الموحدة
يدعم Nim بناء جملة استدعاء الوظائف الموحد (UFCS) [ 29 ] ومساواة المعرفات، مما يوفر درجة كبيرة من المرونة في الاستخدام.
على سبيل المثال، كل سطر من هذه الأسطر يطبع "hello world" ، ولكن بصيغة مختلفة:
echo "hello world" echo ( "hello world" ) "hello world" . echo () "hello world" . echo echo ( "hello" , " world" ) "hello" . echo ( " world" ) "hello" . echo " world"تساوي المعرف
لغة Nim غير حساسة تقريبًا لأسلوب الكتابة؛ يُعتبر مُعرّفان متساويين إذا اختلفا فقط في حالة الأحرف الكبيرة والصغيرة والشرطات السفلية، طالما أن الأحرف الأولى متطابقة. هذا يُتيح استخدام أنماط كتابة مُختلفة في المكتبات: يُمكن لمُستخدم كتابة مكتبة باستخدام نمط snake_case، ويُمكن لمُستخدم آخر استخدامها بنمط camelCase دون أي مشكلة. [ 30 ]
const useHttps = true assert useHttps == useHttps assert useHTTPS == useHttps assert use_https == useHttpsالإيقاف
تتيح خاصية "التحديد" استخدام أي اسم للمتغيرات أو الدوال، حتى لو كانت هذه الأسماء كلمات محجوزة أو كلمات مفتاحية. مثال على ذلك هو إمكانية تعريف متغير باسم `<اسم المتغير>` ifدون التعارض مع الكلمة المفتاحية `<اسم المتغير if>`. يتم تحقيق ذلك في لغة Nim باستخدام علامات التنصيص المائلة (```)، مما يسمح باستخدام أي كلمة محجوزة كمعرّف. [ 31 ]
النوع Type = كائن ` int` : عدد صحيحlet ` object` = Type ( ` int` : 9 ) assert ` object` is Type assert ` object`.`int` == 9var ` var ` = 42 Let ` Let ` = 8 أجزم ` var ` + ` Let ` == 50const ` assert ` = true assert ` assert `المترجم
يُصدر مُصرّف Nim افتراضيًا شيفرة C سريعة ومُحسّنة . ويُؤجل عملية تحويل الشيفرة إلى كائن إلى مُصرّف C خارجي [ 32 ] للاستفادة من تحسينات المُصرّفات الحالية وقابلية النقل. يدعم Nim العديد من مُصرّفات C، بما في ذلك Clang و Microsoft Visual C++ (MSVC) و MinGW و GNU Compiler Collection (GCC). كما يُمكن لمُصرّف Nim إصدار شيفرة C++ و Objective-C و JavaScript لتسهيل التفاعل مع واجهات برمجة التطبيقات ( APIs ) المكتوبة بهذه اللغات؛ [ 9 ] حيث يُمكن للمطورين ببساطة الكتابة بلغة Nim، ثم تحويلها إلى أي لغة مدعومة. وهذا يُتيح أيضًا كتابة تطبيقات لأنظمة iOS و Android . يوجد أيضًا نظام LLVM خلفي غير رسمي، مما يسمح باستخدام مُصرّف Nim بشكل مُستقل. [ 18 ]
مُصرّف لغة نيم مُستضاف ذاتيًا ، أي أنه مكتوب بلغة نيم. [ 33 ] يدعم المُصرّف الترجمة المتقاطعة، لذا فهو قادر على ترجمة البرامج لأي نظام تشغيل مدعوم، بغض النظر عن جهاز التطوير. يُعدّ هذا مفيدًا لترجمة التطبيقات للأنظمة المُدمجة، وللبنى الحاسوبية غير الشائعة والنادرة.
خيارات المُترجم
يُنشئ مُصرّف لغة Nim افتراضيًا نسخة تصحيح الأخطاء . [ 34 ] وباستخدام هذا الخيار ، يُمكن إنشاء -d:releaseنسخة إصدار مُحسّنة للسرعة وتحتوي على عدد أقل من عمليات التحقق أثناء التشغيل. [ 34 ] وباستخدام هذا الخيار، -d:dangerيُمكن تعطيل جميع عمليات التحقق أثناء التشغيل، إذا رُغِبَ في تحقيق أقصى سرعة. [ 34 ]
إدارة الذاكرة
يدعم Nim استراتيجيات متعددة لإدارة الذاكرة، بما في ذلك ما يلي: [ 35 ]
--mm:arc– يوفر نظام العد المرجعي التلقائي (ARC) مع تحسينات دلالات النقل ، كومة مشتركة. كما يوفر أداءً حتميًا تمامًا للأنظمة ذات الوقت الحقيقي الصارم. [ 36 ] قد تتسبب دورات المراجع في تسرب الذاكرة: ويمكن معالجة ذلك عن طريق إضافة{.acyclic.}تعليقات توضيحية يدوية إلى التعليمات البرمجية أو باستخدام--mm:orc...--mm:orc– نفس الشيء--mm:arcولكن مع إضافة جامع دورات (الرمز "O") يعتمد على "حذف تجريبي". [ 37 ] يقوم جامع الدورات بتحليل الأنواع فقط إذا كانت قابلة للدورية.--mm:refc– جامع قمامة قياسي يعتمد على عد المراجع المؤجل مع جامع قمامة احتياطي بسيط يعتمد على وضع العلامات والمسح لجمع الدورات. تكون أكوام البيانات محلية لكل خيط.--mm:markAndSweep– جامع قمامة بسيط يعتمد على تقنية التحديد والمسح . تكون أكوام البيانات محلية لكل خيط.--mm:boehm– جامع القمامة القائم على نموذج بوهم ، فهو يوفر كومة مشتركة.--mm:go– جامع البيانات المهملة في لغة Go ، وهو مفيد للتوافق مع لغة Go . يوفر كومة مشتركة.--mm:none– لا توجد استراتيجية لإدارة الذاكرة ولا جامع قمامة . ببساطة، لا يتم تحرير الذاكرة المخصصة أبدًا، إلا إذا تم تحريرها يدويًا بواسطة كود المطور.
اعتبارًا من Nim 2.0، فإن ORC هو جامع البيانات المهملة الافتراضي. [ 26 ]
أدوات التطوير
حزمة
تتضمن حزمة تثبيت Nim العديد من الأدوات، بما في ذلك:
رشيق
Nimble هو مدير الحزم القياسي الذي يستخدمه Nim لتغليف وحدات Nim البرمجية. [ 38 ] طُوّر في البداية بواسطة دومينيك بيشيتا، وهو أيضًا مطور أساسي في Nim. أُدرج Nimble كمدير الحزم الرسمي لـ Nim منذ 27 أكتوبر 2015، مع إصدار v0.12.0. [ 39 ]
تُعرَّف حزم Nimble بواسطة .nimbleملفات تحتوي على معلومات حول إصدار الحزمة، والمؤلف، والترخيص، والوصف، والتبعيات، وغير ذلك. [ 21 ] : 132 تدعم هذه الملفات مجموعة فرعية محدودة من صيغة Nim تُسمى NimScript، ويتمثل القيد الرئيسي في الوصول إلى واجهة FFI. تسمح هذه البرامج النصية بتغيير إجراءات الاختبار، أو كتابة مهام مخصصة.
تُخزَّن قائمة الحزم في ملف JSON (تدوين كائنات جافا سكريبت ) متاح مجانًا في مستودع nim-lang/packages على GitHub. يوفر هذا الملف لـ Nimble ربطًا بين أسماء الحزم وعناوين URL الخاصة بمستودعات Git أو Mercurial الخاصة بها.
يأتي برنامج Nimble مزودًا بمترجم Nim. لذا، يُمكن اختبار بيئة Nimble بتشغيل الأمر التالي: nimble -v. سيكشف هذا الأمر عن رقم الإصدار، وتاريخ ووقت التجميع، ورمز Git الخاص بـ Nimble. يستخدم Nimble حزمة Git، والتي يجب أن تكون متاحة لكي يعمل البرنامج بشكل صحيح. تُستخدم واجهة سطر أوامر Nimble لتثبيت حزم الوحدات النمطية وإزالتها (إلغاء تثبيتها) وترقيتها. [ 21 ] : 130-131
c2nim
c2nim هو مُترجم من المصدر إلى المصدر (مُترجم تحويلي أو مُترجم مُحوّل) مُصمم للاستخدام مع رؤوس C / C++ للمساعدة في إنشاء روابط Nim جديدة. [ 40 ] الناتج هو كود Nim قابل للقراءة البشرية، يُفترض تعديله يدويًا بعد عملية الترجمة.
كوتش
koch عبارة عن برنامج نصي للصيانة يُستخدم لبناء Nim، وتوفير وثائق HTML. [ 41 ]
نيمغريب
nimgrep أداة عامة لمعالجة النصوص. تُستخدم للبحث عن التعبيرات النمطية، وأنماط الربط، ومحتويات المجلدات، ويمكن استخدامها لاستبدال المهام. أُدرجت هذه الأداة للمساعدة في البحث عن مُعرّفات Nim غير الحساسة للنمط. [ 42 ]
nimsuggest
nimsuggest هي أداة تساعد أي محرر شفرة مصدرية على الاستعلام عن .nimملف مصدري للحصول على معلومات مفيدة مثل تعريف الرموز أو اقتراحات الإكمال. [ 43 ]
نيمينست
niminst هي أداة لإنشاء برنامج تثبيت لبرنامج Nim. [ 44 ] تقوم بإنشاء برامج تثبيت .msi لنظام التشغيل Windows عبر Inno Setup، وبرامج نصية للتثبيت والإزالة لأنظمة Linux و macOS و Berkeley Software Distribution (BSD).
نيمبريتي
nimpretty هو أداة لتنسيق شفرة المصدر، تُستخدم لتنسيق الشفرة وفقًا لدليل أسلوب Nim الرسمي. [ 45 ]
الوصية
Testament هو برنامج متقدم لتشغيل اختبارات الوحدات تلقائيًا في لغة Nim. يُستخدم في تطوير تطبيقات Nim، ويوفر اختبارات عزل العمليات، ويُنشئ إحصائيات حول حالات الاختبار، ويدعم أهدافًا متعددة ومحاكاة التشغيل الجاف، ويحتوي على سجلات، ويمكنه إنشاء تقارير HTML، ويمكنه تخطي الاختبارات من ملف، وغير ذلك الكثير.
أدوات أخرى جديرة بالذكر
تتضمن بعض الأدوات البارزة غير المضمنة في توزيعة Nim ما يلي:
اخترني
طُوِّر برنامج choosenim بواسطة دومينيك بيشيتا، مبتكر مدير حزم Nimble، كأداة تُمكّن من تثبيت واستخدام إصدارات متعددة من مُصرِّف Nim. يقوم البرنامج بتنزيل أي إصدار مستقر أو تجريبي من مُصرِّف Nim من سطر الأوامر، مما يُسهِّل التبديل بينها. [ 46 ]
نيمبي
nimpy هي مكتبة تتيح دمج لغة بايثون بسهولة في برامج Nim. [ 47 ]
عابث
مكتبة pixie هي مكتبة رسومات ثنائية الأبعاد غنية بالميزات، تشبه مكتبة Cairo أو Skia . تستخدم تسريع SIMD لتسريع معالجة الصور بشكل كبير. تدعم العديد من تنسيقات الصور، والمزج، والإخفاء، والتمويه، ويمكن دمجها مع مكتبة boxy لإجراء عرض مُسرّع بواسطة الأجهزة.
نيمتيروب
nimterop هي أداة تركز على أتمتة إنشاء أغلفة C/C++ اللازمة لواجهة الوظائف الخارجية في Nim. [ 48 ]
المكتبات
مكتبات نقية/غير نقية
المكتبات النقية هي وحدات مكتوبة بلغة Nim فقط. وهي لا تتضمن أي أغلفة للوصول إلى المكتبات المكتوبة بلغات برمجة أخرى.
المكتبات غير النقية هي وحدات من كود Nim تعتمد على مكتبات خارجية مكتوبة بلغات برمجة أخرى مثل C.
المكتبة القياسية
تتضمن مكتبة Nim القياسية وحدات لجميع المهام الأساسية، بما في ذلك: [ 49 ]
- النظام والوحدات الأساسية
- المجموعات والخوارزميات
- معالجة السلاسل النصية
- إدارة الوقت
- خدمات أنظمة التشغيل العامة
- مكتبات الرياضيات
- بروتوكولات الإنترنت والدعم
- عملية ربط الخيوط
- المحللات
- دوكوتيلز
- معالجة XML
- مولد أكواد XML و HTML
- التجزئة
- دعم قواعد البيانات (PostgreSQL وMySQL وSQLite)
- برامج التغليف (واجهة برمجة تطبيقات Win32، POSIX)
استخدام مكتبات أخرى
يمكن لبرنامج Nim استخدام أي مكتبة يمكن استخدامها في برامج C أو C++ أو JavaScript. تتوفر روابط لغوية للعديد من المكتبات، بما في ذلك GTK ، [ 50 ] [ 51 ] وQt QML، [ 52 ] وwxWidgets ، [ 53 ] وSDL 2 ، [ 54 ] [ 55 ] وRaylib ، [ 56 ] وGodot ، [ 57 ] وUE5 ، [ 58 ] وCairo ، [ 59 ] وOpenGL ، [ 60 ] و Vulkan ، [ 61 ] و Windows API (WinAPI)، [ 62 ] وzlib و libzip و OpenSSL و cURL . [ 63 ] يعمل Nim مع قواعد البيانات PostgreSQL و MySQL و SQLite .
توجد أدوات مفتوحة المصدر، بدرجات دعم متفاوتة، يمكن استخدامها لربط لغة Nim بلغات Lua ، [ 64 ] وJulia ، [ 65 ] و Rust ، [ 66 ] و C# ، [ 67 ] و Python ، [ 68 ] أو لتحويل Nim إلى TypeScript . [ 69 ]
أمثلة
مرحبا بالعالم
برنامج "Hello, World!" في لغة Nim:
echo ( "Hello, World!" ) # يمكن استدعاء الإجراءات بدون أقواس echo "Hello, World!"يمكن تحقيق نسخة أخرى من "Hello World" عن طريق استدعاء الدالة writeباستخدام stdoutالتدفق:
stdout.write ( "Hello, World! \n " ) write ( stdout , " Hello , World! \n " )فيبوناتشي
العديد من تطبيقات دالة فيبوناتشي ، والتي تعرض عمليات الإرجاع الضمنية، والمعاملات الافتراضية، والمكررات، والتكرار، وحلقات while:
proc fib ( n : Natural ): Natural = if n < 2 : return n else : return fib ( n - 1 ) + fib ( n - 2 ) func fib2 ( n : int , a = 0 , b = 1 ): int = if n == 0 : a else : fib2 ( n - 1 , b , a + b ) iterator fib3 : int = var a = 0 var b = 1 while true : yield a swap a , b b += aمضروب
برنامج لحساب مضروب عدد صحيح موجب باستخدام الأسلوب التكراري، مع عرض معالجة الأخطاء باستخدام try/catch وحلقات for:
استيراد std / strutilsvar n = 0 try : stdout . write "أدخل عددًا صحيحًا موجبًا: " n = stdin . readline . parseInt except ValueError : raise newException ( ValueError , "يجب عليك إدخال عدد موجب" )var fact = 1 for i in 2 .. n : fact = fact * iصدى الحقائقباستخدام وحدة الرياضيات من المكتبة القياسية للغة Nim:
استيراد std / math echo fac ( x )عكس سلسلة نصية
عرض توضيحي بسيط يُبين متغير النتيجة الضمني واستخدام المُكرِّرات.
proc reverse ( s : string ): string = for i in countdown ( s . high , 0 ): result . add s [ i ]let str1 = "اعكس هذا!" echo "معكوس: " , reverse ( str1 )من أبرز ميزات لغة Nim المتغير الضمني result. فكل إجراء في Nim ذي نوع إرجاع غير فارغ (void) يحتوي على متغير نتيجة ضمني يُمثل القيمة المراد إرجاعها. في حلقة for، نرى استدعاءً لمتغير countdownمُكرِّر. إذا لم يُحدد مُكرِّر، سيحاول المُصرِّف استخدام itemsمُكرِّر افتراضي، إن وُجد مُكرِّر مُعرَّف للنوع المُحدد.
واجهة المستخدم الرسومية
استخدام GTK 3 مع فحص GObject من خلال وحدة gintro :
استيراد gintro /[ gtk , glib , gobject , gio ]proc appActivate ( app : Application ) = let window = newApplicationWindow ( app ) window.title = " تطبيق GTK3 مع فحص كائنات Go " window.defaultSize = ( 400 , 400 ) showAll ( window )proc main = let app = newApplication ( "org.gtk.example" ) connect ( app , "activate" , appActivate ) discard run ( app )رئيسي ()يتطلب هذا الكود وحدة gintro للعمل، وهي غير مضمنة في المكتبة القياسية. لتثبيت وحدة gintro والعديد من الوحدات الأخرى، يمكنك استخدام أداة nimble، المتوفرة ضمن بيئة Nim. لتثبيت وحدة gintro باستخدام nimble، اتبع الخطوات التالية:
تثبيت gintro السريع
نماذج البرمجة
البرمجة الوظيفية
يدعم Nim البرمجة الوظيفية من خلال الدوال من الدرجة الأولى، وكتابة التعليمات البرمجية دون آثار جانبية عبر التوجيه noSideEffectالبرمجي أو funcالكلمة المفتاحية. [ 70 ] سيُجري Nim تحليلًا للآثار الجانبية ، وسيُصدر أخطاءً أثناء الترجمة للتعليمات البرمجية التي لا تلتزم بشرط عدم إنتاج آثار جانبية عند ترجمتها باستخدام الميزة التجريبية strictFuncs، والمُخطط لها أن تُصبح الميزة الافتراضية في الإصدارات اللاحقة. [ 71 ]
على عكس لغات البرمجة الوظيفية البحتة، فإن Nim هي لغة برمجة متعددة الأنماط ، لذا فإن قيود البرمجة الوظيفية اختيارية على أساس كل وظيفة على حدة.
وظائف من الدرجة الأولى
يدعم Nim الدوال من الدرجة الأولى من خلال السماح بتخزين الدوال في متغيرات أو تمريرها بشكل مجهول كمعاملات لاستدعائها بواسطة دوال أخرى. [ 72 ] توفر الوحدة std/sugarالنمطية اختصارًا برمجيًا للدوال المجهولة في تعريفات الأنواع وإنشاء الكائنات.
استيراد std /[ sequutils , sugar ]let powersOfTwo = @[ 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 ]proc filter [ T ] ( s : openArray [ T ] , pred : T- > bool ) : seq [ T ] = result = newSeq [ T ] ( ) for i in 0 .. < s.len : if pred ( s [ i ] ) : result.add ( s [ i ] )echo powersOfTwo.filter ( proc ( x : int ): bool = x > 32 ) # اختصار برمجي لما سبق، مُقدم كدالة ماكرو من std / sugar echo powersOfTwo.filter ( x = > x > 32 )proc greaterThan32 ( x : int ): bool = x > 32 echo powersOfTwo . filter ( greaterThan32 )تأثيرات جانبية
يتم فحص الآثار الجانبية للدوال المُعَلَّمة بـ noSideEffectpragma، وسيرفض المُصرِّف تجميع الدوال التي لا تستوفي هذه الشروط. تشمل الآثار الجانبية في Nim التغيير، والوصول إلى الحالة العامة أو تعديلها، والتعليمات البرمجية غير المتزامنة، والتعليمات البرمجية متعددة الخيوط، والإدخال/الإخراج. قد يحدث تغيير في المعاملات للدوال التي تأخذ معاملات من النوع varأو refالنوع: من المتوقع أن يفشل هذا في التجميع مع الإصدار التجريبي الحالي strictFuncsفي المستقبل. [ 73 ] تُقدِّم الكلمة funcالمفتاحية اختصارًا لـ noSideEffectpragma. [ 74 ]
funcbinarySearch[T](a:openArray[T];elem:T):int
- اختصار لـ...
procbinarySearch[T](a:openArray[T];elem:T):int{.noSideEffect.} {.experimental: "strictFuncs".}typeNode=refobjectle,ri:Nodedata:stringfunclen(n:Node):int=# صالح: ليس للطول آثار جانبيةvarit=nwhileit!=nil:incresultit=it.rifuncmut(n:Node)=letm=n# is the statement that connected the mutation to the parameterm.data="yeah"# the mutation is here# Error: 'mut' can have side effects# an object reachable from 'n' is potentially mutated
تركيب الدوال
يسمح بناء جملة استدعاء الدوال الموحد بتسلسل الدوال العشوائية ، ولعل أفضل مثال على ذلك هو std/sequtilsالمكتبة. [ 75 ]
استيراد std /[ sequutils , sugar ]let numbers = @[ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ] # a و b مُعرّفان خاصان في ماكرو foldr echo numbers . filter ( x => x > 3 ). deduplicate . foldr ( a + b ) # 30أنواع البيانات الجبرية ومطابقة الأنماط
تدعم لغة Nim أنواع المنتجات عبر objectالنوع، وأنواع الجمع عبر متغيرات الكائنات : وهي تمثيلات أولية للاتحادات الموسومة ، مع وسم نوع مُعدّد يجب مطابقته بأمان قبل الوصول إلى حقول المتغيرات. [ 76 ] يمكن تركيب هذه الأنواع جبريًا . تتوفر مطابقة الأنماط الهيكلية ، ولكنها تقتصر على وحدات الماكرو في مكتبات خارجية مختلفة. [ 77 ]
استيراد std / tablesنوع القيمة = uint64 المعرف = سلسلة نصية نوع التعبير = تعداد حرفي ، متغير ، تجريد ، تطبيق التعبير = كائن مرجعي نوع الحالة : نوع التعبير من حرفي : معرف الحرفي : قيمة المتغير : معرف المتغير : معرف التجريد : معرف المعامل : معرف الدالة : تعبير التطبيق : تطبيق الدالة ، تطبيق الوسيطة : تعبيردالة eval ( expr : Expr , context : var Table [ Ident , Value ] ) : Value = case expr.kind of Literal : return expr.litIdent of Variable : return context [ expr.varIdent ] of Application : case expr.funcApp.kind of Abstraction : context [ expr.funcApp.paramAbs ] = expr.argApp.eval ( context ) return expr.funcAbs.eval ( context ) else : raise newException ( ValueError , " تعبير غير صالح ! " ) else : raise newException ( ValueError , " تعبير غير صالح ! " )البرمجة الكائنية التوجه
على الرغم من كونها لغة برمجة إجرائية ووظيفية في المقام الأول، إلا أن لغة نيم تدعم العديد من الميزات لتمكين نماذج البرمجة الكائنية التوجه. [ 78 ] [ 79 ]
التصنيف الفرعي والوراثة
تدعم لغة Nim التوريث المحدود باستخدام الكلمة المفتاحية ref objects`and` of. [ 79 ] ولتمكين التوريث، يجب أن يرث أي كائن ابتدائي ("root") من RootObj`. يُعدّ استخدام التوريث محدودًا ضمن شيفرة Nim الاصطلاحية، باستثناء الاستثناءات. [ 80 ]
نوع الحيوان = كائن مرجعي من RootObj، الاسم : سلسلة نصية، العمر : عدد صحيح، نوع الكلب = كائن مرجعي من الحيوان ، نوع القط = كائن مرجعي من الحيوانvar animals : seq [ Animal ] = @[] animals . add ( Dog ( name : "Sparky" , age : 10 )) animals . add ( Cat ( name : "Mitten" , age : 10 ))بالنسبة لـ a في الحيوانات : تأكيد على حيوانيمكن أيضًا الاستعلام عن علاقات التصنيف الفرعي باستخدام ofالكلمة المفتاحية. [ 79 ]
استدعاءات الأساليب والتغليف
تُمكّن صيغة استدعاء الدوال الموحدة في لغة Nim من استدعاء الدوال العادية بصيغة مشابهة لاستدعاءات الدوال في لغات البرمجة الأخرى. وهذا ينطبق على دوال الوصول (getters)، كما توفر Nim صيغة لإنشاء دوال التعيين (setters) أيضًا. ويمكن جعل الكائنات عامة على أساس كل حقل على حدة، مما يوفر إمكانية التغليف.
نوع Socket * = مرجع كائن المضيف : عدد صحيح # خاص، يفتقر إلى علامة التصدير# دالة جلب عنوان المضيف proc host * ( s : Socket ): int = s . host# مُعيِّن عنوان المضيف proc `host=` * ( s : var Socket , value : int ) = s . host = valuevar s : Socket new s assert s . host == 0 # نفس host(s), s.host() s . host = 34 # نفس `host=`(s, 34)الإرسال الديناميكي
يُفضّل استخدام الإرسال الثابت ، فهو أكثر كفاءةً ومعيارياً حتى بين الإجراءات التي تبدو كطرق. [ 79 ] ومع ذلك، إذا رُغِبَ في الإرسال الديناميكي، فإن لغة Nim توفر methodالكلمة المفتاحية لتمكين الإرسال الديناميكي على أنواع المراجع.
استيراد std / strformatنوع الشخص = كائن مرجعي من RootObj، الاسم : سلسلة نصية، الطالب = كائن مرجعي من الشخص ، المعلم = كائن مرجعي من الشخصmethod define ( a : Person ) = raise newException ( CatchableError , "Method without implementation override" )method introduction ( a : Student ) = echo & "أنا طالب اسمه {a.name}!"method introduction ( a : Teacher ) = echo & "أنا معلم/ة اسمي {a.name}!" let people : seq [ Person ] = @[ Teacher ( name : "Alice" ), Student ( name : "Bob" ) ] for person in people : person . introduction ()البرمجة الوصفية
القوالب
يدعم Nim الاستبدال البسيط في شجرة بناء الجملة المجردة عبر قوالبه.
template genType ( name , fieldname : untyped , fieldtype : typedesc ) = type name = object fieldname : fieldtypegenType ( Test , foo , int )var x = Test ( foo : 4566 ) echo ( x . foo ) # 4566يتم استدعاء هذا genTypeفي وقت الترجمة ويتم Testإنشاء نوع.
الأدوية الجنيسة
يدعم Nim البرمجة العامة المقيدة وغير المقيدة. يمكن استخدام الأنواع العامة في الإجراءات والقوالب والماكرو. Tتُعرَّف مُعرِّفات الأنواع العامة غير المقيدة (في هذا المثال) بعد اسم الروتين بين قوسين مربعين. يمكن وضع الأنواع العامة المقيدة على مُعرِّفات الأنواع العامة، أو مباشرةً على المعاملات.
proc addThese [ T ] ( a , b : T ): T = a + b echo addThese ( 1 , 2 ) # 3 (من نوع int) echo addThese ( uint8 1 , uint8 2 ) # 3 (من نوع uint8)# لا نريد المخاطرة بطرح أعداد غير مُوقَّعة! proc subtractThese [ T : SomeSignedInt | float ] ( a , b : T ): T = a - b echo subtractThese ( 1 , 2 ) # -1 (من نوع int)استيراد std / sequtils# يمكن أيضًا استخدام الأنواع العامة المقيدة مباشرةً على المعاملات. proc compareThese [ T ] ( a , b : string | seq [ T ] ): bool = for ( i , j ) in zip ( a , b ): if i != j : return falseيمكن توضيح أنواع البيانات التي سيقبلها الإجراء بشكل أكبر عن طريق تحديد فئة النوع (في المثال أعلاه، SomeSignedInt). [ 81 ]
وحدات الماكرو
يمكن للماكرو إعادة كتابة أجزاء من الكود أثناء وقت الترجمة. تتميز ماكرو Nim بقوتها وقدرتها على العمل على شجرة بناء الجملة المجردة قبل أو بعد التحقق الدلالي. [ 82 ]
إليك مثال بسيط يقوم بإنشاء ماكرو لاستدعاء التعليمات البرمجية مرتين:
استيراد وحدات الماكرو القياسيةmacro twice ( arg : untyped ): untyped = result = quote do : ` arg ` ` arg `يردد مرتين عبارة "مرحباً بالعالم!" يأخذ الماكرو twiceفي هذا المثال عبارة echo على شكل شجرة بناء جملة مجردة كمدخل. في هذا المثال، قررنا إعادة هذه الشجرة دون أي تعديلات عليها. لكننا نكرر ذلك مرتين، ومن هنا جاء اسم الماكرو. والنتيجة هي أن الماكرو يعيد كتابة الكود ليصبح كما يلي عند وقت الترجمة:
صدى "مرحباً بالعالم!" صدى "مرحباً بالعالم!"واجهة الوظائف الخارجية (FFI)
تُستخدم واجهة البرامج الخارجية (FFI) في لغة Nim لاستدعاء الدوال المكتوبة بلغات البرمجة الأخرى التي يمكن ترجمتها إليها. هذا يعني إمكانية استخدام المكتبات المكتوبة بلغات C وC++ وObjective-C وJavaScript في شفرة مصدر Nim. تجدر الإشارة إلى أنه لا يمكن دمج مكتبات JavaScript مع مكتبات C أو C++ أو Objective-C في البرنامج نفسه، نظرًا لاختلاف توافقها مع JavaScript. فكل من C++ وObjective-C مبنيتان على لغة C ومتوافقتان معها، بينما JavaScript غير متوافقة معها، كونها لغة ديناميكية تعمل من جانب العميل على الويب. [ 21 ] : 226
يوضح البرنامج التالي مدى سهولة استخدام كود C الخارجي مباشرة في Nim.
proc printf ( formatstr : cstring ) {.header : "<stdio.h>", varargs.}printf ( "%s %d \n " , "foo" , 5 )في هذا الكود، printfيتم استيراد الدالة إلى Nim ثم استخدامها.
مثال أساسي باستخدام 'console.log' مباشرةً كهدف لتجميع جافا سكريبت :
proc log ( args : any ) {.importjs : "console.log(@)", varargs.} log ( 42 , "z" , true , 3.14 )يمكن تنفيذ كود جافا سكريبت الذي ينتجه مترجم Nim باستخدام Node.js أو متصفح الويب.
التوازي
لتفعيل دعم الخيوط في لغة Nim، يجب تجميع البرنامج باستخدام --threads:onوسيط سطر الأوامر. لكل خيط كومة منفصلة تُدار بواسطة جامع البيانات المهملة، ويتم تقييد مشاركة الذاكرة، مما يُحسّن الكفاءة ويمنع حدوث حالات التزامن بين الخيوط.
استيراد std / locksvar thr : array [ 0 .. 4 , Thread [ tuple [ a , b : int ]]] L : Lockproc threadFunc ( interval : tuple [ a , b : int ] ) {.thread.} = for i in interval . a .. interval . b : acquire ( L ) # قفل الإخراج القياسي echo i release ( L )initLock ( L )for i in 0 .. high ( thr ): createThread ( thr [ i ] , threadFunc , ( i * 10 , i * 10 + 5 )) joinThreads ( thr )تحتوي لغة Nim أيضًا على channelsوحدة نمطية تعمل على تبسيط تمرير البيانات بين الخيوط.
استيراد std / osنوع مهمة الحساب = كائن معرف * : عدد صحيح بيانات * : عدد صحيحCalculationResult = object id * : int result * : intvar task_queue : Channel [ CalculationTask ] var result_queue : Channel [ CalculationResult ]proc workerFunc () {.thread.} = result_queue . open ()بينما صحيح : var task = task_queue.recv ( ) result_queue.send ( CalculationResult ( id : task.id , result : task.data * 2 ) )var workerThread : Thread [ void ] createThread ( workerThread , workerFunc )task_queue.open ( ) task_queue.send ( CalculationTask ( id : 1 , data : 13 ) ) task_queue.send ( CalculationTask ( id : 2 , data : 37 ) )بينما صحيح : اطبع "تم الحصول على النتيجة: " , repr ( result_queue.recv ( ) )التزامن
يدعم النظام الإدخال والإخراج غير المتزامن إما عبر asyncdispatchالوحدة النمطية في المكتبة القياسية أو chronosالمكتبة الخارجية. [ 83 ] تُضيف كلتا المكتبتين صيغة async/await عبر نظام الماكرو، دون الحاجة إلى دعم لغوي خاص. مثال على خادم HTTP غير متزامن :
import std /[ asynchttpserver , asyncdispatch ] # يمكن أيضًا استخدام chronos بدلاً من asyncdispatch، # بدون أي تغييرات أخرى.var server = newAsyncHttpServer ( ) proc cb ( req : Request ) {.async.} = await req.respond ( Http200 , "Hello World " )waitFor server.serve ( Port ( 8080 ) , cb )مجتمع
متصل
تتمتع لغة نيم بمجتمع نشط على منتداها الرسمي المُستضاف ذاتيًا والمُطور ذاتيًا. [ 84 ] علاوة على ذلك، يستخدم المشروع مستودع Git، ونظام تتبع الأخطاء، ونظام تتبع طلبات التعليقات، وويكي مُستضاف على GitHub ، حيث يتفاعل المجتمع مع اللغة. [ 85 ] كما توجد غرف دردشة رسمية عبر الإنترنت، مُرتبطة بشبكات IRC و Matrix و Discord و Gitter و Telegram . [ 86 ]
الاتفاقيات
عُقد مؤتمر Nim الأول، NimConf، في 20 يونيو 2020. ونظرًا لجائحة كوفيد-19 ، عُقد المؤتمر رقميًا ، مع دعوة مفتوحة للمساهمين لتقديم عروضهم التقديمية على شكل فيديوهات على يوتيوب . [ 87 ] بدأ المؤتمر بعروض تعريفية بلغة Nim قدمها مطوراها أندرياس رومبف ودومينيك بيشيتا. وشملت مواضيع العروض التقديمية أطر عمل الويب، وتطوير تطبيقات الجوال ، وأجهزة إنترنت الأشياء ، وتطوير الألعاب ، بما في ذلك عرض تقديمي حول كتابة Nim لجهاز Game Boy Advance . [ 88 ] يتوفر NimConf 2020 كقائمة تشغيل على يوتيوب. [ 89 ] وفي العام التالي، عُقد مؤتمر NimConf 2021 رقميًا أيضًا، وتضمن عروضًا تقديمية حول تطوير الألعاب ، وبيئات التفاعل التفاعلية (REPLs) ، وأنظمة التشغيل في الوقت الحقيقي ، واستخدام Nim في الصناعة، ورسم خرائط الكائنات العلائقية (ORM)، واختبار البرمجيات العشوائي (fuzzing )، وتصميم اللغة ، ومكتبات الرسومات . [ 90 ]
إلى جانب المؤتمرات الرسمية، عُرضت لغة Nim في العديد من المؤتمرات الأخرى. فقد قُدِّم عرضٌ تقديميٌّ عنها في مؤتمر O'Reilly Open Source Convention (OSCON) عام 2015. [ 91 ] [ 92 ] [ 93 ] ومثّل أربعة متحدثين لغة Nim في مؤتمر FOSDEM 2020، بمن فيهم مبتكر اللغة، أندرياس رومبف. [ 94 ] وفي مؤتمر FOSDEM 2022، استضافت Nim قاعة مطورين خاصة بها افتراضيًا بسبب جائحة كوفيد-19 . [ 95 ] وتناولت المحاضرات مواضيع التزامن ، والبرمجة المدمجة ، والبرمجة لوحدات معالجة الرسومات ، وأنظمة الكيانات والمكونات ، وتطوير الألعاب ، ومحركات القواعد ، والتوافق مع لغة بايثون ، والبرمجة الوصفية . [ 96 ]
انظر أيضاً
مراجع
- ↑ "المساهمون في nim-lang/Nim" . GitHub . تم الاطلاع عليه بتاريخ 23-03-2022 .
- ↑ "الإصدار 2.2.10" . 24-04-2026 . تم الاطلاع عليه بتاريخ 24-04-2026 .
- ↑ "Nim by example" . GitHub . تم الاسترجاع في 20 يوليو 2014 .
- ^ كاراجوف ، زاخاري. ستانيميروف ، بوريسلاف (2014). البرمجة الفوقية مع نمرود . VarnaConf (باللغة البلغارية) . تم الاسترجاع 2014/07/27 .
- ↑ "Packaging Nim" . تم الاطلاع عليه بتاريخ 23-03-2022 .
- ↑ "تثبيت Nim" . تم الاطلاع عليه بتاريخ 12-10-2018 .
- ↑ "copying.txt" . GitHub .
- 1 2 رومبف، أندرياس (19-10-2017). "نيم بدون جي سي" . تأملات عرق . تم الاسترجاع في 1-9-2020 .
- 1 2 رومبف، أندرياس (11 فبراير 2014). "نمرود: لغة برمجة أنظمة جديدة" . مجلة دكتور دوبز . تم الاطلاع عليه بتاريخ 20 يوليو 2014 .
- ↑ "لغة برمجة نيم" . Nim-lang.org . تم الاطلاع عليه بتاريخ 20 يوليو 2014 .
- ↑ "الأسئلة الشائعة" . nim-lang.org . تم الاطلاع عليه بتاريخ 27-03-2015 .
- ^ كيرر ، هارون (اكيهرير) (2015/01/05). "بناء جملة نيم" . جيثب . تم الاسترجاع 2015/01/05 .
- 1 2 3 "دليل لغة نيم" . Nim-lang.org . تم الاطلاع عليه بتاريخ 20 يوليو 2014 .
- ↑ "عرض تقديمي لـ Strangeloop Nim" . مؤرشف من الأصل بتاريخ 13 يوليو 2014. تم الاطلاع عليه بتاريخ 30 أبريل 2015 .
- ↑ "إدارة الذاكرة في لغة نيم" . nim-lang.org . تم الاطلاع عليه بتاريخ 17 أغسطس 2023 .
- ↑ بينستوك، أندرو (2014-01-07). "صعود وسقوط اللغات في عام 2013" . مجلة دكتور دوب . تم الاطلاع عليه بتاريخ 2018-10-08 .
- ↑ دليل مستخدم مُجمِّع لغة نيم
- 1 2 سيكا، جاسيك (18/07/2020)، arnetheduck/nlvm ، استرجاعها 2020/07/21
- ↑ "إصدارات نيم" . مشروع نيم . تم الاسترجاع في 26 يناير 2020 .
- ↑ أندرياس رومبف. إتقان لغة البرمجة نيم: دليل شامل للغة البرمجة .
- 1 2 3 4 بيشيتا، دومينيك (2017). نيم في العمل . منشورات مانينغ. ISBN 978-1617293436.
- ↑ "مصادر Nim Pascal" . GitHub . تم الاسترجاع في 2013-04-05 .
- ↑ "الأخبار" . Nim-lang.org . مؤرشف من الأصل بتاريخ 26-06-2016 . تم الاطلاع عليه بتاريخ 11-06-2016 .
- ↑ "المساهمون" . جيت هاب . تم الاسترجاع في 2013-04-05 .
- ↑ بيشيتا، دومينيك (29-12-2014). "إصدار 0.10.2" . Nim-lang.org . تم الاطلاع عليه بتاريخ 17-10-2018 .
- 1 2 "تم إصدار Nim v2.0" . لغة برمجة Nim . تم الاطلاع عليه بتاريخ 17 أغسطس 2023 .
- ↑ يغولالب، سردار (16 يناير 2017). "لغة نيم تستمد أفضل ما في لغات بايثون، وراست، وجو، وليسب" . إنفوورلد .
- ↑ مقابلة مع أندرياس رومبف، مبتكر لغة نيم ، 9 مارس 2020 ، تم الاطلاع عليها بتاريخ 15 أكتوبر 2023
- ↑ "دليل لغة نيم: صيغة استدعاء الدوال" . تم الاطلاع عليه بتاريخ 12-10-2018 .
- ↑ "دليل لغة نيم: مساواة المعرفات" . nim-lang.org . تم الاطلاع عليه بتاريخ 17-08-2023 .
- ↑ بيشيتا، دومينيك (dom96)؛ ويذرفوردشاير، بيلينجسلي (fowlmouth)؛ فيلسينج، دينيس (def-)؛ راف، هانز (oderwat)؛ دان، كريستوفر (cdunn2001)؛ wizzardx (2017-10-25). "نصائح وحيل" . جيت هاب . تم الاسترجاع في 2018-10-17 .
{{cite web}}: صيانة CS1: الأسماء الرقمية: قائمة المؤلفين ( رابط ) - ↑ رومبف، أندرياس (15 يناير 2014). نمرود: منهج جديد للبرمجة الوصفية . إنفو كيو . حدث في تمام الساعة 2:23 . تم الاطلاع عليه بتاريخ 20 يوليو 2014 .
- ↑ رومبف، أندرياس (12 أكتوبر 2018). "تجميع لغة نيم" . جيت هاب . تم الاسترجاع في 17 أكتوبر 2018 .
- 1 2 3 "دليل مستخدم مترجم Nim" .
- ↑ "إدارة الذاكرة في لغة نيم" . nim-lang.org . تم الاطلاع عليه بتاريخ 28-07-2024 .
- ↑ "مقدمة إلى ARC/ORC في لغة Nim" . لغة برمجة Nim . تم الاطلاع عليه بتاريخ 17 أغسطس 2023 .
- ^ "ORC - خوارزميات Vorsprung durch" . لغة البرمجة نيم . تم الاسترجاع 2023-08-17 .
- ↑ "Nimble" . GitHub . تم الاسترجاع في 12-10-2018 .
- ↑ "إصدار Nim v0.12.0" . GitHub . تم الاطلاع عليه بتاريخ 28-11-2020 .
- ↑ "c2nim" . GitHub . تم الاسترجاع في 12-10-2018 .
- ↑ "برنامج صيانة Nim" . nim-lang.org . تم الاطلاع عليه بتاريخ 16-11-2021 .
- ↑ "دليل مستخدم nimgrep" . nim-lang.org . تم الاطلاع عليه بتاريخ 16-11-2021 .
- ↑ "دليل دمج بيئة تطوير Nim المتكاملة" . nim-lang.org . تم الاطلاع عليه بتاريخ 16-11-2021 .
- ↑ "دليل مستخدم niminst" . nim-lang.org . تم الاطلاع عليه بتاريخ 16-11-2021 .
- ↑ "الأدوات المتاحة مع لغة Nim" . nim-lang.org . ١٩ أكتوبر ٢٠٢١. مؤرشف من الأصل بتاريخ ٩ مايو ٢٠١٥. تم الاطلاع عليه بتاريخ ١٨ فبراير ٢٠٢٢ .
- ↑ "choosenim" . GitHub . تم الاسترجاع في 12-10-2018 .
- ^ غلوخوف، يوري (12/11/2021)، نيمبي ، استرجاعها 2021/11/16
- ↑ نيمتيروب / نيمتيروب ، نيمتيروب، 12-11-2021 ، تم استرجاعه بتاريخ 16-11-2021
- ↑ مكتبة نيم القياسية
- ↑ التثبيت ، لغة برمجة Nim، 25-09-2021 ، تم الاطلاع عليه بتاريخ 16-11-2021
- ↑ ستيفان ساليفسكي (15 نوفمبر 2021)، روابط GTK4 وGTK3 عالية المستوى للغة البرمجة Nim ، تم الاطلاع عليه بتاريخ 16 نوفمبر 2021
- ↑ "NimQml" . GitHub . 2022-11-10.
- ↑ "WxNim" . GitHub . 2022-11-29.
- ↑ SDL2 للغة Nim ، لغة برمجة Nim، 26 أكتوبر 2021 ، تاريخ الاطلاع 16 نوفمبر 2021
- ^ أراباجي ، فلاديمير (15/11/2021)، sdl2_nim 2.0.14.2 ، استرجاعها 2021/11/16
- ↑ "naylib" . GitHub . 2024-07-28.
- ↑ "godot-nim" . GitHub . 2024-07-28.
- ↑ "NimForUE" . GitHub . 2024-07-28.
- ↑ القاهرة ، لغة برمجة نيم، 5 أكتوبر 2021 ، تاريخ الاطلاع 16 نوفمبر 2021
- ↑ أوبن جي إل ، لغة برمجة نيم، ١٤ نوفمبر ٢٠٢١ ، تم الاطلاع عليه بتاريخ ١٦ نوفمبر ٢٠٢١
- ↑ "Vulkan" . GitHub . 2024-07-28.
- ↑ وارد (15-11-2021)، وينيم ، تم الاطلاع عليه بتاريخ 16-11-2021
- ↑ "مكتبة نيم القياسية" . وثائق نيم . مؤرشفة من الأصل بتاريخ 2015-04-06 . تم الاطلاع عليها بتاريخ 2015-04-04 .
- ^ ليم ، أندري (جانجكو) (2018-10-17). " نيم لوا " . جيثب . تم الاسترجاع 2018/10/17 .
- ^ "نيمجل" . جيثب . 2022-08-24.
- ↑ "Nbindgen" . GitHub . 2022-11-17.
- ↑ "cs2nim" . GitHub . 2022-10-10.
- ^ جلوخوف ، يوري (20/07/2020)، yglukhov/nimpy ، استرجاعها 2020/07/21
- ↑ "ts2nim" . GitHub . 2022-11-21.
- ↑ "دليل لغة نيم" . nim-lang.org . تم الاطلاع عليه بتاريخ 10-07-2021 .
- ↑ "منتدى نيم: تحديث حول الدوال الصارمة" . forum.nim-lang.org . تم الاطلاع عليه بتاريخ 17-08-2023 .
- ↑ "Nim by Example - First Class Functions" .
- ↑ "ميزات تجريبية في لغة نيم: الدوال الصارمة" .
- ↑ "دليل نيم: الوظائف" .
- ↑ "std/sequtils" . nim-lang.org . تم الاطلاع عليه بتاريخ 17-08-2023 .
- ↑ "دليل لغة نيم: متغيرات الكائنات" . nim-lang.org . تم الاطلاع عليه بتاريخ 17-08-2023 .
- ↑ "src/fusion/matching" . nim-lang.github.io . تم الاطلاع عليه بتاريخ 17-08-2023 .
- ↑ "دليل Nim (الجزء الثاني): البرمجة الكائنية التوجه" . nim-lang.org . تم الاطلاع عليه بتاريخ 17-08-2023 .
- 1 2 3 4 "Nim by Example - البرمجة الكائنية التوجه" . nim-by-example.github.io . تم الاطلاع عليه بتاريخ 17 أغسطس 2023 .
- ↑ "system/exceptions" . nim-lang.org . تم الاطلاع عليه بتاريخ 17-08-2023 .
- ↑ "دليل لغة نيم: فئات الأنواع" . nim-lang.org . تم الاطلاع عليه بتاريخ 21-07-2020 .
- ↑ "دليل لغة نيم (الجزء الثالث)" . nim-lang.org . تم الاطلاع عليه بتاريخ 17-08-2023 .
- ↑ كرونوس - مكتبة فعّالة للبرمجة غير المتزامنة ، الحالة، 14 أغسطس 2023 ، تاريخ الاسترجاع 17 أغسطس 2023
- ↑ "منتدى نيم" . nim-lang.org . تم الاطلاع عليه بتاريخ 2015-05-04 .
- ↑ "مستودع شفرة المصدر الأساسي ونظام تتبع الأخطاء" . جيت هاب . تم الاطلاع عليه بتاريخ 4 مايو 2015 .
- ↑ "المجتمع" . لغة برمجة نيم . تم الاسترجاع في 17 أغسطس 2023 .
- ↑ "مؤتمر نيم الإلكتروني 2020" . نيم . تم الاطلاع عليه بتاريخ 28-11-2020 .
- ↑ "NimConf 2020" . Nim . تم الاسترجاع في 17 أغسطس 2023 .
- ↑ "قائمة تشغيل مؤتمر NimConf 2020" . يوتيوب . تم الاطلاع عليه بتاريخ 28 نوفمبر 2020 .
- ↑ "مؤتمر نيم 2021" . مؤتمر نيم 2021. تم الاطلاع عليه بتاريخ 17 أغسطس 2023 .
- ↑ "نيم في مؤتمر أوسكون 2015" . مؤتمر أوريلي للمصادر المفتوحة (أوسكون) . أوريلي ميديا. 20 يوليو 2015. مؤرشف من الأصل في 6 أكتوبر 2015. تم الاطلاع عليه في 17 أكتوبر 2018 .
- ↑ رومبف، أندرياس؛ شوارتز، جيسون؛ هاريسون، مات. "اللغات الأساسية: نيم، سكالا، بايثون" . أورايلي . أورايلي ميديا . تم الاسترجاع في 17 أكتوبر 2018 .
- ^ رامف ، أندرياس (26/10/2015). OSCON 2015 - نيم: نظرة عامة . يوتيوب (فيديو) . تم الاسترجاع 2018/10/12 .
- ↑ "الفعاليات" . fosdem.org . تم الاطلاع عليه بتاريخ 17-02-2020 .
- ↑ "مطور لغة نيم في مؤتمر FOSDEM 2022 - دعوة للمشاركة" . لغة برمجة نيم . تم الاطلاع عليه بتاريخ 17 أغسطس 2023 .
- ↑ "Nim Programming Language devroom" . archive.fosdem.org . تم الاطلاع عليه بتاريخ 17-08-2023 .
روابط خارجية
- الموقع الرسمي

- Nim على GitHub
- معلومات حول لغة Nim على موقع Stack Overflow
- برمجة الحاسوب باستخدام لغة البرمجة Nim - مقدمة مبسطة بقلم ستيفان ساليفسكي
- برنامج 2008
- لغات البرمجة المتزامنة
- برامج متعددة المنصات
- اللغات الوظيفية
- لغات البرمجة متعددة الأنماط
- لغات البرمجة الإجرائية
- لغات البرمجة
- لغات البرمجة التي تم إنشاؤها في عام 2008
- برنامج مرخص بموجب ترخيص MIT
- مترجمات من المصدر إلى المصدر
- لغات البرمجة ذات الكتابة الثابتة
- لغات برمجة الأنظمة
- لغات برمجة ذات بنية قابلة للتوسيع
