繁体   English   中英

Linux C:类似于Shell的环境-用于单独执行-C命令? (C口译员)

[英]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 shellcsh )的名称所迷惑-但是我认为它不能即时执行C命令。

因此,首先,我想知道是否有可能说服gdb以这种方式执行? 如果没有,还有其他什么可以让我做类似的事情(也许有一些特殊的外壳)?

至于上下文-我有一些代码在故障排除结构等之间的指针时遇到问题; 在这种情况下, gdb可以打印出结构的方法效果很好-但是,为了隔离问题,我必须制作新的源文件,粘贴数据,重新编译和调试。 在这种情况下,我宁愿可以将几种结构(及其初始化命令)粘贴到某种类型的外壳中,然后使用直接键入的printf (甚至更好,类似于gdbprint )进行检查。在外壳上。

仅作记录-我并不是真的说服像这样的事情确实存在; 但我想无论如何我都会问:)

预先感谢您的任何回答,
干杯!

编辑 :我有点忙,所以还没来得及审查所有答案是否可以接受(对不起:)); 只是想添加一点评论:“ 解释与机器代码 ”; 或如@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
  • Ctrl + 1- gdb退出,控制权返回给我们的应用程序-该应用程序再次等待下一行代码。
    • (随后的代码行条目保存在临时文件中-放在同一类别的最后一个条目下方)

显然,我不希望能够将整个linux内核代码粘贴到这样的应用程序中,并希望它能工作:)但是,我希望能够粘贴到几个struct ,并进行检查语句的结果如:

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

...所以我确定要使用什么正确的语法(通常是我弄乱了什么)- 无需重新构建和调试整个软件的开销,只是为了弄清楚我是否应该移动正确的括号在星号之前或之后(当然,在这种操作不会引起编译错误的情况下 )。

现在,我不确定上述简单化的应用程序体系结构可能引起的全部问题。 但是,这只是一个例子,它简单地指出,通过使用gccgdb ,类似“ C shell”(对于相对简单的会话/程序)在概念上是可行的-不会与','之间的严格区别产生任何严重冲突。机器代码”和“解释”语言。

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

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

重复

或像在城市街道上驾驶法拉利一样使用它。


Tiny 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-谢谢您的回答!

为了n00bery的好处,这里是答案的摘要(因为我无法立即掌握发生的事情):我需要的(在OP中)由所谓的“ C Interpreter ”( 不是 ' C shell '),建议以下内容:

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

对于c-replc-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM