Umka는 정적으로 유형이 지정된 내장형 스크립팅 언어입니다. 이는 스크립팅에 필요한 단순성과 유연성을 유형 오류에 대한 컴파일 타임 보호와 결합합니다. 그 목표는 Python Zen 원칙을 따르는 것입니다. 명시적인 것이 암시적인 것보다 낫습니다 . 동적 유형이 지정된 언어가 일반적으로 수행하는 것보다 더 일관됩니다.
400 x 400 매트릭스 곱셈(AMD A4-3300M @ 1.9 GHz, Windows 7)
fn main() {
printf("Hello Umka!n")
}
const a = 3
const b* = 2.38 // Exported identifier
const (
c = sin(b) / 5
d = "Hello" + " World"
)
type IntPtr = ^uint16 // Pointer
type Arr = [a]real // Array
type (
DynArr = [][5]int // Dynamic array
String = str // String
Button = enum { // Enumeration
left
middle
right
}
MyMap = map[str]real // Map
Quat = struct { // Structure
q: [4]real
normalized: bool
}
Printable = interface { // Interface
print(): int
}
ErrFn = fn(code: int) // Function
)
var e: int
var f: String = d + "!"
var (
g: Arr = [3]real{2.3, -4.1 / 2, b}
h: DynArr
m: MyMap
)
q := Quat{q: [4]real{1, 0, 0, 0}, normalized: true}
fn tan(x: real): real {return sin(x) / cos(x)}
fn getValue(): (int, bool) {return 42, true}
fn (a: ^Arr) print(): int {
printf("Arr: %vn", a^)
return 0
}
h = make([][5]int, 3) // Dynamic arrays and maps are initialized with make()
m = make(MyMap)
m["Hello Umka"] = 3.14
sum := 0.0
y := tan(30 * std::pi / 180)
h = append(h, [5]int{10, 20, 30, 40, 50})
h = delete(h, 1)
g.print()
if x, ok := getValue(); ok {
printf("Got %vn", x)
}
switch a {
case 1, 3, 5, 7: std::println(std::itoa(a) + " is odd")
case 2, 4, 6, 8: std::println(std::itoa(a) + " is even")
default: std::println("I don't know")
}
switch v := type(a) {
case int: printf("int: %d + 5 = %dn", v, v + 5)
case str: printf("str: %s + 5 = %sn", v, v + "5")
default: printf("unknown: %vn", a)
}
for k := 1; k <= 128; k *= 2 {
printf("%vn", k)
}
for i, x in g {
if fabs(x) > 1e12 {break}
if x < 0 {continue}
sum += x
}
a := new(int)
child := make(fiber, |a| {
for i := 0; i < 5; i++ {
std::println("Child : i=" + std::itoa(i) + " buf=" + std::itoa(a^))
a^ = i * 3
resume()
}
})
for i := 0; i < 10; i++ {
std::println("Parent: i=" + std::itoa(i) + " buf=" + std::itoa(a^))
a^ = i * 7
if valid(child) {
resume(child)
}
}
Go는 복잡한 런타임 라이브러리와 대규모 출력 바이너리를 갖춘 컴파일된 시스템 프로그래밍 언어인 반면, Umka는 공유 라이브러리로 모든 애플리케이션에 쉽게 내장할 수 있는 경량 인터프리터를 갖춘 스크립팅 언어입니다.
Umka는 구문적으로 Go와 매우 유사합니다. 그러나 어떤 면에서는 다릅니다. 더 짧은 키워드가 있습니다: func
의 경우 fn
, string
의 경우 str
, range
의 경우 in
. 가독성을 높이려면 선언의 변수 이름과 유형 사이에 :
가 필요합니다. 포인터 역참조라는 불행한 C 전통을 따르지 않습니다. *p
대신 파스칼 구문 p^
사용합니다. *
문자는 더 이상 포인터로 사용되지 않으므로 Oberon처럼 내보내기 표시가 되어 프로그래머가 자신의 스타일에 따라 식별자에 대문자/소문자를 자유롭게 사용할 수 있습니다. 유형 주장에는 특별한 구문이 없습니다. 포인터 유형 캐스트처럼 보입니다. 클로저 정의에는 캡처된 변수의 명시적인 목록이 필요합니다.
Umka는 암시적 유형 캐스팅을 허용하고 함수 선언에서 기본 매개변수를 지원합니다. Go에서 의도적으로 생략된 삼항 조건 연산자가 특징입니다. 별도의 데이터 유형으로 조각이 없습니다. 대신 Go의 슬라이스처럼 선언되고 make()
호출하여 초기화되는 동적 배열을 지원합니다. 메소드 수신자는 포인터여야 합니다. Umka의 멀티스레딩 모델은 Go보다는 Lua와 Wren에서 영감을 받았습니다. 고루틴과 채널 대신 파이버라는 경량 스레드를 제공합니다. 가비지 수집 메커니즘은 참조 계산을 기반으로 하므로 Umka는 weak
포인터를 지원해야 합니다. 전체 유니코드 지원이 개발 중입니다.