Umka هي لغة برمجة نصية قابلة للتضمين مكتوبة بشكل ثابت. فهو يجمع بين البساطة والمرونة اللازمة للبرمجة النصية مع الحماية في وقت الترجمة ضد أخطاء الكتابة. هدفها هو اتباع مبدأ Python Zen الصريح أفضل من الضمني بشكل أكثر اتساقًا مما تفعله اللغات المكتوبة ديناميكيًا بشكل عام.
مضاعفة مصفوفة 400 × 400 (AMD A4-3300M @ 1.9 جيجا هرتز، 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
لـ range
. للحصول على إمكانية قراءة أفضل، يتطلب الأمر وجود :
بين أسماء المتغيرات وأنواعها في الإعلانات. إنه لا يتبع تقليد C المؤسف المتمثل في إلغاء مرجعية المؤشر. بدلاً من *p
، يستخدم بناء جملة باسكال p^
. نظرًا لأن الحرف *
لم يعد يُستخدم للمؤشرات، فإنه يصبح علامة التصدير، كما هو الحال في Oberon، بحيث يمكن للمبرمج استخدام الأحرف الكبيرة/الصغيرة بحرية في المعرفات وفقًا لأسلوبه الخاص. تأكيدات النوع ليس لها أي بناء جملة خاص؛ أنها تبدو وكأنها يلقي نوع المؤشر. تتطلب تعريفات الإغلاق قوائم واضحة للمتغيرات التي تم التقاطها.
يسمح Umka بإلقاء النوع الضمني ويدعم المعلمات الافتراضية في إعلانات الوظائف. إنه يتميز بعامل تشغيل شرطي ثلاثي تم حذفه عمدًا من Go. لا تحتوي على شرائح كأنواع بيانات منفصلة. بدلًا من ذلك، فهو يدعم المصفوفات الديناميكية، والتي يتم الإعلان عنها مثل شرائح Go ويتم تهيئتها عن طريق استدعاء make()
. يجب أن تكون مستقبلات الأسلوب مؤشرات. نموذج تعدد مؤشرات الترابط في Umka مستوحى من Lua وWren بدلاً من Go. يقدم خيوطًا خفيفة الوزن تسمى الألياف بدلاً من goroutines والقنوات. تعتمد آلية جمع البيانات المهملة على العد المرجعي، لذا يحتاج Umka إلى دعم المؤشرات weak
. دعم Unicode الكامل قيد التطوير.