Рубрики
Без рубрики

Записать код, который записывает код

Мы всегда пишем коды пальцами, мы всегда набираем на наших клавиатурах, и мы работаем часами и часами … Tagged с помощью программирования, Python, c.

Мы всегда пишем коды своими пальцами, мы всегда набираем на наших клавиатурах, и мы работаем в рабочем месте для создания компьютерных программ.

Но вещи, которые мы пишем, могут быть написаны компьютером. И в настоящее время языки программирования, такие как C , C ++ , Python В Java , … на последнем этапе компиляции будет переведен в коды машинного байта, а это означает Программы, которые пишут коды Анкет

Но это не должно быть конец. Мы должны писать программы, которые могут писать коды на других языках программирования, таких как C , C ++ , Python , Java , Ruby или что -то еще.

Возможно, это будет новый язык программирования или некоторые структуры, которые изменяют структуру кода или процессор по потоку текста, которые переводят текст на что -то другое.

Я покажу вам простой пример для каждого предмета, который я упоминал, но это не единственный способ сделать это.

новый язык программирования

В то время мы всегда слышим о новых языках программирования, которые обеспечивают набор функций и подчиняются философии дизайна, но большинство из них всегда копируют другие принципы языка программирования, и их нельзя использовать для повседневных случаев использования. Но если мы забудем их и попытаемся создать новый язык программирования с нулевой основы с нашим творчеством, это принесет нам целые новые идеи для достижения наших целей.

Например, думайте, что вы хотите сделать простой текстовый редактор, язык программирования для этой цели может быть чем -то вроде этого:

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 

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”