맨위로가기

님 (프로그래밍 언어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

님(Nim)은 2005년 안드레아스 룸프에 의해 개발이 시작된 다중 패러다임 프로그래밍 언어이다. 파이썬과 유사한 문법을 사용하며, 명령형, 객체 지향, 함수형, 메타프로그래밍 등 다양한 프로그래밍 스타일을 지원한다. 님은 C, C++, Objective-C, JavaScript 코드를 생성하며, 다양한 외부 라이브러리와의 연동을 지원한다. 2019년 1.0 버전이 출시되었으며, 님블(Nimble)이라는 패키지 관리자를 포함한 개발 도구들을 제공한다.

더 읽어볼만한 페이지

  • 소스 대 소스 컴파일러 - 스칼라 (프로그래밍 언어)
    스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
  • 소스 대 소스 컴파일러 - 타입스크립트
    타입스크립트는 마이크로소프트에서 개발한 자바스크립트의 상위 집합으로, 정적 타입 지정, 타입 추론 등의 기능을 제공하여 코드의 안정성과 가독성을 높이는 언어이다.
  • 병행 프로그래밍 언어 - 자바 (프로그래밍 언어)
    자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다.
  • 병행 프로그래밍 언어 - 스칼라 (프로그래밍 언어)
    스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
  • 시스템 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 시스템 프로그래밍 언어 - 스위프트 (프로그래밍 언어)
    2014년 애플 세계 개발자 컨퍼런스에서 처음 공개된 스위프트는 크리스 래트너가 개발한 애플의 범용 프로그래밍 언어로서, Objective-C를 대체하며 다양한 플랫폼 지원, 모던 문법, 안정성, 인터랙티브한 개발 환경, SwiftUI 등의 특징을 가진다.
님 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
기본 정보
이름
님의 크라운 로고
개발자Nim Lang Team
출시일2008년
최신 버전 출시일}}
파일 확장자.nim, .nims, .nimble
웹사이트님 공식 웹사이트
특징
프로그래밍 패러다임멀티 패러다임 프로그래밍: 컴파일 언어, 병행 프로그래밍, 절차적 프로그래밍, 명령형 프로그래밍, 함수형 프로그래밍, 객체 지향 프로그래밍, 메타 프로그래밍
자료형정적 자료형, 강한 자료형, 자료형 추론, 구조적 자료형 체계
적용 범위어휘적 범위
플랫폼IA-32, x86-64, ARM 아키텍처, Aarch64, RISC-V, PowerPC ...
운영체제크로스 플랫폼
설계 및 영향
설계자안드레아스 룸프
프로그래밍 언어파스칼 (2005–2008), 님 (2008–현재, 자체 호스팅)
영향을 받은 언어에이다, 모듈라-3, 리스프, C++, 오브젝트 파스칼, 파이썬, 오베론, 러스트, ParaSail
라이선스

2. 역사

님(Nim)은 C, C++, 자바스크립트로 컴파일되는 간결하고 빠른 프로그래밍 언어이다. 2005년 안드레아스 룸프가 님(Nim) 개발을 시작했다.[18] 그는 카이저슬라우테른-란다우 대학교(독일)에서 컴퓨터 과학 학위를 받았으며, 하드 실시간 시스템, 임베디드 시스템, 컴파일러 구성 및 인공 지능을 연구했다.[17] 초기에는 님로드(Nimrod)라는 이름으로 불렸다.[18]

님(Nim) 컴파일러의 첫 번째 버전은 파스칼로 작성되었으며, 프리 파스칼 컴파일러를 사용하여 작성되었다.[19] 2008년에는 님(Nim)으로 작성된 컴파일러 버전이 출시되어 셀프 호스팅이 가능해졌다.[20] 이 컴파일러는 자유-오픈 소스 소프트웨어이며 안드레아스 룸프와 자원 봉사자 커뮤니티에 의해 개발되고 있다.[21] 2014년 12월 버전 0.10.2가 출시되면서 공식적으로 ''님로드(Nimrod)''에서 ''님(Nim)''으로 이름이 변경되었다.[22]

https://nim-lang.org 님(Nim)의 원래 웹사이트는 도미니크 피체타와 휴고 로쿠르시오가 디자인했고, 조셉 웨커가 님(Nim)의 로고를 만들었다.

2. 1. 버전 역사

분기버전출시일[16]
0.x0.10.22014-12-29
0.11.22015-05-04
0.12.02015-10-27
0.13.02016-01-18
0.14.22016-06-09
0.15.22016-10-23
0.16.02017-01-08
0.17.22017-09-07
0.18.02018-03-01
0.19.62019-05-13
0.20.22019-06-17
1.01.0.02019-09-23
1.0.102020-10-27
1.21.2.02020-04-03
1.2.182022-02-09
1.41.4.02020-10-16
1.4.82021-05-25
1.61.6.02021-10-19
1.6.202024-04-16
2.02.0.02023-08-01
2.0.122024-11-01
2.22024-10-02
각 0.x 분기에 대해 최신 포인트 릴리스만 나열됩니다. 이후 분기에 대해서는 첫 번째 및 최신 포인트 릴리스가 나열됩니다.



님(Nim)은 2005년 안드레아스 룸프가 개발을 시작했다.[18][114] 2008년에는 님(Nim)으로 작성된 컴파일러 버전이 출시되었다.[20][116] 2014년 12월 0.10.2 버전 출시와 함께 공식적으로 ''님로드(Nimrod)''에서 ''님(Nim)''으로 이름이 변경되었다.[22] 2019년 9월 23일, 1.0.0 버전이 출시되어 언어와 해당 도구 체인의 성숙을 알렸다.[23] 2023년 8월 1일, 2.0.0 버전이 출시되어 ARC/ORC 메모리 모델의 완성, 안정화 및 전환을 알렸다.[23]

3. 언어 설계

님은 정적 타입 언어로, 컴파일 시점에 타입 오류를 검출하여 안정성을 높였다.[1] 파이썬과 유사한 간결한 문법을 채택하여 가독성과 생산성을 높였으며,[24] 컴파일 타임 메타 프로그래밍 기능을 통해 코드 생성 및 조작이 가능하다.[11]

객체 지향 프로그래밍상속 및 다중 디스패치를 통해 지원된다. 함수는 제네릭으로 오버로드될 수 있으며, 제네릭 프로그래밍은 님의 타입 클래스 지원으로 더욱 향상된다. 연산자 오버로딩 또한 지원된다.[11]

함수형 프로그래밍을 위한 기능으로, 반복자를 지원하며, 일급 엔티티로 사용할 수 있다.[11] 함수 또한 일급 엔티티로 사용 가능하다.

