I'm new myself to the project but I'll try to answer and they'll correct me if I'm wrong.
The lua interpreter source code is in ..\Iris_SVN\lugre\lib\lua-5.1.4\src, but I think you're asking about the rest of the lua code for Iris. So yes, it is possible to change Iris 2.0 client without compiling the client because in ..\Iris_SVN\lua (and some other places) there are lua files that do anything from packet handling to generating gumps, etc.
From my point of view so far, I want to stay inside of ..\Iris_SVN\lua when helping to improve Iris unless something leads me outside (like a bug or something that affects what I'm doing in Lua).
The lua scripts call on part of their Lugre library (written in C++), and that calls Lugre's (and subsequently OGRE's?) PrepareFrame() and RenderOneFrame() so the answer is
C++ because that's what OGRE is written in?
Here's the run down of the actual rendering call:
main.lua: function MainStep () =>
lugre_game.cpp: void cGame::RenderOneFrame() =>
lugre_ogrewrapper.cpp: void cOgreWrapper::RenderOneFrame() =>
OGRE
Of course I think I'd prefer if it were all C++ (recompiling whatever is changed and creating a new exe), but that could be because I just started checking out Lua last week. There is one thing that annoys me about Lua. Since it is dynamically typed, when I find a variable, I'm not able to quickly find all of the available subfields of that variable (like the members of an object).
An example from when I first started is:
local playermobile = GetPlayerMobile() in gui.paperdoll.lua
From the code below it, I knew that the variable playermobile had a serial and name fields, but little did I know it was a full blow mobile with
Code:
mobile.serial
mobile.artid
mobile.xloc
mobile.yloc
mobile.zloc
mobile.dir
mobile.hue
mobile.flag
mobile.notoriety
mobile.amount -- only kPacket_Equipped_MOB, corpse related ?
mobile.dir2 -- only kPacket_Equipped_MOB, unknown
which was listed as a comment in another file (no header file explaining the mobile object that is easily searchable). I followed the functions calls to obj.mobile.lua and eventually found that comment. But that's not all that's a part of the mobile. In the initialize function more fields are added!
Code:
mobile.content = {}
mobile.stats = {}
mobile.ismobile = true