LINUX.ORG.RU

новый язык. Еще один подход.


0

0

Доброго времени суток!

Давненько я здесь не флудил. Короче, ещё одно видение нового мегаязыка.
Известно, что паскаль компилируется в несколько раз быстрее, чем С. Поэтому, подход к созданию динамического языка через промежуточный компилятор Паскаля выглядит более здравым, чем подобный же подход через промежуточный компилятор С. Однако, сложилось так, что «всё» написано на С. Значит, мораль-то в чём?

1. Вычленяем в С то, что заставляет его медленно компилировать.
2. Делаем частичный компилятор С в язык, подобный Паскалю (который можно быстро компилировать).
По моим понятиям, что мешает С быстро компилироваться (могу ошибаться):
- система типов
Значит, нужен промежуточный язык, в котором неявное становится явным.
- идеология сборки с многократным чтением инклюдников
Значит, нужно поменять идеологию сборки. Я думаю, нужно уметь создавать некий «модуль», подобный «прекомпилированному хедеру», но более гибкий. С gcc я почти не работал, в MSVS прекомпилированный хидер - один на проект и этого мало. Нужно несколько. Они должны инкапсулировать состояние препроцессора и перекомпилироваться только по необходимости.

Тем самым мы получаем в наследство всё, что есть в С, только с быстрой сборкой.
Далее добавляем:
- нормальные макросы (включая обратимые макросы, возможность подменить лексеры и включая средства отслеживания сорсов)
- возможность делать код динамическим, т.е. динамически перекомпилировать отдельные функции и менять типы данных. Не все, но большинство.
- специальные переменные, локальные функции, замыкания
- встроенный тип «вариант» и полноценный полиморфизм
- декларативное управление памятью. Работая в лиспе, я чётко понимаю, что он мало подходит для задач реального времени. Я не думаю, что языки со сборкой мусора когда-нибудь смогут использоваться для этого. Да, можно извратиться и иногда накрутить много циклов без сборки мусора, но программирование становится очень сложным. Кроме того, ничего не декларируется о неожиданном порождении мусора в библиотеках или даже в самой рантайм-среде (например, если вдруг запустится JIT-компилятор). Поэтому, предлагается поддерживать на уровне компилятора всякие «умные указатели», чтобы можно было в статике проверить правильность работы с памятью.Конечно, вообще говоря эта задача не разрешима. Но представьте себе, например, сигнатуру функции:

fresh treeNode makeTreeNod(alien referenced treeNode parent);

Здесь говорится о том, что функция возвращает treeNode, выделенный в куче. Значит, кто-то в будущем должен будет позаботиться о его уничтожении (если мы не находимся в режиме компиляции с автоматической сборкой мусора, что может быть нужно для отладки или гарантии динамизма). При этом параметр parent также является ссылкой. alien говорит о том, что этот параметр не будет уничтожен нашей функцией. referenced говорит о том, что мы, возможно, создадим на него новую ссылку. Как минимум, это - автодокументация. Как максимум - подсказка компилятору. Я для своего пользования разработал несколько таких деклараций и пользуюсь ими на работе (пишу на Дельфи). Мой набор неполон, но вот он:

onStack - это вызов функции, которая гарантирует очистку объекта по выходе из кадра стеков. Поскольку это Дельфи, приходится использовать на стеке переменную variant, храняющую интерфейс (она автоматически освобождается при выходе из кадра стека, а на неё уже вешается всё остальное). При выходе из кадра вариант уничтожается (число ссылок равно нулю) и в деструкторе объекта происходит удаление объектов. В С++ это делается размещением экземпляра класса на стеке, хотя по-моему, в общем случае в С++ это тоже не так просто.

fresh - для возвращаемого значения или локальной переменной. Создали в области видимости и куда-то передаём (или возвращаем), после чего мы уже не отвечаем за удаление
my - для локальной переменной. Функция создаёт объект и удаляет его
alien - для параметра. Функция не берёт ответственности за удаление объекта.
eat - для параметра. Принимающая функция теперь отвечает за удаление
kill - для параметра функции. Не я создал, но я убъю до возврата из функции.
нет декларации - ничего не известно и нельзя судить о поведении функции в отношении удаления этого объекта.

Вот, видимо, этот набор не полон. Он, как минимум, не учитывает возможности включения объекта в подсчёт ссылок или сборку мусора, не рассматривает возможность существования объекта на стеке. Видимо, можно развить некую «алгебру» и получить полный набор таких деклараций. Он будет довольно сложным и не всегда однозначным, но он позволит, анализируя возможные пути исполнения, во многих случаях найти ошибки работы с памятью. Подобно тому, как сейчас компиляторы находят неинициализированные переменные, или неиспользованные присваивания значений.

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

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

/*М fresh*/treeNode makeTreeNod(/*M alien referenced*/ treeNode parent);
по сути означает то же самое, но не проверяется компилятором. Или же

typedef treeNode fresh_treeNode;

или же
#define FRESH(x) x
#define ALIEN(x) x

FRESH(treeNode) makeTreeNode(FRESH(ALIEN(treeNode)) parent);

Я пользуюсь, мне нравится.

А, вот ещё одну фишку вспомнил, только не могу её сформулировать в виде С.
declare procedure foo returns (x int, y varchar(100)) as
begin
end
соответственно, foo.return_type должно быть именем записи с двумя полями x и y. Чтобы не придумывать ей имя. Маленькая фишка, но ИМХО полезная.

★★★★★

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

> Ещё раз, у человека уже есть высокая зп без использования лиспа, близкая к потолку в своей области, и только тогда он уже возможно начинает смотреть на лисп.

Потолка практически нет. И до уровня сильно выше среднего доходят как правило люди уровня сильно выше среднего. Для этого им нужно знать сильно больше среднего, в том числе и фундаментальщины всякой. Лисп фундаментален, и его надо знать хотя бы для того, чтобы иметь возможность прочитать Чейтина.

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

> Думаю, это характерно для любого идеологически продуманного подхода.

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

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

> Но обойтись совсем без классов невозможно - на них весь ввод/вывод (как минимум).
О чём ты? Я читал исходники ридеров ССL и SBCL - там нет CLOS, всё на структурах. Печать использует CLOS только тогда, когда для типа определён метод print-object. И то не всегда. Например, я пытался определить print-object для символа - это работает не во всех реализациях. Чтение вообще свободно от CLOS-зависимости (в CCL точно).

Они тоже могут «наследоваться» - подозреваю

Мне кажется, что в структурах всё нормально со скоростью. Кстати, может быть, да, вредны именно слоты в CLOS-классах. ПОследнее время потихоньку начинаю использовать дженерики, а вместо классов - структуры. Но меня в дженериках добивает congruent lambda lists.

Кто может посоветовать какой-нибудь простой компилятор/транслятор для экспериментов? Требования:
- компактность, желательно, чтобы код уложился хотя бы в 300-400 кБ
- может порождать на выходе какой-нибудь язык низкого уровня (наверное, С) или быть интерпретатором

Касаемо макр. Самые интересные макры - это обратимые макры, которые можно как расширять, так и «сжимать», напуская на исходный текст специальную распозновалку. А типы - это уже вторично. Хотя, может, я что-то не догоняю.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

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

den73 ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

Каков процент полиглотов среди выдающихся писателей? Каков процент выдающихся писателей среди полиглотов?

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

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

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

Не судите по себе.
Понятная аналогия:

Если человека, познавшего Машу, стало тошнить от других дам, то это не значит, что всех познавших Машу стало тошнить от других дам. Возможно их стало тошнить от Маши.

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

> Каков процент полиглотов среди выдающихся писателей? Каков процент выдающихся писателей среди полиглотов?

Возьми и посчитай.

Интересно узнать, как знания дополнительных иностранных языков влияют на литературные способности


Ну почитай спец. литературу. Филилоги из своей профессии сакральной тайны для избранных не делают.

и доходы от писателькой деятельности.


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

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

Ты переоцениваешь роль своей скоромной персоны в моей аргументации. Если ты ничего, кроме себя любимого, не увидел - я бессилен тебе помочь.

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

Тогда следующий вопрос:
простейший транслятор какого-нибудь язычка в С, написанный на лиспе. Язычок может быть основан на s-exp -ах. Какого-нибудь примитивного подможества лиспа, желательно, со статической типизацией.

