编写能够编写代码的代码结论

2025-05-25

编写可编写代码的代码

结论

我们总是用手指编写代码,我们总是在键盘上打字,我们花费大量时间来编写计算机程序。

但是我们写的东西可以由计算机编写。目前,诸如,,,,...之类的编程语言CC++最后的编译步骤Python中将Java被转换为机器字节码,这意味着编写代码的程序

但这不应该是终点。我们必须编写能够用其他编程语言(例如,,,,C其他任何语言)C++编写代码的程序。Pythonjavaruby

也许是一种新的编程语言或一些改变代码结构的框架或将文本转换为其他内容的文本流处理器。

我将针对我提到的每个主题向您展示一个简单的示例,但这不是您可以做到的唯一方法。

一种新的编程语言

如今,我们总是听说新的编程语言提供了一系列功能并遵循某种设计理念,但它们中的大多数总是照搬其他编程语言的原则,无法用于日常用例。但如果我们抛开这些,尝试运用我们的创造力从零开始创建一种新的编程语言,这将为我们带来全新的思路,帮助我们实现目标。

例如,假设您想制作一个简单的文本编辑器,那么用于此目的的编程语言可以是这样的:

OpenWindow
{
    text_area: TextArea[editable, fullsize]
    KeyPress('CTRL+s') =>
    {
        path = AskPath('Save As', 'Save', 'Cancel)
        open(path, 'wt').write(text_area.text)
    }
    KeyPress('CTRL+o') =>
    {
        path = AskPath('Open', 'Open', 'Cancel)
        text_area.text = open(path).read()
    }
}

或者也许你是一位艺术家并想画一些像素艺术:

use random, new_image

image = new_image([500, 500])
image.fill('Navy Blue')

repeat (40)
{
    image.draw_dot(
        random.position_range([0, 0], [image.width, 300]),
        random.color_range('bw:200', 'bw:256')
    )
}

image.draw_rectangle([0, 300], image.size, 'Dark Blue')

repeat(10)
{
    start = random.position_range([40, 200], [image.width - 40, 300])
    end = [start.x + random.choice(1, -1) * random.range(20, 35), 300]
    image.draw_rectangle(start, end, 'Dark Blue')
}

你能猜出程序会画什么吗?

或者像这样的编程语言:

set total_words to zero.
open "article.txt" then,
    for each line,
        add number of words in line to total_words.
    end.
end.
print total_words.

元编程

如果你了解编译器的工作原理,那么真正的问题与其说是 Lisp 的语法奇怪,不如说是 Lisp 没有语法。你编写的程序是在编译器解析其他语言时生成的解析树中运行的。但这些解析树完全可以被你的程序访问。你可以编写程序来操作它们。在 Lisp 中,这些程序被称为宏。它们是编写程序的程序。

用程序来写程序?你什么时候会想这么做?如果你用Cobol思考,那可不常发生。如果你用Lisp思考,那可是随时都可能发生。如果我能举一个强大的宏的例子,然后说“好了!”,那会很方便。但如果我这么做了,对于不懂Lisp的人来说,它看起来就像胡言乱语;这里没有足够的篇幅来解释你需要知道的所有内容来理解它的含义。在Ansi Common Lisp中,我尽量加快进度,即便如此,直到160页我才讲到宏。

来源链接:https ://stackoverflow.com/questions/514644/what-exactly-is-metaprogramming

或者可以编辑程序结构的框架,例如python

from auto_code_gene import python as py
import sys

writer = py.PyWriter(sys.stdout)
node = \
py.Function('parse_argv', 'argv', [
    py.For('arg', 'argv', [
        py.If("len(argv) == 0", [
            py.Raise('ValueError', py.Str('empty argument')),
        ]),
        py.If("arg == '-'", [
            py.Pass()
        ])
    ])
])

node.write(writer)

结果:

def parse_argv(argv):
    for arg in argv:
        if len(argv) == 0:
            raise ValueError('empty argument')
        if arg == '-':
            pass

文本流处理器

一些可以翻译此文本的程序:

INC stdlib.h
ST buffer:
    char *pntr, size_t start, size_t len, size_t size
    FN ${buffer}, allocate_buffer,
        pntr = malloc($size), start = 0, len = 0, size = $(size)

到这个 C 文件:

#include <stdlib.h>

struct buffer
{
    char *pntr;
    size_t start;
    size_t len;
    size_t size;
};

struct buffer *
allocate_buffer(size_t size)
{
    struct buffer *result;

    result = malloc(sizeof(struct buffer));
    if (result == NULL)
    {
        return NULL;
    }

    result->pntr = malloc(size);
    if (result->pntr == NULL)
    {
        free(result);
        return NULL;
    }

    result->start = 0;
    result->len = 0;
    result->size = size;

    return result;
}

结论

永远不要用手指编写程序,而要始终编写生成代码的程序。每次想要编写某些内容时都这样做。因为计算机可以自动完成这项工作。

文章来源:https://dev.to/mak12776/write-codes-that-writes-codes-568
PREV
10 分钟内 CORS、XSS 和 CSRF 示例 CORS XSS CSRF
NEXT
如何在 Android 设备上本地运行 DeepSeek R1