Как стать автором
Обновить

Комментарии 37

Скорее для опыта. Для развлечения. Мне оно нравится.

Тогда годно!

Я бы вам рекомендовал обратить внимание то на книгу Эндрю Таненбаума «Operating Systems Design and Implementation» на ее первое издание и на то, как в ней представлен язык Си. И может это описание Си и положить в основу вашего компилятора. Удачи вам.

Спасибо вам. Буду читать.

Простите, вы не поможете выучить данный язык программирования?

Прошу поощения. Возможно, я невнимательно прочёл, но что и во что он "компилирует"? Если это перевод кода, написанного на си, в код на питоне, то почему именно компилятор, а не транслятор?

Оу, я и правда забыл это. Он компилируется в собственный набор инструкций (или проще говоря байткод) который выполняется виртуальной машине

созданной тоже мной (для понимания)

У нас тоже есть подобный проект, я разрабатываю свою ISA с эмулятором и ассемблером, а один чувак в нашей команде пишет компилятор ANSI C для него.

Это надо бы добавить в статью.

Добавил

"Но зачем?" - в смысле, зачем именно C?

Что если вместо всем известного C попробовать придумать другой язык, решающий какую-то в принципе иную задачу?

Не A * B, а что-нибудь из статистического анализа, например, или еще что-то довольно специальное, то, что сейчас решается через программирование хотя бы на том же С, а могло бы быть записано на своем языке в несколько операторов?

И вот к нему - компилятор в байткод?

Такую задачу вредно навешивать на единственного разработчика.

Почему нет? )

Если бы тот же Линус Торвальдс начал с подбора команды разработчиков - никакого линукса вообще бы не получилось никогда, завязли бы в согласованиях, утверждениях, бюджетировании, зависли на митингах и признали бы экономически необоснованным и нецелесообразным.

Тогда, всю эту дичь ещё не придумали, до такой степени.

Идея хороша. Осталось придумать и создать.

Посмотрите на старую книжку Р.Берри и Б.Микинза, там и компилятор С есть:

Скрытый текст

Ок

Увидев printf, можно понять, что это не Си. Вовсе. gcc это скомпилировать - скомпилирует вполне, но по факту работать не будет так же.

printf - это как раз самый не на есть C без всяких плюсов.

Там от printf только название.

Разверните вашу мысль пжлста.

Автор туда засунул питоновые строки, а не сишные

Аж захотелось узнать, как эта реализация факториала

#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 писал "одну каску". И ничего...не помер. При чем не с двумя типами данных, а полные.

Раскрою секрет: мне лень было добавлять double, float

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации