Nim(プログラミング言語)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
ニム
Nim-logo.png
ニムクラウンのロゴ
パラダイムマルチパラダイムコンパイル済み並行手続き型命令型、機能型、オブジェクト指向
によって設計されたアンドレアス・ルンプ
デベロッパーニムラングチーム[1]
初登場2008 ; 14年前 (2008)
安定リリース
1.6.4 [1] ウィキデータでこれを編集する / 2022年2月9日; 21日前 (9 February 2022)
規律の入力静的[2] 強い[3] 推定構造的
範囲語彙
プラットホームIA-32x86-64ARMAarch64RISC-VPowerPC ... [2]
OSクロスプラットフォーム[4]
ライセンスMIT [5] [6]
ファイル名拡張子.nim、.nims、.nimble
Webサイトnim-lang .org
に影響を受けた
AdaModula-3LispC ++Object PascalPythonOberonRust [3]

Nimは、Andreas Rumpfの周りのチームによって設計および開発された、必須の、汎用のマルチパラダイムで、静的に型付けされた、システム コンパイルされたプログラミング言語です[7] 。Nimは、コンパイル時のコード生成、代数的データ型などのいくつかの機能を提供することにより、「効率的、表現力豊か、エレガント」であり、 [8]メタプログラミング機能メッセージパッシング[5] 手続き型、およびオブジェクト指向プログラミングスタイルをサポートするように設計されています。 CC ++Objective-C、およびJavaScriptを使用し、これらの同じ言語へのコンパイルをサポートする 外部関数インターフェイス(FFI) 。

説明

Nimは、Cと同じくらい高速で、Pythonと同じくらい表現力があり、 Lispと同じくらい拡張可能な言語になるように作成されました

Nimは静的に型付けされています。[9]構文マクロや項書き換えマクロなどのコンパイル時のメタプログラミング機能をサポートします。[10]項書き換えマクロを使用すると、bignumや行列などの一般的なデータ構造のライブラリ実装を、組み込みの言語機能であるかのように効率的に実装できます。[11]イテレータはサポートされており、ファーストクラスのエンティティとして使用できます。[10]関数として使用できるため、関数型プログラミングメソッドを使用できます。オブジェクト指向プログラミングは、継承多重ディスパッチによってサポートされています関数はジェネリックにすることができ、オーバーロードすることができ、ジェネリックはNimの型クラスのサポートによってさらに強化されます。演算子のオーバーロードもサポートされています。[10] Nimには、サイクル検出を備えた遅延参照カウントに基づく調整可能な自動ガベージコレクションが含まれています。これは完全にオフにすることもできます。[12]

[Nim] ... PascalPythonにまたがり、CコードまたはJavaScriptにコンパイルする最も独創的なデザインを紹介します。[13]

—  Andrew Binstock、 Dr。Dobb's Journalの編集長、2014年

2021年10月の時点で、NimはC、C ++、JavaScript、およびObjective-Cにコンパイルされます。[14]

歴史

ブランチ バージョン リリース日[15]
0.x Old version, no longer maintained: 0.10.2 2014-12-29
Old version, no longer maintained: 0.11.2 2015-05-04
Old version, no longer maintained: 0.12.0 2015-10-27
Old version, no longer maintained: 0.13.0 2016-01-18
Old version, no longer maintained: 0.14.2 2016-06-09
Old version, no longer maintained: 0.15.2 2016-10-23
Old version, no longer maintained: 0.16.0 2017-01-08
Old version, no longer maintained: 0.17.2 2017-09-07
Old version, no longer maintained: 0.18.0 2018-03-01
Old version, no longer maintained: 0.19.6 2019-05-13
Old version, no longer maintained: 0.20.2 2019-06-17
1.0 Old version, no longer maintained: 1.0.0 2019-09-23
Older version, yet still maintained: 1.0.10 2020-10-27
1.2 Old version, no longer maintained: 1.2.0 2020-04-03
Older version, yet still maintained: 1.2.18 2022-02-09
1.4 Old version, no longer maintained: 1.4.0 2020-10-16
Older version, yet still maintained: 1.4.8 2021-05-25
1.6 Old version, no longer maintained: 1.6.0 2021-10-19
Current stable version: 1.6.4 2022-02-09
伝説:
古いバージョン
古いバージョン、まだ維持されています
最新バージョン
Latest preview version
Future release
0.xブランチごとに、最新のポイントリリースのみが一覧表示されます。
それ以降のブランチでは、最初と最新のポイントリリースが一覧表示されます。

