SMOLNET PORTAL home about changes
2023.12.07 Thu 19:42 Is C a scripting language?

Real talk, I feel like C is more a scripting than compiled language.
Not only because it has week types.  Where do I start...

So what defines a scripting language?  It's interpreted rather than
compiled but often their also come with dynamic types and garbage
collector.  The idea is to make them noob friendly to get the job done
without thinking about lower level concepts.  This is exactly how I
feel when programming in C after applying few concepts.

1. Compiled vs interpreted.  The convenience here is that you only run
   the program.  No need to setup the compilation or wait for it.

   Most of my C programs are build from single compilation unit using
   single header libraries or nothing at all.  This not only makes the
   compilation setup trivial with just "$ gcc main.c" but also blazing
   fast.  With that I have single command to build and run program and
   in practice it feels like I am only running it.

   So for me there is no compilation.  Unless there are compile time
   errors.  But those are actually lesser evil than runtime errors and
   I want to have them.

2. Dynamic types.  In scripting language you just assign random stuff
   to variables and it all works.  MAGIC!  Except for the confusing
   part when you like to use variables of different types together.
   Depending on language this is handled differently but it's usually
   the most confusing part in dynamic types.

   My realization with C was that everything is a number.  I know that
   everyone is aware of that when talking about computers, binary and
   stuff.  But you rarely see a source code that uses only numbers.
   Even in C we like to have more abstract concepts like String, Null,
   Boolean, Date, File etc. for primitive types.

   Observation here is that the less types you use the more dynamic C
   becomes.  I'm usually fine with int, char and pointers.  Often it's
   necessary to use float and FILE.  Rarely more.  But mostly all vars
   are just integers as those can be a file descriptor, error, enum,
   counter, boolean, flag, date, socket etc.  And when all variables
   are of the same type then one of them have a type.  It almost feels
   like writing "var" from JS when I write "int" in C as it doesn't
   matter that much what will be the value.

   OFC you can't escape types entirely.  Also by not having specific
   well defined types you can't tell what kind of information is held
   by the integer.  But my thinking is that enums, errors, dates, file
   descriptors etc. are all a lie, there are only numbers.  Thinking
   of them as specific types will make your program more complicated,
   but seeing them as numbers will open doors to simpler code.

   You can still enforce arbitrary rules to your variables, like max
   value or allowed value, with assertions.  This will produce runtime
   error which makes C program fell even more like a script.  Not
   necessarily a good thing in this case but assertions gives greater
   control over expected values than types.  I found out that the best
   place to use them is right at the beginning of function to validate
   all assumptions of function arguments.

   BTW you can omit return type in function declaration and it will be
   an integer by default.  Try to write a program that way and it will
   have script vibe.

3. Garbage collector.  This one is all about not caring about memory
   management.  Is bizarre as essentially programming is only about
   getting data from one place and placing it in another place which
   is memory management.

   Anyway, when writing programs in C that don't run continuously but
   rather execute single task and then terminate you can safely forget
   about freeing the heap memory.  Even better, you can avoid calling
   malloc() most of the time as usually you can predict or assume
   sizes of things easily.  At least the maximum sizes.

   Operating System will free program memory once terminated and it
   will probably do it better than you (o_o ).

   But what to do when you need a lot of dynamically heap allocated
   memory?  Well then you can just call malloc() once at program start
   asking for big chunk of memory, like 1 GB.  OS will not take away
   all of 1 GB from your system resources.  It will only take the
   amount that you use.  And again you don't have to free it as you
   will use this bi chunk for entire lifetime of your program.

   Obviously there are exceptions to those two cases but usually this
   is all you have to do and there is no memory management anymore.

In summary, C will feel like a scripting language when you use:

1. Single compilation unit for easy and fast builds.
2. Less types, mostly integers, chars and pointers.
3. Allocation on heap sparingly without free() or not at all.

My job here is done  ( -_-)/

EOF
Response: text/plain
Original URLgopher://tilde.pink/0/~irek/log/20231207
Content-Typetext/plain; charset=utf-8