【问题标题】:Looking for ideas on a computer science course project [closed]寻找有关计算机科学课程项目的想法[关闭]
【发布时间】:2010-11-08 06:29:40
【问题描述】:

嘿。我正在学习一门名为《编程语言原理》的课程,我需要决定今年夏天要做的一个项目。以下是项目需要完成的简短版本:

“项目的本质是语言处理。写一个Scheme/Lisp处理器就是这种类型的项目。像C或Pascal这样的语言的编译器也是这种类型的潜在项目。一些过去的学生做过项目与数据库和处理 SQL 相关。另一个可能的项目可能与模式匹配和操作 XML 有关。Lisp、Pascal 和 C 通常会产生最直接的项目。"

我对 Web 技术非常感兴趣,并且对 PHP、MySql、JavaScript 等有一定的经验,我想做一些面向 Web 的事情,但是我无法提出任何想法。我也希望这是一个有价值的项目,可能具有一定的意义,而不是像班上其他人一样做同样的事情。

有什么想法吗?谢谢!

编辑:我真的很喜欢 Latex 到 XHTML/MathML 翻译器的想法,我把这个想法传递给了我的导师,他回信了:

“我认为这个想法很有趣,我的问题(和你的问题)是它是否合适。

我认为 LateX 是一种低级标记语言。我想知道将其转换为 XHTML 或 MathML 是否真的是级别和复杂性的变化。我想你可以通过更多的讨论和一些例子来表达你的观点。您可能还会想到一些其他标记结构,它们可以更轻松地描述方程式。”

关于如何说服他这可能是合适的任何想法,或者这个想法的任何扩展可以为我的项目目标工作?

感谢到目前为止的所有回复!

【问题讨论】:

  • +1 制作一个给定 SQL 查询的分词器,将其解析为 php 数组结构。当然,在更改数组时...它会生成 SQL ......这将很有用并且有复杂程度很高
  • 我已经扩展了我的答案,其中我提出了 LaTeX-to-MathML 翻译器。我不知道我的阐述是否解决了您的讲师提出的问题,但我更热情、更详细地论证了为什么这样的翻译人员会对现实世界产生重大影响。我真的很想看到这种情况发生。祝你好运!
  • 您可能想看看现有的(正在进行的)项目,用于将 LaTeX 转换为 MathML:hackage.haskell.org/package/texmath-0.1.0.1

标签: php xml parsing compiler-construction computer-science


【解决方案1】:

针对您的编辑,以下是一些乳胶的想法:

  1. LaTeX 到 ASCII 的漂亮打印,也许只是 TeX 的一小部分
  2. LaTeX-to-Maple/Mathcad/Mathematica 脚本,以便可以导入或编辑或求解方程(不知道是否已经存在)
  3. Javascript LaTeX 翻译器。基本上,当您输入时,它会从乳胶翻译成 html/css/.gif/whatever,因此您可以在输入时看到您的数学“实时”,有点像 stackoverflow 文本编辑器。
  4. 也许是某种乳胶宏来表达 C 代码之类的?或者这个怎​​么样:通常,C 代码在做数学运算:“det = (b*b - 4*a*c); det_sqrt = sqrt(det); etc” 用 C(或 java 或其他)代码执行一系列算术赋值,并将其转换为格式良好的胶乳怎么样?人类可读的方程式列表(即\begin{eqnarray} 块)
  5. 或做相反的事情:获取乳胶计算或方程式的列表,并生成声明必要变量的 C 代码,获取必要的用户输入,并执行乳胶中列出的计算?

