LinuxC:类似Shell的环境—用于单独执行—C命令?(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
#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)