Nimの最初の開発は、AndreasRumpfによって2005年に開始されました。プロジェクトが2008年に公開されたとき、元々はNimrodという名前でした。[16] :4–11  Nimコンパイラの最初のバージョンは、FreePascalコンパイラを使用してPascalで作成されまし[17] 2008年に、Nimで記述されたコンパイラのバージョンがリリースされました。[18]コンパイラは無料のオープンソースソフトウェアであり、AndreasRumpfと協力しているボランティアのコミュニティによって開発されています。[19]この言語は、2014年12月にバージョン0.10.2がリリースされ、正式にNimrodからNimに名前が変更されました。 [20]2019年9月23日に、バージョン1.0.0のNimがリリースされました。これは、言語とそのツールチェーンの成熟を意味します。

言語デザイン

構文

Nimの構文はPythonの構文に似ています[21]コード​​ブロックとネストステートメントは、オフサイドルールに従って空白を使用して識別されます。多くのキーワードはPythonの同等のキーワードと同じであり、ほとんどが英語のキーワードですが、他のプログラミング言語では通常句読点が使用されます。NimはPythonのようなインデントベースの構文をサポートしていますが、影響言語を改善することを目的として、追加の柔軟性を導入しました。次の行にコンマまたは二項演算子を使用してステートメントを分割することができます。さらに、Nimはユーザー定義の演算子をサポートしています。

Nimはほぼ完全にスタイルに依存しません。2つの識別子は、最初の文字が同一である限り、大文字とアンダースコアのみが異なる場合に等しいと見なされます。歴史的に、Nimは大文字と小文字を完全に区別していませんでした(つまり、識別子の大文字と小文字は完全に無視されていました)。[22]

影響力

Nimは、次のような既存の言語の特定の特性の影響を受けました。

統一関数呼び出し構文

Nimは、Uniform Function Call Syntax(UFCS)[23]と識別子の同等性をサポートしており、使用に大きな柔軟性をもたらします。

たとえば、これらの各行は、構文が異なるだけで同じ呼び出しを実行します。

echo  "hello world" 
echo "hello world" 
"helloworld" echo ()
"helloworld" エコー
「こんにちは」echo "world" 
"hello" エコー 「世界」

識別子の同等性

最初の文字を除いて、Nimの識別子は大文字と小文字を区別せずに比較され、アンダースコアは無視されます。

例:

const  useHttps  =  true 
assert  useHttps  ==  useHttps 
assert  useHTTPS  ==  useHttps 
assert  use_https  ==  useHttps

革砥

革砥機能を使用すると、名前がキーワードの予約語である場合でも、変数または関数に任意の名前を使用できます。革砥の例はif、キーワードと衝突することなく、という名前の変数を定義する機能ifです。Nimによるこれの実装は、バッククォートを介して実現され、予約語を識別子として使用できます。[24]

type  Type  =  object 
  ` int` int 

let  ` object` = Type ` int` 9 assert` object `  is Type assert` object` .` int` == 9 _ _ _  
   
   

var  ` var` = 42 let` let`  = 8 assert` var ` + ` let ` == 50 _ _ _ _ 
   
     

const  ` assert` = true assert` assert` _  _ _ 
 

コンパイラ

Nimコンパイラは、デフォルトで高速で最適化されたCコードを出力します。オブジェクトへのコンパイルコードを外部のCコンパイラ[25]に延期し、既存のコンパイラの最適化と移植性を活用します。ClangMicrosoft Visual C ++(MSVC)、MinGWGNUコンパイラコレクション(GCC)など、多くのCコンパイラがサポートされています。Nimコンパイラは、 C ++Objective-C、およびJavaScriptコードを発行して、これらの言語で記述されたアプリケーションプログラミングインターフェイス(API )と簡単にインターフェイスできるようにすることもできます。[7]開発者は、Nimで記述してから、サポートされている任意の言語にコンパイルできます。これにより、 iOSおよびAndroid用のアプリケーションを作成することもできます非公式のLLVMバックエンドもあり、Nimコンパイラをスタンドアロンで使用できます。[26]

Nimコンパイラはセルフホスティングです。つまり、Nim言語で記述されています。[27]コンパイラはクロスコンパイルをサポートしているため、開発マシンに関係なく、サポートされているオペレーティングシステムのソフトウェアをコンパイルできます。これは、組み込みシステム用のアプリケーションのコンパイルや、一般的ではなくあいまいなコンピュータアーキテクチャの場合に役立ちます。

コンパイラオプション

デフォルトでは、Nimコンパイラはデバッグビルドを作成します。[28] オプションを使用すると-d:releaseリリースビルドを作成できます。これは、速度が最適化されており、実行時チェックが少なくなっています。[28] オプション-d:dangerを使用すると、最大速度が必要な場合、すべてのランタイムチェックを無効にできます。[28]

