CoffeeScript (489465)
Update: Adding spaces took more bytes than I thought.
p=prompt().replace(/\(.*?\)/g,"").match(/\??[^\d\s\r\n]\s*\n*\r*\d*/g) ?[]
y=p[..]
i=prompt()
r=[].map.call i,(c)->c[0].charCodeAt()
n=0
m=[(d)->n=d
(d)->m[5] (r[n]+d)%%256
(d)->p=y[d..]
(d)->m[1] -d
(d)->n-=d
(d)->r[n]=d
(d)->n+=d]
while b=p.shift()?.replace /^(.)(\s\r\n)*/,"$1"
if b[0]=="?"
continue if !r[n]
b=b[1..]
d="><+-#=:".indexOf(b[0])//4
~d||throw "!badcmd"
m[b[0].charCodeAt()%7](+b[1..]||+!d)
n<0&&throw "!ramdix<0"
alert String.fromCharCode(r...).replace(/\0.*/,"")
The first prompt box is for the program and the second prompt box is input. Test it at http://coffeescript.org.
p=prompt().replace(/\(.*?\)|[\s\n\r]/g,"").match(/\??[^\s\d]\d*[^\d]\d*/g) ?[]
y=p[..]
i=prompt()
r=[].map.call i,(c)->c[0].charCodeAt()
n=0
m=[(d)->n=d
(d)->m[5] (r[n]+d)%%256
(d)->p=y[d..]
(d)->m[1] -d
(d)->n-=d
(d)->r[n]=d
(d)->n+=d]
while b=p.shift()
if b[0]=="?"
continue unless r[n]
b=b[1..]
d="><+-#=:".indexOf(b[0])//4
throw~d||throw "!badcmd '#{b[0]}'" if d==-1
m[b[0].charCodeAt()%7](+b[1..]||+!d)
thrown<0&&throw "!ramdix<0" if n<0
alert String.fromCharCode(r...).replace(/\0.*/,"")
# Get program
p=prompt().replace(/\(.*?\)/g,"").match(/\??[^\s\d]\d*/g) ?[]
# Create a copy of the program (for goto)
y=p[..]
# Get input
i=prompt()
# Put the input in the ram
r=[].map.call i,(c)->c[0].charCodeAt()
# RAM pointer
n=0
# An array of commands
# Since each of "<>+-#=:" is a different
# value mod 7 (what a coincedence?!)
# So 0th value is "#" command because
# "#".charCodeAt() % 7 === 0
m=[(d)->n=d
(d)->m[5] (r[n]+d)%%256
(d)->p=y[d..]
(d)->m[1] -d
(d)->n-=d
(d)->r[n]=d
(d)->n+=d]
# Iterate through commands
while b=p.shift()
# If you find a "?" skip unless r[n] is > 0
if b[0]=="?"
continue unless r[n]
b=b[1..]
# Get the default value
d="><+-#=:".indexOf(b[0])//4
# If the command isn't good, throw an error
throw "!badcmd '#{b[0]}'" if d==-1
# Call the appropriate command
# By computing the char code mod 7
m[b[0].charCodeAt()%7](+b[1..]||+!d)
# Make sure n is bigger than or equal to 0
throw "!ramdix<0" if n<0
# Show output
alert String.fromCharCode(r...).replace(/\0.*/,"")
Edit: Adding spaces took more bytes than I thought. This interpreter will throw an error on invalid syntax, the other has unspecified behavior on invalid syntax.
p=prompt().replace(/\(.*?\)/g,"").match(/\??[^\d\s\r\n]\s*\n*\r*\d*/g) ?[]
y=p[..]
i=prompt()
r=[].map.call i,(c)->c[0].charCodeAt()
n=0
m=[(d)->n=d
(d)->m[5] (r[n]+d)%%256
(d)->p=y[d..]
(d)->m[1] -d
(d)->n-=d
(d)->r[n]=d
(d)->n+=d]
while b=p.shift()?.replace /^(.)(\s\r\n)*/,"$1"
if b[0]=="?"
continue if !r[n]
b=b[1..]
d="><+-#=:".indexOf(b[0])//4
~d||throw "!badcmd"
m[b[0].charCodeAt()%7](+b[1..]||+!d)
n<0&&throw "!ramdix<0"
alert String.fromCharCode(r...).replace(/\0.*/,"")