Nim (programlama dili) - Nim (programming language) - Wikipedia

Nim
Nim-logo.png
Nim taç logosu
ParadigmalarÇoklu paradigma: derlenmiş, eşzamanlı, Prosedürel, Zorunlu, İşlevsel, Nesne odaklı
Tarafından tasarlandıAndreas Rumpf
İlk ortaya çıktı2008; 12 yıl önce (2008)
Kararlı sürüm
1.4.2[1] Bunu Vikiveri'de düzenleyin / 1 Aralık 2020; 16 gün önce (1 Aralık 2020)
Yazma disipliniStatik,[2] kuvvetli,[3] çıkarsanmış, yapısal
PlatformIA-32, x86-64
işletim sistemiÇapraz platform[4]
LisansMIT[5][6]
Dosya adı uzantıları.nim, .nims, .nimble
İnternet sitesinim-lang.org
Tarafından etkilenmiş
Ada, Modula-3, Lisp, C ++, Nesne Pascal, Python, Oberon

Nim bir zorunlu, genel amaçlı, çoklu paradigma, statik olarak yazılmış, sistemleri, derlenmiş programlama dili[7] tarafından tasarlanmış ve geliştirilmiştir Andreas Rumpf. "Etkili, etkileyici ve zarif" olacak şekilde tasarlanmıştır,[8] destekleyici metaprogramlama, işlevsel, ileti geçişi,[5] prosedürel, ve nesne yönelimli programlama gibi çeşitli özellikler sağlayarak Derleme zamanı kod üretimi, cebirsel veri türleri, bir yabancı işlev arabirimi (FFI) ile C, C ++, Amaç-C, ve JavaScript C, C ++ 'ya derlemeyi desteklemenin yanı sıra Amaç-C, ve JavaScript.

Açıklama

Nim, C kadar hızlı, Python kadar etkileyici ve Lisp kadar genişletilebilir bir dil olarak yaratıldı.

Nim statik olarak yazılmıştır.[9] Derleme süresini destekler metaprogramlama sözdizimsel makrolar gibi özellikler ve makroları yeniden yazma terimi.[10] Terim yeniden yazma makroları, bignumlar ve matrisler gibi ortak veri yapılarının kütüphane uygulamalarının, sanki yerleşik dil tesisleri gibi verimli bir şekilde uygulanmasını sağlar.[11] Yineleyiciler desteklenir ve birinci sınıf varlıklar olarak kullanılabilir,[10] işlevler, kullanımına izin veren fonksiyonel programlama yöntemler. Nesneye yönelik programlama aşağıdakiler tarafından desteklenir: miras ve çoklu gönderim. Fonksiyonlar genel olabilir, aşırı yüklenebilir ve jenerik Nim'in tür sınıfları için desteği ile daha da geliştirilmiştir. Operatör aşırı yükleme ayrıca desteklenmektedir.[10] Nim ayarlanabilir otomatik içerir çöp toplama ertelenmişe dayalı referans sayma ile döngü tespiti tamamen kapatılabilir.[12]

2014'te Andrew Binstock (baş editörü Dr. Dobb's Journal ) dedim:

"[Nim] ... çok özgün bir tasarım sunuyor. Pascal ve Python ve C koduna veya JavaScript'e derler. "[13]

Bugün Nim, C, C ++, JavaScript ve Objective-C için derleme yapmaktadır.

Tarih

SürümYayın tarihi[14]
Eski versiyon, artık desteklenmiyor: 0.10.22014-12-29
Eski versiyon, artık desteklenmiyor: 0.11.22015-05-04
Eski versiyon, artık desteklenmiyor: 0.12.02015-10-27
Eski versiyon, artık desteklenmiyor: 0.13.02016-01-18
Eski versiyon, artık desteklenmiyor: 0.14.22016-06-09
Eski versiyon, artık desteklenmiyor: 0.15.22016-10-23
Eski versiyon, artık desteklenmiyor: 0.16.02017-01-08
Eski versiyon, artık desteklenmiyor: 0.17.22017-09-07
Eski versiyon, artık desteklenmiyor: 0.18.02018-03-01
Eski versiyon, artık desteklenmiyor: 0.19.62019-05-13
Eski versiyon, artık desteklenmiyor: 0.20.22019-06-17
Eski versiyon, artık desteklenmiyor: 1.0.02019-09-23
Eski versiyon, artık desteklenmiyor: 1.0.22019-10-23
Eski versiyon, artık desteklenmiyor: 1.0.42019-11-26
Eski versiyon, artık desteklenmiyor: 1.0.62020-01-24
Eski versiyon, artık desteklenmiyor: 1.2.02020-04-03
Eski versiyon, artık desteklenmiyor: 1.2.22020-06-17
Eski versiyon, artık desteklenmiyor: 1.2.42020-06-27
Eski versiyon, artık desteklenmiyor: 1.2.62020-07-30
Eski versiyon, artık desteklenmiyor: 1.4.02020-10-16
Mevcut kararlı sürüm: 1.4.22020-12-01
Açıklama:
Eski versiyon
Eski sürüm, hala korunuyor
En son sürüm
En son önizleme sürümü
Gelecek sürüm
Her 0.x dalı için yalnızca en son sürüm sürümü listelenir.