メモリ管理

Nimは、次のような複数のメモリ管理戦略をサポートしています。[29]

  • --gc:refc–これはデフォルトのGCです。これは、サイクルを収集するための単純なMark&SweepバックアップGCを備えた遅延参照カウントベースのガベージコレクターです。ヒープはスレッドローカルです。
  • --gc:markAndSweep–シンプルなマークアンドスイープベースのガベージコレクターヒープはスレッドローカルです。
  • --gc:boehm–ベームベースのガベージコレクター。共有ヒープを提供します。
  • --gc:go–Goガベージコレクタ。Goとの相互運用に役立ちます共有ヒープを提供します。
  • --gc:arc–移動セマンティック最適化によるプレーン参照カウントは、共有ヒープを提供します。ハードリアルタイムシステムに決定論的なパフォーマンスを提供します。参照サイクルはメモリリークを引き起こします、注意してください。
  • --gc:orc–と同じ--gc:arcですが、「試行削除」に基づいてサイクルコレクターを追加します。残念ながら、それはそのパフォーマンスプロファイルを推論するのを難しくするので、ハードリアルタイムシステムにはあまり役に立ちません。
  • --gc:none–メモリ管理戦略もガベージコレクタもありません。開発者のコ​​ードによって手動で解放されない限り、割り当てられたメモリが解放されることはありません。

開発ツール

バンドル

Nimインストールパッケージには、次のような多くのツールがバンドルされています。

軽快

Nimbleは、NimがNimモジュールをパッケージ化するために使用する標準のパッケージマネージャーです。[30]当初は、Nimのコア開発者でもあるDominikPichetaによって開発されました。Nimbleは、2015年10月27日のv0.12.0リリース以降、Nimの公式パッケージマネージャーとして含まれています。[31]

.nimble軽快なパッケージは、パッケージのバージョン、作成者、ライセンス、説明、依存関係などに関する情報を含むファイルによって定義されます。[16] :132 これらのファイルは、NimScriptと呼ばれるNim構文の限定されたサブセットをサポートしますが、主な制限はFFIへのアクセスです。これらのスクリプトを使用すると、テスト手順を変更したり、カスタムタスクを記述したりできます。

パッケージのリストは、GitHubのnim-lang / packagesリポジトリから自由にアクセスできるJavaScriptObject Notation(JSON )ファイルに保存されます。このJSONファイルは、パッケージの名前とGitまたはMercurialリポジトリのURLの間のマッピングをNimbleに提供します。

NimbleにはNimコンパイラが付属しています。したがって、以下を実行することにより、Nimble環境をテストすることができます nimble -vこのコマンドは、バージョン番号、コンパイル日時、および軽快なGitハッシュを明らかにします。NimbleはGitパッケージを使用します。これは、Nimbleが正しく機能するために使用可能である必要があります。Nimbleコマンドラインは、モジュールパッケージのインストール、削除(アンインストール)、およびアップグレード-パッチ適用のためのインターフェイスとして使用されます。[16] :130〜131 

c2nim

c2nimは、ANSI CコードをNimコードに変換することにより、新しいバインディングを生成するのに役立つソースツーソースコンパイラ(トランスコンパイラまたはトランスパイラ)です。[32]出力は人間が読める形式のNimコードであり、翻訳プロセス後に手動で最適化することを目的としています。

DrNim

DrNimは、Nimで記述されたソフトウェアの検証と妥当性確認を可能にするためにNimコンパイラフロントエンドとZ3プルーフエンジンを組み合わせたツールです。[33] NimにはDrNimソースコードが含まれていますが、Kochを使用してコンパイルする必要があります。これもNimにバンドルされています。

コッホ

kochは、Nimを構築し、HTMLドキュメントを提供するために使用されるメンテナンススクリプトです。[34]

Nimgrep

nimgrepは、テキストを操作するための汎用ツールです。正規表現、ペグパターン、およびディレクトリの内容を検索するために使用され、タスクを置き換えるために使用できます。これは、Nimのスタイルに依存しない識別子の検索を支援するために含まれています。[35]

nimsuggest

nimsuggestは、ソースコードエディタが.nimソースファイルをクエリして、記号の定義や補完の提案などの有用な情報を取得するのに役立つツールです。[36]

niminst

niminstは、Nimプログラムのインストーラーを生成するためのツールです。[37] Inno Setupを介してWindows用の.msiインストーラーを作成し、 LinuxmacOS、およびBerkeley Software Distribution(BSD) 用 のスクリプトをインストールおよびアンインストールします。

nimpretty

nimprettyはソースコードの美化機能であり、公式のNimスタイルガイドに従ってコードをフォーマットするために使用されます。[38]

テスタメント

Testamentは、Nimテスト用の高度な自動単体テストランナーです。Nimの開発に使用され、プロセス分離テストを提供し、テストケースに関する統計を生成し、複数のターゲットとシミュレートされたドライランをサポートし、ログを記録し、HTMLレポートを生成し、ファイルからテストをスキップできます。

その他の注目すべきツール

Nimパッケージに含まれていないいくつかの注目すべきツールは次のとおりです。

Choosenim

Choosenimは、Nimbleパッケージマネージャーの作成者であるDominik Pichetaによって、Nimコンパイラの複数のバージョンをインストールして使用できるようにするツールとして開発されました。コマンドラインからNim安定版または開発用コンパイラのバージョンをダウンロードし、それらを簡単に切り替えることができます。[39]

nimfix

nimfixは、古いスタイルのNimrodコードの一部をNimコードに変換するためのツールです。[40] 2014年11月現在ベータリリース中です。[41]

pas2nim

pas2nimは、ObjectPascalラッパーをNimコードに変換するためのツールです。[42] pas2nimは、Nimコンパイラの元のPascalソースを変換するために使用されたため、Nimのタイムラインで重要な役割を果たしました。Nimに簡単にマッピングできるものだけがサポートされています。無料のPascal、Delphiスタイルのクラスは、他の翻訳が難しい機能と同様にサポートされていません。2020年10月の時点で、pas2nimの開発と保守はほとんど行き詰まっています。

py2nim

py2nimは、Pythonコードを慣用的なNimコードに変換するために使用されるツールです。[43] 2020年現在、その開発は停滞している。

ニンピー

nimpyは、Nimプログラムへの便利なPython統合を可能にするライブラリです。[44]

nimterop

nimteropは、Nimの外部関数インターフェイスに必要なC / C ++ラッパーの作成を自動化することに焦点を当てたツールです。[45]

ライブラリ

純粋/不純なライブラリ

純粋なライブラリは、Nimでのみ記述されたモジュールです。他のプログラミング言語で書かれたライブラリにアクセスするためのラッパーは含まれていません。

不純なライブラリは、Cなどの他のプログラミング言語で記述された外部ライブラリに依存するNimコードのモジュールです。

標準ライブラリ

Nim標準ライブラリには、次のようなすべての基本タスクのモジュールが含まれています。[46]

  • システムおよびコアモジュール
  • コレクションとアルゴリズム
  • 文字列処理
  • 時間処理
  • 一般的なオペレーティングシステムサービス
  • 数学ライブラリ
  • インターネットプロトコルとサポート
  • 糸脱毛
  • パーサー
  • Docutils
  • XML処理
  • XMLおよびHTMLコードジェネレーター
  • ハッシュ
  • データベースのサポート(PostgreSQL、MySQL、SQLite)
  • ラッパー(Win32 API、POSIX)

他のライブラリの使用

Nimプログラムは、C、C ++、またはJavaScriptプログラムで使用できる任意のライブラリを使用できます。言語バインディングは、 GTK[47] [48] Qt QML、[49] wxWidgets[50] Simple DirectMedia Layer(SDL)2、[51] [52] Cairo[53] OpenGL[54 ]を含む多くのライブラリに存在します。 ] Windows API(WinAPI)、[55] zliblibzipOpenSSLVulkan [56]およびcURL[57]Nimは、PostgreSQLMySQL、およびSQLiteデータベースで動作します。Nimは、Lua[58] Julia[59] Rust[60] C#[61] TypeScript[62] およびPython [63]プログラミング言語とインターフェイスできます。

Hello world

Hello、World!」Nimの プログラム:

echo "Hello、world!" 
#プロシージャは括弧なしで呼び出すことができます
echo  "Hello、World!"

「HelloWorld」を作成する別のバージョンは...

stdout write "Hello、world!\ n " 

階乗

反復アプローチを使用して正の整数の階乗 を計算するプログラム:

 strutilsをインポートする

var  n  =  0 
try 
  stdout 「入力正の整数:」n = stdinと記述し ます。readline ValueErrorを除くparseInt raise newException ValueError "正の数を入力する必要があります" 
    
 
    

var  fact  =  1 
for  i  in  2 .. n 
  fact  =  fact  *  i

エコー ファクト

Nimの標準ライブラリのモジュール数学を使用する:

import  math 
echo  fac x 

文字列を逆にする

Nimの機能の多くを示す簡単なデモンストレーション。

proc reverse s  string ): string  = 
  for  i  in  countdown s .high 0 result s [ i ]を追加します 
     

str1  = "Reverse This!"  echo "Reversed:" reverse str1  
  

よりエキゾチックな機能の1つは、暗黙のresult変数です。非voidの戻り型を持つNimのすべてのプロシージャには、返される値を表す暗黙の結果変数があります。forループでは、その呼び出しがcountdownイテレーターであることがわかります。itemsイテレータが省略されている場合、指定されたタイプにイテレータが定義されていれば 、コンパイラはイテレータの使用を試みます。

グラフィカルユーザーインターフェース

gintroモジュールを介したgobjectイントロスペクションでGTK3使用する:

import  gintro / [ gtk  glib  gobject  gio ]

proc appActivate app  Application  = 
  let  window  =  newApplicationWindow app 
  window title  =  "gobjectイントロスペクションを備えたGTK3アプリケーション"
  ウィンドウdefaultSize  =  400、400 showAll window _  _
  

proc main  = 
  let  app  =  newApplication "org.gtk.example" 
  connect app  "activate"  appActivate 
  discard  run app 

メイン()

このコードが機能するには、標準ライブラリの一部ではないgintroモジュールが必要です。モジュールgintroや他の多くのモジュールをインストールするには、nimの一部として提供されているツールnimbleを使用できます。敏捷性を備えたgintroモジュールをインストールするには、次のようにします。

軽快なインストールgintro

プログラミングパラダイム

関数型プログラミング

関数型プログラミングは、 `noSideEffect`プラグマ、` func`キーワード[64]および実験的機能 `strictFuncs` を介して、副作用のないファーストクラスの関数とコードを介してNimでサポートされます。

`strictFuncs`機能を有効にすると、Nimは副作用分析を実行し、副作用を生成しないという契約に従わないコードのコンパイルエラーを発生させます。

純粋に関数型プログラミング言語とは異なり、Nimはマルチパラダイムプログラミング言語であるため、関数型プログラミングの制限は関数ごとにオプトインされます。

第一級関数

Nimは、関数を変数に格納したり、他の関数によって呼び出されるパラメーターとして渡したりできるようにすることで、 ファーストクラスの関数をサポートします。

例えば:

 sequtilsをインポートする

powersOfTwo  = @ [ 1、2、4、8、16、32、64、128、256  ] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _         

echo powersOfTwo。filterdo x int - > bool x > 32 echopowersOfTwo _ _ _ filter proc x int ):bool = x > 32         
        

proc greatThan32 x  int  bool  =  x  >  32 
echopowersOfTwo  フィルタgreaterThan32 

出力を生成します:

@ [ 64、128、256 ] @ [ 64、128、256 ] @ [ 64、128、256 ] _  _ _ _ _ _ _ _ _ 
  
  

[65]

Funcs

キーワードは、プラグマ funcショートカットを紹介します。noSideEffect

func  binarySearch [ T ] a  openArray [ T ] ;  elem  T ): int

の略:

proc binarySearch [ T ] a  openArray [ T ] ;  elem  T ): int  {。noSideEffect 。}

[66]

厳格な機能

バージョン1.4以降、「副作用」のより厳密な定義が利用可能になりました。副作用が副作用のある関数を呼び出すという既存のルールに加えて、次のルールも適用されます。

パラメータとして宣言されていないパラメータを介してそのオブジェクトに到達できる場合、オブジェクトへの変更は副作用としてカウントされvarます。

例えば:

{。実験的 "strictFuncs" 。}

タイプ
  Node  =  ref  object 
    le  ri  ノード
    データ 文字列

func  len n  Node ): int  = 
  #valid:lenには副作用がありません
  var  it  =  n 
  while  it  !=  nil 
    inc  result 
    it  =  it ri

func  mut n  Node  = 
  let  m  =  n  #は、ミューテーションをパラメーター
  mに接続したステートメントですdata  =  "yeah"  #ミューテーションはここにあります
  #エラー: 'mut'は副作用を引き起こす可能性が
  あります# 'n'から到達可能なオブジェクトは潜在的にミューテーションされています

[67]

オブジェクト指向プログラミング(OOP)

メタプログラミング

テンプレート

これは、テンプレート機能を使用したNimでのメタプログラミングの例です。

テンプレート genType name  fieldname  untyped  fieldtype  typedesc  = 
  type 
    name  =  object 
      fieldname  fieldtype

genType Test  foo  int 

var  x  =  Test foo  4566 
echo x .foo 4566 

genTypeコンパイル時に呼び出され、Test型が作成されます。

ジェネリック

Nimは、制約付きと制約なしの両方のジェネリックプログラミングをサポートします。ジェネリックは、プロシージャ、テンプレート、およびマクロで使用できます。以下に示すように、これらは角かっこで囲まれたprocの名前の後に定義されます。

proc addThis [ T ] a  b  T ): T  = 
  a  +  b

echo  addThis 1、2 #3(int型の)echo addThis uint8 1  uint8 2 ) # 3 uint8型の) 
     

はジェネリック型addTheseTあり、パラメータと戻り値の両方が同じ型である限り、コンパイラはこの関数のすべての値を受け入れます。

型クラスを指定することで、プロシージャが受け入れる型をさらに明確にすることができます。[68]

proc addThisNumbers [ T  SomeNumber ] a  b  T ): T  = 
  a  +  b

addTheseNumbersSomeNumberその場合、合計型 に含まれる型に対してのみ機能します。

マクロ

マクロは、コンパイル時にコードの一部を書き換えることができます。Nimマクロは強力で、抽象構文ツリーに対して多くの操作を実行できます。

これは、2回呼び出されるマクロを作成する簡単な例です。

 マクロのインポート

マクロ 2arg  untyped  untyped  = 
  result  =  quote  do 
    ` arg`` arg`
    

 「Helloworld!」を2回エコーします 

この例のtwiceマクロは、入力として抽象構文ツリーの形式のechoステートメントを取ります。この例では、操作を適用せずにこの構文ツリーを返すことにしました。しかし、それを2回行うので、マクロの名前になります。その結果、コードはマクロによって書き直され、コンパイル時に次のコードのようになります。

echo  "Hello world!" 
echo  "Hello world!"

外部関数インターフェース(FFI)

NimのFFIは、コンパイル可能な他のプログラミング言語で記述された関数を呼び出すために使用されます。これは、C、C ++、Objective-C、およびJavaScriptで記述されたライブラリをNimソースコードで使用できることを意味します。JavaScriptとC、C ++、またはObjective-Cライブラリの両方を同じプログラムで組み合わせることができないことに注意する必要があります。これらは互いにJavaScriptと互換性がないためです。C ++とObjective-CはどちらもCに基づいており、Cと互換性がありますが、JavaScriptは、動的なクライアント側のWebベースの言語として互換性がありません。[16] :226 

次のプログラムは、外部CコードをNimで直接使用できる簡単さを示しています。

proc printf formatstr  cstring  {。ヘッダー "<stdio.h>"  varargs 。}

printf "%s%d \ n "  "foo"  5 

このコードでは、printf関数がNimにインポートされてから使用されます。

JavaScriptコンパイルターゲット に直接「console.log」を使用する基本的な例:

proc log args  any  {。importjs  "console.log(@)"  varargs 。} 
log 42  "z"  true  3.14 

Nimコンパイラによって生成されたJavaScriptコードは、Node.jsまたはWebブラウザで実行できます。

並列処理

Nimでスレッドサポートをアクティブにするには、--threads:onコマンドライン引数を使用してプログラムをコンパイルする必要があります。各スレッドには個別のガベージコレクションヒープがあり、メモリの共有が制限されているため、効率が向上し、スレッドによる競合状態が停止します。

インポート ロック

var 
  thr  array [ 0 .. 4  Thread [ tuple [ a b  int ]]] 
  L  ロック

proc threadFunc 間隔 タプル[ a b  int ]  {。スレッド。}  =
  間隔 iの場合 ..間隔_ b 取得L #ロックstdoutエコーiリリースL  
     
     
    

initLock L 

for  i  in  0 .. high thr ):
  createThread thr [ i ]  threadFunc  i * 10  i * 10 + 5 ))
joinThreads thr 

Nimには、channelsスレッド間でのデータの受け渡しを簡素化するモジュールもあります。

 OSのインポート

タイプ
  CalculationTask  = オブジェクト
    ID *  int
    データ*  int

  CalculationResult  = オブジェクト
    ID *  int
    結果*  int

var  task_queue  チャネル[ CalculationTask ] 
var  result_queue  チャネル[ CalculationResult ]

proc workerFunc () {。スレッド。}  = 
  result_queue 開く()

   trueの場合
    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 ))

 trueの場合
  echo  "got result:" repr result_queue .recv  

並行性

Nimは、モジュールを介して非同期IOをサポートします。これにより、マクロシステムを介して非同期/待機asyncdispatch構文が追加されます。非同期httpサーバーの例:

インポート asynchttpserver  asyncdispatch

var  server  =  newAsyncHttpServer ()
proc cb req  Request  {。async }  = 
  awaitreq  応答Http200 "Hello World"  

