님 (프로그래밍 언어)
"오늘의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. 버전 역사
님은 정적 타입 언어로, 컴파일 시점에 타입 오류를 검출하여 안정성을 높였다.[1] 파이썬과 유사한 간결한 문법을 채택하여 가독성과 생산성을 높였으며,[24] 컴파일 타임 메타 프로그래밍 기능을 통해 코드 생성 및 조작이 가능하다.[11]
님(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. 언어 설계
객체 지향 프로그래밍은 상속 및 다중 디스패치를 통해 지원된다. 함수는 제네릭으로 오버로드될 수 있으며, 제네릭 프로그래밍은 님의 타입 클래스 지원으로 더욱 향상된다. 연산자 오버로딩 또한 지원된다.[11]
함수형 프로그래밍을 위한 기능으로, 반복자를 지원하며, 일급 엔티티로 사용할 수 있다.[11] 함수 또한 일급 엔티티로 사용 가능하다.
다양한 메모리 관리 전략을 지원한다.
현재, 님은 C, C++, 자바스크립트, Objective-C,[15] 및 LLVM으로 컴파일된다.[30]
앤드루 빈스톡(Andrew Binstock)은 님에 대해 다음과 같이 말했다.
3. 1. 문법
님(프로그래밍 언어)의 구문은 파이썬과 유사하게 들여쓰기 기반 구문을 지원하며, 오프사이드 규칙에 따라 공백을 사용하여 코드 블록과 중첩 문을 식별한다.[24] 쉼표나 이항 연산자가 각 줄의 끝에 있으면 단일 명령문이 여러 줄에 걸쳐 있을 수 있다. 또한 사용자 정의 연산자를 지원한다.
파이썬과 달리 님은 정적 타이핑을 구현하며, 쉬운 타입 변환, 캐스팅 및 제네릭 프로그래밍을 위한 구문을 제공한다. 여러 타입을 대신할 수 있는 타입 클래스를 제공하며, '즉시 사용 가능한' 여러 타입 클래스를 제공한다. 예를 들어:
다음은 님에서 타입 클래스의 사용법을 보여주는 코드 예시이다.
```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. 프로그래밍 패러다임
님은 다중 패러다임 프로그래밍 언어로, 명령형 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍, 메타프로그래밍 등 다양한 스타일을 지원한다.
님은 파이썬과 유사한 문법을 가지고 있지만, 정적 타이핑을 사용한다.[24] 타입 시스템은 쉬운 타입 변환과 캐스팅을 허용하며, 제네릭 프로그래밍을 위한 구문을 제공한다. 여러 타입을 대신할 수 있는 타입 클래스를 제공하며, '즉시 사용 가능한' 여러 타입 클래스를 제공한다. 예를 들어:
다음은 타입 클래스 사용 예시이다.
```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` | 메모리 관리 전략 또는 가비지 컬렉션이 없다. 할당된 메모리는 개발자 코드에서 수동으로 해제하지 않는 한 절대 해제되지 않는다. |
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]연도 | 행사명 | 주요 내용 |
---|---|---|
2020 | NimConf 2020 | 웹 프레임워크, 모바일 개발, 사물 인터넷 (IoT) 장치, 게임 개발, 게임보이 어드밴스용 님 작성 방법[87] |
2021 | NimConf 2021 | 비디오 게임 개발, REPL, 실시간 운영 체제, 업계의 님, 객체 관계 매핑 (ORM), 퍼징, 프로그래밍 언어 설계, 그래픽 라이브러리[89] |
2022 | FOSDEM 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
nimecho "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. 피보나치 수열
nimproc 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