【问题标题】:Which language to use for implementing few Linux shell commands (homework) - plain C or C++? [closed]使用哪种语言来实现少量 Linux shell 命令(作业) - 纯 C 或 C++? [关闭]
【发布时间】:2010-12-08 08:48:17
【问题描述】:

我需要为我的作业实现一些 Linux shell 命令 - 其中 5 或 6 个,包括 ls。不太了解每个命令要实现哪些参数...
我本来打算用C++的,但是当我问我的同事选择什么语言-纯C还是C++时,他说解释器不是传统意义上的程序,它是一个功能工具,它绝对必须用C来实现.
我对 C++ 的论点是代码重用性好、关注点分离更好,事实上我对 C 的了解并不多 - 实际上,我学习了 C++ 并喜欢它。
那么,您对此有何看法?在此先感谢。
这是一项个人任务 - 我的意思是我的小组中的每个人,所以不应该合作。
我有底层编程、指针算术、void* 等方面的经验。

【问题讨论】:

  • 我不想做一个重复的答案所以...绝对去 C++ :)

标签: c++ c linux shell


【解决方案1】:

首先:使用你所知道的。

如果您可以通过熟悉的路线到达未知水域,则没有理由进入未知水域。

无论如何,在您的情况下,C++ 是一个非常可行的选择。所以,你只是使用它并没有错。

第二:你的朋友错了。 (我会用更严厉的话,但我会很好。)

C++ 和 C 都是编译语言。 C++ 程序绝对是传统意义上的程序。 C 和 C++ 也是静态类型的。

PS: 您仍然可以使用 C++ 编译器来构建 C 程序。您可以使用 C++ 完成 C 中可用的一切

【讨论】:

  • 您绝对不能使用 C++ 编译器来构建 C 程序(long long、VLA、从void * 转换,...​​)。然而,大多数 C++ 编译器也支持 C。
  • C++ 和 C 并不是真正的“编译语言”。说实话,不是语言是“编译”或“解释”的。语言只是一种规范,它可以被编译或解释。
  • @avakar,好点,但我确实说的是编译器。 @tster,好点,适当指出。如果你们中的任何一个人能想到改进我的答案的好方法,请编辑它。
  • @tster: 是的,但我们真的想说“C 是一种本质上总是编译的语言”吗?我认为我们都可以处理简化。
  • @Jefromi,+1 我同意。但有时我只是认为人们需要记住,语言是一种规范,而不是他们碰巧使用的编译器/解释器。
【解决方案2】:

你知道 C++,你喜欢它,所以使用 C++。

或者,你想要挑战,你想学习 C,这将使家庭作业感觉有用,所以使用 C。

PS。 “必须用C实现”完全是废话。不要掉进那个陷阱。

【讨论】:

  • +1 在编程语言方面无需感受到同龄人的压力。如果您使用它很舒服,那就使用它;如果你追求更多,尝试一些新的东西。
【解决方案3】:

真的没关系。你用什么最舒服?您可以使用任何一种语言获得编写得相当好的代码。

  • 如果您对编程的过程/模块化范式感到满意,请使用 C
  • 如果您想使用面向对象和/或通用编程工具,请使用 C++

如果您只是对完成某事感兴趣,我可能会使用 python 或其他脚本语言来完成此任务。

【讨论】:

    【解决方案4】:

    这不是直接回答你的问题,但也许它会回答你的情况。我记得自己在很久以前做过类似的作业……

    我相信,最初的目标是让学生熟悉手册页的第 3 节“C 程序的 C 库例程”,并在较小程度上熟悉第 2 节“Unix 和 C 系统调用”。我记得我问过老师我是否可以用 C++ 写作业,但得到了否定的答案——C 是必需的。

    无论如何,我的观点是我大部分时间都浪费在解析命令行参数上。实用程序本身是微不足道的。事后看来,没有人向我指出 man 3 getopt 真是太可惜了。我希望你会变得比我更聪明。

    【讨论】:

      【解决方案5】:

      由于这是家庭作业,我会与教师或为您的作业评分的人核实一下。一个好的讲师应该能够理解一个 C++ 程序以及一个 C 程序,如果它不是以疯狂的方式编写的(但是学生怎么知道什么是疯狂的呢?)

      如果您的教师不关心您使用哪种语言,如果您想更快地完成工作,请使用您最熟悉的语言。如果您想挑战,请使用您不太熟悉的语言。上学是犯错的好时机,但在学期末你的成绩很重要。

      最后,如果作业的目的是学习 API,请不要太着迷于尝试封装原生 API 或重新发明它。如果你能想出一个优雅的包装器来证明你理解 API,那很好,但否则你的教师可能会因为你的程序与 API 而不是它一起工作而感到恼火。

      【讨论】:

        【解决方案6】:

        如果您了解并熟悉 C++,我想不出理由不将其用于此目的。

        【讨论】:

          【解决方案7】:

          你的朋友不知道他们在说什么。 C 和 C++ 都正常编译(存在解释器,但正常用法是编译它)。最后,C 编译的二进制文件和 C++ 编译的二进制文件的行为方式相同。使用任何你想使用的东西,这是一个偏好问题。

          【讨论】:

          • 甚至没有真正的理由避免使用解释性语言。在文件顶部贴上一个shebang,你就是金子。
          【解决方案8】:

          关于您的第一个论点:在 C 中也实现了出色的代码重用和更好的关注点分离。

          关于你同事的论点:我不知道传统意义上的程序是什么。不存在阻止将 C++ 用作解释器的技术或法律问题。

          关于你的第二个论点:如果你不懂 C,就不要用 C 编程(除非你的目标是学习它,这很好)。 对于唯一工具是锤子的人来说,每个问题看起来都像钉子。这可能是个玩笑,但我认为这也是一个很好的建议。

          【讨论】:

          • 我的意思是我不t know it well enoigh to use even 10% of all its advantages. while learning C++ I did pointers operations, arrays, some low-level stuff. but I dont 认为 linux API 很友好,所以我想使用 C++ 以最方便的方式使用 OOP 进行包装
          • 对于唯一工具是锤子的人来说,每个问题看起来都像钉子 - 或者更具体地说是stackoverflow.com/questions/234075/…
          【解决方案9】:

          使用任何你觉得更舒服的东西。

          但是,使用 C 你可以cheat :)

          不要作弊!各种实用程序的来源不适合一般使用。

          【讨论】:

          • 最初的 UNIX V6 源代码(例如 minnie.tuhs.org/UnixTree/V6/usr/source/s1)可能值得一看这个分配 - 尽管它们确实使用了 C 的古老方言(例如 =+ 运算符现在拼写为 @987654326 @)。
          • V6 不会让他走得太远。他的任务不是重写 UNIX v6。这些来源仍然不使用他最肯定应该使用的包含文件。 v7 更类似于他应该写的。 minnie.tuhs.org/UnixTree/V7/usr/src/cmd 但无论如何,父解决方案可能是一个更好的起点(v7 不兼容 posix)。违反 GPL 的作业——那会很有趣。实际上,编写基本的 unix 实用程序非常容易,实用程序和 posix 函数的手册页绰绰有余。 openbsd.org/cgi-bin/man.cgi
          • 啊!感谢您的链接...旧的 C 语法比 GNU 缩进样式好得多!
          【解决方案10】:

          如果您对 C++ 感到满意...使用它。您可以使用Boost Program Options 库来管理输入参数。

          【讨论】:

          • 是的,新手系统程序员想要做的第一件事就是为应该具有尽可能少的依赖关系的实用程序构建和使用 boost。
          • 为什么会出现反对票?你的建议很好,我考虑过使用 Boost 库
          • 我在这里不是 +1 或 -1,但我同意 Boost 中的链接对于不了解 C 和 C++ 的人来说有点可疑。
          • OP 显然确实从 C++ 中了解 C,并且更喜欢 C++。如果您使用的是 C++,那么使用 Boost 来消除乏味是很明智的选择。
          • 是的,他应该使用 boost.program_options 来解析命令行参数。 boost.shared_ptr 用于他的指针, boost.flyweight 用于存储输出的每个字符, boost.streams 用于他自己的格式化 cout...man...really..?
          【解决方案11】:

          实际上,您可以同时使用两者。这在很大程度上取决于您正在编写什么命令。

          C++ 有一个缺点,可执行文件大小。如果你真的在实现 shell 命令,你希望可执行文件更小,而 C 更有可能生成更小的可执行文件。当然,这不是唯一的限制。您也希望代码易于使用。因此,混合方法可能会带来好处。对于像 ls 这样的输入处理很少的命令,您可以使用 C stdio.h 库来完成所有输出,这样您就不必包含更大的 C++ iostream 库。

          OTOH,这是一个家庭作业,所以我怀疑你是否会因为大型可执行文件而获得分数,所以在这种特定情况下,你可能应该坚持你最了解的内容。

          【讨论】:

            【解决方案12】:

            如果您只是在执行 shell 命令,我认为最简单的方法是编写一个 bash 脚本。这样你就已经在使用 shell,只需要学习简单的语法,然后管道和重定向命令。

            【讨论】:

              猜你喜欢
              • 2020-07-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-11-25
              • 1970-01-01
              相关资源
              最近更新 更多