waitFor サーバーサーブポート8080 )、 cb 

コミュニティ

Nimは、自己ホスト型、自己開発型の公式フォーラムに活発なコミュニティを持っています。[69]さらに、このプロジェクトでは、GitHubがホストするGitリポジトリ、バグトラッカー、およびwikiを使用しており、コミュニティはこの言語に取り組んでいます。[70]

規約

最初のNim会議であるNimConfは、2020年6月20日に開催されました。COVID-19によりデジタルで開催され、 YouTubeビデオの形で寄稿者の講演が公募されました。[71]会議は、Nim開発者のAndreasRumpfとDominikPichetaによる言語の概要から始まりました。プレゼンテーションのトピックには、Nim Webフレームワーク、モバイル開発、モノのインターネット(IoT)デバイス、およびゲーム開発に関する講演が含まれ、ゲームボーイアドバンス向けのNimの作成に関する講演も含まれています。[72] NimConf2020はYouTubeプレイリストとして利用できます。[73]

公式会議に加えて、ニムは他のさまざまな大会で紹介されています。Nimに関するプレゼンテーションは、2015年のO'Reilly Open Source Convention(OSCON)で行われました。[74] [75] [76] 4人のスピーカーがNimを代表してFreeand Open source Software Developers'European Meeting(FOSDEM)2020に参加しました。言語の作成者、AndreasRumpf。[77]

も参照してください