다양한 메모리 관리 전략을 지원한다.


  • 추적 가비지 수집[13]
  • 참조 카운팅[13]
  • 완전 수동 시스템[13]
  • 기본값은 이동 의미론 및 시험 삭제를 통한 최적화를 갖춘 결정적 참조 카운팅이다.[13]


현재, 님은 C, C++, 자바스크립트, Objective-C,[15] 및 LLVM으로 컴파일된다.[30]

앤드루 빈스톡(Andrew Binstock)은 님에 대해 다음과 같이 말했다.

3. 1. 문법

님(프로그래밍 언어)의 구문은 파이썬과 유사하게 들여쓰기 기반 구문을 지원하며, 오프사이드 규칙에 따라 공백을 사용하여 코드 블록과 중첩 문을 식별한다.[24] 쉼표나 이항 연산자가 각 줄의 끝에 있으면 단일 명령문이 여러 줄에 걸쳐 있을 수 있다. 또한 사용자 정의 연산자를 지원한다.

파이썬과 달리 님은 정적 타이핑을 구현하며, 쉬운 타입 변환, 캐스팅 및 제네릭 프로그래밍을 위한 구문을 제공한다. 여러 타입을 대신할 수 있는 타입 클래스를 제공하며, '즉시 사용 가능한' 여러 타입 클래스를 제공한다. 예를 들어:

  • `openarray` - 서로 다른 크기의 배열, 시퀀스 및 문자열을 나타낸다.
  • `SomeSignedInt` - 모든 부호 있는 정수 타입을 나타낸다.
  • `SomeInteger` - 모든 정수 타입(부호 있거나 없음)을 나타낸다.
  • `SomeOrdinal` - 정수가 아닌 숫자를 제외한 모든 기본적인 셀 수 있고 정렬된 타입을 나타낸다.


다음은 님에서 타입 클래스의 사용법을 보여주는 코드 예시이다.

```nim

# 임의의 숫자 타입을 받아 두 배로 표시하는 함수를 선언해 봅시다.

# 님에서 부작용이 있는 함수는 "proc"라고 불립니다.

proc timesTwo(i: SomeNumber) =

echo i * 2

```

```nim

# 임의의 순서 타입을 받아 숫자이면 입력의 두 배를 원래 타입으로 반환하고,

# 그렇지 않으면 입력을 자체적으로 반환하는 다른 함수를 작성해 봅시다.

# 제네릭 타입(T)을 사용하고, 순서형만 될 수 있다고 명시합니다.

func twiceIfIsNumber[T: SomeOrdinal](i: T): T =

when T is SomeNumber: # `when`은 컴파일 시간에 평가되는 `if`입니다.

result = i * 2 # `return i * 2`로 쓸 수도 있습니다.

else:

# 순서형이 숫자이면 int로 변환되고,

# 두 배로 곱해진 후 기본 타입으로 다시 변환됩니다.

result = (i.int * 2).T

```

```nim

echo twiceIfIsNumber(67) # int를 함수에 전달합니다.

echo twiceIfIsNumber(67u8) # uint8을 전달합니다.

echo twiceIfIsNumber(true) # 부울값을 전달합니다(순서형이기도 합니다).

```

님은 균일 함수 호출 구문(UFCS)을 지원하며,[26] 식별자 동등성을 통해 사용에 있어 광범위한 유연성을 제공한다.

예를 들어, 다음 각 줄은 hello world"를 출력하며, 구문만 다르다.

```nim

echo "hello world"

echo("hello world")

"hello world".echo()

"hello world".echo

echo("hello", " world")

"hello".echo(" world")

"hello".echo " world"

```

님은 거의 완벽하게 스타일에 둔감하다. 두 식별자는 대소문자와 밑줄만 다르고 첫 글자가 동일하면 동일한 것으로 간주된다. 이는 라이브러리 간에 다양한 스타일을 사용할 수 있도록 하기 위한 것이다.[27]

```nim

const useHttps = true

assert useHttps == useHttps

assert useHTTPS == useHttps

assert use_https == useHttps

```

스트로핑 기능은 변수 또는 함수의 이름으로 어떤 이름이든 사용할 수 있게 해준다. 심지어 그 이름이 예약어이거나 키워드인 경우에도 말이다. 님은 백틱을 통해 이 기능을 구현하여 모든 예약어를 식별자로 사용할 수 있게 한다.[28]

```nim

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`

```

님은 단순한 구문을 사용하는 정적 타입 언어이며,[107] 구문 매크로와 항 재작성 매크로와 같은 컴파일 시점의 메타 프로그래밍 기능을 지원한다.[108] 반복자도 지원하며, 이 반복자는 님 내에서 제1급 객체로 사용할 수 있고,[108] 이러한 기능은 함수형 프로그래밍을 가능하게 한다. 객체 지향 프로그래밍은 상속 및 다중 디스패치를 통해 지원된다. 함수는 제네릭이 될 수 있으며, 오버로드도 가능하다. 또한 `Type` 클래스가 지원되며, 이는 제네릭을 촉진한다. 연산자 오버로딩도 지원된다.[108]

3. 2. 님에 영향을 준 언어

3. 3. 프로그래밍 패러다임

님은 다중 패러다임 프로그래밍 언어로, 명령형 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍, 메타프로그래밍 등 다양한 스타일을 지원한다.

  • 객체 지향 프로그래밍: 상속 및 다중 디스패치를 통해 지원된다. 함수는 제네릭으로 오버로드될 수 있으며, 제네릭 프로그래밍은 님의 타입 클래스 지원으로 더욱 향상된다. 연산자 오버로딩 또한 지원된다.[11]
  • 함수형 프로그래밍: 일급 함수와 `noSideEffect` 프라그마 또는 `func` 키워드를 통해 부작용이 없는 코드를 통해 지원된다.[69] 반복자도 지원하며, 이 반복자는 Nim 내에서 제1급 객체로 사용할 수 있다.[108]
  • 메타프로그래밍: 님은 구문 매크로 및 용어 재작성 매크로와 같은 컴파일 시간 메타 프로그래밍 기능을 지원한다.[11] 항 재작성 매크로는 `Bignum` 및 `Matrix`와 같은 데이터 구조의 효율적인 라이브러리 구현을 가능하게 하며, 마치 원래 언어 기능에 내장되어 있었던 것처럼 효율적인 구현을 가능하게 한다.[109]


님은 파이썬과 유사한 문법을 가지고 있지만, 정적 타이핑을 사용한다.[24] 타입 시스템은 쉬운 타입 변환과 캐스팅을 허용하며, 제네릭 프로그래밍을 위한 구문을 제공한다. 여러 타입을 대신할 수 있는 타입 클래스를 제공하며, '즉시 사용 가능한' 여러 타입 클래스를 제공한다. 예를 들어:

  • `openarray`: 서로 다른 크기의 배열, 시퀀스 및 문자열을 나타낸다.
  • `SomeSignedInt`: 모든 부호 있는 정수 타입을 나타낸다.
  • `SomeInteger`: 모든 정수 타입(부호 있거나 없음)을 나타낸다.
  • `SomeOrdinal`: 정수가 아닌 숫자를 제외한 모든 기본적인 셀 수 있고 정렬된 타입을 나타낸다.


다음은 타입 클래스 사용 예시이다.

```nim

