Jump to content

Draft:Odin (programming language)

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Wukuendo (talk | contribs) at 18:33, 16 March 2023. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
  • Comment: of 9 refs 6 are from odin website, and 2 are youtube videos Artem.G (talk) 18:35, 21 November 2021 (UTC)

Odin
Paradigmsimperative, procedural
Designed byGinger Bill
First appearedJuly 7, 2016; 8 years ago (2016-07-07)
Stable release
dev-2023-0x[1]
Typing disciplineStatic, strong, inferred, nominal, structural, generic
Platformx86-64, ARM/ARM64, WebAssembly
OSCross-platform
License3-clause BSD.[2]
Filename extensions.odin
Websiteodin-lang.org
Influenced by
Pascal[3], C, Go, Oberon-2, Newsqueak, Jai[4], GLSL[5]

Odin is an imperative, general-purpose, compiled, statically typed, and distinct types using system programming language designed by Ginger Bill[6]

The language supports: compile-time parametric polymorphism, runtime reflection, cross-compilation, manual memory management, array programming, and SOA data types.[7][8][9][10]

Example

package main

import "core:fmt"

main :: proc() {
	program := "+ + * 😃 - /"
	accumulator := 0

	for token in program {
		switch token {
		case '+': accumulator += 1
		case '-': accumulator -= 1
		case '*': accumulator *= 2
		case '/': accumulator /= 2
		case '😃': accumulator *= accumulator
		case: // Ignore everything else
		}
	}

	fmt.printf("The program \"%s\" calculates the value %d\n",
	           program, accumulator)
}

Design

Odin is designed to be an alternative for the C programming language[11] to achieve "high performance" on "modern systems"[12][13], with features like compile-time parametric polymorphism, array programming, and runtime reflection.

Syntax

Odin's declaration syntax is inspired by Newsqueak and Jai.

// Variable declarations
x : int = 123
x := 123 // Type inference

// Constant value declarations
X :: 123
Y : int : 123

// Function declaration
Z :: proc() {}

Explicit procedure overloading

Odin has procedure overloading[14], but unlike C++ the overloads have to be specified explicitly.

bool_to_string :: proc(b: bool) -> string {...}
int_to_string  :: proc(i: int)  -> string {...}

// "to_string" is will call either "bool_to_string" or "int_to_string" depending on type.
to_string :: proc{bool_to_string, int_to_string}

Array programming

Odin provides array programming[15][16], enabling arithmetics on array elements:

a := [3]f32{ 1, 2, 3 }
b := [3]f32{ 5, 6, 7 }
c := a * b
d := a + b
e := 1 + (c - d) / 2
fmt.printf("%.1f\n", e) // [0.5, 3.0, 6.5]

The language also features "swizzling" of arrays, similar to the operation in shader languages like GLSL.[17]

// Declaring type Vector to be the same as array of 3 f32's.
Vector3 :: [3]f32

// Cross product using swizzle function
cross :: proc(a, b: Vector3) -> Vector3 {
	i := swizzle(a, 1, 2, 0) * swizzle(b, 2, 0, 1)
	j := swizzle(a, 2, 0, 1) * swizzle(b, 1, 2, 0)
	return i - j
}

// Cross product using shorter swizzle notation
cross_shorter :: proc(a, b: Vector3) -> Vector3 {
	i := a.yzx * b.zxy
	j := a.zxy * b.yzx
	return i - j
}

Matrix support

A matrix is a mathematical type built into Odin[18]. It is a regular array of numbers, arranged in rows and columns. Odin's matrix support allows for matrix-array and matrix-matrix operations making it a Level 3 Basic Linear Algebra Subprograming language.

a: matrix[2, 3]f32 // matrix that has 2 rows and 3 columns with an element type of f32
b: matrix[3, 2]f32 // matrix that has 3 rows and 2 columns with an element type of f32
v: [2]f32          // array that has 2 elements with an element type of f32

a = matrix[2, 3]f32{
	1, 9, -13,
	20, 5, -6,
}
b = matrix[3, 2]f32{
	3, 5,
    7, 9,
}
v = [2]f32{2, -4}

m  := a * b // matrix-matrix multiplication
vp := m * v // matrix-array multiplication

The internal representation of a matrix in Odin is stored in column-major format[19] while the matrix literals are written in standard (row-major like) order (e.g. matrix[2, 3]f32 is internally [3][2]f32 (with different a alignment requirement)). Column-major is used in order to utilize (SIMD) vector instructions effectively on modern hardware, if possible.

Comparisons with other languages

The syntax of Odin resembles Go's syntax[20] with many adjustments.

Compared to C, Odin:

Compared to Go, Odin:

Notable software built with Odin

See also

References

  1. ^ "Latest releases".
  2. ^ https://github.com/odin-lang/Odin/blob/master/LICENSE
  3. ^ https://gamefromscratch.com/odin-programming-language/
  4. ^ "Jai vs Odin systems programming languages". Retrieved 2022-07-06.
  5. ^ https://odin-lang.org/docs/faq/
  6. ^ https://www.youtube.com/watch?v=2YLA4ajby00
  7. ^ https://www.youtube.com/watch?v=iCqW_RepcW0
  8. ^ "Overview". odin-lang.org. Retrieved 2022-10-20.
  9. ^ https://graphitemaster.github.io/odin_review/#quality-of-life
  10. ^ https://medium.com/swlh/something-is-happening-to-our-programming-languages-and-i-like-it-a66447beade
  11. ^ "Introducing Odin Lang (Japanese)". Qiita. Retrieved 2019-09-29.
  12. ^ https://odin-lang.org/
  13. ^ https://www.c3-lang.org/compare/#odin
  14. ^ https://graphitemaster.github.io/odin_review/#procedure-groups
  15. ^ https://bgthompson.com/blog/octonions-in-odin.html
  16. ^ "Overview". odin-lang.org. Retrieved 2022-10-20.
  17. ^ https://www.khronos.org/opengl/wiki/Data_Type_(GLSL)#Swizzling
  18. ^ "A review of the Odin programming language". graphitemaster. Retrieved 2022-09-10.
  19. ^ https://odin-lang.org/docs/overview/#matrix-type
  20. ^ "Low-Level Programming with Odin Lang". Dev. Retrieved 2022-09-21.
  21. ^ "Overview". odin-lang.org. Retrieved 2022-10-20.
  22. ^ https://dev.to/patrickodacre/low-level-programming-with-odin-lang-perfect-for-beginners-5cc3
  23. ^ https://jangafx.com/software/embergen/
  24. ^ https://gamefromscratch.com/embergen-real-time-fluid-simulation-2/
  25. ^ https://www.allanmckay.com/289/

Category:Programming languages Category:Cross-platform free software Category:Cross-platform software Category:Free compilers and interpreters Category:Programming languages created in 2016 Category:Statically typed programming languages Category:Systems programming languages