参考文献

  1. ^ https://nim-lang.org/blog/2022/02/08/version-164-released.html
  2. ^ 「例によるニム」GitHub2014年7月20日取得
  3. ^ Караджов、Захари; Станимиров、Борислав(2014)。МетапрограмиранесニムロッドVarnaConf(ブルガリア語)2014年7月27日取得
  4. ^ 「Nimのインストール」2018年10月12日取得
  5. ^ a b "FAQ"rust-lang.org 2015年3月27日取得
  6. ^ "copying.txt"GitHub 2015年3月27日取得
  7. ^ a b Rumpf、Andreas(2014-02-11)。「ニムロッド:新しいシステムプログラミング言語」ドブ博士の日記2014年7月20日取得
  8. ^ 「Nimプログラミング言語」Nim-lang.org 2014年7月20日取得
  9. ^ ケーラー、アーロン(akehrer)(2015年1月5日)。「Nim構文」GitHub 2015年1月5日取得
  10. ^ a bc 「 Nim マニュアル」Nim-lang.org 2014年7月20日取得
  11. ^ 「StrangeloopNimプレゼンテーション」2014年7月13日にオリジナルからアーカイブされまし2015年4月30日取得
  12. ^ 「ニムのガベージコレクター」Nim-lang.org 2018年1月10日取得
  13. ^ ビンストック、アンドリュー(2014-01-07)。「2013年の言語の興亡」ドブ博士の日記2018年10月8日取得
  14. ^ Nimコンパイラユーザーガイド
  15. ^ 「Nimリリース」ニムプロジェクト2020年1月26日取得
  16. ^ a b c d Picheta、Dominik(2017)。Nim inActionマニング出版物。ISBN 978-1617293436
  17. ^ 「NimPascalソース」GitHub 2013年4月5日取得
  18. ^ 「ニュース」Nim-lang.org2016年6月26日にオリジナルからアーカイブされました2016年6月11日取得
  19. ^ 「貢献者」GitHub 2013年4月5日取得
  20. ^ ピチェタ、ドミニク(2014-12-29)。「バージョン0.10.2がリリースされました」Nim-lang.org 2018年10月17日取得
  21. ^ Yegulalp、Serdar(2017-01-16)。「Nim言語は、Python、Rust、Go、Lispの最高のものを利用しています」InfoWorld
  22. ^ 「Nimマニュアル」nim-lang.org 2020年7月21日取得
  23. ^ 「Nimマニュアル:メソッド呼び出し構文」2018年10月12日取得
  24. ^ ピチェタ、ドミニク(dom96); ウェザーフォードシャー、ビリングスリー(ファウルマウス); フェルシング、デニス(def-); Raaf、Hans(oderwat); ダン、クリストファー(cdunn2001); wizzardx(2017-10-25)。「ヒントとコツ」GitHub 2018年10月17日取得
  25. ^ Rumpf、Andreas(2014-01-15)。Nimrod:メタプログラミングへの新しいアプローチInfoQイベントは2:23に発生します。2014年7月20日取得
  26. ^ Sieka、Jacek(2020-07-18)、arnetheduck / nlvm 、 2020-07-21を取得
  27. ^ Rumpf、Andreas(2018-10-12)。「Nimコンパイル」GitHub 2018年10月17日取得
  28. ^ a bc 「 Nim コンパイラユーザーガイド」
  29. ^ Nimのメモリ管理
  30. ^ 「軽快」GitHub 2018年10月12日取得
  31. ^ 「Nimv0.12.0リリース」GitHub 2020年11月28日取得
  32. ^ "c2nim"GitHub 2018年10月12日取得
  33. ^ 「DrNimユーザーガイド」nim-lang.org 2021-11-16を取得
  34. ^ 「Nimメンテナンススクリプト」nim-lang.org 2021-11-16を取得
  35. ^ 「nimgrepユーザーズマニュアル」nim-lang.org 2021-11-16を取得
  36. ^ 「NimIDE統合ガイド」nim-lang.org 2021-11-16を取得
  37. ^ 「niminstユーザーズマニュアル」nim-lang.org 2021-11-16を取得
  38. ^ 「Nimで利用可能なツール」nim-lang.org2021-10-19。2015-05-09にオリジナルからアーカイブされました2022-02-18を取得
  39. ^ 「choosenim」GitHub 2018年10月12日取得
  40. ^ "nimfix.nim"GitHub 2018年10月12日取得
  41. ^ Rumpf、Andreas(2014-11-03)。「Nimfixユーザーガイド」GitHub2021-10-24にオリジナルからアーカイブされました2022-02-18を取得
  42. ^ "pas2nim"GitHub 2018年10月12日取得
  43. ^ "py2nim"GitHub 2018年10月12日取得
  44. ^ Glukhov、Yuriy(2021-11-12)、nimpy 、 2021-11-16を取得
  45. ^ nimterop / nimterop、nimterop、2021-11-12、2021-11-16取得
  46. ^ Nim標準ライブラリ
  47. ^ インストール、Nimプログラミング言語、2021-09-25、2021-11-16取得
  48. ^ StefanSalewski(2021-11-15)、Nimプログラミング言語用の高レベルGTK4およびGTK3バインディング、2021-11-16取得
  49. ^ 「NimQml」GitHub
  50. ^ 「WxNim」GitHub
  51. ^ SDL2 for Nim、Nimプログラミング言語、2021-10-26、2021-11-16取得
  52. ^ Arabadzhi、Vladimir(2021-11-15)、sdl2_nim 2.0.14.2、2021-11-16取得
  53. ^ Cairo、Nimプログラミング言語、2021-10-05、2021-11-16取得
  54. ^ opengl、Nimプログラミング言語、2021-11-14、2021-11-16取得
  55. ^ ワード(2021-11-15)、Winim 、 2021-11-16を取得
  56. ^ 「Vulkanim」GitHub
  57. ^ 「Nim標準ライブラリ」Nimのドキュメント2015年4月6日にオリジナルからアーカイブされまし2015年4月4日取得
  58. ^ Lim、Andri(jangko)(2018-10-17)。「nimLUA」GitHub 2018年10月17日取得
  59. ^ 「Nimjl」GitHub
  60. ^ 「Nbindgen」GitHub
  61. ^ "cs2nim"GitHub
  62. ^ "ts2nim"GitHub
  63. ^ Glukhov、Yuriy(2020-07-20)、yglukhov / nimpy 、 2020-07-21を取得
  64. ^ 「Nimマニュアル」nim-lang.org 2021-07-10を取得
  65. ^ 「例によるNim-ファーストクラス関数」
  66. ^ 「Nimマニュアル」
  67. ^ 「Nim実験的特徴」
  68. ^ 「Nimマニュアル」nim-lang.org 2020年7月21日取得
  69. ^ 「Nimフォーラム」nim-lang.org 2015年5月4日取得
  70. ^ 「プライマリソースコードリポジトリとバグトラッカー」GitHub 2015年5月4日取得
  71. ^ 「ニムオンライン会議2020」ニム2020年11月28日取得
  72. ^ 「NimConf2020」ニム2020年11月28日取得
  73. ^ 「NimConf2020プレイリスト」YouTube 2020年11月28日取得
  74. ^ 「OSCON2015のニム」O'Reillyオープンソースコンベンション(OSCON)オライリーメディア。2015-07-20 2018年10月17日取得
  75. ^ ルンプ、アンドレアス; スワーツ、ジェイソン; ハリソン、マット。「必須言語:Nim、Scala、Python」オライリーオライリーメディア2018年10月17日取得
  76. ^ Rumpf、Andreas(2015-10-26)。OSCON 2015 – Nim:概要YouTube(ビデオ)2018年10月12日取得
  77. ^ 「イベント」fosdem.org 2020年2月17日取得

外部リンク