# 임의의 숫자 타입을 받아 두 배로 표시하는 함수를 선언해 봅시다.

# 님에서 부작용이 있는 함수는 "proc"라고 불립니다.

proc timesTwo(i: SomeNumber) =

echo i * 2

```

```nim

# 임의의 순서 타입을 받아 숫자이면 입력의 두 배를 원래 타입으로 반환하고,

# 그렇지 않으면 입력을 자체적으로 반환하는 다른 함수를 작성해 봅시다.

# 제네릭 타입(T)을 사용하고, 순서형만 될 수 있다고 명시합니다.

func twiceIfIsNumber[T: SomeOrdinal](i: T): T =

when T is SomeNumber: # `when`은 컴파일 시간에 평가되는 `if`입니다.

result = i * 2 # `return i * 2`로 쓸 수도 있습니다.

else:

# 순서형이 숫자이면 int로 변환되고,

# 두 배로 곱해진 후 기본 타입으로 다시 변환됩니다.

result = (i.int * 2).T

```

```nim

echo twiceIfIsNumber(67) # int를 함수에 전달합니다.

echo twiceIfIsNumber(67u8) # uint8을 전달합니다.

echo twiceIfIsNumber(true) # 부울값을 전달합니다(순서형이기도 합니다).

```

님은 추적 가비지 수집, 참조 카운팅, 그리고 완전 수동 시스템을 포함한 여러 조정 가능한 메모리 관리 전략을 포함하며, 기본값은 이동 의미론 및 시험 삭제를 통한 최적화를 갖춘 결정적 참조 카운팅이다.[13]

3. 3. 1. 객체 지향 프로그래밍

님은 주로 명령형 및 함수형 언어이지만, 객체 지향 프로그래밍 패러다임을 지원하기 위한 다양한 기능을 제공한다.[77][78]

님은 `ref object`와 `of` 키워드를 사용하여 제한적인 상속을 지원한다.[78] 상속을 활성화하려면 모든 초기 ("루트") 객체는 `RootObj`에서 상속받아야 한다. 상속은 님의 관용적인 코드 내에서 제한적으로 사용된다. 특히 예외를 제외하고는 말이다.[79]

```nim

type Animal = ref object of RootObj

name: string

age: int

type Dog = ref object of Animal

type Cat = ref object of Animal

var animals: seq[Animal] = @[]

animals.add(Dog(name: "Sparky", age: 10))

animals.add(Cat(name: "Mitten", age: 10))

for a in animals:

assert a of Animal

```

서브타입 관계는 `of` 키워드를 사용하여 쿼리할 수도 있다.[78]

님의 통일 함수 호출 구문은 다른 프로그래밍 언어의 메서드 호출과 유사한 구문으로 일반 함수를 호출할 수 있게 해준다. 이는 "게터"에 유용하며, 님은 이러한 "세터"를 생성하기 위한 구문도 제공한다. 객체는 필드별로 공개될 수 있으며, 캡슐화를 제공한다.

```nim

type Socket* = ref object

host: int # private, lacks export marker

# getter of host address

proc host*(s: Socket): int = s.host

# setter of host address

proc `host=`*(s: var Socket, value: int) =

s.host = value

var s: Socket

new s

assert s.host == 0 # same as host(s), s.host()

s.host = 34 # same as `host=`(s, 34)

```

정적 디스패치는 선호되고, 더 성능이 좋으며, 메서드처럼 보이는 루틴에서도 표준으로 사용된다.[78] 그럼에도 불구하고 동적 디스패치를 원하는 경우, 님은 참조 형식에 동적 디스패치를 활성화하기 위해 `method` 키워드를 제공한다.

```nim

import std/strformat

type

Person = ref object of RootObj

name: string

Student = ref object of Person

Teacher = ref object of Person

method introduce(a: Person) =

raise newException(CatchableError, "구현 재정의 없는 메서드")

method introduce(a: Student) =

echo &"저는 {a.name} 학생입니다!"

method introduce(a: Teacher) =

echo &"저는 {a.name} 선생님입니다!"

let people: seq[Person] = @[Teacher(name: "Alice"), Student(name: "Bob")]

for person in people:

person.introduce()

3. 3. 2. 함수형 프로그래밍

님(Nim)은 일급 함수를 지원하여 함수를 변수에 저장하거나 다른 함수의 인수로 전달할 수 있다.[71] `noSideEffect` 프라그마 또는 `func` 키워드를 사용하여 부작용이 없는 순수 함수를 작성할 수 있다.[69]

`std/sugar` 모듈은 익명 함수를 위한 구문 설탕을 제공한다.[71]

```nim

import std/[sequtils, 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)

# syntactic sugar for the above, provided as a macro from std/sugar

echo powersOfTwo.filter(x => x > 32)

proc greaterThan32(x: int): bool = x > 32

echo powersOfTwo.filter(greaterThan32)

```

`noSideEffect` 프라그마로 주석 처리된 함수는 부작용이 검사되며, 컴파일러는 이를 충족하지 못하는 함수를 컴파일하지 않는다. 님에서 부작용에는 변이, 전역 상태 접근 또는 수정, 비동기 코드, 스레드 코드 및 IO가 포함된다. `var` 또는 `ref` 유형의 매개변수를 사용하는 함수의 경우 매개변수의 변이가 발생할 수 있는데, 이는 현재 실험적인 `strictFuncs`가 향후 컴파일에 실패할 것으로 예상되는 부분이다.[72] `func` 키워드는 `noSideEffect` 프라그마의 단축키이다.[73]

```nim

{.experimental: "strictFuncs".}

type

Node = ref object

le, ri: Node

data: string

func len(n: Node): int =

# 유효: len은 부작용이 없습니다.

var it = n

while it != nil:

inc result

it = it.ri

func mut(n: Node) =

let m = n # 변이를 매개변수에 연결하는 문장입니다.

m.data = "yeah" # 변이는 여기에 있습니다.

# Error: 'mut' can have side effects

# 'n'에서 접근 가능한 개체가 잠재적으로 변이됩니다.

```

통일 함수 호출 구문을 사용하면 임의의 함수를 체이닝할 수 있다.[74]

