monomorphization

{{Short description|Compile-time transformation}}

Monomorphization is a compile-time process where polymorphic functions are replaced by many monomorphic functions for each unique instantiation.{{cite web |title=Generic Data Types - The Rust Programming Language |url=https://doc.rust-lang.org/book/ch10-01-syntax.html |access-date=27 May 2021}} It is considered beneficial to undergo the mentioned transformation because it results in the output intermediate representation (IR) having specific types, which allows for more effective optimization. Additionally, many IRs are intended to be low-level and do not accommodate polymorphism. The resulting code is generally faster than dynamic dispatch, but may require more compilation time and storage space due to duplicating the function body.{{cite web |last1=Hume |first1=Tristan |title=Models of Generics and Metaprogramming: Go, Rust, Swift, D and More |url=https://thume.ca/2019/07/14/a-tour-of-metaprogramming-models-for-generics/ |access-date=27 May 2021}}{{Cite journal|last1=Tanaka|first1=Akira|last2=Affeldt|first2=Reynald|last3=Garrigue|first3=Jacques|date=2018|title=Safe Low-level Code Generation in Coq Using Monomorphization and Monadification|url=https://www.jstage.jst.go.jp/article/ipsjjip/26/0/26_54/_article/-char/ja/|journal=Journal of Information Processing|volume=26|pages=54–72|doi=10.2197/ipsjjip.26.54|doi-access=free}}{{Cite journal|title=Extending Smt-Lib v2 with λ-Terms and Polymorphism|citeseerx = 10.1.1.663.6849}}{{Cite book|last1=Cai|first1=Yufei|last2=Giarrusso|first2=Paolo G.|last3=Ostermann|first3=Klaus|title=Proceedings of the 43rd Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages |chapter=System f-omega with equirecursive types for datatype-generic programming |date=2016-01-11|chapter-url=https://doi.org/10.1145/2837614.2837660|series=POPL '16|location=St. Petersburg, FL, USA|publisher=Association for Computing Machinery|pages=30–43|doi=10.1145/2837614.2837660|isbn=978-1-4503-3549-2|s2cid=17566568}}{{Cite book|last1=Klabnik|first1=Steve|url=https://books.google.com/books?id=0Vv6DwAAQBAJ|title=The Rust Programming Language (Covers Rust 2018)|last2=Nichols|first2=Carol|date=2019-08-06|publisher=No Starch Press|isbn=978-1-7185-0044-0|language=en}}{{Cite book|last1=Felty|first1=Amy P.|url=https://books.google.com/books?id=l9hJCgAAQBAJ&dq=%22Monomorphization%22+-wikipedia&pg=PA291|title=Automated Deduction - CADE-25: 25th International Conference on Automated Deduction, Berlin, Germany, August 1-7, 2015, Proceedings|last2=Middeldorp|first2=Aart|date=2015-07-30|publisher=Springer|isbn=978-3-319-21401-6|language=en}}

Example

This is an example of a use of a generic identity function in Rust

fn id(x: T) -> T {

return x;

}

fn main() {

let int = id(10);

let string = id("some text");

println!("{int}, {string}");

}

After monomorphization, this would become equivalent to

fn id_i32(x: i32) -> i32 {

return x;

}

fn id_str(x: &str) -> &str {

return x;

}

fn main() {

let int = id_i32(10);

let string = id_str("some text");

println!("{int}, {string}");

}

See also

References