Nim'in ilk geliştirmesine 2005 yılında Andreas Rumpf tarafından başlandı. Proje 2008'de kamuoyuna açıklandığında başlangıçta Nemrut olarak adlandırıldı.[15] Nim'in ilk versiyonu derleyici yazılmıştır Pascal kullanmak Ücretsiz Pascal derleyici.[16] 2008 yılında, derleyicinin Nim'de yazılmış bir sürümü yayınlandı.[17] Derleyici ücretsiz ve açık kaynaklı yazılım ve Andreas Rumpf ile çalışan bir gönüllüler topluluğu tarafından geliştirilmektedir.[18] Dil resmi olarak yeniden adlandırıldı Nemrut -e Nim Aralık 2014'te 0.10.2 sürümünün yayınlanmasıyla.[19] 23 Eylül 2019'da, dilin ve araç zincirinin olgunlaştığını gösteren Nim'in 1.0.0 sürümü yayınlandı.

Dil tasarımı

Sözdizimi

Nim'in sözdizimi, Python.[20] Kod blokları ve iç içe geçme ifadeleri, beyaz boşluk kullanımıyla tanımlanır. ofsayt kuralı. Birçok anahtar kelimeler Çoğunlukla İngilizce anahtar kelimeler olan Python eşdeğerleriyle aynıdır, oysa diğer programlama dilleri genellikle noktalama kullanır. Bu, Python kodlamadan Nim kodlamaya geçişi kolay ve ağrısız hale getirir. Nim, Python gibi girintiye dayalı sözdizimini desteklese de, etki dillerini geliştirme hedefi ile ek esneklik getirdi; virgül veya ikili operatör içeren ifadeleri sonraki satıra bölebilir. Ek olarak, Nim kullanıcı tanımlı operatörleri destekler.

Nim neredeyse tamamen stilden etkilenmez; iki tanımlayıcılar ilk karakterler aynı olduğu sürece, yalnızca büyük harf ve alt çizgi açısından farklılık gösteriyorsa eşit kabul edilir. Tarihsel olarak, Nim tamamen büyük / küçük harfe duyarlı değildi (bu, tanımlayıcıların büyük harf kullanımı ve alt çizgilerinin tamamen göz ardı edildiği anlamına geliyordu).[21]

Etkilemek

Nim, aşağıdakiler dahil, mevcut dillerin belirli özelliklerinden etkilenmiştir:

Tekdüzen İşlev Çağrısı Sözdizimi

Nim destekler Tekdüzen İşlev Çağrısı Sözdizimi (UFCS)[22] ve kullanımda büyük ölçüde esneklik sağlayan tanımlayıcı eşitliği.

Örneğin, bu satırların her biri aynı çağrıyı farklı sözdizimiyle yapar:

Eko "Selam Dünya"Eko("Selam Dünya")"Selam Dünya".Eko()"Selam Dünya".Eko"Merhaba".Eko("dünya")"Merhaba".Eko "dünya"

Tanımlayıcı Eşitliği

İlk harf dışında, Nim'deki tanımlayıcılar büyük / küçük harf duyarlı bir şekilde karşılaştırılır ve alt çizgiler göz ardı edilir.

Misal:

sabit useHttps = doğruiddia etmek useHttps == useHttpsiddia etmek kullanımHTTPS == useHttpsiddia etmek use_https == useHttps

Stropping

Stropping bir harf dizisini özel bir amaç için açıkça işaretleme yöntemidir. Stropping çoğu modern dilde kullanılmaz, çünkü anahtar kelimeler genellikle Ayrılmış kelimeler ve bu nedenle değişkenler veya işlevler için tanımlayıcılar olarak kullanılamaz. Stropping yöntemi, aynı harf dizisinin hem anahtar kelime hem de tanımlayıcı olarak kullanılmasına izin verir, bu da ayrıştırmayı basitleştirir ve daha fazla esneklik sağlar. Stropping'e bir örnek, adında bir değişken tanımlama yeteneğidir. Eğer, anahtar kelimeyle çakışmadan Eğer. Nim'in bunu uygulaması, herhangi bir ayrılmış sözcüğün bir tanımlayıcı olarak kullanılmasına izin veren ters işaretler aracılığıyla gerçekleştirilir.[23]