```nim

import std/[sequtils, 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

3. 3. 3. 메타프로그래밍

님은 템플릿, 제네릭, 매크로 등을 통해 컴파일 시간에 코드를 생성하고 조작할 수 있는 기능을 제공한다.
템플릿템플릿은 추상 구문 트리(AST)에서 간단한 치환을 지원한다. 다음은 템플릿을 사용하여 `Test` 타입을 생성하는 예시이다.

```nim

template 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` 타입을 생성한다.
제네릭님은 제한적 제네릭 프로그래밍과 제한되지 않은 제네릭 프로그래밍을 모두 지원한다. 제네릭은 프로시저, 템플릿, 매크로에서 사용할 수 있다. 제한되지 않은 제네릭 식별자(예: `T`)는 루틴 이름 뒤에 대괄호 안에 정의된다. 제한된 제네릭은 제네릭 식별자 또는 매개변수에 직접 배치할 수 있다.

```nim

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 타입)

import 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

import std/macros

macro twice(arg: untyped): untyped =

result = quote do:

`arg`

`arg`

twice echo "Hello world!"

```

`twice` 매크로는 `echo` 문을 추상 구문 트리 형태로 입력받는다. 이 예시에서는 이 구문 트리를 조작 없이 반환하지만, 두 번 수행하기 때문에 매크로의 이름이 `twice`가 되었다. 결과적으로 코드는 컴파일 시 다음과 같이 다시 작성된다.

```nim

echo "Hello world!"

echo "Hello world!"

```

이처럼 매크로는 추상 구문 트리(AST)를 조작하여 강력한 코드 변환 기능을 제공한다.[108] 항 재작성 매크로는 `Bignum` 및 `Matrix`와 같은 데이터 구조의 효율적인 라이브러리 구현을 가능하게 하며, 마치 원래 언어 기능에 내장되어 있었던 것처럼 효율적인 구현을 가능하게 한다.[109]

4. 컴파일러

님 컴파일러는 기본적으로 빠르고 최적화된 C 코드를 생성한다. Clang, Microsoft Visual C++ (MSVC), MinGW, GNU 컴파일러 모음 (GCC) 등 많은 C 컴파일러가 지원되며, 님은 이러한 외부 C 컴파일러[29]를 이용하여 최종 실행 파일을 생성할 수 있다. 이를 통해 기존 컴파일러의 최적화와 이식성을 활용할 수 있다.

또한 님 컴파일러는 C++, Objective-C, JavaScript 코드를 생성할 수 있어 해당 언어로 작성된 응용 프로그래밍 인터페이스(API)와 쉽게 연동할 수 있다.[7] 이 기능을 통해 iOS 및 안드로이드용 애플리케이션을 작성하는 것도 가능하다.

님 컴파일러는 셀프 호스팅 방식으로, 님 언어로 작성되었다.[31] 크로스 컴파일을 지원하여 개발 머신에 관계없이 지원되는 모든 운영 체제용 소프트웨어를 컴파일할 수 있으므로, 임베디드 시스템과 흔하지 않은 컴퓨터 아키텍처를 위해 컴파일하는 데 유용하다.

4. 1. 컴파일러 옵션

` -d:release` 옵션을 사용하면 속도에 최적화되고 런타임 검사가 줄어든 릴리스 빌드를 생성할 수 있다.[32] 최대 속도를 원할 경우 ` -d:danger` 옵션을 사용하여 모든 런타임 검사를 비활성화할 수 있다.[32]

님은 여러 메모리 관리 전략을 지원한다.[33]

옵션설명
` --mm:arc`이동 의미론 최적화를 사용한 자동 참조 계수(ARC)는 공유 힙을 제공한다. 하드 실시간 시스템에 대해 완전히 결정적인 성능을 제공한다.[34] 순환 참조는 메모리 누수를 유발할 수 있으며, 수동으로 ` .acyclic.` 프라그마를 주석 처리하거나 ` --mm:orc`를 사용하여 처리할 수 있다.
` --mm:orc`` --mm:arc`와 동일하지만 "트라이얼 삭제"를 기반으로 하는 순환 수집기("O")를 추가한다.[35] 순환 수집기는 잠재적으로 순환적인 유형만 분석한다.
` --mm:refc`순환을 수집하기 위해 간단한 마크 앤 스윕 백업 GC를 사용하는 표준 지연된 참조 계수 기반 가비지 컬렉션이다. 힙은 스레드 로컬이다.
` --mm:markAndSweep`간단한 마크 앤 스윕 기반 가비지 컬렉션이다. 힙은 스레드 로컬이다.
` --mm:boehm`Boehm 가비지 컬렉터 기반 가비지 컬렉션이며, 공유 힙을 제공한다.
` --mm:go`Go (프로그래밍 언어)의 가비지 컬렉션으로, Go (프로그래밍 언어)와의 상호 운용성에 유용하다. 공유 힙을 제공한다.
` --mm:none`메모리 관리 전략 또는 가비지 컬렉션이 없다. 할당된 메모리는 개발자 코드에서 수동으로 해제하지 않는 한 절대 해제되지 않는다.



Nim 2.0부터 ORC가 기본 GC이다.[36]

5. 개발 도구

님은 개발 편의성을 높이기 위해 다양한 개발 도구를 제공한다.

설치 패키지에는 Nimble, c2nim 등 여러 도구가 함께 제공된다.[37][39] Nimble은 님 모듈을 패키징하고 관리하는 표준 패키지 관리자이다. c2nim은 C/C++ 코드를 님 코드로 변환하는 도구이다. 이 외에도 코드 유지 관리를 위한 koch, 텍스트 조작 도구인 nimgrep, 코드 편집기에 유용한 정보를 제공하는 nimsuggest, 설치 관리자 생성 도구인 niminst, 코드 서식 도구인 nimpretty, 자동 유닛 테스트 도구인 Testament 등이 있다.

5. 1. 번들 도구

설치 패키지에는 여러 도구가 함께 제공된다.

  • Nimble: 모듈을 패키징하는 데 사용되는 님의 표준 패키지 관리자이다.[37] 님의 핵심 개발자이기도 한 도미니크 피체타가 처음 개발했다. 2015년 10월 27일 v0.12.0 릴리스부터 님의 공식 패키지 관리자로 포함되었다.[38] Nimble 패키지는 패키지 버전, 작성자, 라이선스, 설명, 종속성 등에 대한 정보를 담고 있는 `.nimble` 파일로 정의된다.[18] 님블(Nimble)은 님 모듈을 패키징하는 데 사용되는 패키지 관리자이며 구성을 위해 님스크립트(NimScript)를 사용한다. [https://github.com/nim-lang/nimble 님블]은 깃(Git) 저장소에서 패키지의 주요 소스로 작동한다. 패키지 목록은 JSON 파일에 저장되며, nim-lang/packages 저장소에서 자유롭게 접근할 수 있다. 이 JSON 파일은 님블에 Git URL을 제공하며, 해당 URL에서 패키지가 클론되어 설치된다.[121]
  • c2nim: https://github.com/nim-lang/c2nim c2nim은 Ansi C 코드를 Nim 코드로 변환할 때 새로운 바인딩을 생성하는 데 기여한다. 출력은 사람이 읽을 수 있는 Nim 코드가 되며, 이를 통해 변환 후에 사람의 손으로 개선 및 개량이 가능하다.

5. 2. 기타 도구


  • choosenim: 님 컴파일러 버전 관리 도구이다. 님블(Nimble) 패키지 관리자를 만든 도미니크 피케타(Dominik Picheta)가 개발하였다. 이 도구를 사용하면 명령줄에서 안정적인 님 컴파일러나 개발 컴파일러 버전을 다운로드하여 쉽게 전환할 수 있다.[45]
  • nimterop: 님(Nim)의 외부 함수 인터페이스에 필요한 C/C++ 래퍼 생성을 자동화하는 도구이다.[47]
  • c2nim은 새로운 님 바인딩을 생성하기 위해 C/C++ 헤더에 사용하도록 설계된 소스 간 컴파일러(트랜스파일러 또는 변환기)이다.[39] 출력물은 번역 과정 후에 수동으로 편집할 수 있는 사람이 읽을 수 있는 님 코드이다.

6. 라이브러리

님은 구문 매크로 및 용어 재작성 매크로와 같은 컴파일 시간 메타 프로그래밍 기능을 지원한다.[11] 용어 재작성 매크로는 빅넘이나 행렬과 같은 일반적인 데이터 구조를 라이브러리 구현을 통해 효율적으로 구현하고, 마치 언어 내장 기능처럼 구문적으로 통합할 수 있게 한다.[12]

6. 1. 표준 라이브러리

님(Nim) 표준 라이브러리는 다음과 같은 기본적인 작업을 위한 모듈을 포함한다.[48]

  • 시스템 및 핵심 모듈
  • 컬렉션 및 알고리즘
  • 문자열 처리
  • 시간 처리
  • 일반 운영 체제 서비스
  • 수학 라이브러리
  • 인터넷 프로토콜 및 지원
  • 스레딩
  • 파서
  • 문서 유틸리티
  • XML 처리
  • XML 및 HTML 코드 생성기
  • 해싱
  • 데이터베이스 지원 (PostgreSQL, MySQL, SQLite)
  • 래퍼 (Win32 API, POSIX)

6. 2. 외부 라이브러리 사용

님은 C, C++, 자바스크립트 프로그램에서 사용할 수 있는 모든 라이브러리를 사용할 수 있다. 언어 바인딩GTK,[49][50] Qt QML,[51] wxWidgets,[52] SDL 2,[53][54] Raylib,[55] Godot,[56] UE5,[57] Cairo,[58] OpenGL,[59] Vulkan,[60] WinAPI,[61] zlib, libzip, OpenSSL, cURL을 포함한 많은 라이브러리에 존재한다.[62] 님은 PostgreSQL, MySQL, SQLite 데이터베이스와 함께 작동한다.

님을 Lua,[63] Julia,[64] Rust,[65] C#,[66] Python[67] 프로그래밍 언어와 연결하거나 님을 타입스크립트로 변환하는 데 사용할 수 있는 다양한 지원 수준의 오픈 소스 도구가 있다.[68]

Nim의 외부 함수 인터페이스(FFI)는 Nim이 컴파일할 수 있는 다른 프로그래밍 언어로 작성된 함수를 호출하는 데 사용된다. 이는 C, C++, Objective-C 및 JavaScript로 작성된 라이브러리를 Nim 소스 코드에서 사용할 수 있음을 의미한다. JavaScript와 C, C++ 또는 Objective-C 라이브러리는 서로 호환되지만, JavaScript와는 호환되지 않으므로 동일한 프로그램에서 결합할 수 없다. C++와 Objective-C는 모두 C를 기반으로 하며 C와 호환되지만, JavaScript는 동적이고 클라이언트 측 웹 기반 언어이므로 호환되지 않는다.[18]

7. 동시성 및 병렬성

`--threads:on` 컴파일 옵션을 사용하여 님(Nim)에서 스레딩을 활성화할 수 있다. 각 스레드는 별도의 가비지 컬렉션 힙을 가지므로 메모리 공유를 최소화하고 경합 상태를 방지한다.[10] `channels` 모듈을 사용하여 스레드 간 안전한 데이터 통신을 지원한다.[10]

```nim

