CTFE

Nov. 4th, 2014 03:36 pm
thedeemon: (office)
[personal profile] thedeemon
Jonathan Blow, автор игрушки Braid, замутил на ютюбе сперва пару выступлений о том, как ему осточертел С++ и не видно годных альтернатив для написания игрушек, и как было бы круто сделать свой язык для этих целей с блекджеком и т.д., а на днях уже раз и показал демку вырисовывающегося язычка. Работающий компилятор (пока что через генерацию Си, но это временно), работающие примеры. Пока что там почти ничего нет (ни объектов в том или ином виде, ни генериков), код примерно на уровне Go без GC, зато есть прикольная киллер-фича: весь язык целиком доступен в компайл-тайме (для этих целей сделана генерация байткода и его исполнение компилятором). Надо сделать безопасный printf? Сказал компилятору, что все вызовы printf проверяются вот этой функцией, а она проверяет соответствие агрументов форматной строке, отрабатывая в компайл-тайме. Надо проверить, что все переданные в функцию строки одной длины? Аналогично. Говорит, чем городить суперсложную систему типов, которая бы пыталась проверять такие инварианты, проще позволить проверять их кодом на том же языке, а систему типов оставить простой (ну, генериков добавить, конечно). Показал демку - простая игрушка на OpenGL со стрельбой по пришельцам. Потом ставит в коде строчку вроде

#assert( #run invaders() >= 10, "need to kill 10 invaders for this to compile")

запускает компилятор, вдруг открывается окошко и запускается игра. Если убьешь 10 пришельцев - скомпилируется успешно, нет - ошибка компиляции. :) Развлекуха.

В D тоже есть похожий compile time function execution, но все ж более ограниченный, некоторые вещи там недоступны и OpenGL не повызываешь.

Date: 2014-11-05 04:34 pm (UTC)
From: [identity profile] sober-space.livejournal.com
Вот у меня как раз такая идея была - go без рантайма и со встроенным языком доступным во время компиляции. Но как всегда кто-то воплотил это вместо меня :D

Date: 2014-11-05 07:19 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
А чем именно планировалось заменить GC?

Date: 2014-11-05 07:22 pm (UTC)
From: [identity profile] sober-space.livejournal.com
defer memory.free()

:)

Это в терминах go defer

Date: 2014-11-05 07:54 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Кстати, Blow в своей демке показал работающий defer, тоже его сделал. Но он там не столько для памяти, сколько для более толстых ресурсов. Для памяти у него планировались владеющие указатели, не знаю, работают ли уже.

Date: 2014-11-05 07:56 pm (UTC)
From: [identity profile] sober-space.livejournal.com
Я старый C-программер, и утечки памяти не особо меня беспокоят :) Особенно если есть такая роскошь как defer.

Но владеющие указатели тоже можно.

Date: 2014-11-05 07:28 pm (UTC)
From: [identity profile] sober-space.livejournal.com
Но это в сочетании с еще одной идеей, которую я пока не встречал в известных мне языках - совмещенный конструктор/деструктор

codestructor MyType(x, y, ...) {
//здесь конструируем результат
...

//директива lifecycle
lifecycle;

//здесь код деструктора
...
}

Компилятор автоматически разделял бы это на конструктор и деструктор, используя lifecycle как разделитель. Тогда defer'ы размещенные в начале "кодеструктора" выполнялись бы в реальном деструкторе.

Date: 2014-11-05 07:44 pm (UTC)
From: [personal profile] zaharchenko
что-то не пойму, в чем lifecycle; отличается от:
"
};
__dectructor(){
"

???

Date: 2014-11-05 07:44 pm (UTC)
From: [identity profile] sober-space.livejournal.com
defer'ом
И общими переменными
Edited Date: 2014-11-05 07:45 pm (UTC)

Date: 2014-11-05 07:51 pm (UTC)
From: [personal profile] zaharchenko
Ничего не понимаю:-)
Что дадут общие переменные у конструктора и деструктора, в плане отказа от GC и чем не угодили свойства объекта? И что вы дефером называете?

Date: 2014-11-05 07:54 pm (UTC)
From: [identity profile] sober-space.livejournal.com
Лень рассказывать, извините.

А defer - это go defer: habrahabr.ru/post/118898/

Date: 2014-11-05 08:01 pm (UTC)
From: [personal profile] zaharchenko
Да что вы, за ссылку спасибо, сразу идея понятнее стала :-)

Date: 2014-11-05 07:57 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Занятно. Но ведь общим переменным придется неявно стать полями объекта, чтобы дожить до деконструкции?

Date: 2014-11-05 07:59 pm (UTC)
From: [identity profile] sober-space.livejournal.com
Ну да, типа деструктор-замыкание.

Date: 2014-11-05 07:44 pm (UTC)
From: [identity profile] sober-space.livejournal.com
Ну и, раз пошла такая пьянка, ключевое слово main, чтобы из одного исходника можно было компилить несколько исполнимых файлов:

main myserver(args...) {
//компилируется в myserver.exe
}

//в том-же исходнике:
main myclient(args...) {
//компилируется в myclient.exe который взаимодействует с myserver.exe
}

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

Date: 2014-11-05 07:59 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Прикольно, Blow тоже предлагает описывать что как собирать прямо в исходнике. Не в точности та же идея, но близко.

Date: 2014-11-05 08:07 pm (UTC)
From: [identity profile] sober-space.livejournal.com
Ну да, к этому все идет. Я, например, в go-проектах не пользуюсь makeфайлами. Думаю, когда-нибудь придется, но пока нет.

Profile

thedeemon: (Default)
Dmitry Popov

April 2026

S M T W T F S
   1 234
567891011
12131415161718
19202122232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 26th, 2026 09:26 am
Powered by Dreamwidth Studios