tip Tür = nesne  `int`: intİzin Vermek `nesne` = Tür(`int`: 9)iddia etmek `nesne` dır-dir Türiddia etmek `nesne`.`int` == 9var `var` = 42İzin Vermek `İzin Vermek` = 8iddia etmek `var` + `İzin Vermek` == 50sabit `iddia etmek` = doğruiddia etmek `iddia etmek`

Derleyici

Nim derleyicisi hızlı, optimize edilmiş çıktılar verir C varsayılan olarak kod. Harici bir C derleyicisine kod derlemeyi erteliyor[24] mevcut derleyici optimizasyonundan ve taşınabilirliğinden yararlanmak için. Birçok C derleyicisi desteklenir. Clang, ve GNU Derleyici Koleksiyonu (GCC). Nim derleyicisi ayrıca C ++, Amaç-C, ve JavaScript ile kolay arayüz oluşturmaya izin veren kod API'ler bu dillerde yazılmış;[7] geliştiriciler basitçe Nim'de yazabilir, ardından desteklenen herhangi bir dilde derleyebilir. Özellikle, bu aynı zamanda iOS ve Android. Resmi olmayan bir de var LLVM arka uç, Nim derleyicisinin bağımsız bir şekilde kullanılmasına izin verir.[25]

Nim derleyicisi kendi kendine barındırma yani Nim dilinde yazılmıştır.[26] Derleyici, çapraz derlemeyi destekler, böylece geliştirme makinesi ne olursa olsun desteklenen işletim sistemlerinden herhangi biri için yazılım derleyebilir. Bu, yaygın olmayan bilgisayar mimarilerinin yanı sıra gömülü sistemler için uygulamaları derlemek için kullanışlıdır.

Hız

Hız, Nim'in gelişiminin birincil hedefidir. Nim'in kolay ve anlamlı Python benzeri sözdizimine rağmen, kıyaslama testleri, dilin ne kadar rekabetçi bir şekilde çalıştığını gösterir. Çeşitli topluluk testlerinde Nim, Rust, Go ve Kotlin gibi hızlı olduğu için köklü bir üne sahip birçok dili geride bıraktı.[27][28][29] Dikkat çekici bir şekilde, Nim, C'nin hızıyla rekabet ediyor ve bir dizi kıyaslama testini daha hızlı uyguluyor.[30] Nim, neredeyse her örnekte, genellikle 300 saniyeden fazla olmak üzere büyük marjlarla Python'dan daha hızlı çalıştı. Önemli olan, bu kıyaslama testlerinin çoğunun derleme sırasında Nim'in optimizasyon bayraklarını bile kullanmadığını unutmayın.

Nim, bir projenin ana dili olmasa bile hız için kullanılabilir. Topluluk araçları, Python ve Nim arasında güçlü bir çalışma ilişkisine izin verdi; Python'da Nim betiklerini içe aktarmak için sarmalayıcılar vardır ve bunun tersi de geçerlidir.[31] Bu ilişki, Nim'in hızının, yerel Python modülleri yerine ithal edilen Nim modülleri biçiminde Python tarafından kullanılmasına izin verir.

Hızın çok önemli olduğu herhangi bir Nim kodunu geliştirirken, --opt: hızNim'in yeteneklerinin en temsilcisini çalıştırılabilir bir hale getirmek için bayrak kullanılır.[32]

Araçlar

Birlikte Verilen Araçlar

Aşağıdaki araçlar Nim yükleme paketiyle birlikte gelir:

Çevik

Çevik standarttır Paketleme yöneticisi Nim tarafından Nim modüllerini paketlemek için kullanılır.[33] Başlangıçta tarafından geliştirilmiştir Dominik Picheta, aynı zamanda çekirdek bir Nim geliştiricisi olan. Nimble, 27 Ekim 2015 v0.12.0 sürümünden bu yana Nim'in resmi paket yöneticisi olarak dahil edilmiştir.[34]

Çevik paketler şu şekilde tanımlanır: .çevik paket sürümü, yazar, lisans, açıklama, bağımlılıklar ve daha fazlası hakkında bilgi içeren dosyalar.[35] Bu dosyalar, NimScript adı verilen sınırlı bir Nim sözdizimi alt kümesini destekler; ana sınırlama, FFI'ya erişimdir. Bu komut dosyaları, test prosedürünün değiştirilmesine veya özel görevlerin yazılmasına izin verir.

Paketlerin listesi bir JSON GitHub'daki nim-lang / packages deposunda serbestçe erişilebilen dosya. Bu JSON dosyası, Nimble'a paketlerin adları ile Git veya Mercurial depo URL'leri arasında bir eşleme sağlar.

