Pretty much all the major programming languages have a way or another for creating abstractions and for a good reason. They enable programmers to deal with programs in the same way as engineers deal with large designs: design and build larger parts from smaller parts and reuse those in even larger parts. Abstractions let programmer to trade details for a chunked, large scale, view of part of the software.
Different languages have different capabilities for creating abstractions. When I started programming BASIC with SVI-728, abstractions were limited to subroutines that shared global variables and user defined functions that could return a single value. Building any meaningful abstractions was hard and most programs I wrote were just tangled mess of code.