Interpret Befunge-93
Befunge-93 - 404 371 361 352 339 337 323 bytes
&lt;xyXYvp01&lt;&gt;110vv5_v#`0+1:_v#+!-&quot;g&quot;\&lt;v&quot;&lt;&quot;:::&lt;&gt;1v#p03-1_&gt;! g20gp00g1+0v25p
v2g02 &lt; p0 20p&lt;+vp020p01-10$_:&quot;p&quot;-!^&gt;&gt;-!\ v^ &lt;&gt;0p20pv|!*-&quot;;&quot;\+1::~p0&lt;
v2-10&lt;^v# ^#&lt;  &lt;&lt;$&lt;       &lt; ^+!-&quot;_&quot;\+!-&quot;?&quot;&lt;&gt;#^_10v4p&lt;:^00 _$20g1+20p^
v21p010&gt;#&lt;40g20v&gt;\%:40p5+g:92p:75*1--00g!\#^_\$0 v   &gt;91+-^
&lt;3+g01g 03p04+g&lt;^++g04g02:*54p03:%\++g03g01:&quot;P&quot;p0&lt;

Try It Online!
Input program must have at most 20 lines. Input can be provided in same file as Befunge program by placing it after a ; character. Yes, it can interpret itself, but the *54 in the bottom line should be replaced by *53 if you do that. And if you ask that interpreted interpreter to interpret itself, change it to *52 etc. If run in a Befunge-97 interpreter, it will also support the a-f commands (but not ' or any new command that affects control flow or wrapping behavior).
Note that it basically asks the interpreter it runs in to handle all the stuff relating to I/O and stack, so its specific behavior is largely dependent on that of the interpreter running it. In other words, it is perfectly compliant if run in a compliant interpreter.
It works by reading in the program from input (until EOF or semicolon) directly into the playfield below it, then simulating the movement of a virtual instruction pointer through that program. It copies each command from the program into its own execution area (at position (9,2) on the grid) and runs its own instruction pointer through it after ensuring all of its own data has been removed from the stack (as all of the interpreted program's stack data is maintained at the bottom of the stack). This is the standard methodology for Befunge self-interpretation since the early 00s, but I don't think it has ever been done in such a small program.
A fuller explanation is in the annotations you can see by clicking the link above.