Nimble, Nim derleyicisiyle birlikte geldiğinden, aşağıdakileri çalıştırarak Nimble ortamını test etmek mümkündür:çevik -vBu komut sürüm numarasını, derleme tarihini ve saatini ve ayrıca nimble'ın git karmasını ortaya çıkaracaktır. Nimble, git Nimble'ın düzgün çalışması için mevcut olması gereken paket. Nimble komut satırı, modül paketlerini kurmak, kaldırmak (kaldırmak) ve yükseltmek / yamalamak için bir arayüz olarak kullanılır.[36]

c2nim

c2nim bir transcompiler / transpiler çevirerek yeni bağlar oluşturmaya yardımcı olan ANSI C Nim koduna kod.[37] Çıktı, çeviri işleminden sonra elle ince ayarlanması gereken, insan tarafından okunabilir Nim kodudur.

DrNim

DrNim Nim'de yazılan yazılımı doğrulamak ve doğrulamak için Nim derleyici Frontend'i Z3 prova motoru ile birleştiren bir araçtır. Nim, DrNim kaynak koduyla birlikte gelir, ancak yine Nim ile birlikte gelen Koch kullanılarak derleme gerektirir.

Koch

Nim'i oluşturmak ve HTML belgeleri sağlamak için kullanılan bir bakım betiği.

Nimgrep

Nimgrep metni işlemek için genel bir araçtır. Düzenli ifadeleri, peg kalıplarını ve dizinlerin içeriğini aramak için kullanılır ve görevleri değiştirmek için kullanılabilir.

Nimsuggest

Nimsuggest herhangi bir kaynak kodu düzenleyicisinin arama sorgusuna yardımcı olan bir araçtır. .nim sembollerin tanımı veya tamamlama önerileri gibi yararlı bilgiler elde etmek için kaynak dosyası.

Niminst

Niminst bir Nim programı için bir yükleyici oluşturmak için bir araçtır. Inno Setup aracılığıyla Windows için .msi yükleyicileri ve ayrıca Linux, Mac ve BSD için yükleme / kaldırma komut dosyaları oluşturur.

Nimpretty

Nimpretty, kodu resmi stil kılavuzuna göre biçimlendirmek için kullanılan bir Nim kaynak kodu güzelleştiricidir.

Ahit

Ahit Nim testleri için gelişmiş bir otomatik Unittests koşucusudur. Nim'in kendisinin geliştirilmesinde kullanılır, süreç izolasyon testleri sunar, test senaryoları hakkında istatistikler üretir, birden fazla hedefi ve simüle edilmiş Dry-Run'ları destekler, günlük kaydı vardır, HTML raporları oluşturabilir, bir dosyadan testleri atlayabilir ve daha fazlasını yapabilir.

Diğer Önemli Araçlar

Aşağıdakiler, Nim paketine dahil olmayan bazı önemli araçlardır:

Choosenim

Choosenim, Nimble paket yöneticisinin yaratıcısı Dominik Picheta tarafından, geliştiricilerin Nim derleyicisinin birden çok sürümünün kurulu olmasını sağlayan bir araç olarak geliştirildi. Choosenim, herhangi bir Nim kararlı veya geliştirme derleyici sürümünü komut satırından indirerek aralarında kolay geçiş sağlar.[38]

Nimfix

Nimfix, eski tarz Nimrod kodunu Nim koduna dönüştürmeye yardımcı olan bir araçtır.[39] Nimfix şu anda beta sürümündedir.[40]

pas2nim

pas2nim, Object Pascal'ı çevirmek için bir araçtır sarmalayıcılar Nim koduna.[41] pas2nim, Nim derleyicisinin orijinal Pascal kaynaklarını çevirmek için kullanıldığından, Nim'in zaman çizelgesinde önemli bir rol oynadı. Yalnızca Nim ile kolayca eşleşen şey desteklenir; Free Pascal, Delphi tarzı sınıflar, diğer bazı çevrilmesi zor özellikler gibi desteklenmez. 2020'nin sonlarından itibaren pas2nim'deki geliştirme ve bakım çoğunlukla durdu.

py2nim

py2nim, aktarma Python kodunu deyimsel Nim koduna dönüştürür.[42] Şu anda gelişimi durmuş durumda.

Standart Kitaplık

Nim standart kitaplığı, saf ve saf olmayan kitaplıklar olarak bilinen iki gruba ayrılabilir.

Saf Kitaplıklar

Yalnızca Nim ile yazılmış bir modül koleksiyonu, saf kitaplıklar, diğer programlama dillerinde yazılmış kitaplıklara erişmek için sarmalayıcılar içermez. Saf modüller, görevlerine bağlı olarak aşağıdakileri içeren alt gruplara ayrılabilir:

  • Çekirdek
  • Koleksiyonlar ve Algoritmalar
  • Dize İşleme
  • Genel İşletim Sistemi Hizmetleri
  • Matematik Kitaplıkları
  • İnternet Protokolleri
  • Ayrıştırıcılar

