Erg: Python 호환 정적 유형 언어

12021 단어 newspythonrust
저는 몇 년 동안 프로그래밍 언어를 개발해 왔으며 이번 주에 GitHub에 게시했습니다.

언어의 이름은 Erg입니다. TypeScript의 Python 버전이라고 생각하면 됩니다(하지만 TS보다 더 우아하다고 생각합니다).

Python은 널리 사용되는 언어이지만 동적 타이핑으로 인해 대규모 개발이 어려웠습니다. 제 야망은 Erg로 이 문제를 해결하는 것입니다.

특징:



Note: some features are not yet implemented.



1. 견고성



Erg는 스마트하고 강력한 타입 시스템을 가지고 있습니다. 예를 들어 Erg는 null 검사(옵션 유형), 0으로 나누기, 컴파일 시간에 배열의 범위를 벗어난 주소를 수행할 수 있습니다.

rand = pyimport "random"

l = [1, 2, 3]
assert l in [Nat; 3] # type checking
assert l in [1..3; 3] # more detailed
l2 = l.push(rand.choice! 0..<10)
assert l2 in [0..9; 4]
assert l2 + [3, 5, 7] in [0..9; 7]
# This causes an IndexError, Erg can detect it at compile time
l2[10] # IndexError: `l2` has 7 elements but was accessed the 11th element

2.times! do!:
    print! "hello, ", end: ""
# => hello, hello, 
-2.times! do!:
    print! "hello, ", end: ""
# TypeError: `.times!` is a method of `Nat` (0 or more Int), not `Int`


2. 단순성



Erg는 매우 간단한 구문으로 구성되어 있어 다른 언어에 비해 코드의 양을 크게 줄일 수 있습니다. 그러나 그 기능은 그들보다 열등하지 않습니다.

유형 추론 시스템은 강력하기 때문에 동적으로 유형이 지정된 언어처럼 코딩할 수 있습니다.

fib 0 = 0
fib 1 = 1
fib n = fib(n - 1) + fib(n - 2)
assert fib(10) == 55


Erg에서는 특별하게 취급되는 것이 거의 없습니다. 예약어가 없습니다.
Even forwhile 식은 서브루틴 중 하나일 뿐이므로 이것이 가능합니다.

loop! block = while! True, block

# equals to `while! True, do! print! "hello"`
loop! do!:
    print! "hello"


3. 기능 및 객체 지향



Erg는 순수한 객체 지향 언어입니다. 모든 것이 객체입니다. 유형, 함수 및 연산자는 모두 개체입니다. 반면에 Erg는 기능적 언어이기도 합니다.
Erg는 부작용을 일으키거나 내부 상태를 변경하여 코드의 복잡성을 지역화할 수 있는 코드에 몇 가지 종류의 마커를 배치해야 합니다. 이렇게 하면 코드의 유지 관리성이 크게 향상됩니다.

# Functional style (immutable), same as `sorted()` in Python
immut_arr = [1, 3, 2]
assert immut_arr.sort() == [1, 2, 3]
# Object-oriented style (mutable)
mut_arr = ![1, 3, 2]
mut_arr.sort!()
assert mut_arr == [1, 2, 3]
i = !1
i.update! old -> old + 1
assert i == 2


4. 상호 운용성



Erg는 무료로 Python API를 사용할 수 있습니다. 게다가 잘 입력되어 있습니다!

# using a built-in Python module
rand = pyimport "random"

print! rand.randint!(0, 10) # 7
print! rand.randint!(0, 1.0) # TypeError: the type of rand.randint!::b is mismatched:
# expected:  Int
# but found: {%v16: Float | %v16 == 1.0}


그리고 더 많은 기능이 구현될 예정입니다.

자주하는 질문



Q: Erg가 유형 유추 가능한 경우 Python 함수를 어떻게 호출할 수 있습니까?



A: Erg에는 assert casting라는 기능이 있습니다. 이 기능은 런타임까지 컴파일 시간에 확인할 수 없는 유형 결정을 지연시킵니다(TypeScript의 declare와 동일하지만 더 강력함).

o = eval("1 + 1")
print! Typeof(o) # Object
assert o in Int # From this point on, o can be regarded as Int.
print! Typeof(o) # Int
print! o + 1 # 3


인수가 반환 유형을 변경하는 함수는 or type(Union)을 사용하여 입력됩니다.

parse_int(x: Str): Int or IntParseError


Erg에는 구조적 유형 시스템도 있으므로 어설션 없이 즉시 인수의 속성에 액세스하는 내키지 않는 함수도 유형화할 수 있습니다.

get_name(named: Structural {.name = Str}): Str =
    named.name


이러한 기능을 사용하여 대부분의 Python 함수를 입력할 수 있습니다.exec 와 같은 몇 가지 함수는 여전히 원칙적으로 유형이 지정되지 않지만(쉽게 호출하는 것은 나쁜 습관이며 금지되어야 함) 유형 안전성을 손상시키지 않고 제한된 버전의 eval 함수를 사용할 수 있습니다.

Python 내장 함수는 컴파일러에 의해 특별히 유형이 지정되며 무료로 호출할 수 있습니다. 내장 라이브러리의 기능은 곧 지원될 예정입니다.

Q: Erg는 트랜스파일 언어인가요?



A: 현재로서는 그렇습니다. 내 원래 계획은 심지어 Python 프로세서(VM)를 개발하고 정적으로 유형이 상향 호환되는 Python 언어를 만드는 것이었습니다(그래서 소유권 문법이 있고 GC/GIL이 없도록 만들 계획이었습니다). VM의 이름은 "Dyne"이며 하위 프로젝트로 개발됩니다.

Q: Python과 호환된다고 하는데 구문이 호환되지 않는 것 같습니다.



A: JS/TS와 같은 구문 호환성은 없습니다(간편한 전환을 위해 상당히 유사하게 만들려고 노력했지만). 이전 질문에서 언급했듯이 처리 시스템의 호환성을 의미합니다.

Q: 절차에 첨부하십시오! mark는 구문을 보기 흉하게 만듭니다. 이 구문을 선택한 이유는 무엇입니까?



A: 당신이 그렇게 느낀다면 당신이 옳고 정확히 내가 의도한 것입니다.
코드에서 !의 많은 수는 코드 냄새라고 하는 것입니다. 이 코드는 많은 부작용과 낮은 유지 관리 가능성이 있습니다.

Q: Erg에서 TensorFlow 및 NumPy와 같은 API를 호출할 수 있습니까?



A: TS의 DefinitelyTyped와 같이 Erg 측에서 타이핑하고 호출할 수 있도록 할 예정입니다.


이 프로젝트가 마음에 들면 GitHub에 별표를 표시하십시오.

좋은 웹페이지 즐겨찾기