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. Чтобы не придумывать ей имя. Маленькая фишка, но ИМХО полезная.

★★★★★

Ответ на: комментарий от pseudo-cat

_всё_ формализуемо

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

pseudo-cat ★★★
()
Ответ на: комментарий от tailgunner

Я как бы намекаю, что ты сказал фразу, достойную К.О

кстати да, извиняюсь, но в данном случае я этого и хотел, т.е. хотел, чтобы, исходя из очевидности моего предположения, был сделан вывод об очевидности (not «Для расчетов, кстати, абстрактное мышление нужно меньше всего»)

pseudo-cat ★★★
()
Ответ на: комментарий от Love5an

> Философия это не наука в принципе.

Правильно. Это метанаука.

Она не руководствуется научным методом.


Не правильно. Руководствуется. Но чтобы его понять, нужно понять хотя бы одну реальную науку - т.е. понять её методологию. И да, для школоты - методология != совокупности методик.

Ну и программирование, разумеется, ни в одном месте не наука. :3

Кстати, для полноты дискуссии и поддержания тонуса подкину дров - математика это тоже не наука. ^^

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

Я просто немного утрировал для легкого эпатажа школьников. Как вижу, провокация вполне себе удалась :-).

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

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

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

Ну да, а математика — это «такая игра, в которую играют по заранее оговоренным правилам» (C). В общем, этакая игрушка для гиков, не имеющая практического применения. Даже для заполнения пауз в разговорах с девушками :-).

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

Осталось только объяснить, почему самые практичные изобретения в программировании сделаны не инженерами, а лингвистами, ага.

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

>В двух словах: C — это унифицированный кроссплатформенный ассемблер (автокод)

Это не идеология.

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

>Математика как раз самая примитивная из всех наук

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

Каким боком математика наукой является? :)

...

Математика - это язык науки.

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

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

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

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

это потому что науки хреновые :)

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

>А что это тогда?

Практика использования, реализация... Ну какой из Си «ассемблер высокого уровня», когда есть реализации с интерпретацией, есть реализации с байткодом, есть трансляторы в другие языки? «Ассемблер низкого уровня» - это конкретная реализация конкретных продуктов. Идеология же - нечто, оторванное от реализации и охватывающее саму концепцию языка. Ну, от балды, LISP - «всё есть список», Форт - «всё есть Форт», Эрланг - «всё есть процесс»...

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

>Таким, что это «особый вид человеческой познавательной деятельности»

Наука, всё же, подразумевает объект изучения :) Это познание реального мира, а не выдуманного. Иначе кастанедовщина какая-нибудь тоже в науку превращается :)

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

Какие это? Перл чтоли? Гыгы.
Ну, называть его «самым практичным изобретением в программировании» это несколько жирновато.

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

>Правильно. Это метанаука.
Метанаука это как раз математика.

Не правильно. Руководствуется. Но чтобы его понять, нужно понять хотя бы одну реальную науку - т.е. понять её методологию. И да, для школоты - методология != совокупности методик.

Бред.

Ну и программирование, разумеется, ни в одном месте не наука.

Это инженерная специальность. А вот computer science уже наука.

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

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

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

> Метанаука это как раз математика.

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

И да, Крон уже провёл ликбез для школоты: http://www.linux.org.ru/jump-message.jsp?msgid=4335258&cid=4348459
Не проугливай. ;)

Бред.


xDD

А вот computer science уже наука.


Наука, изучающая что? Предмет её каков? ;)

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

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

Раскрой тему подробнее...

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

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

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

Си - «всё есть массив байтов».

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

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

Список изобретений - в студию :)

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

> Ну это - вообще проблема лиспа, что он не публикует известную компилятору информацию о типах данных. Хотя, на это есть codewalker-ы, которые умеют эту информацию извлекать.

И где гарантия, что они извлекут то же, что и компилятор?

И волшебная кнопка «свернуть-развернуть текущий файл».

А вот тут мы переходим к тому, что макросы не нужны. «развернуть» это не что иное, как сделать partial evaluation + м.б. еще fine print, хотя...

Вообще насчет макросов — их проблема в том, что они могут быть протестированы на ряде входных данных (т.е. исходного кода), быть там вполне рабочими, и тем не менее на особом исходном коде сгенерить семантически (а то и синтаксически!) некорректный результат.

Те же проблемы у плюсовых шаблонов (хотя кажется в меньшем объеме). И совсем меньше (или даже нет) таких проблем у дженириков явы и си-шарп.

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

>7. Такие вещи, как =, +, -, * - это тоже символы. Поэтому, не a=b, а только a = b. Что оставляет возможность иметь имена идентификаторов типа integer->string или doit!

я согласен с тем, что пробелы значимы, но integer->string это чересчур, хотя и интересно

однако запись

Someclass.(Integer->String) = bla-bla-bla

при условии, что у нас имеется оператор -> перегруженный соответсвтующим образом, является вполне возможной

м.б. стоит иметь возможность писать произвольные идентификаторы как-то чуть по-другому, типа 'integer->string = 7

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

и вообще не понятно, где нужны такие идентификаторы

единственное что приходит в голову — это мемоизированное значение функции, но его лучше писать в виде memoized(f(x))

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

> Я ожидал, что кто-нибудь поможет мне развить алгебру, позволяющую управлять памятью более гибко. Но никто что-то не помог.

преждевременный вывод

а ты сделал хотя бы страничку в вики (или отдельную нить строго на эту тему)

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

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

Это от лиспа математика становится метанаукой? А что же тогда такое метаматематика? Мето-мето-наука??? Рекурсию в лиспе заклинило?

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

Огласите, пожалуйста, список самых практичных изобретений в программировании и их авторов-лингвистов.

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

А что в Си - не массив байтов?

я как-то даже задумался

#include <stdio.h>

void f(void)
{
    printf("F\n");
}

int main(void)
{
    void * b;

    b = (void *)(&f);

    ((void (*)(void))b)();

    return 0;
}
jtootf ★★★★★
()
Ответ на: комментарий от jtootf

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

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

Не понял, что это должно было значить.

что я сходу не смог придумать контраргумент

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

А что в компьютерах не массив байтов? Всё есть массив байтов на диске до включения компьютера, всё в массив байтов на диске превращается после выключения компьютера. Между этими событиями все есмъ массив байтов в памяти и на диске и передаваемый по сети поток байтов.

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

Даже процессы это в ОС массив данных о процессе. И даже лиспы с эрлангами превращаются в итоге в массив байтов инструкций процессора, обрабатывающий массив данных в памяти компьютера.

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

> А что в компьютерах не массив байтов?

В каком компьютере? Эльбрус-[12], какой-нибудь Symbolics?

И даже лиспы с эрлангами превращаются в итоге в массив байтов инструкций процессора

Ну, сделай мне на Эрланге побайтовый дамп какой-нибудь функции.

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

>> Ну, сделай мне на Эрланге побайтовый дамп какой-нибудь функции.

cat /dev/mem

Слив засчитан.

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

Математика всего лишь «находит отдельные применения», а философия в виде гносеологии и логики дает фундамент для всех наук без исключения. Кстати, тут соседи намекают, что математика — это тоже «просто бред в себе», сродни кастанедовщине, ага.

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

Почитай что-нибудь о Хоаре и Хомском. И кстати, не следует путать лингвистику и филологию.

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

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

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

математика — это тоже «просто бред в себе», сродни кастанедовщине

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

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

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

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

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

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