LINUX.ORG.RU

Дарую вам свою гениальную мысль о MetaTXTprog!

 , , ,


1

3

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

И так, для начала нужно выбрать хороший язык для основы, смысл делать велосипед? Раньше хорошим выбором был бы С, на нем как раз базируются многие успешные языки, но так как уже появился и получил популярность С++, у которого возможностей больше, нужно взять его! Можно конечно взять и С, для прототипа...

И так, какие проблемы имеются у С++? Ограниченность, Qt даже пришлось делать свой MOC, поэтому нужна расширяемость! А у кого лучшая расширяемость? Многие борщехлебы скажут что у Lisp'a, но это не так, он ограничен своими списками, а вот Forth нет, он ограничен разве что платформой на которой был запущен.

А какие проблемы есть у Forth? Это очень низкоуровневый язык, еще например в нем нет структур, их можно реализовать самому, но каждый реализует свои структуры которые не совместимы с другими! А даже если совместимы, нельзя улучшить ВСЕ структуры в Forth сразу, добавить им выравнивание к примеру, нужно улучшать каждую библиотеку по отдельности... Ужас.

Как же решить проблему Forth? А она сама решится, так как у нас будет база в виде C++ или C! Надо только дать удобный интерфейс ко всему этому, что бы можно было просто взять и пройти по полям структуры, добавить свои конструкции, юзать свои лексеры-парсеры... Тот же Forth, тольео вместо слов будут функции! Так же нужно обязательно взять идею с «одновременно компилятор и интерпретатор», многие удивятся, а зачем интерпретатор? Все просто, он нужен для расширяемости, что бы во время компиляции использовался код MegaTXTprog, а не какого нибудь препроцессора, как в Rust'овых макросах. Потом уже интерпретатор и всю ненужную среду можно будет выкинуть, главное что бы интерпретируемый код все настроил и расширил во время компиляции... Причем выкидывание нужно сделать опциональным, а вдруг понадобится eval? Его даже не нужно будет как то сложно реализовывать, Forth нам его подарит...

Жду такой язык уже джва года.

Домашнее задание:

  • Реализовать вычисление SEXP выражений на Forth для лучшего понимания сути языка.
  • Поиграться с Factor, попробовать собрать минимальную программу без среды.
  • Узнать что есть у конкурентов https://docs.racket-lang.org/guide/languages.html
Deleted

Ответ на: комментарий от iluha16

машина то поумнее тебя будет

… и поймёт, что на самом деле ты хочешь не слова считать, а увидеть, что их много, поэтому оптимизирует программу, оставив печать константы.

i-rinat ★★★★★
()
Ответ на: комментарий от iluha16

Не забывай, тот компьютер будет умнее тебя. Что бы ты не делал, он умнее. Он и обманывать тебя сможет, причём так, что ты даже не догадаешься. Потому что он умнее.

i-rinat ★★★★★
()
Ответ на: комментарий от iluha16

Ну я не знаю как такие примеры накидать что бы человек сразу проникся, мне кажется не в ту сторону его рассуждения пойдут, надо знать Forth... Но накидать примеры надо конечно. Да.

Deleted
()
Ответ на: комментарий от metaprog

Предложение в этой теме такое чтоб создать текстовый язык, свободный от недостатков.

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

Deleted
()

Как же решить проблему Forth? А она сама решится, так как у нас будет база в виде C++ или C!

В каком виде она будет представлена и что она будет содержать?

Владимир

anonymous
()
Ответ на: комментарий от anonymous

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

Deleted
()
Ответ на: комментарий от anonymous

Можно оставить в run-time если нужен eval, или что то подобное. Но в остальных случаях это по дефолту все должно вырезаться, и даже не отличишь, на ФортоСи это было сделанно, или на обычном Си...

Deleted
()
Ответ на: комментарий от Deleted

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

Deleted
()
Ответ на: комментарий от Deleted

Проще говоря это называется - «генератор кода».
ИМХНО если уже идти этим путем /а LLVM что делает?/, то не плохо бы
обеспечить поддержку некой метадата базы объектов, которые могли бы использовать программисты.
Например работы с векторами, списками, деревьями ... для того, чтобы обеспечить возможность упрощения синтаксиса исходного кода.

PS: Вполне приемлемый путь разработки некоего нового языка программирования.
Но всякую хорошую идею легко и «угробить».

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Генератор кода это что текст генерирует вроде. Я предлагаю что то типа такого:

struct box {
	int x;
	int y;
};

// Добавляем get функции к каждому полю структуры... 
// Эта функция будет существовать только в compile-time
// Но она сгенерирует нам обычные функции
void __compiletime add_getters(CC::Structure *st) {
	// Проходимся по всем полям
	for(int i = 0;i < st->fields_count;i++) {	
		CC::StructField *field = &st->field[i];
		
		// Генерирем имя функции
		char *getter_name = asprintf("%s_get_%s", st->name, field->name);
		
		// Создаем функцию принимающую указатель структуру и возвращающюю поле
		CC::Function *func = CC::Function::create(getter_name, CC::Type::to_pointer(st->type), field->type);
		
		// Помещаем в функцию код... Аналог printf...
		// На самом деле нужно придумать что то нормальное
		// Но это сложно, нужно понимать работу современных компиляторов
		// А у меня этого понимания особо и нету... Но идея языка вроде бы
		// Должна быть ясна
		CC::Function::fill_templatef(func, {{
			return %v->%v;
		}}, st, field);
	}
}

int main() {
	add_getters(struct box);
	
	struct box b = { 10, 20 };
	printf("%d\n", box_get_x(&b)); // 10
}

Deleted
()
Ответ на: комментарий от Deleted

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

Deleted
()
Ответ на: комментарий от Deleted

Код для сложения 2 + 2 в любом языке прост.
Сказал это к тому, что затрудняюсь оценить ваш подход для разработки компилятора в целом.
Об приемлемом для меня подходе сказал выше.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Добавочка.

В ИТ наблюдается «помешательство» на создании «серебрянного компилятора».
ИМХНО компилятор - средство записи алгоритмов.
Но все «забыли» о понятии - проект.
IDE которые сейчас нам приносят «гиганты» - «слезы капали».

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Ну вещи которые можно будет сделать «после» никак нельзя было сделать «до», хотя я видимо просто думаю только о новом. Приведу кстати еще один пример C++Форта.

// Вклиниваемся в лексеры-парсеры
void __custpars print_varlist() {
	// print_varlist(ВЫРЕЗАЕМ ВСЕ ДО ЗАКРЫВАЮЩЕЙСЯ СКОБКИ)
	std::string part = CC::Parser.Cut(')');
	
	// Режем вырезанный кусок на куски 
	for(std::string name : part.split(' ')) {
		
		CC::Variable *v = CC::Variable();
		// Если переменная существует
		if(v->by_name(name)) {
			// Печатаем ее значение
			std::cout << v->value;
		}
	}
}

int main() {
	int x = 10, y = 20, z = 30;
	
	// Выведет 103020
	print_varlist(-- 43 x z %% y  );
}

Deleted
()
Ответ на: комментарий от Deleted

нахрена это всё нужно не пойму. никакого практического применения не вижу. я так понимаю это средства чего то там менять в исходниках в runtime причём прямо скажем говнокодерскими какими то методами. если уж есть желание выжрать побольше памяти и процессорного времени не взять ли джаву с более адекватным reflection API.

iluha16
()
Ответ на: комментарий от iluha16

нахрена это всё нужно не пойму

Что бы делать так:

JSON json = {
	"mojno": {
		"tak": [1,2,3],
		"ponyal?": "a?"
	}
};

я так понимаю это средства чего то там менять в исходниках в runtime причём

Не в исходниках, и не в runtime. Это наоборот очень производительная вещь, без накладных расходов, forth работал на хламье же.

взять ли джаву с более адекватным reflection API

В яве нету геттеров и сеттеров, и сделали kotlin где это добавили, и все сразу туда убежали, а я могу сделать в СиФорте и свой reflection api как в яве, и геттеры сеттеры...

Deleted
()
Ответ на: комментарий от iluha16

а в compile-time есть preprocessor и мне кажется покомпактнее получится чем вот это вот

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

Deleted
()
Ответ на: комментарий от Deleted

А можете привести пример скажем при работе с vector /цикл какой-нибудь, ... /.
Для того, чтобы оценить синтаксис, который «был» и «стал».

Речь об «до» была в смысле - был такой синтаксис, а «после» - теперь можно написать так.

Владимир

anonymous
()
Ответ на: комментарий от Deleted

я нихрена не понял короче, будем считать из-за моего незнания этого вашего forthа. json как раз так и пишется вроде в джава скрипте.

iluha16
()
Ответ на: комментарий от anonymous

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

std::vector<CC::Variable> __custpars __compiletime vec_from_varlist() {
	// print_varlist(ВЫРЕЗАЕМ ВСЕ ДО ЗАКРЫВАЮЩЕЙСЯ СКОБКИ)
	std::string part = CC::Parser.Cut(')');
	
	std::vector<CC::Variable> vars;
	// Режем вырезанный кусок на куски 
	for(std::string name : part.split(' ')) {
		
		CC::Variable v = CC::Variable();
		// Если переменная существует
		if(v.by_name(name)) {
			vars.push_back(v);
		}
	}
	
	return vars;
}

int x = 10, y = 20, z = 30;
std::vector<CC::Variable> vars = vec_from_varlist(x y z);

Deleted
()
Ответ на: комментарий от Deleted

чем расширенный компилтайм отличается от обычного? ты хочешь расширить возможности препроцессора?

iluha16
()
Ответ на: комментарий от Deleted

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

какое-то жонглирование понятиями. сам то понял что сказал?

anonymous
()
Ответ на: комментарий от iluha16

В JavaScript, а можно будет такое сделать и в С, не изменяя компиляторов, просто написав свою функцию как тут Дарую вам свою гениальную мысль о MetaTXTprog! (комментарий)

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

Deleted
()
Ответ на: комментарий от Deleted

В яве нету геттеров и сеттеров, и сделали kotlin где это добавили, и все сразу туда убежали, а я могу сделать в СиФорте и свой reflection api как в яве, и геттеры сеттеры...

Это пока только рассуждения или ...?

PS: Название СиФорт - крайне не удачно /не нужно «дразнить программистов»/.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Это пока только рассуждения или ...?

Ну это определенно можно будет сделать, так как это можно сделать в Forth, а у меня тот же Forth, только уровень поднят до абстркций С, а не просто куска памяти.

PS: Название СиФорт - крайне не удачно /не нужно «дразнить программистов»/.

Забыл что есть название MetaTXTprog!

Deleted
()
Ответ на: комментарий от Deleted

зачем вообще в C писать JSON напрямую в исходники? не лучше ли читать его из отдельного файла в runtime? таким образом считаю идея не имеет практического применения, чисто поиграться.

iluha16
()
Ответ на: комментарий от Deleted

Забыл что есть название MetaTXTprog!

Хуже не придумаешь /вы же не враг своей идеи?/.

Владимир

anonymous
()
Ответ на: комментарий от Deleted

Да, а еще выше тебе написали про рефлексию и интроспекцию. Если можешь их добавить - иди добавляй, это тебе не на форуме трепаться.

anonymous
()
Ответ на: комментарий от iluha16

зачем вообще в C писать JSON напрямую в исходники?

Ну получать значение из json. Это же просто пример. С помощью этого можно добавлять новые синтаксические конструкции! Зачем это нужно говорить не буду, не можешь придумать зачем надо - ок.

Но можно к примеру получить значение элементов enum'a все, перебрать их, и получить именна в виде строк, это реальная задача, в гугле пишут какие то питоноскрипты, а если чуть усложить? Там вообще ад начинается, а MetaTXTprog это упростит...

Deleted
()
Ответ на: комментарий от anonymous

Зачем эта примитивщина? Я хочу современный юзабельный форт скрещенный с С, там уже возможностей завались.

это тебе не на форуме трепаться

Может кто то захочет реализовать сам, но у меня плохо с объяснением, так что тема провалилась.

Deleted
()
Ответ на: комментарий от Deleted

Может кто то захочет реализовать сам, но у меня плохо с объяснением, так что тема провалилась.

Выше вы упомянули Kotlin и об его триумфе.
Может быть а-ля СKotlin и имел бы успех ...

Владимир

anonymous
()
Ответ на: комментарий от Deleted

ну так скриптовщина хороша для манипулирования текстом, в данном случае текстом программы.

Мимо C++ и так каждый второй не может пройти не бросив в него какашку а ты ещё собираешься всё усложнить какими то новыми синтаксисами которые всем будет лень учить для того что бы прочитать чей то код.

iluha16
()
Ответ на: комментарий от anonymous

Добавочка.

На форумах часто говорят - «Сделал бы это за две недели.» /вариации на тему/.
«А воз и ныне там».

Владимир

anonymous
()
Ответ на: комментарий от iluha16

ну так скриптовщина хороша для манипулирования текстом, в данном случае текстом программы

Приходится писать кода слишком много лишнего, еще скрипты ограниченны сильно.

Мимо C++ и так каждый второй не может пройти не бросив в него какашку а ты ещё собираешься всё усложнить какими то новыми синтаксисами которые всем будет лень учить для того что бы прочитать чей то код.

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

Deleted
()
Ответ на: комментарий от Deleted

Я хочу современный юзабельный форт скрещенный с С, там уже возможностей завались.

Ты похож на школьника, который не знает о чем говорит, но говорит смело: «да! возможностей завались! кококо! не можете придумать применения сами? да вы же просто не видите.»

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

Может кто то захочет реализовать сам

Что-то мне подсказывает, людям которые это могут реализовать не нужны гениальные идеи с лора.

anonymous
()
Ответ на: комментарий от anonymous

не можете придумать применения сами? да вы же просто не видите.

Я уже назвал применение. Вот Iron_Bug считает что С++11 вообще ненужон, и нету применению его фичам, все, закапывайте стандарты, их сделали школьники. У тебя аргументы какие то есть?

Deleted
()
Ответ на: комментарий от Deleted

Я уже назвал применение.

Я про применение которое я не могу сделать через шланг+питон или через препроцессор или через темплеты (да, то еще говно, но все же). МБ твой подход будет где-то лучше, но есть мнение, что все-таки нет.

anonymous
()
Ответ на: комментарий от anonymous

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

Deleted
()
Ответ на: комментарий от Deleted

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

iluha16
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.