Килобайт на 10-30.

den73 ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

>Возьми и посчитай.

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

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

Это лисперы заявляют, что их зарплата на порядки больше, чем у не лисперов благодаря знанию лиспа.

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

>Я читал исходники ридеров ССL и SBCL - там нет CLOS, всё на структурах.

Угу, это я прогнал :)

Мне кажется, что в структурах всё нормально со скоростью.


Надо тестить, но судя по всему - да, побыстрее чем с классами.

ПОследнее время потихоньку начинаю использовать дженерики, а вместо классов - структуры.


По мне - тоже надо потестить. Подозреваю, что дженерики просядут на структурах не хуже чем на классах.

Самые интересные макры - это обратимые макры, которые можно как расширять, так и «сжимать», напуская на исходный текст специальную распозновалку.


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

А типы - это уже вторично. Хотя, может, я что-то не догоняю.


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

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

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

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

Это лисперы заявляют


Ну и пусть себе заявляют, я тот тут при чем?

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

Аргументация у Вас выше всяких похвал! Я знаю, почему я именно так считаю, но никому не скажу.
Также Вы статистику (в данном случае по писателям) заменяете своими тайными знаниями и выводами из них по индукции. Это тоже очень интересный подход. Вы удивительный собеседник.

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

> Также Вы статистику (в данном случае по писателям)

Я по-русски написал «индукция». Какая еще «статистика»? Ты читать не умеешь?

заменяете своими тайными знаниями


Взятыми мною из открытых источников. Что мешает тебе их взять? Ах, да, я забыл - ты же читать не умеешь...

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

Я по русски спросил про проценты писателей. То есть тупую статистику, а не твои «индукции» по открытым источникам. Читать научить сначала, а потом уже переходи к индукциям там, где нужна просто статистика.

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

Никакой связи нет между литературными способностями и знанием иностранных языков и других инструментов писателей.
Никакой связи нет между программными способностями и знанием программных языков и других инструментов программеров.
Так что «индукция» твоя хреново работает.

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

>А ты индукцией не пользуешься вообще, только статистикой?

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

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

Ох, лол. «Невнятные рассуждения» про индукцию - это сильно. Прости, анон, и в третий раз - я бессилен тебе помочь.

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

Твои знания с рассуждениями (которые ты не привел) являются репрезентативной выборкой? Или твоя логика может нерепрезентативную выборку превратить репрезентативную?

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

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

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

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

Ну это - вообще проблема лиспа, что он не публикует известную компилятору информацию о типах данных. Хотя, на это есть codewalker-ы, которые умеют эту информацию извлекать. В общем-то, их можно считать аналогами парсеров в обычных языках. Например, iterate и screamer написаны на codewalker-е. Компилятор тоже начинает свою работу с codewalker-а. Хорошо тут то, что тебе не нужно писать codewalker целиком, а нужно лишь написать обработки отдельных ситуаций. Я, кстати, думаю, что если посмотреть в дебри SBCL, то там наверняка можно увидеть нестандартные compiler-макры, которые умеют читать эти декларации.

хотя в данном случае я не совсем догоняю - зачем

Затем, чтобы выделять из ЧУЖОГО кода устойчивые паттерны (хотя я тут скорее не уверен, что это получится). И для того, чтобы рефакторить свой код, вводя новые макры. Или применять макросы в тех языках, где их нет. Пример для Delphi:

В свёрнутом виде:

unless(a)
blahBlahBlah;


В развёрнутом виде:
{macro unless(a)}if not a then{endmacro}
blahBlahBlah;

И волшебная кнопка «свернуть-развернуть текущий файл».
Я не скажу, что я пользуюсь таким макропроцессором, но, возможно, попробую. Кстати, Дельфи стал настолько хорош последнее время, что такой острой нужды в макрах, как раньше, я уже не испытываю. Ну и плюс методология построения приложения - data driven calculations и всё такое.

den73 ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

> Ну у лисперов песец самомнение.

А так же хаскеляторов, эрлангеров, фортеров :)

а вот и неправда

jtootf ★★★★★
()
Ответ на: комментарий от den73

>какой-нибудь простой компилятор/транслятор для экспериментов? ...может порождать на выходе какой-нибудь язык низкого уровня (наверное, С) или быть интерпретатором

Euphoria - скоростной интерпретатор, транслятор с Euphoria на C. http://www.rapideuphoria.com/russian/index_r.htm (бесплатный, с открытым кодом)

компактность

1.3 Mb .tar-файл

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

А можно узнать, чего такого особенного в этой эйфории? Я начал читать описание, но не понял, в чём фишка. 1.3 Мб - наверное, tgz - это много. В общем, я нашёл пару простейших интерпретаторов, каждый - экранов на 5.

den73 ★★★★★
() автор топика
Ответ на: комментарий от alg0rythm

Ну, в общем, я посмотрел, наверное, тяжеловато. Меня просили proof-of-concept, а тут полновесный язык. Хотя что-то я устал уже от этой темы. Я ожидал, что кто-нибудь поможет мне развить алгебру, позволяющую управлять памятью более гибко. Но никто что-то не помог.

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

Это для аналогии. Изучение нового концептуального языка сравнимо с чтением толковой книжки, скажем по философии :]

vasily_pupkin ★★★★★
()

> Вычленяем в С то, что заставляет его медленно компилировать.

C-- [cmm] предназначался как раз для этого.

идеологя сборки с многократным чтением инклюдников

В Plan 9 этого нет. Это исключительно вопрос стиля программирования. Идея в том, что никакой .h-файл не использует #include. В результате все #include находятся в .c-файлах. А для того, чтобы программист включил все заголовки, которые .h-файл включал до этого сам, в man есть секция «SYNOPSIS». Соответственно трюков с #ifdef нет, так как проконтролировать отсутствие дублей в одном .c-файле довольно просто. В [pikestyle] подобная идея также описана.

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

[cmm]: http://www.cminusminus.org/ [pikestyle]: http://doc.cat-v.org/bell_labs/pikestyle

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

> для того, чтобы программист включил все заголовки, которые .h-файл включал до этого сам, в man есть секция «SYNOPSIS».

Чего бы ему самому всё содержимое файлов руками не напечатать? А чо? Он ведь программист... И инклюдить ничего не нужно.

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

Все же это лучше, чем #ifdef. В [pikestyle] ясно написано, почему. Да и в SYNOPSIS требуемые включения довольно очевидны: ясно, что парсеру нужен string.h и т.п.

Нормальные прекомпилированные заголовки вообще невозможны, так как результат компиляции зависит от окружения, то есть при включении из разных файлов он может быть разным. К тому же началом файла .h может быть конец выражения, начало которого находится в предыдущем файле. Так что для C лучшего варианта, чем тот, который используется в Plan 9, нет. Для того, чтобы компилировать интерфейсы в бинарный вид, нужен либо язык с полноценными модулями (Go, например).

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

> нужен либо язык

нужен язык

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

> Чего бы ему самому всё содержимое файлов руками не напечатать?

Во-первых для того, чтобы не повторять одно и то же в различных исходниках. А #include уже не настолько уникальны, как прототипы и макросы, так что они будут повторяться реже. В большинстве случаев они уже включены и без этого.

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

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

Ты представляешь, какие объемы инклудов будут в реальном коде, если запретить инклуды из инклудов? В том же ведре, например?

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

LamerOk ★★★★★
()
Ответ на: комментарий от KRoN73

А я работал на одной платформе с Фортом на 9 килобайт и Лиспом на 6 килобайт. Причем во втором была сборка мусора, а в первом не было даже кучи.

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

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

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

Немцы говорят: сколько языков ты знаешь, столько раз ты человек. А ярким примером преимущества полиглотов в писательской деятельности могут быть Пушкин и Лермонтов — знание иностранных языков позволило им безнаказанно тырить темы у Байрона и Гете.

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

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

eugine_kosenko ★★★
()

> С gcc я почти не работал, в MSVS прекомпилированный хидер - один на проект и этого мало

ламо

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

> Каков процент полиглотов среди выдающихся писателей? Каков процент выдающихся писателей среди полиглотов?

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

это что? заказ реферата? сколько платите?

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

> Никакой связи нет между литературными способностями и знанием иностранных языков и других инструментов писателей. Никакой связи нет между программными способностями и знанием программных языков и других инструментов программеров.

докажешь?

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