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

LinuxC:类似Shell的环境—用于单独执行—C命令?(C)口译员,c,linux,shell,gdb,environment,C,Linux,Shell,Gdb,Environment,很抱歉,如果问题的措辞有误-我不知道我所要求的是什么意思!: 比如说,你有一些简单的C程序,比如: #include <stdio.h> int main() { int a=2; printf("Hello World %d\n", a); return 0; } 换句话说,我希望能够以交互方式执行单个C命令,我猜这将代表排序的即时编译?。起初我被csh的名字误导了,但我认为它不能在运行中执行C命令 所以,首先,我想知道是否有可能以某种方式说服,比如说,g

很抱歉,如果问题的措辞有误-我不知道我所要求的是什么意思!:

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

#include <stdio.h>

int main()
{
   int a=2; 
   printf("Hello World %d\n", a);
   return 0;
} 
换句话说,我希望能够以交互方式执行单个C命令,我猜这将代表排序的即时编译?。起初我被csh的名字误导了,但我认为它不能在运行中执行C命令

所以,首先,我想知道是否有可能以某种方式说服,比如说,gdb以这种方式执行?如果没有的话,有没有其他东西可以让我做一些类似的事情,比如一些特殊的外壳

至于上下文-我有一些代码,在这些代码中,我对结构和类似结构之间的指针进行故障排除时遇到问题;在这里,这种方法非常有效——但是,为了隔离问题,我必须创建新的源文件,粘贴数据,重新编译和调试。在这种情况下,我更希望能够将多个结构及其初始化命令粘贴到某种shell中,然后使用printf或更好的方法进行检查,类似于直接在shell上键入gdb的print

只是为了记录在案——我真的不相信这样的事情真的存在;但我想我还是要问:

提前感谢您的回答, 干杯

编辑:我有点忙,所以还没来得及复习所有答案,请接受抱歉:;只是想添加一点注释:解释与机器代码;或如@doron所述:

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

我完全了解这一点,但让我们设想一下,命令行应用程序甚至可以是一个解释的应用程序,它可以为您提供命令行界面提示。首先,假设此应用程序在内存中生成以下简单文本文件:

@@HEADER@@

int main()
{
    @@MAIN@@

    return 0;
} 
然后,应用程序只需等待在提示下输入文本,然后按ENTER键;在一条新的线路上:

应用程序将检查: 如果该行以define或include开头,则该行将添加到临时文件中@@HEADER@@的下方,但在int主线的上方 任何其他内容,都会在@MAIN@@line下面,但在上面返回0;行-在临时文件中 临时文件将从@HEADER@@和@MAIN@@行中删除,并作为temp.c保存到磁盘 调用gcc编译temp.c并生成temp.out可执行文件 如果失败,通知用户,退出 调用gdb运行temp.out可执行文件,在返回0处设置断点;线 如果失败,通知用户,退出 执行返回到提示符;用户输入的下一个命令实际上会传递给gdb,因此用户可以使用p变量之类的命令进行检查,直到用户按Ctrl+1退出gdb为止 Ctrl+1-gdb退出,控制返回到我们的应用程序-它再次等待下一个代码行。。等 后续的代码行条目保存在临时文件中-位于同一类别中最后一个条目的下方 显然,我不希望能够将整个linux内核代码粘贴到这样的应用程序中,也不希望它能够工作:但是,我希望能够粘贴到几个结构中,并检查语句的结果,例如:

char dat = (char) (*(int16_t*)(my->structure->pdata) >> 32 & 0xFF) ^ 0x88; 
。。。因此,我确定应该使用什么样的正确语法,这通常是我搞砸的-没有重建和调试整个软件的开销,只是为了弄清楚在这种操作不会引起编译错误的情况下,我是否应该在星号之前或之后移动右括号


现在,我不确定上述过于简单的应用程序体系结构会导致哪些问题。但是,这只是一个例子,它简单地指出,通过使用gcc和gdb,类似于用于相对简单会话/程序的C shell的东西在概念上是可行的,而不会与“机器代码”和“解释”语言之间的严格区别产生任何严重冲突

Python和c属于不同种类的语言。Python在运行时是逐行解释的,但c应该编译、链接和生成代码来运行。

Python和c属于不同的语言。Python在运行时是逐行解释的,但c应该编译、链接并生成要运行的代码。

有c解释器。 寻找Ch或CINT

有C口译员。 寻找Ch或CINT

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

或者就像在城市街道上开着一辆法拉利一样使用它

[…许多功能,包括] 支持的C脚本:只需添加“/usr/local/bin/tcc-在C源代码的第一行运行,并直接从命令行执行它。 编辑:发现一个新的未经测试的东西,似乎是OP想要的

或者干脆用它。。。 ]就像在城市街道上开着一辆法拉利

[…许多功能,包括] 支持的C脚本:只需添加“/usr/local/bin/tcc-在C源代码的第一行运行,并直接从命令行执行它。
当你的CPU运行一个计算机程序时,它运行一种叫做机器代码的东西。这是一系列特定于您所使用的CPU的二进制指令。由于机器代码是很难手工编码的,人们发明了高级语言,如C和C++。不幸的是,CPU只理解机器代码。因此,我们运行一个编译器,将高级源语言转换成机器代码。这个类中的计算机语言是C语言和C++语言。这些语言被称为本机运行,因为生成的机器代码由CPU运行,无需进一步解释

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


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