【讨论】:

    【解决方案2】:

    这是我喜欢的东西:基于 PHP 的 LaTeX-to-MathML 翻译器。它不必做所有事情,但如果我可以将用有效的 LaTeX 代码编写的数学公式剪切并粘贴到一个窗口中,并让脚本对其进行解析并将其转换为有效的 MathML,那就太棒了。

    让我进一步扩展一下。目前网络上的科学出版状况并不好。标题、页眉、节号、表格等都可以用 HTML 完成,但对于依赖精确二维格式的数学和化学公式,科学作者只有二等选择:

    • 以 pdf 格式发布他们的作品,该格式看起来很棒,但文件大小(相当)巨大,并且不能很好地进行超链接,或者
    • 使用 latex-to-html 之类的东西,它将公式转换为 .gif 文件(或一些类似的图像文件),这些文件在语义上没有意义,因此不适合索引或搜索。

    此外,这些选项都不允许以编程方式生成数学公式,这将有助于教育社区(想想随机生成的在线作业)。

    用 MathML 发表科学作品可以解决所有这些问题,但它也有一些问题,即:

    1. 手工编码实在是太冗长了。我的意思是,你可以做到,但是来吧。
    2. 科学界使用 LaTeX 进行出版,他们对此很满意(有充分的理由),而且当他们有自己的研究和课程计划要做时,他们不会学习另一种数学标记语言。
    3. 浏览器对 MathML 的支持目前非常有限。我知道这一点,我并不想为此埋头苦干。

    换句话说:科学作者知道 LaTeX,他们每天都在使用它,这是创作科学内容的事实上的标准。 MathML 不是也永远不会是数学和科学的创作方式,但它是将超文本数学放到网络上的唯一语义丰富的方式。浏览器对 MathML 的支持很弱,因为没有人使用它;没有人使用它,因为手写太难了。现在,也许这是一厢情愿,但我必须相信,如果只是更容易编写 MathML,更多的科学家和数学家,尤其是早期采用者类型,至少会尝试它,这将激发浏览器(尤其是开放式-源浏览器)来改进他们的支持,这将导致更多的作者使用它,等等。

    这就是翻译器的用武之地:在 MathML 的准入门槛下降之前,它永远不会被广泛采用。一个简单的 LaTeX-to-MathML 转换器可以解决这个问题。它将 MathML 的准入门槛降低到接近于零。如果它导致 MathML 的广泛使用和更好的支持,这将对科学和教育界大有裨益。

    【讨论】:

    • ohman,LaTeX-to-anything 翻译器会发生很多好事。我知道那里已经有 latex-to-html 的东西,但它们都是 perl-shell-scripts。没有任何东西可以轻松用作 PHP 模块或 C 模块或其他东西。
    • 虽然是一个非常酷的想法,但它与项目描述不符,尽管有一天我会把它作为一个可能的副项目记在脑海里,谢谢你的回答
    【解决方案3】:

    您可以从这个massive list.中获得灵感

    【讨论】:

      【解决方案4】:

      嗯,不错!也许:

      1. 基于网络的语言解释器。例如,一个非常简单的 javascript 汇编解释器,或基于 PHP 的 C 解释器(PHP 脚本读取 C 代码,并以某种沙盒方式执行它。显然它只能实现 C 的一小部分语言)

      2.也许是某种自动化的方式将 PHP 数据结构(如 PHP 数组)转换为 SQL 查询,反之亦然。这类事情已经完成,但您可能能够做一些事情,例如,接受 SQL 查询并创建“保存”SQL 返回的信息所需的数组数据结构。它可以支持诸如 JOINS 和 GROUP BY 之类的复杂事物。

      3. 也许是 C-to-PHP 编译器? (或 PHP-to-C 编译器,能够在本地运行简单的 PHP 代码。与任何语言组合一起使用)

      编辑:

      4. 可能是一个正则表达式到 C 的解析器。也就是说,需要一个正则表达式,并生成 C 代码以匹配该模式。或者采用正则表达式并将其转换为代表该表达式的“数学”翻译的 FSM 的东西。或者相反 - 将 FSM 用于 CFL 并为其生成 perl 语法正则表达式。

      5. 也许是一个 XML-to-PHP/MySQL 解析器。例如,一个 XML 文件可能包含有关数据库和字段的信息,然后您的程序会创建 SQL 来创建这些表,或者为表单创建 HTML/PHP 代码。

      祝你好运!

      【讨论】:

        【解决方案5】:

        我上学期完成了这门课程:)

        恕我直言,最好的方法是构建一个表达式评估器。构建最简单的表达式求值器。

        然后按你喜欢的顺序添加这些功能:

        1- 常量符号,只是变量的占位符。您的评估者应该在解析表达式后询问它们的值。

        2- 命令式变量。就像任何命令式语言中的变量一样,用户可以在代码中的任何位置更改符号的值。

        3- 简单的控制语句。 'if-else' 和 pretest while 循环是最容易考虑的。

        4- 数组。如果你真的希望你的表达式评估器真的像一门编程语言。如果您将可变维度数组添加到您的“语言”中,那将会很有趣。你必须建立一个generic mapping function for your arrays

        现在您有了真正的编程语言。要成为有用的,您可以添加子例程。 所以列表是连续的:

        5- 子程序。这比以前的功能要难一些,但应该不是不可能的:)

        6- 用您自己的语言为您的新语言构建一个简单的数学库!在我看来,这就是有趣的部分;)

        Sebest book 是一本概述著名命令式编程语言的好书。

        【讨论】:

        • 这将非常接近我最终要做的事情,感谢您的回复!
        【解决方案6】:

        网络是处理语言的丰富领域。看看像 Ruby on Rails 这样流行的 Web 框架,您会发现它的大部分生产力来自于它实现了一个非常适合 Web 应用程序的 domain specific language。 Ruby 恰好是一种很好的语言来实现这种语言,因为它具有动态特性,但它的力量来自于他们用它创建的语言。

        在您的情况下,也许您可​​以尝试使用您熟悉的语言(例如 PHP)设计自己的领域特定语言,以实现 Web 框架的基本核心:

        • 将 URL 路由到页面
        • 使用模板动态生成页面(并且可能实现您自己的模板语法!)
        • 将对象连接到底层数据库 (object relational mapping)

        如果您真的雄心勃勃,那么您可以从头开始构建自己的语言(词法分析器、解析器、代码生成器等),而不是从现有语言构建。 p>

        【讨论】:

          【解决方案7】:

          如果你想处理语言,你可以做一个 UIMA 程序。 UIMA 代表非结构化信息管理架构,它由 IBM 开发,耗资约 4500 万美元,现已开源。基本上 UIMA 是 ascii 编解码器,用于分析文本文档以查找模式。它被用来寻找没有顺序的东西(在干草堆中寻找针)。它使用 XML 和 C。

          【讨论】:

            【解决方案8】:

            您不应将创建特定语言的实现视为微不足道。可能每个人都想成为一名著名的程序员,但实现它的人并不多。这是熟悉非常酷的不常见语言的绝佳机会。 (Lisp、APL 等)如果这是您第一次创建编译器/解释器,那么使用已经存在的语言也是一个更好的选择(这样您就可以看到创建成功的语言需要哪些设计元素。)

            重要的想法通常源于必要性。人们开始使用一种语言是因为他们要么需要它,要么因为它更容易完成他们想做的任务。我认为您不会在这里找到从头开始项目的答案或动力。话虽如此,我一直认为拥有一种使用处理器本机字节码来创建动态网站的语言(不使用 cgi 之类的东西)会很酷。

            【讨论】:

              【解决方案9】:

              如果您想做一些有趣的事情,您可以尝试使用 nadvsh 编写脚本语言,但它可能与您的导师对您的期望相去甚远。

              New Adventure Shell (nadvsh)

              【讨论】:

                【解决方案10】:

                对于这样的项目,我会远离 PHP 和 MySQL。两者都是商业平台,为了获得市场份额和解决用户问题,已经妥协了许多核心 CS 原则。鉴于您所描述的,听起来这个项目的重点是考虑如何处理编程语言。 Javascript 语言(不是浏览器 API)在这里可能是一个不错的选择。为 Javascript 编写处理器/解释器/编译器或使用 Javascript 本身为另一种语言编写处理器/解释器/编译器将符合分配标准。编写一个 Javascript“缩小器”,删除所有不必要的空白(对于较小的文件大小),同时保持程序的功能是另一个可能的项目。

                【讨论】:

                • 哦,或者他可以写一个代码混淆器。无论如何,那里似乎缺乏好的开源软件。 (除了这样一个程序的优点之外,这将是一件有趣的事情——肯定会出现一些字典上的“陷阱”。)
                【解决方案11】:

                一些有趣的工作是使用 Glouchkov 算法的自动机正则表达式,这里有一些可以实现的关键特性

                • 正则表达式的语法分析
                • 使用 Glouchkov 算法转换为自动机
                • 使用该自动机生成匹配正则表达式的随机短语/验证短语
                • 使用 XML 导出自动机

                这不是一个很长的任务,所以你可以在几个月内完成它

                【讨论】:

                  【解决方案12】:

                  我最近想到的一件事:用 Lisp 写一个 Ruby 解释器。

                  【讨论】:

                    【解决方案13】:

                    如果您不是编译器专家,为 C 或 Pascal 编写编译器可能需要几个月或几年的时间。

                    编写一个简单的网络服务器。它会很有趣,并且作为一个简单且免费的解决方案可能会被证明是有用的。我曾经遇到一个人,他说他做了类似的事情并用于简单的客户网站。你的也可以成为有用的东西。

                    【讨论】:

                    • 我认为编写网络服务器不符合语言处理的条件。
                    【解决方案14】:

                    为什么不编写某种可以解释/编译成用户选择的适当网络技术的界面?

                    或者类似 Python 到 C 的编译器?

                    【讨论】:

                    • Python 到 C 的编译器并不是那么简单,因为 Python 是一种动态类型的语言,而 C 不是。这在理论上是可能的,但不是仅限夏季的 IMO 项目。 (PyPy 做到了,但他们通过使用该语言的严格子集来作弊。)
                    猜你喜欢
                    • 2010-12-12
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-01-29
                    • 2010-11-15
                    • 1970-01-01
                    • 2010-09-18
                    • 2019-11-30
                    • 1970-01-01
                    相关资源
                    最近更新 更多