代码之家  ›  专栏  ›  技术社区  ›  sdaau

Linux C:C命令的类shell环境(用于单独执行)?(C翻译)

  •  0
  • sdaau  · 技术社区  · 14 年前

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

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

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

    通常,这必须保存在一个文件中(例如, hello.c );然后我们跑 gcc 在源文件上获取可执行文件-如果我们在调试信息中编译,那么我们可以使用 gdb 在可执行文件上,单步执行代码行,并检查变量。

    我想要的基本上是某种“c”shell——类似于python shell;从某种意义上说,我可以在一个文件(脚本)中有一系列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 can printout structs 工作得很好——但是,为了隔离这个问题,我必须制作新的源文件,粘贴数据,重新编译和调试。在这种情况下,我更愿意将几个结构(及其初始化命令)粘贴到某种shell中,然后使用 printf (或者更好的是,类似于 GDB print )直接在外壳上键入。

    只是为了记录-我不太相信这样的事情确实存在;但我想我无论如何都会问:)

    事先感谢您的回答,
    干杯!

    编辑 :我有点忙,所以还没有时间查看所有答案以便接受(抱歉:);只是想添加一点评论: 解释代码与机器代码 “或如@doron所述:

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

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

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

    然后,应用程序只需等待在提示下输入文本,然后按Enter;在新行上:

    • 应用程序检查:
      • 如果行首是 #define #include ,然后将其添加到 @@HEADER@@ -但在 int main() 行-在临时文件中
      • 其他的都在下面 @@MAIN@@ 行-但在上面 return 0; 行-在临时文件中
    • 临时文件被剥离 @@标题@@ @@主@@ 行,并保存到磁盘 temp.c
    • 海湾合作委员会 调用以编译 温度C 并生成 temp.out 可执行文件
      • 如果失败,通知用户,退出
    • GDB 被调用以运行 温度输出 可执行文件,在 返回0; 线
      • 如果失败,通知用户,退出
    • 执行返回到提示;用户输入的下一个命令实际上被传递到 GDB ( 所以用户可以使用如下命令 p variable 检查 )-直到用户按,例如,ctrl+1退出 GDB
    • Ctrl+1- GDB 退出后,控件将返回到应用程序-该应用程序将再次等待下一个代码行。等
      • (后续代码行条目保存在临时文件中-放在同一类别的最后一个条目下面)

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

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

    …所以我确定使用什么样的语法(这通常是我搞砸的)—— 没有 重建和调试整个软件的开销,只是为了弄清楚是否应该在星号符号之前或之后移动右括号。( 当然,在这种情况下,这样的操作不会导致编译错误。 )

    现在,我不确定上述简单的应用程序体系结构可能产生的整个问题范围。但是,它只是一个例子,它简单地指出,像“C shell”(对于相对简单的会话/程序)这样的东西在概念上是可行的,同时使用 海湾合作委员会 GDB -没有任何严重的冲突,否则,严格区分“机器代码”和“解释”语言。

    5 回复  |  直到 10 年前
        1
  •  6
  •   buddhabrot    14 年前

    有C译员。
    查找ch或cint。

        2
  •  5
  •   pmg    14 年前

    编辑:找到新的( 未测试 )看起来像是警察想要的东西

    c-repl

    或者像在城市街道上驾驶费拉里一样使用它。


    Tiny C Compiler

    • …许多功能,包括]
    • 支持C脚本:只需添加“”!/usr/local/bin/tcc-在C源的第一行运行,并直接从命令行执行它。
        3
  •  2
  •   Jonathan Leffler    14 年前

    当你的CPU运行一个计算机程序时,它运行一个叫做机器代码的程序。这是一系列特定于您使用的CPU的二进制指令。由于机器代码对手工代码很难,人们发明了更高级的语言,如C和C++。不幸的是,CPU只理解机器代码。所以我们运行一个编译器,将高级源语言转换为机器代码。这个类中的计算机语言是C语言和C++语言。这些语言据说是本地运行的,因为生成的机器代码是由CPU运行的,没有任何进一步的解释。

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

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

        4
  •  1
  •   Community CDub    8 年前

    @Buddhabrot和@pmg-谢谢你的回答!

    为了n00bery的利益,这里有一个答案的摘要(因为我不能立即理解正在发生的事情):我所需要的(在op中)是由所谓的“a”来处理的。 C Interpreter A 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 standard edition -标准版是Windows/Unix的免费软件

    为了 c-repl -有一个关于 c-repl homepage 作为一个示例会话;但是下面是在我的Ubuntu-Lucid系统上,对于存储库版本,相同的命令是如何工作的( 编辑:请参见 Where can I find c-repl documentation? 举个更好的例子 ):

    $ 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 Tutorials 相反 但是后来我发现 Le Huy: Using CINT - C/C++ Interpreter - Basic Commands “下面是我的系统中的一个示例会话:

    (注:如果 金鸡纳 在您的分发包中不可用 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> .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)
    

    无论如何,那是 确切地 我需要的是:加载头、添加变量和检查它们将占用的内存的能力!再次感谢大家-干杯!

        5
  •  0
  •   elprup    14 年前

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