Odin是一种通用编程语言,具有独特的类型,专为高性能、现代系统和面向数据的编程而构建。
阅读文档,查看完整演示
包装主要进口和#34;核心:fmt和#34;main::proc(){program:=";++*😃 - /"累加器:=0表示程序{switch token{case';+';:累加器+=1 case';-';:累加器-=1 case';*';:累加器*=2 case';/#39;:累加器/=2 case';😃': 累加器*=累加器case://忽略所有其他内容}fmt。printf(";程序\";%s\";计算值%d\n";,程序,累加器)}
包装主要进口和#34;核心:fmt和#34;main::proc(){{a:=[3]f32{1,2,3}b:=[3]f32{5,6,7}c:=a*bd:=a+be:=1+(c-d)/2fmt。[0.5,3.0,6.5]{a:[3]f32{1,2,2,3}b:=3[3]f32{1,2,3}b:[3]b:=Swizz(34;34;34;34;7.3;7.1,1.1,0)1f.[1,1.1,1,1)1f,1f,1f;1f,[1,[0.5,[0.5,3,3.5,3,3,3,3,3.0,3,3,3,3,3,3,3.0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3=(a*b)/2+1 d:=c.x+c.y+c.z fmt。printf(";%.1f\n";,d)//22.0 cross::proc(a,b:Vector3)->;向量3{i:=swizzle(a,1,2,0)*swizzle(b,2,0,1)j:=swizzle(a,2,0,1)*swizzle(b,1,2,0)返回i-j}cross_shorter::proc(a,b:Vector3)->;Vector3{i:=a.yzx*b.zxy j:=a.zxy*b.yzx返回i-j}blah::proc(a:Vector3)->;f32{return a.x+a.y+a.z}x:=cross(a,b)fmt。println(x)fmt。println(blah(x))}
包装主要进口和#34;核心:fmt和#34;main::proc(){{Vector3::struct{x,y,z:f32}N::2v_aos:[N]vector3v_aos[0]。x=1 v_aos[0]。y=4 v_aos[0]。z=9 fmt。println(len(v_aos))fmt。println(v_aos[0])fmt。println(v_aos[0].x)fmt。println(&;v_aos[0].x)v_aos[1]={0,3,4}v_aos[1]。x=2英尺。println(v_aos[1])fmt。println(v_aos)v_soa:#soa[N]向量3 v_soa[0]。x=1 v_soa[0]。y=4 v_soa[0]。z=9//语法与AOS相同,并将其视为数组fmt。println(len(v_soa))fmt。println(v_soa[0])fmt。println(v_-soa[0].x)fmt。println(&;v_-soa[0].x)v_-soa[1]={0,3,4}v_-soa[1]。x=2英尺。println(v_-soa[1])//如果需要,可以使用soa语法v_-soa。x[0]=1 v_soa。y[0]=4v_。z[0]=9 fmt。println(v_soa.x[0])//使用两个语法断言的指针地址相同(&;v_soa[0]。x==&;v_soa.x[0])//相同的fmt打印fmt。println(v_aos)fmt。println(v_-soa)}{//使用长度为<;=4的数组,这些数组具有隐式字段xyzw/rgba Vector3::distinct[3]f32 N::2v_-aos[N]vector3v_-aos[0]。x=1v_-aos[0]。y=4v_-aos[0]。z=9v_-soa:#soa[N]vector3v_-soa[0]。x=1v_-soa[0]。y=4v_-soa[0]。z=9//{x:i8,y:i16,z:f32}N::3v:#soa[N]向量3v[0]。x=1 v[0]。y=4V[0]。z=9s:#soa[]向量3s=v[:]断言(len=N)fmt。普林顿(s)fmt。println(s[0].x)a:=s[1:2]assert(len(a)==1)fmt。println(a)d:#soa[dynamic]Vector3 append_soa(&;d,Vector3{1,2,3},Vector3{4,5,9},Vector3{-4,-4,3})fmt。println(d)fmt。println(len(d))fmt。println(第(d)章)fmt。println(d[:])}{//soa_-zip和soa_-unzip-fmt.println(";\nsoa_-zip和soa#unzip";)x:[]i32{1,3,9}y:[]f32{2,4,16}z:[]b32{true,false,true}//生成一个#soa切片正常切片经过s:=soa_zip(a=x,b=y,c=z)//在#soa切片上迭代v,s{fmt.println(v,i)//与s[i]完全相同//注意:';v';不是一个临时值,而是有一个专门的寻址模式//这意味着当访问v.a等时,它会在内部执行正确的转换//s[i].a==s.a[i]fmt.println(v.a,v.b,v.c)//从#soa切片a,b,恢复切片,c:=soa_解压fmt。println(a,b,c)}
package mainmain::proc(){//在每个作用域中,都有一个名为context的隐式值。该//上下文变量是每个作用域的本地变量,通过指向该作用域中任何过程调用的指针//隐式传递(如果过程//具有Odin调用约定).//隐式上下文系统的主要目的是//拦截第三方代码和库并修改其//功能。其中一种情况是修改库分配//内容或记录内容的方式。在C语言中,这通常是通过//库定义宏来实现的,宏可以被重写,以便//用户可以定义他想要的。然而,默认情况下,没有多少库//在许多语言中支持这一点,这意味着拦截//第三方代码以查看它的功能,并改变它的功能//这是不可能的。c:=上下文//复制当前范围';这是上下文。user_index=456{context.allocator=my_custom_allocator()context.user_index=123_a_fool_相信的内容()//此范围的` context`隐式传递给` what_fool_相信的内容'}/`context`值是它在断言中的范围的本地值(context.user_index==456)what_fool_相信的内容::proc(){c:=context//this`context`与从中调用它的父过程相同//在本例中,context.user_index==123//context.allocator被分配给`my_custom_allocator()`assert(context.user_index==123)的返回值//内存管理过程使用`上下文。分配器//默认情况下,除非另有明确规定,否则china_grove:=new(int)free(china_grove)\=c}my_custom_分配器::mem。nil_分配器_u=c//默认情况下,上下文值具有其参数的默认值,该值//在包运行时确定。默认值是特定于编译器的。//要查看隐式上下文值包含的内容,请在包运行时中查看以下//定义。}
包装主要进口和#34;核心:fmt和#34;进口和#34;核心:反映和#34;main::proc(){Foo::struct{x:int`tag1',y:string`json:";y#u字段";`,z:bool,//no tag}id:=typeid_of(Foo)名称:=reflect。结构\字段\名称(id)类型:=反映。结构\字段\类型(id)标记:=反射。结构字段标签(id)断言(len(名称)==len(类型)&&;len(姓名)==len(标签)fmt。println(";Foo::struct{";)对于标签,我在标签中{name,type:=names[i],type[i]if tag!=";";{fmt.printf(";\t%s:%t`%s`,\n";,name,type,tag)}其他{fmt.printf(";\t%s:%t、\n";,name,type)}fmt。println(";}";)对于tag,标记{if val,ok:=reflect.struct_tag_lookup(tag,";json";)中的i好的{fmt.printf(";json:%s->;%s\n";,names[i],val)}}
Odin是为概念的可读性、可扩展性和正交性而设计的。简单是很难做到的,清晰总比聪明好。
Odin通过对内存布局、内存管理和自定义分配器等的低级别控制,实现了最高的性能。
Odin是为现代计算机自下而上设计的,内置了对SOA数据类型、阵列编程和其他功能的支持。
我们从事编程是因为我们喜欢解决问题。为什么不应该';难道我们的工具在工作时不会给我们带来快乐吗?再次享受编程,与奥丁!
EmberGen是一款实时体积流体模拟器,可以即时模拟、渲染和导出动画书、图像序列和VDB体积。有了EmberGen,你可以创造任何东西,从火和烟,到爆炸和魔法。EmberGen为您提供了在几毫秒而不是几个小时内迭代模拟的创造性自由。
通过EmberGen,奥丁在游戏和电影行业的巨头中进行制作:贝塞斯达、CAPCOM、Codemasters、THQNordic、华纳兄弟、Weta Digital和许多其他公司。
Odin为所有主要的图形API提供了官方库:OpenGL、Vulkan、Direct3D11、Direct3D12、Metal和WebGL 1&;2.
Odin还提供了官方维护的绑定,用于其供应商库中的流行库,如SDL2、GLFW、raylib、microui、miniaudio等!
Odin是一种开源编程语言,欢迎社区的贡献!如果你想提供帮助,请查看问题追踪器,了解你可能感兴趣的未决问题。那些被称为需要帮助的人现在特别需要社区援助。
加入Odin Discord,帮助我们将Odin编程的乐趣带给所有人。🥳