ФлеймФорумПрограммирование

А что если сделать свою мини-среду программирования с компилятором?

Страницы: 1 2 38 9 Следующая »
#0
14:57, 14 фев 2012

Я уже не в первый раз задумываюсь о такой возможности, идея заключается в следующем:
1. Используем укороченный набор инструкций процессора. Для этого смотрим классические конструкции опкодов, используемые в основных классических конструкциях циклов, арифметики и т.д. Выбираем наиболее оптимизированные варианты, следим какие использовать регистры, а дальше используем как шаблон и не паримся. Генерация опкодов и наполнение секций EXE-файла - не такое уж и сложное занятие, этим я когда-то попробовал побаловаться: http://tmtlib.narod.ru/files/peasm-0.3beta.zip

2. Делаем вывод формы не классическими средствами, а с помощью BitBlt. Т.е. как у Blender, но даже без OpenGL. Реализуем основные элементы: поле для ввода, кнопку, список, может ещё чего. (Никто не мешает потом на основе самого языка выводить "костыли" с помощью BitBlt: ползунки и т.д.).

3. Ограничиваем разнообразие типов. Пусть это будет 32-bit integer, 32-bit float и string. Соответственно, уменьшаем количество опкодовых шаблонов по преобразованию типов и всяких конструкций.

Как программа дорастёт до приличного уровня, переписываем IDE на свой язык и компилируем. IDE типа как у "Delphi 1" (погуглите картинку). По идее на этом хозяйстве можно будет делать 3D демки в софтваре и прочую мелочь. Стандартные конструкции можно вытаскивать в дизассемблере из кода, генерируемого Delphi или C++, переделывать в свои опкодовые шаблоны, подгоняя регистры и стек в нужном направлении. Как вам идейка?

p.s. Есть ощущение, что нечто подобное уже реализовано, но возможно на экзотической платформе и т.д.

#1
15:01, 14 фев 2012

А в чем преимущество перед "серьезной" IDE?

#2
15:02, 14 фев 2012

Работы много, смысла - мало.

#3
15:03, 14 фев 2012

tmtlib
Ты тоже скриптами и своими языками решил увлечься?
Тогда Форт что ли.

Я вот тоже свой язык лабаю, пока архитектуру пытаюсь пооптимальнее сделать. Хочу свести интерпретатор к тупому

for i := Low(P) to High(P) do P[i]();

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

т.е. вместо

a := f(b);

писать

with f(b) do begin
  a:=res_a;
  b:=res_b;
end;
#4
15:04, 14 фев 2012

Начинаем...

COMPILER gmaker

CHARACTERS

  letter="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_".
  digit="0123456789".
  cr="\r".
  lf="\n".
  tab="\t".
  ws=" ".

TOKENS

  IDENT = letter {letter | digit}.
  INT = digit {digit}.

COMMENTS FROM "#" TO cr lf

IGNORE cr + lf + tab + ws

PRODUCTIONS

gmaker = {stmt} EOF.

/*
stmt =

...
Здесь нужно написать что-то ещё,... что-то загадочное и шибко заумное.
*/

END gmaker.

правка:

Ну и с кодогенерацией особо возиться смысла нет (если только для спортивного интереса), - LLVM позволяет делать все проще (плюс лёгкий интерфейс к Си либам и очень неслабые возможности оптимизации сгенерированного кода).

#5
15:42, 14 фев 2012

Я же тоже хочу написать свой простенький язык и простенькую ide :) Желаю автору удачи :)

Кстати, мне осталось реализовать аргументы функции, ее вызов и пару управляющих конструкций :)

А в идеале, переписать компилятор на сишку, а то он у меня, внимание, на гейм мейкере.

TarasB
Можно увидеть оп-коды твоей ВМ? У меня их сейчас около 30, из специфичных, пожалуй, только 3 из них, предназначеных для работы с стеком локальных переменных (классная кстати, штука получилась)

#6
15:57, 14 фев 2012

"Свое", "родное" и пахнет приятней и в унитазе не тонет.

#7
16:01, 14 фев 2012

Bizunow
> Можно увидеть оп-коды твоей ВМ?

У меня нет опкодов.
У меня есть массив процедур, которые вызываются одна за другой.
Процедуры принимают параметр на одну структуру, с которой они работают.
Структура может содержать в качестве члена указатель на массив ещё таких же процедур - это для ветвлений удобно.

#8
16:05, 14 фев 2012

Тьфу блин, как я это то
упустил. Ладно, не буду оффтопить.

#9
16:25, 14 фев 2012

http://colinm.org/language_checklist.html

#10
16:31, 14 фев 2012

Chipmunk
> http://colinm.org/language_checklist.html

И что? Теперь и своих языков писать нельзя? Может и игры писать не стоит, - полно же больших и сверхопытных команд, которые сделают это лучше?

#11
16:34, 14 фев 2012

0iStalker
это описание к какому тулу?
flex/bison?

#12
16:43, 14 фев 2012

Pushkoff
> flex/bison?

COCO/R, - оно генерит исходник с рекурсивным спуском по LL1.  Собственно, можно и Bison, но там (с его LALR1) надо извращаться описывать продукции строго через рекурсию, а тут для парсера можно использовать правила, как в лексере.  Ну и извратов с интеграцией именно в С++ намного меньше, с чем у Bison'а и Antlr - беда.

#13
17:00, 14 фев 2012

0iStalker
посмотри на r2c/lemon(LARL), говорят они генерят самый быстрый код парсера и довольно просты
правда у r2c есть проблема, в потоке должен быть терминальный символ, по которому заканчивается парсинг, длинну буфера он не понимает.
а лемон хорош тем что токены ему скармливаются по одному, но он генерит исходник на С и файл с дефайнами для токенов, что очень неудобно заворачивать в неймспейс.

#14
0:38, 15 фев 2012

tmtlib
ну, у меня в мечтах тоже подобная идея есть. и всё было бы ничего, если бы не одно НО:
оно называется interoperability с сишным и плюсовым кодом, потому что куча нужных библиотек написана на С/С++.

и тут появляется две возможности:
1. писать под всё врапперы. упаришся писать на самом деле. библиотек много, а рук всего две.
2. делать утилиту для автоматического импорта, чтобы умела парсить сишные хэдеры (макросы это одна беда, а вот плюсовые шаблоны это уже не шутка).

получается единственная полезная вещь (которая имеет возможность быть сама по себе) - скриптовый язык и биндинги к движку.

Страницы: 1 2 38 9 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.