[英]Linux C: Shell-like environment - for individual execution - of C commands? (C interpreter)
很抱歉,如果这个问题的措词有误-我所要求的单词不正确! :)
假设您有一些简单的C程序,例如:
#include <stdio.h>
int main()
{
int a=2;
printf("Hello World %d\n", a);
return 0;
}
通常,必须将其保存在文件中(例如hello.c
)。 然后在源文件上运行gcc
并获取可执行文件-如果我们在调试信息中进行了编译,则可以在可执行文件上使用gdb
来逐步执行代码行并检查变量。
我想拥有的基本上是某种“ C”外壳,类似于Python外壳; 从某种意义上说,我可以在文件(脚本)中包含一系列Python命令-或者我可以将相同的命令粘贴到Shell中,它们将执行相同的命令。 对于上面的简单程序,这是我想要做的(其中C>
代表想象中的提示):
C> #include <stdio.h>
(stdio.h included)
C> int a=2;
C> printf("Hello World %d\n", a);
Hello World 2
C>
换句话说,我希望能够交互地执行单个C命令( 我猜想这将代表各种类型的动态编译吗? )。 最初,我被C shell ( csh
)的名称所迷惑-但是我认为它不能即时执行C命令。
因此,首先,我想知道是否有可能说服gdb
以这种方式执行? 如果没有,还有其他什么可以让我做类似的事情(也许有一些特殊的外壳)?
至于上下文-我有一些代码在故障排除结构等之间的指针时遇到问题; 在这种情况下, gdb可以打印出结构的方法效果很好-但是,为了隔离问题,我必须制作新的源文件,粘贴数据,重新编译和调试。 在这种情况下,我宁愿可以将几种结构(及其初始化命令)粘贴到某种类型的外壳中,然后使用直接键入的printf
(甚至更好,类似于gdb
的print
)进行检查。在外壳上。
仅作记录-我并不是真的说服像这样的事情确实存在; 但我想无论如何我都会问:)
预先感谢您的任何回答,
干杯!
编辑 :我有点忙,所以还没来得及审查所有答案是否可以接受(对不起:)); 只是想添加一点评论:“ 解释与机器代码 ”; 或如@doron所述:
交互运行C / C ++源代码的问题在于,编译器无法执行代码的逐行解释。
我完全知道这一点-但让我们想象一个命令行应用程序(甚至可以是一个解释的应用程序),它会为您提供带有命令行界面的提示。 首先,假设该应用程序在内存中生成了这个简单的“文本文件”:
@@HEADER@@
int main()
{
@@MAIN@@
return 0;
}
然后,应用程序仅等待在提示符下输入文本,然后按Enter。 在新行上:
#define
或#include
开头,则将其添加到temp文件中的@@HEADER@@
下面-但int main()
行之上 @@MAIN@@
行以下-但在return 0;
以上return 0;
行-临时文件中 @@HEADER@@
和@@MAIN@@
行删除,并以temp.c
保存到磁盘 gcc
来编译temp.c
并生成temp.out
可执行文件
gdb
运行temp.out
可执行文件,并在return 0;
处设置断点return 0;
线
gdb
( 因此用户可以使用p variable
类的命令进行检查 )-直到用户按下(例如)Ctrl + 1退出gdb
gdb
退出,控制权返回给我们的应用程序-该应用程序再次等待下一行代码。
显然,我不希望能够将整个linux内核代码粘贴到这样的应用程序中,并希望它能工作:)但是,我希望能够粘贴到几个struct
,并进行检查语句的结果如:
char dat = (char) (*(int16_t*)(my->structure->pdata) >> 32 & 0xFF) ^ 0x88;
...所以我确定要使用什么正确的语法(通常是我弄乱了什么)- 无需重新构建和调试整个软件的开销,只是为了弄清楚我是否应该移动正确的括号在星号之前或之后(当然,在这种操作不会引起编译错误的情况下 )。
现在,我不确定上述简单化的应用程序体系结构可能引起的全部问题。 但是,这只是一个例子,它简单地指出,通过使用gcc
和gdb
,类似“ C shell”(对于相对简单的会话/程序)在概念上是可行的-不会与','之间的严格区别产生任何严重冲突。机器代码”和“解释”语言。
有C口译员。
查找Ch或CINT。
当您的CPU运行计算机程序时,它将运行称为机器代码的程序。 这是一系列二进制指令,专用于您所使用的CPU。 由于机器代码很难编写代码,因此人们发明了高级语言,例如C和C ++。 不幸的是,CPU仅理解机器代码。 因此,发生的事情是我们运行了将高级源语言转换为机器代码的编译器。 此类中的计算机语言是C和C ++之类的编译语言。 据说这些语言是本地运行的,因为生成的机器代码是由CPU运行的,无需任何进一步的解释。
现在,某些语言(例如Python,Bash和Perl)无需预先编译,而是可以解释。 这意味着解释器会逐行读取源文件,并执行正确的任务。 就像我们在Python中看到的那样,这使您能够在交互式shell中运行内容。
交互运行C / C ++源代码的问题在于,编译器无法执行代码的逐行解释。 它仅用于生成相应的机器代码,因此无法交互运行C / C ++源代码。
@buddhabrot和@pmg-谢谢您的回答!
为了n00bery的好处,这里是答案的摘要(因为我无法立即掌握发生的事情):我需要的(在OP中)由所谓的“ C Interpreter
”( 不是 ' C shell '),建议以下内容:
sudo apt-get install root-system-bin
身份sudo apt-get install root-system-bin
(5.18.00-2.3ubuntu4 + 115MB的额外磁盘空间)安装 sudo apt-get install c-repl
(c-repl_0.0.20071223-1_i386.deb + 106kB的额外磁盘空间) 对于c-repl
在c-repl主页上有一个快速教程作为示例会话; 但是以下是在带有存储库版本的Ubuntu Lucid系统上相同命令的行为( 编辑:请参见在哪里可以找到c-repl文档?以获取更好的示例 ):
$ c-repl
> int x = 3
> ++x
> .p x
unknown command: p
> printf("%d %p\n", x, &x)
4 0xbbd014
> .t fprintf
repl is ok
> #include <unistd.h>
<stdin>:1:22: warning: extra tokens at end of #include directive
> getp
p getp
No symbol "getp" in current context.
> printf("%d\n", getpid())
10284
> [Ctrl+C]
/usr/bin/c-repl:185:in `readline': Interrupt
from /usr/bin/c-repl:185:in `input_loop'
from /usr/bin/c-repl:184:in `loop'
from /usr/bin/c-repl:184:in `input_loop'
from /usr/bin/c-repl:203
显然,最好从最新来源构建c-repl
。
对于cint
来说,找到与它直接相关的东西有点困难( 该网页改为参考ROOT教程 ),但是随后我发现“ Le Huy:使用CINT-C / C ++解释器-基本命令 ”; 这是我系统中的一个示例会话:
(注意:如果您的发行版软件包root-system-bin
上没有提供cint
,请尝试使用root
。)
$ cint
cint : C/C++ interpreter (mailing list 'cint@root.cern.ch')
Copyright(c) : 1995~2005 Masaharu Goto (gotom@hanno.jp)
revision : 5.16.29, Jan 08, 2008 by M.Goto
No main() function found in given source file. Interactive interface started.
'?':help, '.q':quit, 'statement','{statements;}' or '.p [expr]' to evaluate
cint> L iostream
Error: Symbol Liostream is not defined in current scope (tmpfile):1:
*** Interpreter error recovered ***
cint> {#include <iostream>}
cint> files
Error: Symbol files is not defined in current scope (tmpfile):1:
*** Interpreter error recovered ***
cint> {int x=3;}
cint> {++x}
Syntax Error: ++x Maybe missing ';' (tmpfile):2:
*** Interpreter error recovered ***
cint> {++x;}
(int)4
cint> .p x
(int)4
cint> printf("%d %p\n", x, &x)
4 0x8d57720
(const int)12
cint> printf("%d\n", getpid())
Error: Function getpid() is not defined in current scope (tmpfile):1:
*** Interpreter error recovered ***
cint> {#include <unistd.h>}
cint> printf("%d\n", getpid())
10535
(const int)6
cint> .q
Bye... (try 'qqq' if still running)
无论如何,这正是我所需要的:能够加载标头,添加变量以及检查它们将占用的内存! 再次感谢大家-干杯!
Python和c属于不同种类的语言。 Python在运行时会逐行解释,但是c应该编译,链接并生成要运行的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.