< P>当CPU运行计算机程序时,它运行称为机器代码的东西。这是一系列特定于您所使用的CPU的二进制指令。由于机器代码是很难手工编码的,人们发明了高级语言,如C和C++。不幸的是,CPU只理解机器代码。因此,我们运行一个编译器,将高级源语言转换成机器代码。这个类中的计算机语言是C语言和C++语言。这些语言被称为本机运行,因为生成的机器代码由CPU运行,无需进一步解释

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


以交互方式运行C/C++源代码的问题在于编译器无法逐行解释代码。它只设计成生成相应的机器代码,因此不能交互运行C/C++源。

@ P> @佛罗夫特和@ PMG -谢谢你的答案!p> 为了n00bery的利益,以下是答案的摘要,因为我无法立即掌握发生了什么:我在OP中需要的是由所谓的C解释器而不是“C shell”处理的,建议如下:

-Ubuntu:安装为sudo apt get install root system bin 5.18.00-2.3ubuntu4+115MB额外磁盘空间 -Ubuntu:安装为sudo apt get install c-repl c-repl_0.0.20071223-1_i386.deb+106kB额外磁盘空间 -标准版是windows/Unix的免费软件 对于c-repl,有一个快速教程作为示例会话;但以下是同样的命令在我的Ubuntu Lucid系统上的行为,以及存储库版本的编辑:请参阅以获得更好的示例:


在任何情况下,这正是我所需要的:加载头、添加变量和检查它们将占用的内存的能力!再次感谢大家,干杯

@buddhabrot和@pmg-谢谢你的回答

为了n00bery的利益,以下是答案的摘要,因为我无法立即掌握发生了什么:我在OP中需要的是由所谓的C解释器而不是“C shell”处理的,建议如下:

-Ubuntu:安装为sudo apt get install root system bin 5.18.00-2.3ubuntu4+115MB额外磁盘空间 -Ubuntu:安装为sudo apt get install c-repl c-repl_0.0.20071223-1_i386.deb+106kB额外磁盘空间 -标准版是windows/Unix的免费软件 对于c-repl,有一个快速教程作为示例会话;但以下是同样的命令在我的Ubuntu Lucid系统上的行为,以及存储库版本的编辑:请参阅以获得更好的示例:


在任何情况下,这正是我所需要的:加载头、添加变量和检查它们将占用的内存的能力!再次感谢大家,干杯

你好@elprup-谢谢你的评论!我知道Python是被解释的;但我在想,是否有专门为C开发的东西——它不一定要有权限说通过标题包含的东西;但也许至少可以直接处理结构语法?似乎您想在gdb中运行时更改结构值。也许您可以读取,这样您就可以将二进制结构信息复制到内存中。谢谢@elprup-+1
好链接!不幸的是,我更感兴趣的是检查内存,而不是更改内存。请参见上面OP中的编辑,也许它可以澄清。。干杯你好@elprup-谢谢你的评论!我知道Python是被解释的;但我在想,是否有专门为C开发的东西——它不一定要有权限说通过标题包含的东西;但也许至少可以直接处理结构语法?似乎您想在gdb中运行时更改结构值。也许您可以读取,这样您就可以将二进制结构信息复制到内存中。感谢@elprup-+1的链接!不幸的是,我更感兴趣的是检查内存,而不是更改内存。请参见上面OP中的编辑,也许它可以澄清。。干杯感谢@doron-+1的写作;然而,我有一个简单的想法-请看一看操作编辑。干杯感谢@doron-+1的写作;然而,我有一个简单的想法-请看一看操作编辑。干杯啊。。。。所以它被称为“C解释器”,而不是“C外壳”?!万分感谢,@buddhabrot!!cint似乎正是我所需要的——但我并不清楚它是如何工作的,我想我最好写一篇文章。。。再次感谢,干杯!啊。。。。所以它被称为“C解释器”,而不是“C外壳”?!万分感谢,@buddhabrot!!cint似乎正是我所需要的——但我并不清楚它是如何工作的,我想我最好写一篇文章。。。再次感谢,干杯!你好@pmg-谢谢你的回答!c-repl看起来非常好——而tcc似乎不是我想要的那种c解释器,尽管它可能允许调用单个.c文件作为脚本;它仍然可能只是一个编译器+链接器-我找不到任何方法生成解释器外壳。再次感谢,干杯!你好@pmg-谢谢你的回答!c-repl看起来非常好——而tcc似乎不是我想要的那种c解释器,尽管它可能允许调用单个.c文件作为脚本;它仍然可能只是一个编译器+链接器-我找不到任何方法生成解释器外壳。再次感谢,干杯!相关问题:相关问题:
char dat = (char) (*(int16_t*)(my->structure->pdata) >> 32 & 0xFF) ^ 0x88; 
$ 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
$ 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)