Saf Olmayan Kitaplıklar

C gibi diğer programlama dillerinde yazılan harici kitaplıklara bağlı olan Nim kodunun saf olmayan modülleri.

Kitaplıklar

Bir Nim programı herhangi bir kütüphane hangisinde kullanılabilir C, C ++ ve JavaScript programı. Dil bağlamaları dahil birçok kitaplık için mevcuttur GTK +, Qt QML,[43] wxWidgets,[44] SDL 2, Kahire, OpenGL, WinAPI, zlib, libzip, OpenSSL, Vulkan[45] ve cURL.[46] Nim ile çalışır PostgreSQL, MySQL ve SQLite veritabanları. Nim ile arayüz oluşturabilir Lua,[47] Julia,[48] Pas, paslanma,[49], C Keskin [50],TypeScript [51],ve Python[52] Programlama dilleri.

Örnekler

Selam Dünya

"Selam Dünya!" program Nim'de:

Eko("Selam Dünya!")# Prosedürler parantez olmadan çağrılabilirEko "Selam Dünya!"

"Merhaba Dünya" yapmanın başka bir versiyonu ...

standart çıkış.yazmak("Selam Dünya! n")

Faktöriyel

Hesaplama programı faktöryel yinelemeli yaklaşımı kullanarak pozitif bir tamsayı:

ithalat payandalarvar n = 0Deneyin:  standart çıkış.yazmak "Pozitif tam sayı girin:"  n = stdin.okuma satırı.parseIntdışında Değer Hatası:  yükseltmek newException(Değer Hatası, "Pozitif bir sayı girmelisiniz")var gerçek = 1için ben içinde 2..n:  gerçek = gerçek * benEko gerçek

Nim'in standart kütüphanesinden modül matematiğini kullanarak:

ithalat matematikEko fac(x)

Bir dizeyi ters çevirmek

Nim'in birçok özelliğini gösteren basit bir gösteri.

işlev tersine çevirmek(s: dizi): dizi =  için ben içinde geri sayım(s.yüksek, 0):    sonuç.Ekle s[ben]İzin Vermek str1 = "Bunu tersine çevirin!"Eko "Ters:", tersine çevirmek(str1)

Daha egzotik özelliklerden biri örtük sonuç değişken. Nim'deki geçersiz olmayan dönüş türüne sahip her yordam, döndürülecek değeri temsil eden örtük bir sonuç değişkenine sahiptir. For döngüsünde bir çağrı görüyoruz geri sayım bu bir yineleyicidir. Bir yineleyici atlanırsa, derleyici bir öğeler yineleyici, belirtilen tür için tanımlanmışsa.

Grafiksel kullanıcı arayüzü

Kullanma GTK3 gobject iç gözlemi ile gintro modül:

ithalat gintro/[gtk, glib, gobject, Gio]proc appActivate(uygulama: Uygulama) =  İzin Vermek pencere = newApplicationWindow(uygulama)  pencere.Başlık = "Gobject introspection ile GTK3 uygulaması"  pencere.defaultSize = (400, 400)  Hepsini Göster ↓(pencere)proc ana =  İzin Vermek uygulama = yeni uygulama("org.gtk.example")  bağlanmak(uygulama, "etkinleştir", appActivate)  atmak koşmak(uygulama)ana()

Bu kod, standart kitaplığın bir parçası olmayan gintro modülünün çalışmasını gerektirir. Gintro modülünü ve diğerlerini kurmak için, nim'in bir parçası olarak gelen nimble aracını kullanabilirsiniz. Gintro modülünü çevik bir şekilde kurmak için şunları yaparsınız:

çevik kurulum gintro

Programlama Paradigmaları

Nesneye Yönelik Programlama (OOP)

Metaprogramlama

Şablon

Bu, şablon olanaklarını kullanan Nim'de bir meta programlama örneğidir.

şablon genType(isim, alan adı: türlenmemiş, alan türü: typedesc) =  tip    isim = nesne      alan adı: alan türügenType(Ölçek, foo, int)var x = Ölçek(foo: 4566)Eko(x.foo) # 4566

genType derleme zamanında çağrılır ve bir Ölçek tür oluşturulur.

Genel

Jenerikler prosedürlerde, şablonlarda ve makrolarda kullanılabilir. Aşağıda görüldüğü gibi, proc isminden sonra köşeli parantez içinde tanımlanırlar.

proc addThese[T](a, b: T): T =  a + bEko addThese(1, 2) # 3 (int türünde)Eko addThese(uint8 1, uint8 2) # 3 (uint8 türünde)

İçinde addThese, T jenerik tür ise, derleyici, hem parametreler hem de dönüş değeri aynı türden olduğu sürece bu işlev için herhangi bir değeri kabul edecektir.

Bir tip sınıfı belirterek prosedürün hangi türleri kabul edeceği daha da açıklığa kavuşturulabilir.[53]

proc addTheseNumbers[T: Bazı Sayılar](a, b: T): T =  a + b

addTheseNumberso zaman yalnızca içinde bulunan türler için çalışacaktır. Bazı Sayılartoplam türü.

Makrolar

Makrolar, derlenmeden önce kodun parçalarını tam anlamıyla yeniden yazabilir. Nim makroları güçlüdür ve soyut sözdizimi ağacında birçok işlemi yapabilir.

İşte iki kez adlandırılan bir makro oluşturan basit bir örnek:

ithalat makrolarmakro iki defa(arg: türlenmemiş): türlenmemiş =  sonuç = alıntı yapmak:    `arg`    `arg`iki defa Eko "Selam Dünya!"

iki defa Bu örnekteki makrosu, yankı ifadesini bir soyut sözdizimi ağacı biçiminde girdi olarak alır. Bu örnekte, bu sözdizimi ağacına herhangi bir işlem uygulanmadan dönmeye karar verdik. Ama bunu iki kez yapıyoruz, dolayısıyla makronun adı. Sonuç, kodun derleme zamanında aşağıdaki kod gibi görünmesi için makro tarafından yeniden yazılmasıdır:

Eko "Selam Dünya!"Eko "Selam Dünya!"

Yabancı Fonksiyon Arayüzü (FFI)

Nim'in FFI'si, derleyebileceği diğer programlama dillerinde yazılmış fonksiyonları çağırmak için kullanılır. Bu, kütüphanelerin C, C ++, Objective-C ve JavaScript Nim kaynak kodunda kullanılabilir. Kişi her ikisinin de farkında olmalıdır JavaScript ve C, C ++ veya Objective-C kitaplıkları aynı programda birleştirilemez, çünkü bunlar JavaScript birbirleriyle oldukları gibi. Her ikisi de C ++ ve Amaç-C dayanır ve uyumludur C, ancak JavaScript dinamik, istemci tarafı web tabanlı bir dil olarak uyumsuzdur.[54]

Aşağıdaki program, harici C kodunun doğrudan Nim'de kullanılmasının kolaylığını göstermektedir.

proc printf(formatstr: cstring) {.başlık: "", Varargs.}printf("%SD n", "foo", 5)

Bu kodda printf işlev Nim'e aktarılır ve sonra kullanılır.

Doğrudan 'console.log' kullanan temel örnek JavaScript derleme hedefi:

proc günlük(argümanlar: hiç) {.importjs: "console.log (@)", Varargs.}günlük(42, "z", doğru, 3.14)

Nim derleyicisi tarafından üretilen JavaScript kodu ile çalıştırılabilir. Node.js veya bir web tarayıcısı.

Paralellik

Nim'de diş çekme desteğini etkinleştirmek için, bir program ile derlenmelidir. --threads: açık komut satırı argümanı. Her iş parçacığının ayrı bir çöp yığını vardır ve bellek paylaşımı kısıtlanır, bu da verimliliğe yardımcı olur ve iş parçacığı tarafından yarış koşullarını durdurur.

ithalat kilitlervar  th: dizi[0..4, Konu[demet[a,b: int]]]  L: Kilitproc threadFunc(Aralık: demet[a,b: int]) {.Konu.} =  için ben içinde Aralık.a..Aralık.b:    elde etmek(L) # kilit standart çıkışı    Eko ben    serbest bırakmak(L)initLock(L)için ben içinde 0..yüksek(th):  IP oluşurmak(th[ben], threadFunc, (ben*10, ben*10+5))joinThreads(th)

Nim ayrıca kanallar iş parçacıkları arasında veri geçişini kolaylaştıran modül.

ithalat işletim sistemitip  HesaplamaGörev = nesne    İD*: int    veri*: int  Hesaplama Sonuç = nesne    İD*: int    sonuç*: intvar task_queue: Kanal[HesaplamaGörev]var result_queue: Kanal[Hesaplama Sonuç]proc işçiFunc() {.Konu.} =  result_queue.açık()  süre doğru:    var görev = task_queue.recv()    result_queue.göndermek(Hesaplama Sonuç(İD: görev.İD, sonuç: görev.veri * 2))var işçi: Konu[geçersiz]IP oluşurmak(işçi, işçiFunc)task_queue.açık()task_queue.göndermek(HesaplamaGörev(İD: 1, veri: 13))task_queue.göndermek(HesaplamaGörev(İD: 2, veri: 37))süre doğru:  Eko "sonuç alındı:", repr(result_queue.recv())

