Мы всегда пишем коды своими пальцами, мы всегда набираем на наших клавиатурах, и мы работаем в рабочем месте для создания компьютерных программ.
Но вещи, которые мы пишем, могут быть написаны компьютером. И в настоящее время языки программирования, такие как 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:
#includestruct 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”