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 มากทางวากยสัมพันธ์ อย่างไรก็ตามในบางแง่มุมก็แตกต่างออกไป มีคีย์เวิร์ดที่สั้นกว่า: fn สำหรับ func , str สำหรับ string , in for range เพื่อให้อ่านง่ายขึ้น จำเป็นต้องมี : ระหว่างชื่อตัวแปรและประเภทในการประกาศ มันไม่เป็นไปตามประเพณี C ที่โชคร้ายของการยกเลิกการอ้างอิงตัวชี้ แทนที่จะใช้ *p จะใช้ไวยากรณ์ Pascal p^ เนื่องจากอักขระ * ไม่ได้ใช้สำหรับพอยน์เตอร์อีกต่อไป อักขระดังกล่าวจึงกลายเป็นเครื่องหมายส่งออก เช่นเดียวกับใน Oberon เพื่อให้โปรแกรมเมอร์สามารถใช้อักษรตัวพิมพ์ใหญ่/ตัวพิมพ์เล็กในตัวระบุตามสไตล์ของตนเองได้อย่างอิสระ การยืนยันประเภทไม่มีไวยากรณ์พิเศษ พวกมันดูเหมือนแบบพอยน์เตอร์ คำจำกัดความของการปิดจำเป็นต้องมีรายการตัวแปรที่บันทึกไว้อย่างชัดเจน
Umka อนุญาตให้ใช้ประเภทโดยนัยและสนับสนุนพารามิเตอร์เริ่มต้นในการประกาศฟังก์ชัน มันมีตัวดำเนินการตามเงื่อนไขแบบไตรภาคที่จงใจละเว้นจาก Go ไม่มีการแบ่งส่วนเป็นประเภทข้อมูลที่แยกจากกัน แต่จะสนับสนุนอาร์เรย์แบบไดนามิกซึ่งมีการประกาศเหมือนสไลซ์ของ Go และเริ่มต้นได้โดยการเรียก make() ตัวรับวิธีการจะต้องเป็นตัวชี้ โมเดลมัลติเธรดใน Umka ได้รับแรงบันดาลใจจาก Lua และ Wren มากกว่า Go โดยนำเสนอเส้นด้ายน้ำหนักเบาที่เรียกว่าไฟเบอร์ แทนที่จะเป็นโกรูทีนและแชนเนล กลไกการรวบรวมขยะจะขึ้นอยู่กับการนับการอ้างอิง ดังนั้น Umka จึงต้องสนับสนุนตัวชี้ weak การสนับสนุน Unicode แบบเต็มอยู่ระหว่างการพัฒนา