Eşzamanlılık

Nim, asenkron IO'yu, asyncdispatch modül, ekler eşzamansız / bekleyin makro sistemi aracılığıyla sözdizimi. Eşzamansız bir örnek http sunucu:

ithalat eşzamansız, asyncdispatchvar sunucu = newAsyncHttpServer()proc cb(gerekli: İstek) {.eşzamansız.} =  beklemek gerekli.cevap vermek(Http200, "Selam Dünya")bekle sunucu.servis(Liman(8080), cb)

Nim Topluluğu

Nim, kendi kendine barındırılan, kendi geliştirdiği resmi forumda aktif bir topluluğa sahiptir.[55] Ek olarak, proje bir Git deposu, hata izleyici ve barındırılan wiki kullanır. GitHub topluluğun dil ile etkileşime girdiği yer.[56]

Sözleşmeler

İlk Nim konferansı NimConf, 20 Haziran 2020'de gerçekleştirildi. Konferans dijital olarak gerçekleştirildi. COVID-19, şeklinde katılımcı görüşmeleri için açık bir çağrı ile Youtube videolar.[57] Konferans, Nim geliştiricileri Andreas Rumpf ve Dominik Picheta'nın dil incelemeleriyle başladı. Sunum konuları arasında Nim web çerçeveleri hakkında konuşmalar, mobil geliştirme, IoT cihazlar ve oyun geliştirme için Nim yazmak hakkında bir konuşma dahil Game Boy Advance.[58] NimConf 2020, bir YouTube oynatma listesi olarak mevcuttur.[59]

Resmi konferanslara ek olarak, Nim çeşitli kongrelerde de yer aldı. Nim ile ilgili sunum yapıldı. O'Reilly Açık Kaynak Sözleşmesi (OSCON) 2015 yılında.[60][61][62] Dört konuşmacı Nim'i temsil etti FOSDEM 2020, dilin yaratıcısı Andreas Rumpf dahil.[63]

Ayrıca bakınız

