2024-12-16 21:34:48 -05:00
<!doctype html> < html lang = en dir = ltr class = "blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated = false > < meta charset = UTF-8 > < meta name = generator content = "Docusaurus v3.6.1" > < title data-rh = true > Primitives in Rust are weird (and cool) | The Old Speice Guy< / title > < meta data-rh = true name = viewport content = "width=device-width,initial-scale=1.0" > < meta data-rh = true name = twitter:card content = summary_large_image > < meta data-rh = true property = og:url content = https://speice.io/2018/09/primitives-in-rust-are-weird > < meta data-rh = true property = og:locale content = en > < meta data-rh = true name = docusaurus_locale content = en > < meta data-rh = true name = docusaurus_tag content = default > < meta data-rh = true name = docsearch:language content = en > < meta data-rh = true name = docsearch:docusaurus_tag content = default > < meta data-rh = true property = og:title content = "Primitives in Rust are weird (and cool) | The Old Speice Guy" > < meta data-rh = true name = description content = "I wrote a really small Rust program a while back because I was curious. I was 100% convinced it" > < meta data-rh = true property = og:description content = "I wrote a really small Rust program a while back because I was curious. I was 100% convinced it" > < meta data-rh = true property = og:type content = article > < meta data-rh = true property = article:published_time content = 2018-09-01T12:00:00.000Z > < link data-rh = true rel = icon href = /img/favicon.ico > < link data-rh = true rel = canonical href = https://speice.io/2018/09/primitives-in-rust-are-weird > < link data-rh = true rel = alternate href = https://speice.io/2018/09/primitives-in-rust-are-weird hreflang = en > < link data-rh = true rel = alternate href = https://speice.io/2018/09/primitives-in-rust-are-weird hreflang = x-default > < script data-rh = true type = application/ld+json > { "@context" : "https://schema.org" , "@id" : "https://speice.io/2018/09/primitives-in-rust-are-weird" , "@type" : "BlogPosting" , "author" : { "@type" : "Person" , "name" : "Bradlee Speice" } , "dateModified" : "2024-11-09T21:26:36.000Z" , "datePublished" : "2018-09-01T12:00:00.000Z" , "description" : "I wrote a really small Rust program a while back because I was curious. I was 100% convinced it" , "headline" : "Primitives in Rust are weird (and cool)" , "isPartOf" : { "@id" : "https://speice.io/" , "@type" : "Blog" , "name" : "Blog" } , "keywords" : [ ] , "mainEntityOfPage" : "https://speice.io/2018/09/primitives-in-rust-are-weird" , "name" : "Primitives in Rust are weird (and cool)" , "url" : "https://speice.io/2018/09/primitives-in-rust-are-weird" } < / script > < link rel = alternate type = application/rss+xml href = /rss.xml title = "The Old Speice Guy RSS Feed" > < link rel = alternate type = application/atom+xml href = /atom.xml title = "The Old Speice Guy Atom Feed" > < link rel = stylesheet href = /katex/katex.min.css > < link rel = stylesheet href = /assets/css/styles.16c3428d.css > < script src = /assets/js/runtime~main.29a27dcf.js defer > < / script > < script src = /assets/js/main.d461af80.js defer > < / script > < body class = navigation-with-keyboard > < script > ! function ( ) { var t , e = function ( ) { try { return new URLSearchParams ( window . location . search ) . get ( "docusaurus-theme" ) } catch ( t ) { } } ( ) || function ( ) { try { return window . localStorage . getItem ( "theme" ) } catch ( t ) { } } ( ) ; t = null !== e ? e : "light" , document . documentElement . setAttribute ( "data-theme" , t ) } ( ) , function ( ) { try { for ( var [ t , e ] of new URLSearchParams ( window . location . search ) . entries ( ) ) if ( t . startsWith ( "docusaurus-data-" ) ) { var a = t . replace ( "docusaurus-data-" , "data-" ) ; document . documentElement . setAttribute ( a , e ) } } catch ( t ) { } } ( ) < / script > < div id = __docusaurus > < div role = region aria-label = "Skip to main content" > < a class = skipToContent_fXgn href = #__docusaurus_skipToContent_fallback > Skip to main content< / a > < / div > < nav aria-label = Main class = "navbar navbar--fixed-top" > < div class = navbar__inner > < div class = navbar__items > < button aria-label = "Toggle navigation bar" aria-expanded = false class = "navbar__toggle clean-btn" type = button > < svg width = 30 height = 30 viewBox = "0 0 30 30" aria-hidden = true > < path stroke = currentColor stroke-linecap = round stroke-miterlimit = 10 stroke-width = 2 d = "M4 7h22M4 15h22M4 23h22" / > < / svg > < / button > < a class = navbar__brand href = / > < div class = navbar__logo > < img src = /img/logo.svg alt = "Sierpinski Gasket" class = "the
2024-11-10 16:43:02 -05:00
couldn't possibly run:< / p >
< div class = "language-rust codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-rust codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > fn< / span > < span class = "token plain" > < / span > < span class = "token function-definition function" style = "color:hsl(221, 87%, 60%)" > main< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token macro property" style = "color:hsl(5, 74%, 59%)" > println!< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > "{}"< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 8< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > to_string< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < br > < / span > < / code > < / pre > < div class = buttonGroup__atx > < button type = button aria-label = "Copy code to clipboard" title = Copy class = clean-btn > < span class = copyButtonIcons_eSgA aria-hidden = true > < svg viewBox = "0 0 24 24" class = copyButtonIcon_y97N > < path fill = currentColor d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" / > < / svg > < svg viewBox = "0 0 24 24" class = copyButtonSuccessIcon_LjdS > < path fill = currentColor d = M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z / > < / svg > < / span > < / button > < / div > < / div > < / div >
< p > And to my complete befuddlement, it compiled, ran, and produced a completely sensible output.< / p >
< p > The reason I was so surprised has to do with how Rust treats a special category of things I'm going to
call < em > primitives< / em > . In the current version of the Rust book, you'll see them referred to as
< a href = https://doc.rust-lang.org/book/second-edition/ch03-02-data-types.html#scalar-types target = _blank rel = "noopener noreferrer" > scalars< / a > , and in older versions they'll be called < a href = https://doc.rust-lang.org/book/first-edition/primitive-types.html target = _blank rel = "noopener noreferrer" > primitives< / a > , but
we're going to stick with the name < em > primitive< / em > for the time being. Explaining why this program is so
cool requires talking about a number of other programming languages, and keeping a consistent
terminology makes things easier.< / p >
< p > < strong > You've been warned:< / strong > this is going to be a tedious post about a relatively minor issue that
involves Java, Python, C, and x86 Assembly. And also me pretending like I know what I'm talking
about with assembly.< / p >
< h2 class = "anchor anchorWithStickyNavbar_LWe7" id = defining-primitives-java > Defining primitives (Java)< a href = #defining-primitives-java class = hash-link aria-label = "Direct link to Defining primitives (Java)" title = "Direct link to Defining primitives (Java)" > < / a > < / h2 >
< p > The reason I'm using the name < em > primitive< / em > comes from how much of my life is Java right now. For the most part I like Java, but I digress. In Java, there's a special
name for some specific types of values:< / p >
< blockquote >
< div class = "codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-text codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > bool char byte< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > short int long< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > float double< / span > < br > < / span > < / code > < / pre > < div class = buttonGroup__atx > < button type = button aria-label = "Copy code to clipboard" title = Copy class = clean-btn > < span class = copyButtonIcons_eSgA aria-hidden = true > < svg viewBox = "0 0 24 24" class = copyButtonIcon_y97N > < path fill = currentColor d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" / > < / svg > < svg viewBox = "0 0 24 24" class = copyButtonSuccessIcon_LjdS > < path fill = currentColor d = M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z / > < / svg > < / span > < / button > < / div > < / div > < / div >
< / blockquote >
< p > They are referred to as < a href = https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html target = _blank rel = "noopener noreferrer" > primitives< / a > . And relative to the other bits of Java,
they have two unique features. First, they don't have to worry about the
< a href = https://en.wikipedia.org/wiki/Tony_Hoare#Apologies_and_retractions target = _blank rel = "noopener noreferrer" > billion-dollar mistake< / a > ;
primitives in Java can never be < code > null< / code > . Second: < em > they can't have instance methods< / em > .
Remember that Rust program from earlier? Java has no idea what to do with it:< / p >
< div class = "language-java codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-java codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > class< / span > < span class = "token plain" > < / span > < span class = "token class-name" style = "color:hsl(35, 99%, 36%)" > Main< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > public< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > static< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > void< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > main< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token class-name" style = "color:hsl(35, 99%, 36%)" > String< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token plain" > args< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > x < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > =< / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 8< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token class-name" style = "color:hsl(35, 99%, 36%)" > System< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token plain" > out< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > println< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > x< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > toString< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ;< / span > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > // Triggers a compiler error< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < br > < / span > < / code > < / pre > < div class = buttonGroup__atx > < button type = button aria-label = "Copy code to clipboard" title = Copy class = clean-btn > < span class = copyButtonIcons_eSgA aria-hidden = true > < svg viewBox = "0 0 24 24" class = copyButtonIcon_y97N > < path fill = currentColor d = "M19,21H8V7H19M19,5H8A2,2 0
< p > The error is:< / p >
< div class = "codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-text codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > Main.java:5: error: int cannot be dereferenced< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > System.out.println(x.toString());< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > ^< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > 1 error< / span > < br > < / span > < / code > < / pre > < div class = buttonGroup__atx > < button type = button aria-label = "Copy code to clipboard" title = Copy class = clean-btn > < span class = copyButtonIcons_eSgA aria-hidden = true > < svg viewBox = "0 0 24 24" class = copyButtonIcon_y97N > < path fill = currentColor d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" / > < / svg > < svg viewBox = "0 0 24 24" class = copyButtonSuccessIcon_LjdS > < path fill = currentColor d = M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z / > < / svg > < / span > < / button > < / div > < / div > < / div >
< p > Specifically, Java's < a href = https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html target = _blank rel = "noopener noreferrer" > < code > Object< / code > < / a >
and things that inherit from it are pointers under the hood, and we have to dereference them before
the fields and methods they define can be used. In contrast, < em > primitive types are just values< / em > -
there's nothing to be dereferenced. In memory, they're just a sequence of bits.< / p >
< p > If we really want, we can turn the < code > int< / code > into an
< a href = https://docs.oracle.com/javase/10/docs/api/java/lang/Integer.html target = _blank rel = "noopener noreferrer" > < code > Integer< / code > < / a > and then dereference
it, but it's a bit wasteful:< / p >
< div class = "language-java codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-java codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > class< / span > < span class = "token plain" > < / span > < span class = "token class-name" style = "color:hsl(35, 99%, 36%)" > Main< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > public< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > static< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > void< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > main< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token class-name" style = "color:hsl(35, 99%, 36%)" > String< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ]< / span > < span class = "token plain" > args< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > x < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > =< / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 8< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token class-name" style = "color:hsl(35, 99%, 36%)" > Integer< / span > < span class = "token plain" > y < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > =< / span > < span class = "token plain" > < / span > < span class = "token class-name" style = "color:hsl(35, 99%, 36%)" > Integer< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > valueOf< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > x< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token class-name" style = "color:hsl(35, 99%, 36%)" > System< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token plain" > out< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > println< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > y< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > toString< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ;< /s
< p > This creates the variable < code > y< / code > of type < code > Integer< / code > (which inherits < code > Object< / code > ), and at run time we
dereference < code > y< / code > to locate the < code > toString()< / code > function and call it. Rust obviously handles things a bit
differently, but we have to dig into the low-level details to see it in action.< / p >
< h2 class = "anchor anchorWithStickyNavbar_LWe7" id = low-level-handling-of-primitives-c > Low Level Handling of Primitives (C)< a href = #low-level-handling-of-primitives-c class = hash-link aria-label = "Direct link to Low Level Handling of Primitives (C)" title = "Direct link to Low Level Handling of Primitives (C)" > < / a > < / h2 >
< p > We first need to build a foundation for reading and understanding the assembly code the final answer
requires. Let's begin with showing how the < code > C< / code > language (and your computer) thinks about "primitive"
values in memory:< / p >
< div class = "language-c codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-c codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > void< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > my_function< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > num< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > main< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > int< / span > < span class = "token plain" > x < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > =< / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 8< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > my_function< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > x< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < br > < / span > < / code > < / pre > < div class = buttonGroup__atx > < button type = button aria-label = "Copy code to clipboard" title = Copy class = clean-btn > < span class = copyButtonIcons_eSgA aria-hidden = true > < svg viewBox = "0 0 24 24" class = copyButtonIcon_y97N > < path fill = currentColor d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" / > < / svg > < svg viewBox = "0 0 24 24" class = copyButtonSuccessIcon_LjdS > < path fill = currentColor d = M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z / > < / svg > < / span > < / button > < / div > < / div > < / div >
< p > The < a href = https://godbolt.org/z/lgNYcc target = _blank rel = "noopener noreferrer" > compiler explorer< / a > gives us an easy way of showing off the
assembly-level code that's generated: < small > whose output has been lightly
edited< / small > < / p >
< div class = "language-nasm codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-nasm codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token label function" style = "color:hsl(221, 87%, 60%)" > main:< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > push < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rbp< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > mov < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rbp< / span > < span class = "token plain" > , < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rsp< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > sub < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rsp< / span > < span class = "token plain" > , < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 16< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > ; We assign the value `8` to `x` here< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > mov DWORD PTR < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > [< / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rbp< / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > -< / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 4< / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > ]< / span > < span class = "token plain" > , < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 8< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > ; And copy the bits making up `x` to a location< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > ; `my_function` can access (`edi`)< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > mov < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > eax< / span > < span class = "token plain" > , DWORD PTR < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > [< / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rbp< / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > -< / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 4< / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > ]< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > mov < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > edi< / span > < span class = "token plain" > , < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > eax< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span c
< p > At a really low level of memory, we're copying bits around using the < a href = http://www.cs.virginia.edu/~evans/cs216/guides/x86.html target = _blank rel = "noopener noreferrer" > < code > mov< / code > < / a > instruction;
nothing crazy. But to show how similar Rust is, let's take a look at our program translated from C
to Rust:< / p >
< div class = "language-rust codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-rust codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > fn< / span > < span class = "token plain" > < / span > < span class = "token function-definition function" style = "color:hsl(221, 87%, 60%)" > my_function< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > x< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > :< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > i32< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > fn< / span > < span class = "token plain" > < / span > < span class = "token function-definition function" style = "color:hsl(221, 87%, 60%)" > main< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > let< / span > < span class = "token plain" > x < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > =< / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 8< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > my_function< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > x< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < br > < / span > < / code > < / pre > < div class = buttonGroup__atx > < button type = button aria-label = "Copy code to clipboard" title = Copy class = clean-btn > < span class = copyButtonIcons_eSgA aria-hidden = true > < svg viewBox = "0 0 24 24" class = copyButtonIcon_y97N > < path fill = currentColor d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" / > < / svg > < svg viewBox = "0 0 24 24" class = copyButtonSuccessIcon_LjdS > < path fill = currentColor d = M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z / > < / svg > < / span > < / button > < / div > < / div > < / div >
< p > And the assembly generated when we stick it in the
< a href = https://godbolt.org/z/cAlmk0 target = _blank rel = "noopener noreferrer" > compiler explorer< / a > : < small > again, lightly
edited< / small > < / p >
< div class = "language-nasm codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-nasm codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token label function" style = "color:hsl(221, 87%, 60%)" > example:< / span > < span class = "token plain" > :main:< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > push < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rax< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > ; Look familiar? We're copying bits to a location for `my_function`< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > ; The compiler just optimizes out holding `x` in memory< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > mov < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > edi< / span > < span class = "token plain" > , < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 8< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > ; Call `my_function` and give it control< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > call example::my_function< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > pop < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rax< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > ret< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token label function" style = "color:hsl(221, 87%, 60%)" > example:< / span > < span class = "token plain" > :my_function:< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > sub < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rsp< / span > < span class = "token plain" > , < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 4< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > ; And copying those bits again, just like in C< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > mov dword ptr < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > [< / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rsp< / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > ]< / span > < span class = "token plain" > , < / span > < spa
< p > The generated Rust assembly is functionally pretty close to the C assembly: < em > When working with
primitives, we're just dealing with bits in memory< / em > .< / p >
< p > In Java we have to dereference a pointer to call its functions; in Rust, there's no pointer to
dereference. So what exactly is going on with this < code > .to_string()< / code > function call?< / p >
< h2 class = "anchor anchorWithStickyNavbar_LWe7" id = impl-primitive-and-python > impl primitive (and Python)< a href = #impl-primitive-and-python class = hash-link aria-label = "Direct link to impl primitive (and Python)" title = "Direct link to impl primitive (and Python)" > < / a > < / h2 >
< p > Now it's time to < strike > reveal my trap card< / strike > show the revelation that tied all this
together: < em > Rust has implementations for its primitive types.< / em > That's right, < code > impl< / code > blocks aren't
only for < code > structs< / code > and < code > traits< / code > , primitives get them too. Don't believe me? Check out
< a href = https://doc.rust-lang.org/std/primitive.u32.html target = _blank rel = "noopener noreferrer" > u32< / a > ,
< a href = https://doc.rust-lang.org/std/primitive.f64.html target = _blank rel = "noopener noreferrer" > f64< / a > and
< a href = https://doc.rust-lang.org/std/primitive.char.html target = _blank rel = "noopener noreferrer" > char< / a > as examples.< / p >
< p > But the really interesting bit is how Rust turns those < code > impl< / code > blocks into assembly. Let's break out
the < a href = https://godbolt.org/z/6LBEwq target = _blank rel = "noopener noreferrer" > compiler explorer< / a > once again:< / p >
< div class = "language-rust codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-rust codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > pub< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > fn< / span > < span class = "token plain" > < / span > < span class = "token function-definition function" style = "color:hsl(221, 87%, 60%)" > main< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 8< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > to_string< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < br > < / span > < / code > < / pre > < div class = buttonGroup__atx > < button type = button aria-label = "Copy code to clipboard" title = Copy class = clean-btn > < span class = copyButtonIcons_eSgA aria-hidden = true > < svg viewBox = "0 0 24 24" class = copyButtonIcon_y97N > < path fill = currentColor d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" / > < / svg > < svg viewBox = "0 0 24 24" class = copyButtonSuccessIcon_LjdS > < path fill = currentColor d = M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z / > < / svg > < / span > < / button > < / div > < / div > < / div >
< p > And the interesting bits in the assembly: < small > heavily trimmed down< / small > < / p >
< div class = "language-nasm codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-nasm codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token label function" style = "color:hsl(221, 87%, 60%)" > example:< / span > < span class = "token plain" > :main:< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > sub < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rsp< / span > < span class = "token plain" > , < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 24< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > mov < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rdi< / span > < span class = "token plain" > , < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rsp< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > lea < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rax< / span > < span class = "token plain" > , < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > [< / span > < span class = "token plain" > rip < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > +< / span > < span class = "token plain" > .Lbyte_str.u< / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > ]< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > mov < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rsi< / span > < span class = "token plain" > , < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rax< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:hsl(230, 4%, 64%)" > ; Cool stuff right here< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > call < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > < < / span > < span class = "token plain" > T as alloc::string::ToString< / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > >< / span > < span class = "token plain" > ::to_string@PLT< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > mov < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rdi< / span > < span class = "token plain" > , < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rsp< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > call core::ptr::drop_in_place< / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > add < / span > < span class = "token register variable" style = "color:hsl(221, 87%, 60%)" > rsp< / span > < span class = "token plain" > , < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 24< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > ret< / span > < br > < / span > < / code > < / pre > < div class = buttonGroup__atx > < button type = button aria-label = "Copy code to clipboard" title = Copy class = clean-btn > < span class = copyButtonIcons_eSgA aria-hidden = true > < svg viewBox = "0 0 24 24" class = copyButtonIcon_y97N > < path fill = currentColor d = "M19,21H8V7H19M19,5H8A2,2 0 0 ,
< p > Now, this assembly is a bit more complicated, but here's the big revelation: < strong > we're calling
< code > to_string()< / code > as a function that exists all on its own, and giving it the instance of < code > 8< / code > < / strong > . Instead
of thinking of the value 8 as an instance of < code > u32< / code > and then peeking in to find the location of the
function we want to call (like Java), we have a function that exists outside of the instance and
just give that function the value < code > 8< / code > .< / p >
< p > This is an incredibly technical detail, but the interesting idea I had was this: < em > if < code > to_string()< / code >
is a static function, can I refer to the unbound function and give it an instance?< / em > < / p >
< p > Better explained in code (and a < a href = https://godbolt.org/z/fJY-gA target = _blank rel = "noopener noreferrer" > compiler explorer< / a > link because I
seriously love this thing):< / p >
< div class = "language-rust codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-rust codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > struct< / span > < span class = "token plain" > < / span > < span class = "token type-definition class-name" style = "color:hsl(35, 99%, 36%)" > MyVal< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > x< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > :< / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > u32< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > impl< / span > < span class = "token plain" > < / span > < span class = "token class-name" style = "color:hsl(35, 99%, 36%)" > MyVal< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > fn< / span > < span class = "token plain" > < / span > < span class = "token function-definition function" style = "color:hsl(221, 87%, 60%)" > to_string< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > & < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > self< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ->< / span > < span class = "token plain" > < / span > < span class = "token class-name" style = "color:hsl(35, 99%, 36%)" > String< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > self< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token plain" > x< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > to_string< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > }< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > pub< /s
< p > Rust is totally fine "binding" the function call to the instance, and also as a static.< / p >
< p > MIND == BLOWN.< / p >
< p > Python does the same thing where I can both call functions bound to their instances and also call as
an unbound function where I give it the instance:< / p >
< div class = "language-python codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-python codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > class< / span > < span class = "token plain" > < / span > < span class = "token class-name" style = "color:hsl(35, 99%, 36%)" > MyClass< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > :< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > x < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > =< / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 24< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > def< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:hsl(221, 87%, 60%)" > my_function< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > self< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > :< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:hsl(301, 63%, 40%)" > print< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > self< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token plain" > x< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > m < / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > =< / span > < span class = "token plain" > MyClass< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" style = display:inline-block > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > m< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token plain" > my_function< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > MyClass< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token plain" > my_function< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token plain" > m< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < br > < / span > < / code > < / pre > < div class = buttonGroup__atx > < button type = button aria-label = "Copy code to clipboard" title = Copy class = clean-btn > < span class = copyButtonIcons_eSgA aria-hidden = true > < svg viewBox = "0 0 24 24" class = copyButtonIcon_y97N > < path fill = currentColor d = "M19,21H8V7H19M19,
< p > And Python tries to make you < em > think< / em > that primitives can have instance methods...< / p >
< div class = "language-python codeBlockContainer_Ckt0 theme-code-block" style = "--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)" > < div class = codeBlockContent_biex > < pre tabindex = 0 class = "prism-code language-python codeBlock_bY9V thin-scrollbar" style = "background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)" > < code class = codeBlockLines_e6Vv > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > >>< / span > < span class = "token operator" style = "color:hsl(221, 87%, 60%)" > >< / span > < span class = "token plain" > < / span > < span class = "token builtin" style = "color:hsl(119, 34%, 47%)" > dir< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > (< / span > < span class = "token number" style = "color:hsl(35, 99%, 36%)" > 8< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > )< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > [< / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__abs__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__add__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__and__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__class__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__cmp__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__coerce__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__delattr__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__div__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__divmod__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__doc__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__float__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__floordiv__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > .< / span > < span class = "token plain" > < / span > < br > < / span > < span class = token-line style = "color:hsl(230, 8%, 24%)" > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '__setattr__'< / span > < span class = "token punctuation" style = "color:hsl(119, 34%, 47%)" > ,< / span > < span class = "token plain" > < / span > < span class = "token string" style = "color:hsl(119, 34%, 47%)" > '
< p > ...but in practice it's a bit complicated.< / p >
< p > So while Python handles binding instance methods in a way similar to Rust, it's still not able to
run the example we started with.< / p >
< h2 class = "anchor anchorWithStickyNavbar_LWe7" id = conclusion > Conclusion< a href = #conclusion class = hash-link aria-label = "Direct link to Conclusion" title = "Direct link to Conclusion" > < / a > < / h2 >
< p > This was a super-roundabout way of demonstrating it, but the way Rust handles incredibly minor
details like primitives leads to really cool effects. Primitives are optimized like C in how they
have a space-efficient memory layout, yet the language still has a lot of features I enjoy in Python
(like both instance and late binding).< / p >
< p > And when you put it together, there are areas where Rust does cool things nobody else can; as a
quirky feature of Rust's type system, < code > 8.to_string()< / code > is actually valid code.< / p >
< p > Now go forth and fool your friends into thinking you know assembly. This is all I've got.< / div > < / article > < nav class = "pagination-nav docusaurus-mt-lg" aria-label = "Blog post page navigation" > < a class = "pagination-nav__link pagination-nav__link--prev" href = /2018/06/dateutil-parser-to-rust > < div class = pagination-nav__sublabel > Older post< / div > < div class = pagination-nav__label > What I learned porting dateutil to Rust< / div > < / a > < a class = "pagination-nav__link pagination-nav__link--next" href = /2018/09/isomorphic-apps > < div class = pagination-nav__sublabel > Newer post< / div > < div class = pagination-nav__label > Isomorphic desktop apps with Rust< / div > < / a > < / nav > < / main > < div class = "col col--2" > < div class = "tableOfContents_bqdL thin-scrollbar" > < ul class = "table-of-contents table-of-contents__left-border" > < li > < a href = #defining-primitives-java class = "table-of-contents__link toc-highlight" > Defining primitives (Java)< / a > < li > < a href = #low-level-handling-of-primitives-c class = "table-of-contents__link toc-highlight" > Low Level Handling of Primitives (C)< / a > < li > < a href = #impl-primitive-and-python class = "table-of-contents__link toc-highlight" > impl primitive (and Python)< / a > < li > < a href = #conclusion class = "table-of-contents__link toc-highlight" > Conclusion< / a > < / ul > < / div > < / div > < / div > < / div > < / div > < footer class = footer > < div class = "container container-fluid" > < div class = "footer__bottom text--center" > < div class = footer__copyright > Copyright © 2024 Bradlee Speice< / div > < / div > < / div > < / footer > < / div >