Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 正则表达式如何转换为汇编?_C_Assembly_Mips - Fatal编程技术网

C 正则表达式如何转换为汇编?

C 正则表达式如何转换为汇编?,c,assembly,mips,C,Assembly,Mips,我了解到C被翻译成汇编,然后汇编被翻译成机器代码。我还学习了如何将基本的C结构(如指针和循环)转换为32位MIPS汇编。但是我没有学会如何将例如C中的正则表达式翻译成汇编,有没有一个方法?C不支持正则表达式。大会也不例外。您必须编写一些用于模式匹配的算法代码,然后,如果它还没有在汇编代码/机器代码中,则将其翻译/编译到其中。没有魔法。C不支持正则表达式。大会也不例外。您必须编写一些用于模式匹配的算法代码,然后,如果它还没有在汇编代码/机器代码中,则将其翻译/编译到其中。没有魔力。将正则表达式翻译

我了解到C被翻译成汇编,然后汇编被翻译成机器代码。我还学习了如何将基本的C结构(如指针和循环)转换为32位MIPS汇编。但是我没有学会如何将例如C中的正则表达式翻译成汇编,有没有一个方法?

C不支持正则表达式。大会也不例外。您必须编写一些用于模式匹配的算法代码,然后,如果它还没有在汇编代码/机器代码中,则将其翻译/编译到其中。没有魔法。

C不支持正则表达式。大会也不例外。您必须编写一些用于模式匹配的算法代码,然后,如果它还没有在汇编代码/机器代码中,则将其翻译/编译到其中。没有魔力。

将正则表达式翻译成汇编语言在几十年前似乎已经过时了。相反,现在它们通常被编译成确定性有限自动机(DFA),通常有一个中间步骤作为非确定性有限自动机(NFA)。如果您不熟悉这些术语,请参阅:

与正则表达式对应的NFA非常容易构造;只需将正则表达式中的每个点视为一个状态,以及可以匹配并移动到正则表达式中的下一个点的字符集,作为从该状态到下一个状态的转换。


其他流行的正则表达式引擎(包括PCRE)根本不编译正则表达式,而是使用回溯匹配器,该匹配器编写简单,但内存使用情况非常糟糕(许多递归调用帧,如果作为实际函数调用实现,则会导致堆栈溢出),并且big-O性能非常糟糕(可能是指数时间)将正则表达式翻译成汇编语言似乎在几十年前已经过时了。相反,现在它们通常被编译成确定性有限自动机(DFA),通常有一个中间步骤作为非确定性有限自动机(NFA)。如果您不熟悉这些术语,请参阅:

与正则表达式对应的NFA非常容易构造;只需将正则表达式中的每个点视为一个状态,以及可以匹配并移动到正则表达式中的下一个点的字符集,作为从该状态到下一个状态的转换。


其他流行的正则表达式引擎(包括PCRE)根本不编译正则表达式,而是使用回溯匹配器,该匹配器编写简单,但内存使用情况非常糟糕(许多递归调用帧,如果作为实际函数调用实现,则会导致堆栈溢出),并且big-O性能非常糟糕(可能是指数时间).

通常,这取决于如何实现正则表达式。例如,您可以:

  • 使用PCRE或POSIX正则表达式之类的东西。在这种情况下,通过使用特定于您的体系结构/ABI的调用约定进行适当的调用,对该API的函数调用将简单地转换为机器(汇编)代码
  • 使用类似于
    flex
    的工具。在这种情况下,该工具将生成大量的C代码,通常以表和状态机的形式出现,这些代码将使用编译器进行翻译

如果您实现某种特殊的正则表达式解析方案,它将是编译器为您的代码生成的任何内容。

通常,它取决于您如何实现正则表达式。例如,您可以:

  • 使用PCRE或POSIX正则表达式之类的东西。在这种情况下,通过使用特定于您的体系结构/ABI的调用约定进行适当的调用,对该API的函数调用将简单地转换为机器(汇编)代码
  • 使用类似于
    flex
    的工具。在这种情况下,该工具将生成大量的C代码,通常以表和状态机的形式出现,这些代码将使用编译器进行翻译

如果您实现某种特定的正则表达式解析方案,它将简单地是编译器为代码生成的任何内容。

考虑如下:C通过RePixor()来支持正则表达式,这是POSIX LIBC的一部分。你的回答应该更清楚。@James POSIX超出了C标准的范围。我同意@AlexeyFrunze的观点,只是因为POSIX中的某些内容并不意味着它是“C”的一部分,因为它是一个函数,没有任何编译器支持或任何东西。很明显,OP所问的问题与正则表达式是如何“编译”的有关,这意味着它们是一种语言构造(比如Ruby等,它为它们提供了一些支持)。在C中不是这样的,这个答案让人明白了,但是说“C不支持正则表达式”是误导。我与同事共进午餐,他们的想法也是一样的,直到你将他们指向regexec的手册页,该手册页在所有主要*nix平台上都受支持。我理解OP的要求,但其他人可能会将该答案视为他们不知道不能在C程序中使用正则表达式的证明。@James:我同意你的观点,但我认为如果你的评论更像是这样,这个问题本来可以避免的:“C语言不要求在语言级别上支持任何正则表达式,但符合POSIX的和类似POSIX的系统提供了
regcomp
regexec
函数,这些函数在
regex.h
中声明,用于在缺少这些接口的系统上编译和匹配C中的正则表达式,替换实现可以悄悄地删除。“C通过regexec()支持正则表达式,regexec()是POSIX libc的一部分。您的回答应该更清楚。@James POSIX不在C标准的范围内。我同意@AlexeyFrunze,只是因为POSIX中的某些内容并不意味着它是“C”的一部分“从某种意义上说,它是一个函数,没有任何类型的编译器支持或任何东西。有点明显的是