Комментарии 37
CHANGELOG бонусом.
Но зачем?
Скорее для опыта. Для развлечения. Мне оно нравится.
Тогда годно!
Я бы вам рекомендовал обратить внимание то на книгу Эндрю Таненбаума «Operating Systems Design and Implementation» на ее первое издание и на то, как в ней представлен язык Си. И может это описание Си и положить в основу вашего компилятора. Удачи вам.
Простите, вы не поможете выучить данный язык программирования?
Прошу поощения. Возможно, я невнимательно прочёл, но что и во что он "компилирует"? Если это перевод кода, написанного на си, в код на питоне, то почему именно компилятор, а не транслятор?
Оу, я и правда забыл это. Он компилируется в собственный набор инструкций (или проще говоря байткод) который выполняется виртуальной машине
"Но зачем?" - в смысле, зачем именно C?
Что если вместо всем известного C попробовать придумать другой язык, решающий какую-то в принципе иную задачу?
Не A * B, а что-нибудь из статистического анализа, например, или еще что-то довольно специальное, то, что сейчас решается через программирование хотя бы на том же С, а могло бы быть записано на своем языке в несколько операторов?
И вот к нему - компилятор в байткод?
Такую задачу вредно навешивать на единственного разработчика.
Почему нет? )
Если бы тот же Линус Торвальдс начал с подбора команды разработчиков - никакого линукса вообще бы не получилось никогда, завязли бы в согласованиях, утверждениях, бюджетировании, зависли на митингах и признали бы экономически необоснованным и нецелесообразным.
Идея хороша. Осталось придумать и создать.
Посмотрите на старую книжку Р.Берри и Б.Микинза, там и компилятор С есть:
Скрытый текст

Увидев printf, можно понять, что это не Си. Вовсе. gcc это скомпилировать - скомпилирует вполне, но по факту работать не будет так же.
Аж захотелось узнать, как эта реализация факториала
#include <stdio.h>
void
fac(n) {
int
f = 0;
while
(n > 0) { f = f * n; n = n - 1; } }
void
main() {
fac(5);
printf("'factorial of 5: '+str(f)");
}
Смогла выдать
factorial of 5: 120
Там же что ни подставь f будет 0. Либо этот самодельный компилятор умеет распознавать человеческий фактор и корректировать вычисления для соответствия результата ожиданиям, либо при инициализации там всё же f = 1.
Я почитал исходники. Питона не знаю, но что-то попробовал понять.
Лексер нужно улучшать. Во-первых, он принципиально неправильно написан: вы тупо пытаетесь регулярки применять к вводу, из-за чего, встретив, например, "iframe", он выделит "if" как ключевое слово. Правильный способ - конечный автомат, то есть у лексера появляется состояние. Ну и напоследок, вы бы хоть компиляцию регулярок не делали каждый раз, очень уж тормознуто.
С компилятором не понял вот чего: все функции, получается, инлайнятся?
С виртуальной машиной много непоняток. Почему-то FETCH, который у вас для сохранения глобальной переменной на стеке, в случае, если переменная неинициализированна (или тупо опечатка), пушит 0. А STORE наоборот, ругается, если глобальной переменной нет. Я бы сделал наоборот. Не очень понял смысла операции POP, и мне кажется, что она pc недостаточно увеличивает.
Писать компилятор скриптового движка си написанного на скриптовом движке питона, который в свою очередь изначально написан на си - это оригинально. Браво))
Это был смешной стендап.
Использовались ли нейросети при написании кода?
Кажется первые версии компиляторов gcc, RMS писал "одну каску". И ничего...не помер. При чем не с двумя типами данных, а полные.
О том как я писал компилятор Си