Erg: Python 호환 정적 유형 언어
언어의 이름은 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
for
및 while
식은 서브루틴 중 하나일 뿐이므로 이것이 가능합니다.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에 별표를 표시하십시오.
Reference
이 문제에 관하여(Erg: Python 호환 정적 유형 언어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mtshiba/erg-a-python-compatible-statically-typed-language-1b9o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)