import std/os

type

CalculationTask = object

id*: int

data*: int

CalculationResult = object

id*: int

result*: int

var task_queue: Channel[CalculationTask]

var result_queue: Channel[CalculationResult]

proc workerFunc() {.thread.} =

result_queue.open()

while 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))

while true:

echo "got result: ", repr(result_queue.recv())

7. 1. 동시성

님은 표준 라이브러리의 `asyncdispatch` 모듈 또는 외부 `chronos` 라이브러리를 통해 비동기 I/O를 지원한다.[82] async/await 구문을 사용하여 비동기 코드를 간결하게 작성할 수 있다. 두 라이브러리 모두 특수한 언어 지원 없이 매크로 시스템을 통해 async/await 구문을 추가한다.[82]

다음은 비동기 HTTP 서버의 예시이다.

```nim

import std/[asynchttpserver, asyncdispatch]

# chronos could also be alternatively used in place of asyncdispatch,

# with no other changes.

var server = newAsyncHttpServer()

proc cb(req: Request) {.async.} =

await req.respond(Http200, "Hello World")

waitFor server.serve(Port(8080), cb)

7. 2. 병렬성

`--threads:on` 컴파일 옵션을 사용하여 스레딩을 활성화할 수 있다. 각 스레드는 별도의 가비지 컬렉션 힙을 가지므로 메모리 공유를 최소화하고 경합 상태를 방지한다. `channels` 모듈을 사용하여 스레드 간 안전한 데이터 통신을 지원한다.[10]

8. 커뮤니티

님은 깃허브와 포럼을 통해 운영되는 버그 추적 커뮤니티가 있다.[125][126] 2015년에는 O'Reilly 오픈 소스 컨벤션(OSCON)에서 님에 대한 발표가 있었다.[127][128][129]

8. 1. 온라인

님은 자체 호스팅, 자체 개발된 공식 포럼에서 활발한 커뮤니티를 운영하고 있다.[83] 또한, 이 프로젝트는 깃허브에서 호스팅되는 깃(Git) 저장소, 버그 추적기, RFC 추적기 및 위키를 사용하며, 여기서 커뮤니티는 해당 언어와 소통한다.[84] IRC, 매트릭스, 디스코드, 기터, 텔레그램 간의 브리지 역할을 하는 공식 온라인 채팅방도 있다.[85]

8. 2. 컨벤션

님은 자체 호스팅, 자체 개발된 공식 포럼에서 활발한 커뮤니티를 운영하고 있다.[83] 2020년부터 매년 님 공식 컨퍼런스인 NimConf가 개최되고 있다. 2020년과 2021년에는 코로나19로 인해 온라인으로 개최되었다.[86][89]

연도행사명주요 내용
2020NimConf 2020웹 프레임워크, 모바일 개발, 사물 인터넷 (IoT) 장치, 게임 개발, 게임보이 어드밴스용 님 작성 방법[87]
2021NimConf 2021비디오 게임 개발, REPL, 실시간 운영 체제, 업계의 님, 객체 관계 매핑 (ORM), 퍼징, 프로그래밍 언어 설계, 그래픽 라이브러리[89]
2022FOSDEM 2022코로나19 범유행으로 님 자체 개발자 룸 가상 호스팅, 동시성 (컴퓨터 과학), 임베디드 소프트웨어 프로그래밍, GPU 프로그래밍, 엔티티-컴포넌트 시스템, 비디오 게임 개발, 규칙 엔진, 파이썬 (프로그래밍 언어) 상호 운용성, 메타 프로그래밍 강연[94][95]



공식 컨퍼런스 외에도 2015년 O'Reilly 오픈 소스 컨벤션 (OSCON)에서 님에 대한 발표가 있었다.[90][91][92]

9. 코드 예시

다음 코드 예제는 Nim 0.13.0의 문법으로 유효하며, 버전이 새로워짐에 따라 표기법이 변경될 수 있다.[123]

하위 섹션에 이미 헬로 월드 예제가 있으므로, 여기서는 생략한다.

'''문자열 뒤집기'''

님(Nim)의 모든 프로시저(procedure)는 void가 아닌 반환 형식을 가지며, 반환될 값을 나타내는 암시적 `result` 변수를 가진다. 다음은 `result` 변수와 반복자의 사용법을 보여주는 예시이다.

```nim

proc reverse(s: string): string =

for i in countdown(s.high, 0):

result.add s[i]

let str1 = "Reverse This!"

echo "Reversed: ", reverse(str1)

```

위 코드에서 `countdown`은 반복자이다. for 루프에서 반복자가 생략되면, 컴파일러는 지정된 타입에 대해 정의된 `items` 반복자를 사용하려고 시도한다.

'''계승 (팩토리얼)'''

님은 상속을 통해 객체 지향 프로그래밍을 지원한다.[11]

다음은 양의 정수의 계승을 반복적인 방법으로 계산하는 프로그램으로, try/catch 오류 처리 및 for 루프를 보여준다.

```nim

import std/strutils

var 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

echo fact

```

'''피보나치 수열'''

```nim

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

```

피보나치 수열 함수의 여러 구현으로, 암시적 반환, 기본 매개변수, 반복자, 재귀 및 while 루프를 보여준다.

'''GUI'''

님(Nim)은 C, C++, 자바스크립트 프로그램에서 사용할 수 있는 모든 라이브러리를 사용할 수 있다. 언어 바인딩GTK,[49][50] Qt QML,[51] wxWidgets,[52] SDL 2,[53][54] Raylib,[55] Godot,[56] UE5,[57] Cairo,[58] OpenGL,[59] Vulkan,[60] WinAPI,[61] zlib, libzip, OpenSSL, cURL을 포함한 많은 라이브러리에 존재한다.[62]

9. 1. Hello World

nim

echo "Hello, World!"

```

프로시저는 괄호 없이 호출할 수 있다.

```nim

echo "Hello, World!"

```

`stdout` 스트림과 함께 `write` 함수를 호출하여 "Hello World"를 출력할 수도 있다.

```nim

stdout.write("Hello, World!\n")

write(stdout, "Hello, World!\n")

```

이 코드는 님(Nim) 프로그래밍 언어의 헬로 월드 프로그램 예시이다.

9. 2. 문자열 뒤집기

님(Nim)의 모든 프로시저(procedure)는 void가 아닌 반환 형식을 가지며, 반환될 값을 나타내는 암시적 `result` 변수를 가진다. 다음은 `result` 변수와 반복자의 사용법을 보여주는 예시이다.

```nim

proc reverse(s: string): string =

for i in countdown(s.high, 0):

result.add s[i]

let str1 = "Reverse This!"

echo "Reversed: ", reverse(str1)

```

위 코드에서 `countdown`은 반복자이다. for 루프에서 반복자가 생략되면, 컴파일러는 지정된 타입에 대해 정의된 `items` 반복자를 사용하려고 시도한다.

다음은 위와 동일한 기능을 하는 또 다른 예시이다.

```nim

proc reverse(s: string): string =

result = "" # 암묵적인 result 변수

for i in countdown(high(s), 0):

result.add s[i]

var str1 = "Reverse This!"

echo "Reversed: ", reverse(str1)

9. 3. 계승 (팩토리얼)

님은 상속을 통해 객체 지향 프로그래밍을 지원한다.[11]

다음은 양의 정수의 계승을 반복적인 방법으로 계산하는 프로그램으로, try/catch 오류 처리 및 for 루프를 보여준다.



import std/strutils

var 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

echo fact



Nim의 표준 라이브러리에서 math 모듈을 사용하면 다음과 같다.



import std/math

echo fac(x)


9. 4. 피보나치 수열

nim

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

```

피보나치 수열 함수의 여러 구현으로, 암시적 반환, 기본 매개변수, 반복자, 재귀 및 while 루프를 보여준다.

9. 5. GUI

님(Nim)은 C, C++, 자바스크립트 프로그램에서 사용할 수 있는 모든 라이브러리를 사용할 수 있다. 언어 바인딩GTK,[49][50] Qt QML,[51] wxWidgets,[52] SDL 2,[53][54] Raylib,[55] Godot,[56] UE5,[57] Cairo,[58] OpenGL,[59] Vulkan,[60] WinAPI,[61] zlib, libzip, OpenSSL, cURL을 포함한 많은 라이브러리에 존재한다.[62] 님은 PostgreSQL, MySQL, SQLite 데이터베이스와 함께 작동한다.

