Linux C:类似shell的环境 – 个别执行 – C命令? (C口译员)

对不起,如果这个问题措辞错误 – 我不知道我要求的正确的话! 🙂

说,你有一些简单的C程序,如:

#include <stdio.h> int main() { int a=2; printf("Hello World %d\n", a); return 0; } 

通常情况下,这将不得不被保存在一个文件(比如, hello.c ); 那么我们在源文件上运行gcc并获得可执行文件 – 如果我们编译了debugging信息,那么我们可以在可执行文件上使用gdb来遍历代码行,并检查variables。

我想要的是基本上某种“C”shell – 类似于Pythonshell; 从某种意义上说,我可以在一个文件(一个脚本)中拥有一系列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命令( 我猜这会代表即时编译的sorting? )。 最初,我被C shell ( csh )的名字误导了 – 但是我不认为它可以在运行中执行C命令。

所以,首先,我想知道是否有可能以某种方式说服gdb以这种方式执行? 如果没有,还有什么可以让我做类似的事情吗?

至于上下文 – 我有一些代码,我有问题解决指针之间的指针和这样的问题; 这里gdb的打印输出结构的工作方式非常好 – 但是,为了隔离问题,我必须重新创build源文件,粘贴数据,重新编译和debugging。 在这种情况下,我宁愿有可能将几个结构体(及其初始化命令)粘贴到某种shell中,然后使用printf (甚至更好,类似于gdbprint )直接input在壳上。

只是为了logging – 我不是真的说服这样的事情真的存在; 但我想我会问无论如何:)

预先感谢任何答案,
干杯!

编辑 :我有点忙,所以没有时间来审查所有的答案,但接受(对不起:)); 只是想添加一些评论重新:“ 解释与机器代码 ”; 或者像@doron提到的那样:

交互式运行C / C ++源代码的问题是编译器无法逐行解释代码。

我完全意识到这一点 – 但让我们想象一个命令行应用程序(甚至可以是一个解释的应用程序),它给你一个命令行界面的提示。 开始时,让我们假设这个应用程序在内存中生成这个简单的“文本文件”:

 @@HEADER@@ int main() { @@MAIN@@ return 0; } 

然后,应用程序简单地等待在提示符处input文本,并按下ENTER键; 并在一个新的线上:

  • 应用程序检查:
    • 如果行以#define#include开始,那么它将被添加到@@HEADER@@下面,但是在临时文件的int main()行之上
    • 其他任何东西,都会在@@MAIN@@ line下面 – 但是在上面return 0; 行 – 在临时文件中
  • 临时文件被删除@@HEADER@@@@MAIN@@行,并保存到磁盘temp.c
  • 调用gcc来编译temp.c并生成temp.out可执行文件
    • 如果失败,通知用户,退出
  • 调用gdb来运行temp.out可执行文件,并在return 0;处设置断点return 0; 线
    • 如果失败,通知用户,退出
  • 执行返回到提示; 用户input的下一个命令实际上被传递给gdb所以用户可以使用像p variable这样的命令来检查 ),直到用户按下Ctrl + 1来退出gdb
  • Ctrl + 1 – gdb退出,控制返回到我们的应用程序 – 它等待下一个代码行再次..等
    • (随后的代码行条目保存在临时文件中 – 放置在同一类别的最后一个条目之下)

显然,我不希望能够将整个Linux内核代码粘贴到这样的应用程序中,并期望它能够工作:)但是,我期望能够粘贴在几个struct ,并检查陈述的结果就像说:

 char dat = (char) (*(int16_t*)(my->structure->pdata) >> 32 & 0xFF) ^ 0x88; 

…所以我确定什么是正确的语法(通常是我搞砸了) – 没有重build和debugging整个软件的开销,只是为了弄清楚我是否应该移动一个右括号在星号之前或之后( 在这种情况下当然不会引起编译错误 )。

现在,我不确定如上所述的简单应用程序体系结构可能产生的问题的整个范围。 但是,这只是一个例子,简单地指出像“C shell”(对于相对简单的会话/程序)在概念上是可行的,通过也使用gccgdb – 没有任何严重的冲突,否则严格区分“机器代码“和”解释“语言。

Solutions Collecting From Web of "Linux C:类似shell的环境 – 个别执行 – C命令? (C口译员)"

有C口译员。
寻找Ch或CINT。

编辑:发现一个新的( 未经测试 )的东西,似乎是OP想要的

C-REPL

或者就像在城市街道上驾驶Ferarri一样。


微小的C编译器

  • […许多功能,包括]
  • 支持C脚本:只需在C源代码的第一行添加“#!/ usr / local / bin / tcc -run”,然后直接从命令行执行即可。

当你的CPU运行一个计算机程序时,它运行一个叫做机器码的东西。 这是一系列特定于您正在使用的CPU的二进制指令。 由于机器代码很难手工编写,所以人们发明了像C和C ++这样的高级语言。 不幸的是,CPU只能理解机器码。 那么会发生什么呢是我们运行一个编译器把高级源语言转换成机器码。 这个类中的计算机语言是像C和C ++这样的编译语言。 这些语言被认为是本机运行的,因为生成的机器代码是由CPU运行的,没有任何进一步的解释。

现在像Python,Bash和Perl这样的语言不需要事先编译,而是被解释了。 这意味着源文件是由解释器逐行读取的,并且该行的正确任务被执行。 这使您能够在Python中看到的在交互式shell中运行的东西。

交互式运行C / C ++源代码的问题是编译器无法逐行解释代码。 它仅用于生成相应的机器代码,因此不能交互地运行C / C ++源代码。

@buddhabrot和@pmg – 谢谢你的回答!

为了得到好处,下面是答案的总结(因为我不能立即明白发生了什么):我所需要的(在OP中)是由所谓的“ C Interpreter ”( 而不是 C壳 “),其中建议如下:

  • CINT | ROOT – Ubuntu:安装为sudo apt-get install root-system-bin (5.18.00-2.3ubuntu4 + 115MB的额外磁盘空间)
  • c-repl ( c-repl README ) – Ubuntu:安装为sudo apt-get install c-repl (c-repl_0.0.20071223-1_i386.deb + 106kB的额外磁盘空间)
  • Ch标准版 – 标准版是免费的Windows / Unix

对于c-repl ,有一个关于c-repl主页的快速教程作为示例会话; 但是这里是相同的命令在我的Ubuntu Lucid系统上如何运行版本库( 编辑:查看哪里可以找到c-repl文档?更好的例子 ):

 $ c-repl > int x = 3 > ++x > .px 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 ++解释器 – 基本命令 ”; 这里是我的系统中的一个示例会话:

(注意:如果cint在您的发行包的root-system-bin上不可用,请改为使用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> .px (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应该编译,链接并生成代码来运行。