Referanslar

  1. ^ "Sürüm 1.4.2". 1 Aralık 2020. Alındı 15 Aralık 2020.
  2. ^ "Örnek olarak Nim". GitHub. Alındı 2014-07-20.
  3. ^ Караджов, Захари; Станимиров, Борислав (2014). Метапрограмиране с Nemrut. VarnaConf (Bulgarca). Alındı 2014-07-27.
  4. ^ "Nim'i Yükle". Alındı 2018-10-12.
  5. ^ a b "SSS". Nim-lang.org. Alındı 2015-03-27.
  6. ^ "copying.txt". GitHub. Alındı 2015-03-27.
  7. ^ a b Rumpf Andreas (2014-02-11). "Nimrod: Yeni bir sistem programlama dili". Dr. Dobb's Journal. Alındı 2014-07-20.
  8. ^ "Nim Programlama Dili". Nim-lang.org. Alındı 2014-07-20.
  9. ^ Kehrer, Aaron (akehrer). "Nim Sözdizimi". GitHub. Alındı 2015-01-05.
  10. ^ a b c "Nim Kılavuzu". Nim-lang.org. Alındı 2014-07-20.
  11. ^ "Strangeloop Nim sunumu". Arşivlenen orijinal 2014-07-13 tarihinde. Alındı 2015-04-30.
  12. ^ "Nim'in Çöp Toplayıcı". Nim-lang.org. Alındı 2018-01-10.
  13. ^ Binstock, Andrew (2014/01/07). "2013'te Dillerin Yükselişi ve Düşüşü". Dr. Dobb's Journal. Alındı 2018-10-08.
  14. ^ "Nim Bültenleri". Nim Projesi. Alındı 2020-01-26.
  15. ^ Picheta, Dominik (2017). "1.1 Nim nedir?". Nim İş Başında. Manning Yayınları. ISBN  9781617293436.
  16. ^ "Nim Pascal Kaynakları". GitHub. Alındı 2013-04-05.
  17. ^ "Haberler". Nim-lang.org. Arşivlendi 2016-06-26 tarihinde orjinalinden. Alındı 2016-06-11.
  18. ^ "Katkıda Bulunanlar". GitHub. Alındı 2013-04-05.
  19. ^ Picheta, Dominik (2014-12-29). "Sürüm 0.10.2 yayınlandı". Nim-lang.org. Alındı 2018-10-17.
  20. ^ Yegulalp, Serdar (2017-01-16). "Nim dili Python, Rust, Go ve Lisp'in en iyilerinden alınmıştır". InfoWorld.
  21. ^ "Nim Kılavuzu". nim-lang.org. Alındı 2020-07-21.
  22. ^ "Nim Manual: Yöntem çağrısı sözdizimi". Alındı 2018-10-12.
  23. ^ Picheta Dominik (dom96); Wetherfordshire, Billingsly (fowlmouth); Felsing, Dennis (def-); Raaf, Hans (oderwat); Dunn, Christopher (cdunn2001); wizzardx (2017-10-25). "Ipuçları ve Püf noktaları". GitHub. Alındı 2018-10-17.
  24. ^ Rumpf Andreas (2014-01-15). Nemrut: Metaprogramlamaya Yeni Bir Yaklaşım. InfoQ. Etkinlik 2: 23'te gerçekleşir. Alındı 2014-07-20.
  25. ^ Sieka, Jacek (2020-07-18), arnetheduck / nlvm, alındı 2020-07-21
  26. ^ Rumpf Andreas (2018-10-12). "Nim Derleme". GitHub. Alındı 2018-10-17.
  27. ^ "Github'da en iyi dilleri kullanan Yinelemeli Fibonacci Benchmark". GitHub. Alındı 28 Kasım 2020.
  28. ^ "Karşılaştırmalar". GitHub. Alındı 28 Kasım 2020.
  29. ^ "Hız Testleri". GitHub. Alındı 28 Kasım 2020.
  30. ^ "Karşılaştırmalar". GitHub. Alındı 28 Kasım 2020.
  31. ^ "Nimpy". GitHub. Alındı 28 Kasım 2020.
  32. ^ "Nim Belgeleri: Komut Satırı Anahtarları". nim-lang. Alındı 28 Kasım 2020.
  33. ^ "Çevik". GitHub. Alındı 2018-10-12.
  34. ^ "Nim v0.12.0 sürümü". GitHub. Alındı 28 Kasım 2020.
  35. ^ Picheta, Dominik (2017). Nim İş Başında. Manning Yayınları. s. 132. ISBN  9781617293436.
  36. ^ Picheta, Dominik (2017). Nim İş Başında. Manning Yayınları. s. 130–131. ISBN  9781617293436.
  37. ^ "c2nim". GitHub. Alındı 2018-10-12.
  38. ^ "choosenim". GitHub. Alındı 2018-10-12.
  39. ^ "nimfix.nim". GitHub. Alındı 2018-10-12.
  40. ^ "nimfix.nim".
  41. ^ "pas2nim". GitHub. Alındı 2018-10-12.
  42. ^ "py2nim". GitHub. Alındı 2018-10-12.
  43. ^ "NimQml". GitHub.
  44. ^ "WxNim". GitHub.
  45. ^ "Vulkanim". GitHub.
  46. ^ "Nim Standart Kitaplığı". Nim belgeleri. Arşivlenen orijinal 2015-04-06 tarihinde. Alındı 2015-04-04.
  47. ^ Lim Andri (jangko) (2018-10-17). "nimLUA". GitHub. Alındı 2018-10-17.
  48. ^ "Nimjl". GitHub.
  49. ^ "Nbindgen". GitHub.
  50. ^ "cs2nim". GitHub.
  51. ^ "ts2nim". GitHub.
  52. ^ Glukhov, Yuriy (2020-07-20), yglukhov / nimpy, alındı 2020-07-21
  53. ^ "Nim Kılavuzu". nim-lang.org. Alındı 2020-07-21.
  54. ^ Picheta, Dominik (2017). Nim İş Başında. Manning Publishing. s. 226. ISBN  9781617293436.
  55. ^ "Nim Forum". nim-lang.org. Alındı 2015-05-04.
  56. ^ "Birincil kaynak kodu deposu ve hata izleyici". GitHub. Alındı 2015-05-04.
  57. ^ "Nim Çevrimiçi Konferansı 2020". Nim. Alındı 28 Kasım 2020.
  58. ^ "NimConf 2020". Nim. Alındı 28 Kasım 2020.
  59. ^ "NimConf 2020 Oynatma Listesi". Youtube. Alındı 28 Kasım 2020.
  60. ^ "OSCON 2015'te Nim". O'Reilly Açık Kaynak Sözleşmesi (OSCON). O'Reilly Media. 2015-07-20. Alındı 2018-10-17.
  61. ^ Rumpf, Andreas; Swartz, Jason; Harrison, Matt. "Temel Diller: Nim, Scala, Python". O’Reilly. O'Reilly Media. Alındı 2018-10-17.
  62. ^ Rumpf Andreas (2015-10-26). OSCON 2015 - Andreas Rumpf - Nim: Genel Bakış. Youtube (Video). Alındı 2018-10-12.
  63. ^ "Etkinlikler". fosdem.org. Alındı 2020-02-17.

Dış bağlantılar