There are some languages that are good examples of a paradigm, but they are not at a peak because they can still be improved. They also have different philosophies and principles.
Procedural: Ada, Algol, Fortran, Pascal, PL/I
Object-Oriented: Common Lisp (CLOS), Dylan, Smalltalk
Functional: Haskell, "pure" Scheme
Java can't be the archetype or peak of OOP because there were a lot of advances in OOP before Java like multiple inheritance, multiple dispatch, and everything being an object. The reason so many people complain about "OOP" is that UNIX languages like C++ and Java ignore decades worth of solutions that solve the problems they have in those languages. Weenies will say some bullshit about the solutions being "bloated" so they never get used, then they complain about a lack of solutions even though they work fine in other languages. In many cases, the solutions are older than the problems they created by not understanding the solutions.
C is the peak and archetype of the suck paradigm. If C++, Java, JavaScript, and all these other UNIX languages were not based on C, they would be higher quality, simpler, and more productive.
C is supposed to be a "simple" language but they didn't even think of the interaction between macros and the { and } in compound literals. This is considered a minor cosmetic problem but it would have been a complete embarrassment if this kind of thing happened in a good language. This is another example of the solutions being older than the problem. The "designers" didn't care and neither do the standards committee, and it sucks.
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2299.htm
What really sucks is that the people who wrote the C standard don't even understand what they wrote. This kind of bullshit has nothing to do with any paradigm.
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2243.htm
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2263.htm
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2294.htm
I've been confusing my compiler class with this one for
a while now. I pull it out any time someone counters my
claim that C has no block structure. They're usually
under the delusion that {decl stmt} introduces a block
with its own local storage, probably because it looks
like it does, and because they are C programmers who use
lots of globals and wouldn't know what to do with block
structure even if they really had it.
But because you can jump into the middle of a block, the
compiler is forced to allocate all storage on entry to a
procedure, not entry to a block.
But it's much worse than than because you need to invoke
this procedure call before entering the block.
Preallocating the storage doesn't help you. I'll almost
guarantee you that the answer to the question "what's
supposed to happen when I do <the thing above>?" used to be
"gee, I don't know, whatever the PDP-11 compiler did." Now
of course, they're trying to rationalize the language after
the fact. I wonder if some poor bastard has tried to do a
denotational semantics for C. It would probably amount to a
translation of the PDP-11 C compiler into lambda calculus.