This is the single best video on the topic ever! When i was studying cs, our prof didn't even try to explain how data is stored, he just moved on to using pointers, i had no previous experience with them and was like wtf are pointers. You put it all flawlessly into words AND animations, and a picture is worth a thousand words. Great video that brings so much clarity, every cs undergrad needs to see this. Thanks a lot!
@mosantw20146 ай бұрын
There's something about real life coaching that doesn't come near as well organized/animated videos do. All students should know that videos are 100x better at converting knowledge to intuition and they should treat in-class lectures/tutorials as the sub-materials for their learning.
@MrPilotStunts6 ай бұрын
@@mosantw2014 absolutely, well said
@thedave1771Ай бұрын
@@mosantw2014 I don’t entirely disagree with you, but let me offer a counterpoint: A good instructor will have a read of the room, and will know when to move faster, or slow down and dig in to a concept. I’m trying to get back into programming after several years, the hardest part (for me) with videos is staying focused on the stuff that I learned in the 80s/90s and still remember, while waiting to get into newer stuff. Polymorphism is completely new to me. Pointers and structures like linked lists and binary trees and such are not. It’s a weird place to be.
@giankadev30268 ай бұрын
What a spectacular video, I'm just creating my own programming language and this fits me like a glove.
@naautilus08 ай бұрын
best animation quality yet, the pointer hell is somehow very understandable
@skilz80986 ай бұрын
pointers are easy
@michaelciccotosto-camp40338 ай бұрын
I remember really struggling with these sorts of topics when I was at university. These are some of the best explanations for OS/low-level programming concepts I've ever come across!
@ZeroUm_8 ай бұрын
I've been working with Java for almost 20 years, and I don't think I've ever thought about what happens when you remove an element from an ArrayList. Thanks for the eye opener.
@SoniaHamiltonSnowfrog8 ай бұрын
Me too, but with Go. Now I understand the motivation for slices vs arrays
@seid448 ай бұрын
absolutely one of the best channels out there right now. u go even more indepth than some of my college classes and make it seem easy. big ups bro
@borisdorofeev56022 ай бұрын
Absolute banger of a video. Rewatched like 20 times while watching, and I liked and favorited for more rewatching later. There's so much quality info here and every pause is worth it. Great stuff.
@ckpioo4 ай бұрын
i already know pretty much everything which this channel has to offer, but its truly insane that such well formed videos on said topics exist. Wish i had these back when i was learning.
@Blezerker7 ай бұрын
Javascript bashing ✅ Engaging and interesting systems programming content ✅ Funny retorts for armchair programmers ✅ Im so glad i found this channel early and subbed
@D0Samp8 ай бұрын
I have yet to see the combination of a linked list and array list in the wild that I was taught in my AlgoDat course and never again afterwards. It stored the data in a big array that can be relocated to grow, but also a separate mapping from indexes to array offsets. That sounds like a linked list (just with array indexes instead of full pointers) that enforces some form of memory coherence for both list nodes and data. As far as I know, you can refine this concept to a linked list of array slices, which is how text editors support efficient cutting and pasting of text.
@cyrilemeka69872 күн бұрын
Before this video I genuinely thought ArrayLists where LinkedLists that stored an array of pointer offsets, which you suggested, thereby eliminating the access time issues at the cost of memory. It was even going to be my goto implementation after learning of the costly operations that a simple std::vector::push_back can have all just for constant time access. But as he pointed out in this video and as I have seen in soo many others Modern CPUs were built to favour arrays. I would still choose a proper implementation of a linked list if I knew before hand that arbitrary insertion and deletion are going to be common.
@ezsnova8 ай бұрын
baby wake up core dumped just uploaded
@yumyum71968 ай бұрын
🤣lmao seriously tho
@ivankudinov41537 ай бұрын
I prefer 'baby wake up core dumped'
@seggsfault5 ай бұрын
And get the kids
@AidanMacgregor-Personal22 күн бұрын
Let's get to the core of it you're dumped 😂😂😂😊
@biasedbit8 ай бұрын
Incredible work with these videos so far. Hitting all the key points at just the right level of detail. The animation work is just... * chef's kiss * Keep it up 🙌
@dzuchun8 ай бұрын
yes, I am to watch a livestream of yours solving CodeCrafters challenges Jon had done the same a week ago with Git, and I watched through the entire thing. that was indeed really interesting, and I'd like to solve these myself too 😊
@weakspirit_8 ай бұрын
i love that little departure to interpreted language land
@mhFFFFFF8 ай бұрын
“This explains why we use zero instead of one for the first element” What a hero 🙌. Finally a non-stupid “programmers just count from zero” explanation
@azadomer52738 ай бұрын
I recommend everyone starting to understand the data structure to subscribe this channel and save this video, well done very nicely demonstrated!
@stevebrownlee61416 ай бұрын
I absolutely adore JavaScript, but concurrently adore these videos. The quality is capital. I aspire to produce quality material like this.
@rubenvanderark49608 ай бұрын
Just found your channel! Really happy to see you just uploaded. I love your intuitive visuals to explain all sorts of mechanics
@Hersonrock128 ай бұрын
I did try to use the *void pointer once! It was hilarious when you mentioned it
@Firestorm-tq7fy8 ай бұрын
Waited for this video after the previous teaser. Ur videos are the most accurate on the subject there are
@NinosYoukhana5 ай бұрын
I found this person and his channel to be the best explications of complex concepts. Good job man!
@mehdichakroun58785 ай бұрын
Your channel is gold pls never stop making content
@digggggg8988 ай бұрын
Love the quality of the videos I will recommend other people in my class to them because they’re concise and easy to understand. Keep it up!
@mariospada008 ай бұрын
Thank you so much for this video, excellent explaination! I have a question, though: as you showed, in languages like Rust, besides specifying the array's size, it's also necessary to specify the data type (integer, float, etc...), and from what I understood, it's because this way the compiler already knows how many bytes to read for each element. However, at 19:45, in the case of Python, how does the interpreter know if, once a pointer is dereferenced, the retrieved object is an integer, a string, or another element with indefinite length? Because according to your (beautiful) animation it seems like every object has it's own specific size.
@CoreDumpped8 ай бұрын
Interpreters attach 'tags' to values in memory, so when the value is needed, it first reads the tag to identify the type of the value and know how many bytes to read. The answer is explained in my video: The size of your variables matters.
@bartekabuz8558 ай бұрын
I would have never suspected that an IT person can actually explain something well enough for people to understand. Good job buddy
@tonchozhelev8 ай бұрын
The reason why most programmers are bad at explaining things, is that they don't fully understand most of the things they would try to explain. And the reason for that, is that most of the time they were given a surface level explanation themselves, and they just accepted it.
@not_kode_kun8 ай бұрын
@@tonchozhelev EXACTLY
@vimandmanyothers5548 ай бұрын
Programmers and IT people aren’t the same
@not_kode_kun8 ай бұрын
@@vimandmanyothers554 it shouldn't be the same, i agree, but sadly the line is very blurry these days. a lot of programmers nowadays have no real clue what their code is actually doing, all they care about is whether it works or not. this stems from the overly-corporate nature of the modern internet and digital world. as long as it gets them money on the short term, who cares if it's performant, well-written, robust code? the mindless consumers certainly don't, so why should the multimillion dollar companies care? sad world we live in
@3osufdh4rfg8 ай бұрын
@@tonchozhelev I have en education in embedded systems and having watched all the few videos they've done so far I've already learned several important things that no-one bothered to explain about how different data-structures are implemented by the compiler and why/how that has significant performance implications.
@AapoAlas8 ай бұрын
Nitpick: JavaScript engines typically do implement arrays as continuous blocks of data, and generally setting just one item at index 10k will then allocate up to that number (or more). They just have to pessimise the array for the holes in it.
@wil-fri8 ай бұрын
I remember writing a filter and it was returning null items, you have to be very careful with JS
@about2mount8 ай бұрын
They use C++ struct arrays, not normal arrays, class arrays or vectors.
@johnabrossimow8 ай бұрын
12:03 did you cousin also write a getter for "self.lenght" (of self.items[self lenght]) to be the same value as "self.length" ?
@kossboss8 ай бұрын
your content is 👑. my kids will study from this channel one day 🥹 and their kids 😇 and their kids kids for generations learning low level concepts and rust. 🥂
@darkfllame6 ай бұрын
that's why i propose all scripting languages should be pseudo compiled: the bytecodes are as specific as assembly instruction (not as much but you get it), and the generic stuff actually happens at "compile" time, every scripting languages should do that, even at the cost of longer "compile" time. I want to do one, but I struggle everytime when making the parser so you will probably never see that. Also in java, if it's not a primitive, it's an object, every arrays of non-primitives in java are arrays of objects, and you can verify it with the JNI.
@elzabethtatcher95707 ай бұрын
Amazing video. And thank you for not pedaling surfshark or some unrelated crap. Video bookmarks would be welcome!
@knofi70527 ай бұрын
George, your videos are really awesome! I already knew all these concepts but I have never seen them better explained. Anyway, I love C and Assembler because they are teaching how computers work...😊
@sa-hq8jk8 ай бұрын
i recommended the first 3 videos in this series to some computer science students i was tutoring because i felt like they went in depth into these concepts, while at the same time using terms and concepts that beginner programmers are familiar with. i felt like this video used a lot more terms and concepts which might be difficult for beginner programmers to understand compared to the last three. i think this series would be better for introductory students if the smaller concepts mentioned in this video like data structures, time complexity, etc. had heir own video before having a video about dynamically sized collections
@sa-hq8jk8 ай бұрын
in other words i felt like the pacing in this series took a sharp turn that might be too overwhelming for me to be able to recommend it to other computer science students. judging by the pacing of the first three videos in this series, it seemed like these videos were attempting to cater toward beginner-intermediate programmers with around a year of experience, but this video didn’t come across that way, although i may be wrong in my assumption for the targeted audience of these videos
@someonespotatohmm95138 ай бұрын
@@sa-hq8jk I think there is enough context to understand what a datatype is without giving the textbook definition of what a datatype is (which i doubt will be helpfull to anyone anyway). A definition of time complexity would probaply have been nice, it is easy to understand and aply in these cases and can also easily be googled if needed.
@sa-hq8jk8 ай бұрын
@@someonespotatohmm9513 i didnt mean what exactly a data type is, but more of how a struct is a type which combines other types, and how they are grouped together in memory and interpreted by the compiler and by memory
@Darkev777 ай бұрын
Please do Hashmaps next and how are its elements linked and how does it look like in memory
@Method54408 ай бұрын
I think when he says ‘and so Forth’ he’s actually telling us what programming language to use.
@silloo20727 ай бұрын
😂
@silloo20727 ай бұрын
We are 2 orange S
@pedroivog.s.68708 ай бұрын
Hi, the video has been pretty interesting so far. Just a suggestion: please put the link to the previous videos you recommended. Otherwise, in a year or so, it will be much harder to find. Unfortunately, KZbin showed exactly where the current video is in the channel's timeline.
@kienha90368 ай бұрын
About 17:45, I'm no great expert on system programming, but the severity of data locality is unlikely severe. The cost of pointer-based array instead of a template array resides in the unpredictable position of object allocation, which confuse the CPU cache prefetcher. In reality, most workload allocates objects (as each object in the containing array) closely or in a predictable fashion, so prefetching works adequately well. And of course, pointers are still grouped together as always. For example, if we add items to a list in a loop, it is trivial for the CPU prefetcher to assume the next approriate location. Hotspot specifically, each thread has its own thread heap, so as long as the array/list is not multithreaded (which is unlikely), the pattern will be maintained. Moreover, with the nature of GC, the compacting phase will very likely move spreaded objects all over the heap to a single location, both avoiding fragmentation and maintaining the fetch pattern. There are exceptions, like if a BaseType array could contain both DerivativeType1 and DerivativeType2 with completely different object layout (only possible with reference-based array), then it's difficult for the CPU to make a good sense of the fetch pattern, which will likely suffer from "data locality". But as always, the template array would also suffer from this, so it's rather an unfortunate universal technical difficulty.
@deathdogg08 ай бұрын
I wasn't able to leave a comment on your post from yesterday but I guessed arrays and I was right! I love these deep dives
@sameerakhatoon95086 ай бұрын
you've mentioned about thinking to solve codecrafters challenges on stream. Yes please!
@BarnabásHorváth-p8t12 күн бұрын
Hello! I need the information you put out so much! The presentation, knowledge and everything is already a 10/10 so chill! But now let me educate you! Dont give a #### about theese bad opinions; people can and will hate everything and as you get better it wont be better. What you do is so good so please continue doing it!❤
@code-monet94688 ай бұрын
One of the best videos I ever watched in my life
@JamyGolden8 ай бұрын
Wow, so informative, thanks so much. I’d watch a live coding session.
@lukasaudir86 ай бұрын
The quality of this channel is amazing, I wish you all the success and I'm excited to see many more interesting and educative videos like yours, you have a good way of getting your point across... I'm a
@anon_y_mousse8 ай бұрын
Thanks. I had always assumed ArrayList was just some sort of alias for a Deque, but now I know, it's just a dynamic array type. Java is one of those languages that I've avoided fully learning and any language that reuses that name for a container type too. As it is now, I probably have far too much knowledge of Java.
@sidreddy70308 ай бұрын
Omg I loved this video. Super cool to know how python’s list works under the hood. Can’t wait for what you’ve got next!
@MrSomethingdark5 ай бұрын
I love you Core Dumped, cool name, the meat of the problem from right away. Keep up the good work.
@sergeylypko58177 ай бұрын
The content is great. Would be interesting to see your overviews about how rust's compiler works and about compilers theory in general. As well as interpreters actually.
@mehregankbi5 ай бұрын
One thing that is super cool to me is that even mobile phones are powerful enough to track bullets fired from a gun. Take PUBG mobile for example, every single bullet is its own object. not only that, but at every frame (or server tick, depending on the implementation) it has to check if the bullet collided with anything. Just imagine the computational cost of tracking every bullet in a fight of multiple squads, where every guy is spraying bullets. that's hundreds of bullets in a second or two. every bullet needs to have its location refreshed at every refresh cycle, and so does every player's location. then the collision logic needs to be run, and what's more: PUBG mobile has support for bullets going through players too. how awesome is that? That shows you how necessary gaming engines are. implementing all this from scratch would be a software architect's nightmare. with UE5 things are getting even more interesting with destructible maps. Furthermore, some games are moving towards server-side computations as the gold standard so as to make it harder to cheat. In such scenarios, deciding what data structure(s) to choose to represent the objects would be very important. To further emphasize the effect of cache on performance, it is good to know that some modern server CPUs have Gigabytes of cache.
@Visitor______________________v4 ай бұрын
This inspires me to go code some stuff in Rust, great animations, great explanations 👍🏻
@derDooFi7 ай бұрын
no need to be so self-conscious at the end there. this channel is great
@nxthingbutv0id9587 ай бұрын
I fucking love these videos. No long intro, no Indian accent, not slow and no bullshit. Please keep making this type of content
@pritonce65628 ай бұрын
More reasons to hate JS :D (And yes to the streams) Also if you intend to expand your community on other platforms a discord server might be a good idea too.
@DiThi3 ай бұрын
The behaviour of javascript is only theorical to match the specification, but in practice most uses of arrays are much more optimal. Each array has a type, generated code is optimized for it, and it only falls back to the generic type if you assign an out of bounds index (and all code optimized for that type is then thrown away). Even in that unoptimized state, it makes heavy use of tagged pointers, where special values mean they're storing a small int instead of a pointer, or in some cases floating point numbers can be stored, and they make use of NaN (which can take many values) to store info like it not being actually a number and holding a pointer instead, etc. For these reasons and many more, JS is way faster than Python.
@SPimentaTV8 ай бұрын
What a fantastic video! Now all I want is to program in Assembly to learn how really an computer works, and to optimize all those inefficiencies those languages introduce! Great presentation 👌
@SantiagoKus8 ай бұрын
Very good video, this is the kind of teaching that works for me so thank you
@c4cypher8 ай бұрын
The Lua Table has entered the arena.
@VaughanMcAlley8 ай бұрын
It would be interesting to see what Lua’s cache hit & miss rate is compared with other languages…
@7th_CAV_Trooper6 ай бұрын
Linked lists are for tape storage. Similar structures are used for block or heap storage.
@loic16658 ай бұрын
I learn so much deim your videos!! Thanks a lot !!! I'm waiting for the next one!
@eddyvytime8 ай бұрын
this content is pure gold!
@ejon8 ай бұрын
This channel is about to blow up🎉
@cuicuidev2 күн бұрын
14:41 that is assuming we need to preserve the order of the elements, which is not always the case. If order is not important to us, we could fill the gap with the last element of the array, making it an 0(1) operation.
@drf2898 ай бұрын
Your cousin may know more than me, but he still misspelled "length" in that code :P 11:50
@NinosYoukhana5 ай бұрын
I enjoy watching all your videos!
@nexby3238 ай бұрын
You are very good please continue like that and I will be happy if you touch on the assembly perspective of the things too 😄
@ShubhanshuMishra8 ай бұрын
You are back🎉
@jancsi-vera8 ай бұрын
Yes , really good
@silloo20728 ай бұрын
Heeeesss baackkk
@yacinehmdn2 ай бұрын
I love js, im discovering rust and loving it, but js is special, (it's the first language i learned), if anyone wanna argue, he's welcome 😌
@detoxifiedplant3 ай бұрын
thank you so much man, it gave me a lot of clarity
@CoreDumpped3 ай бұрын
Glad it helped!
@Albert-nc1rj8 ай бұрын
Amazing as always Would love to watch those streams
@GabrielCarrillo_EGC29 күн бұрын
Great work! Thanks for the video!
@alfredomoreira67618 ай бұрын
Be aware that modern javascript engines optimises arrays if they have no holes (java like) and even more if they are of the same type (c like) : check for SMI, DOUBLE_SMI, HOLEY_SMI, etc js arrays. So modern js engines are no more just an interpreter but also a list of runtime JIT compilers run depending of the context of the running code (the more a bit of code is run the more it uses the most complex JIT compiler with the most optimisation). hence why js nowadays can be as fast as some compiled languages.
@xyz-vrtgs8 ай бұрын
Really great video, although I would have liked it if you talked about bounds checking in a normal array when you were talking about indexing out of bounds
@premsagar443823 күн бұрын
Found great channel. Keep going!
@lucianobestia7 ай бұрын
May I give two thumbs up ?
@liburnkrasniqi40036 ай бұрын
God please never stop making vids my guy AGHHHHHHHHHHH
@martinsanchez-hw4fi3 ай бұрын
What do you use to make the Animations/transitions? Amazing production and content
@krystofjakubek93768 ай бұрын
It should be pointed out that the cache behavior of linked lists is NOT inherit to the linked list structure but rather to the allocator used to allocate the nodes. If we have an allocator allocators linearly the nodes will be located in memory in exact the same way as with the array. Alternative approach is to store enough elements in each node so that a full cache line is always used. Removal and addition from the middle of a node can be solved with splitting and merging. Also I am certain that pretty much all javascript interpreters really do use arrays whenever possible and only resolve to hash map as a fallback when the wasted size is too much or keys are some other type than numbers. This is not too difficult to implement internally and the performance boost is significant.
@huben_13378 ай бұрын
This is very important to note. I also think iv read v8 uses property access for very small and likely to not be modified arrays. This way it can do direct property access without hashmap lookup or array indexing.
@xBiggs8 ай бұрын
I created a linked list in C with two levels of indirection with varying orders of magnitude up to a billion elements. However, I never got valgrind to report cache misses above 0.7% when pushing all, then accesseing all then popping all. I understand that valgrind will report a simulation of the cache rather than the actual cache, but it was the best I could do to measure because my kernel does not have perf.
@sevos8 ай бұрын
Man this animations Where were they for all these years?
@stefanmladenovic20408 ай бұрын
Yet another banger from project CD!
@Nerdimo8 ай бұрын
If only I had you as my professor
@keeprocking36208 ай бұрын
In Lua arrays are done the same way as in JS: they are in fact maps with values being indexed by numeric indices
@osakadev2 ай бұрын
Im in love with your channel 🙏🙏
@aminsaraj47868 күн бұрын
Really Amazing Thank You so much...
@indiannews5448 ай бұрын
You are doing revolutionary work bro Keep going ,keep posting more often
@thecrazyeagle96748 ай бұрын
What a gem of a channel. Keep it up!
@KeshavKumar-gc9pu8 ай бұрын
Very well explained, these kinds of animations are extremely useful.
@diogenes_of_sinope8 ай бұрын
Great videos, thank you for your efforts!
@yarrakobama34178 ай бұрын
There‘s no way i was too lazy to comment „Dynamically sized data structures“ on yesterday’s post 😂 I had it 😭😭
@catdotjsАй бұрын
I find it weird that you never mention C++ in your videos. I am curious how C++ handles generics. Is there any reason for it?
@DANser-gamingАй бұрын
Whenever it comes down to data structures and memory management/efficiency - scripting languages suck unless they were built for efficiency. A good example would be javascript. Javascript arrays are just regular objects, meaning: data sparsely placed all around RAM, 8 bytes used just for an index to exist, yet the size is indicated as a 32 bit integer, and thus array length limit it 2^32-1. But you know why it doesn't matter? That's right, an array of maximum size containing an object in each entry will likely blow up the heap (~4GB ram by default). And I suspect it's because arrays (being just objects) need a giant little-to-no collision hash table. The only way to memory efficiency is a buffer (contiguous array of binary, also called a vector) but you can't store buffers inside buffers and you can't have a true linked list because javascript doesn't give you actual pointers, it automatically passes objects by reference and that will only create a giant hash table again (because for javascript it looks like one object with many nested objects).
@DrakiniteOfficial6 ай бұрын
Despite its quirks I love JavaScript for many reasons, one of which is that we want better performance in arrays, we can use typed arrays. The hash map approach is quite clever IMO, since in most JS code you won't be looping more than a few hundred (or few thousand at the most) times in a normal array, and if you see doing more than that, then well, you should probably reconsider your approach. All about being the right tool for the job. And if JS is just too slow, you've got WASM. And if WASM is too slow.......... then ditch JS/WASM and build a native app. 🤣
@CoreDumpped6 ай бұрын
Yes I agree, the right tool for the right job. What I really dislike is that people trying to convince the world that JS should be used everywhere.
@DiThi3 ай бұрын
Surprisingly, now JS has the same performance for regular arrays and typed arrays as long as you always use them with one single type (and don't assign to out of bounds). That language has been super optimized since the release of V8.
@pauljarski75906 ай бұрын
If you really want to defend linked lists, you need them to be doubly linked and you need an algorithm that doesn’t just add and remove individual elements in the middle: you need an algorithm that shuffles big chunks of multiple linked lists around in unpredictable ways. In that case there *might* be an advantage to using linked lists. Linked lists get a bad rap for good reason (caching) and for bad reason (lack of imagination).
@L1Q7 ай бұрын
pointer arithmetic was baked directly into intel 8086 cpu instruction set, no wonder systems programming langugaes at the time would also reflect the feature in their syntax
@CoreDumpped7 ай бұрын
Does this has anything to do with that take that I've been recently reading a lot claiming that C beats everything because CPUs are designed to be 'C-compiled code' efficient?
@Kardiiacc7 ай бұрын
Hey Core Dumped, it would be so cool if you could make a vid on what object orientated programming is
@matrix012345678997 ай бұрын
1.Nowadays javascript isn't interpreted but compiled just-in-time 2.in Javascript all objects are behaving like hashmaps (JIT can optimize it if it can), arrays are objects, so: let a=[];a['hello']='world'; is the same as let a=new Object();a['hello']='world'; a['hello'] is the same as a.hello but it doesn't touch array typical behaviour, like changing .length or appearing in for..of loop
@jamesking24397 ай бұрын
Modern JS engines do try to use real arrays as the backing type for your "arrays" as long as you don't do anything too stupid.
@SitaRam-js9fu3 ай бұрын
Thanks...u explained well
@devnarula67338 ай бұрын
afaik js arrays are actual arrays and not hashmaps... you can do array.string_key = value because like everything else js array is ALSO an object, but it contains an array as well, you are just assigning a property to the array object. If you do array[12]=some_val to a new array you will see the length actually change but if you do array.string_key=val length does not change... so basically it is {[,,,,,,,,,,,some_val], string_key: val}, js engines optimize it anyways
@The3XpL0D6 ай бұрын
17:40 how accurate is this part? I would assume the designers of Java/JVM would have definitely looked for some optimization here, seeing how often primitive (boxed) ArrayLists are used in practice. Is there really no caching of the actual values behind the references, happening behind the scenes?