다음은 GObject 인트로스펙션과 함께 GTK 3를 사용하는 예시이다([https://github.com/StefanSalewski/gintro gintro] 모듈을 통해).

```nim

import gintro/[gtk, glib, gobject, gio]

proc appActivate(app: Application) =

let window = newApplicationWindow(app)

window.title = "GTK3 application with gobject introspection"

window.defaultSize = (400, 400)

showAll(window)

proc main =

let app = newApplication("org.gtk.example")

connect(app, "activate", appActivate)

discard run(app)

main()

```

이 코드는 표준 라이브러리의 일부가 아닌 gintro 모듈이 필요하다. gintro 모듈 및 기타 여러 모듈은 Nim의 일부로 제공되는 도구인 nimble을 사용하여 설치할 수 있다. nimble을 사용하여 gintro 모듈을 설치하려면 다음 명령어를 실행한다.

```

nimble install gintro

참조

[1] 웹사이트 Contributors to nim-lang/Nim https://github.com/n[...] 2022-03-23
[2] 웹사이트 Nim by example https://nim-by-examp[...] 2014-07-20
[3] 간행물 Метапрограмиране с Nimrod https://ibob.github.[...] 2014-07-27
[4] 웹사이트 Nim without GC https://nim-lang.org[...] 2017-10-19
[5] 웹사이트 Packaging Nim https://nim-lang.org[...] 2022-03-23
[6] 웹사이트 Install Nim https://nim-lang.org[...] 2018-10-12
[7] 웹사이트 Nimrod: A new systems programming language http://www.drdobbs.c[...] 2014-07-20
[8] 웹사이트 The Nim Programming Language http://nim-lang.org/ 2014-07-20
[9] 웹사이트 FAQ https://nim-lang.org[...] 2015-03-27
[10] 웹사이트 Nim Syntax https://akehrer.gith[...] 2015-01-05
[11] 웹사이트 Nim Manual https://nim-lang.org[...] 2014-07-20
[12] 웹사이트 Strangeloop Nim presentation https://thestrangelo[...] 2015-04-30
[13] 웹사이트 Nim's Memory Management https://nim-lang.org[...] 2023-08-17
[14] 웹사이트 The Rise And Fall of Languages in 2013 http://www.drdobbs.c[...] 2018-10-08
[15] 문서 Nim Compiler User Guide https://nim-lang.org[...]
[16] 웹사이트 Nim Releases https://github.com/n[...] Nim Project 2020-01-26
[17] 서적 Mastering Nim: A complete guide to the programming language
[18] 서적 Nim in Action Manning Publications
[19] 웹사이트 Nim Pascal Sources https://github.com/A[...] 2013-04-05
[20] 웹사이트 News http://nim-lang.org:[...] 2016-06-11
[21] 웹사이트 Contributors https://github.com/A[...] 2013-04-05
[22] 웹사이트 Version 0.10.2 released https://nim-lang.org[...] 2018-10-17
[23] 웹사이트 Nim v2.0 released https://nim-lang.org[...] 2023-08-17
[24] 웹사이트 Nim language draws from best of Python, Rust, Go, and Lisp https://www.infoworl[...] 2017-01-16
[25] Youtube arnetheduck/nlvm https://www.youtube.[...] 2023-10-15
[26] 웹사이트 Nim Manual: Method call syntax http://nim-lang.org/[...] 2018-10-12
[27] 웹사이트 Nim Manual: Identifier Equality https://nim-lang.org[...] 2023-08-17
[28] 웹사이트 Tips and tricks https://github.com/n[...] 2018-10-17
[29] AV media Nimrod: A New Approach to Metaprogramming http://www.infoq.com[...] 2014-07-20
[30] Citation arnetheduck/nlvm https://github.com/a[...] 2020-07-21
[31] 웹사이트 Nim Compiling https://github.com/n[...] 2018-10-17
[32] 웹사이트 Nim Compiler User Guide https://nim-lang.org[...]
[33] 웹사이트 Nim's Memory Management https://nim-lang.org[...] 2024-07-28
[34] 웹사이트 Introduction to ARC/ORC in Nim https://nim-lang.org[...] 2023-08-17
[35] 웹사이트 ORC - Vorsprung durch Algorithmen https://nim-lang.org[...] 2023-08-17
[36] 웹사이트 Nim v2.0 released https://nim-lang.org[...] 2023-08-17
[37] 웹사이트 Nimble https://github.com/n[...] 2018-10-12
[38] 웹사이트 Nim v0.12.0 release https://github.com/n[...] 2020-11-28
[39] 웹사이트 c2nim https://github.com/n[...] 2018-10-12
[40] 웹사이트 Nim maintenance script https://nim-lang.org[...] 2021-11-16
[41] 웹사이트 nimgrep User's manual https://nim-lang.org[...] 2021-11-16
[42] 웹사이트 Nim IDE Integration Guide https://nim-lang.org[...] 2021-11-16
[43] 웹사이트 niminst User's manual https://nim-lang.org[...] 2021-11-16
[44] 웹사이트 Tools available with Nim https://nim-lang.org[...] 2022-02-18
[45] 웹사이트 choosenim https://github.com/d[...] 2018-10-12
[46] 간행물 nimpy https://github.com/y[...] 2021-11-12
[47] 간행물 nimterop/nimterop https://github.com/n[...] nimterop 2021-11-12
[48] 문서 Nim Standard Library https://nim-lang.org[...]
[49] 간행물 Installation https://github.com/n[...] The Nim programming language 2021-09-25
[50] 간행물 High level GTK4 and GTK3 bindings for the Nim programming language https://github.com/S[...] 2021-11-15
[51] 웹사이트 NimQml https://github.com/s[...] 2022-11-10
[52] 웹사이트 WxNim https://github.com/P[...] 2022-11-29
[53] 간행물 SDL2 for Nim https://github.com/n[...] The Nim programming language 2021-10-26
[54] 간행물 sdl2_nim 2.0.14.2 https://github.com/V[...] 2021-11-15
[55] 웹사이트 naylib https://github.com/p[...] 2024-07-28
[56] 웹사이트 godot-nim https://github.com/g[...] 2024-07-28
[57] 웹사이트 NimForUE https://github.com/j[...] 2024-07-28
[58] 간행물 Cairo https://github.com/n[...] The Nim programming language 2021-10-05
[59] 간행물 opengl https://github.com/n[...] The Nim programming language 2021-11-14
[60] 웹사이트 vulkan https://github.com/n[...] 2024-07-28
[61] 간행물 Winim https://github.com/k[...] 2021-11-15
[62] 웹사이트 Nim Standard Library http://nim-lang.org/[...] 2015-04-04
[63] 웹사이트 nimLUA https://github.com/j[...] 2018-10-17
[64] 웹사이트 NimJL https://github.com/C[...] 2022-08-24
[65] 웹사이트 Nbindgen https://github.com/a[...] 2022-11-17
[66] 웹사이트 cs2nim https://github.com/k[...] 2022-10-10
[67] 간행물 yglukhov/nimpy https://github.com/y[...] 2020-07-20
[68] 웹사이트 ts2nim https://github.com/b[...] 2022-11-21
[69] 웹사이트 Nim Manual https://nim-lang.org[...] 2021-07-10
[70] 웹사이트 Nim Forum: Update on strict funcs https://forum.nim-la[...] 2023-08-17
[71] 웹사이트 Nim by Example - First Class Functions https://nim-by-examp[...]
[72] 웹사이트 Nim Experimental Features: Strict Funcs https://nim-lang.org[...]
[73] 웹사이트 Nim Manual: Func https://nim-lang.org[...]
[74] 웹사이트 std/sequtils https://nim-lang.org[...] 2023-08-17
[75] 웹사이트 Nim Manual: Object variants https://nim-lang.org[...] 2023-08-17
[76] 웹사이트 src/fusion/matching https://nim-lang.git[...] 2023-08-17
[77] 웹사이트 Nim Tutorial (Part II): Object Oriented Programming https://nim-lang.org[...] 2023-08-17
[78] 웹사이트 Nim by Example - Object Oriented Programming https://nim-by-examp[...] 2023-08-17
[79] 웹사이트 system/exceptions https://nim-lang.org[...] 2023-08-17
[80] 웹사이트 Nim Manual: Type Classes https://nim-lang.org[...] 2020-07-21
[81] 웹사이트 Nim Tutorial (Part III) https://nim-lang.org[...] 2023-08-17
[82] 간행물 Chronos - An efficient library for asynchronous programming https://github.com/s[...] Status 2023-08-14
[83] 웹사이트 Nim Forum http://forum.nim-lan[...] nim-lang.org 2015-05-04
[84] 웹사이트 Primary source code repository and bug tracker https://github.com/A[...] 2015-05-04
[85] 웹사이트 Community https://nim-lang.org[...] 2023-08-17
[86] 웹사이트 Nim Online Conference 2020 https://nim-lang.org[...] 2020-11-28
[87] 웹사이트 NimConf 2020 https://conf.nim-lan[...] 2023-08-17
[88] Youtube NimConf 2020 Playlist https://www.youtube.[...] 2020-11-28
[89] 웹사이트 NimConf 2021 https://conf.nim-lan[...] 2023-08-17
[90] 웹사이트 Nim at OSCON 2015 http://www.oscon.com[...] O'Reilly Media 2015-07-20
[91] 웹사이트 Essential Languages: Nim, Scala, Python http://www.oreilly.c[...] O'Reilly Media 2018-10-17
[92] AV media OSCON 2015 – Nim: An Overview https://www.youtube.[...] 2015-10-26
[93] 웹사이트 Events https://fosdem.org/2[...] 2020-02-17
[94] 웹사이트 Nim Devroom at FOSDEM 2022 - Call for Participation https://nim-lang.org[...] 2023-08-17
[95] 웹사이트 Nim Programming Language devroom https://archive.fosd[...] 2023-08-17
[96] 웹사이트 Nim by example http://nim-by-exampl[...] GitHub 2014-07-20
[97] conference Метапрограмиране с Nimrod http://ibob.github.i[...] 2014-07-27
[98] 웹사이트 FAQ http://nim-lang.org/[...] 2015-03-27
[99] 웹사이트 copying.txt https://github.com/A[...] GitHub 2015-03-27
[100] 웹사이트 Version 0.10.2 released - Nim Blog https://nim-lang.org[...] 2020-12-11
[101] 웹사이트 Nimrod: A new systems programming language http://www.drdobbs.c[...] 2014-02-11
[102] 웹사이트 The Nim Programming Language http://nim-lang.org/ 2014-07-20
[103] 웹사이트 What's so special about Nim? http://hookrace.net/[...] 2015-03-27
[104] 웹사이트 nim-lang.org https://nim-lang.org[...] 2020-12-17
[105] 웹사이트 BEST SYSTEMS PROGRAMMING LANGUAGES https://www.slant.co[...] 2020-12-17
[106] 문서 システムプログラミング言語#主なプログラミング言語
[107] 웹사이트 Nim Syntax https://akehrer.gith[...] 2015-03-27
[108] 웹사이트 Nim Manual http://nim-lang.org/[...] 2014-07-20
[109] 웹사이트 Strangeloop Nim presentation https://thestrangelo[...] 2015-04-30
[110] 웹사이트 Nim's Garbage Collector http://nim-lang.org/[...] 2015-04-03
[111] 웹사이트 A Quick Comparison of Nim vs. Rust http://arthurtw.gith[...] 2015-05-08
[112] 문서 Andrew Binstock Dr. Dobb's
[113] 뉴스 The Rise And Fall of Languages in 2013 http://www.drdobbs.c[...] Dr. Dobb's 2014-01-07
[114] 문서 Andreas Rumpf
[115] 웹사이트 Nim Pascal Sources https://github.com/A[...] GitHub 2013-04-05
[116] 웹사이트 News https://web.archive.[...] 2016-06-11
[117] 웹사이트 Contributors https://github.com/A[...] GitHub 2013-04-05
[118] Youtube Nimrod: A New Approach to Metaprogramming http://www.infoq.com[...] 2014-01-15
[119] 웹사이트 Nimrod for cross platform software http://gradha.github[...] GitHub 2014-07-20
[120] 웹사이트 Nimrod-on-android failure http://forum.nim-lan[...] 2015-02-28
[121] 문서 Nimble https://github.com/n[...]
[122] 웹사이트 Nim Standard Library http://nim-lang.org/[...] 2015-04-04
[123] 문서 Nim code examples at Rosetta Code http://rosettacode.o[...]
[124] 웹사이트 What is special about Nim? http://hookrace.net/[...] 2015-02-17
[125] 웹사이트 Primary source code repository and bug tracker https://github.com/A[...] GitHub 2015-05-04
[126] 웹사이트 Forum http://forum.nim-lan[...] nim-lang.org 2015-05-04
[127] 웹사이트 Nim at OSCON 2015 http://www.oscon.com[...] OSCON 2015-05-04
[128] 웹사이트 Essential Languages: Nim, Scala, Python http://www.oreilly.c[...] 2015-05-08
[129] Youtube Presentation of Nim by Andreas Rumpf on OSCON 2015 https://www.youtube.[...]
[130] 웹인용 Contributors to nim-lang/Nim https://github.com/n[...] 2022-03-23
[131] 웹인용 Nim by example https://nim-by-examp[...] 2014-07-20
[132] 간행물 Метапрограмиране с Nimrod https://ibob.github.[...] 2014-07-27
[133] 웹인용 Packaging Nim https://nim-lang.org[...] 2022-03-23
[134] 웹인용 Install Nim https://nim-lang.org[...] 2018-10-12
[135] 웹인용 FAQ https://nim-lang.org[...] 2015-03-27
[136] 웹인용 copying.txt https://github.com/n[...] 2015-03-27
[137] 웹인용 Nimrod: A new systems programming language http://www.drdobbs.c[...] 2014-07-20



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com