LINUX.ORG.RU
решено ФорумTalks

Как грамотно и качественно создать свой ЯП?

 ,


2

2

Привет. У меня есть наброски своего языка программирования, теперь думаю как лучше его реализовать. Цель - создать быстрый и практичный язык для продакшена, чтобы писать на нём проги, а не просто сделать, поиграться и выбросить. И мой вопрос не в том как сделать язык вообще, а именно как сделать лучше.

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

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

По поводу самого языка:

1. Нужны ли классы? Мне нравится прототипное программирование и я не понимаю, зачем тогда нужно класс-ориентированное. Какие преимущества даёт класс по сравнению с прототипом?

2. Как лучше организовать области видимости? В разных языках это устроено по разному и трудно понять как именно лучше и удобнее в работе

3. Какие фичи лично вам бы хотелось видетьв новом ЯП?

По поводу реализации:

1. Байт-код или машинный код? И если первое, то регистровая машина или стековая?

2. Какие есть рекомендации по разработке сборщика мусора и оптимизатора?

3. Как лучше организовать возможность обращения к объектам программы извне? В частности, как хранить в скомпилированной программе метаданные (имена и типы переменных)?

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

5. Как вообще лучше реализовать jit-компилятор?

Перемещено tailgunner из development

У тебя не получится. Не трать время зря.

tailgunner ★★★★★
()

Цель - создать быстрый и практичный язык для продакшена, чтобы писать на нём проги, а не просто сделать, поиграться и выбросить.

В продакшен теперь пускают самопальные языки?

Как лучше организовать области видимости?

Лексическая, без глобальных переменных, переменные по умолчанию неизменяемы.

Байт-код или машинный код?

Ты сначала всё, что до кодогена идёт, сделай.

А вообще, держи https://github.com/aalhour/awesome-compilers

quantum-troll ★★★★★
()

tailgunner, может быть а может и нет. почему бы не попробовать?

В продакшен теперь пускают самопальные языки?

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

Ты сначала всё, что до кодогена идёт, сделай.

Возможно, об этом стоит думать сразу.

без глобальных переменных

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

переменные по умолчанию неизменяемы.

Это как? Переменная же не константа

russian-turist-2019
() автор топика
Ответ на: комментарий от russian-turist-2019

tailgunner, может быть а может и нет

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

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

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

JS был создан одним человеком за 10 дней (https://habrahabr.ru/post/106274/), я же конечно как не столь опытный прогер буду делать язык гораздо дольше, может быть год, может больше. Потребуется время чтобы многое изучить, понять. Но почему вы думаете что для меня вообще принципиально не возможно решение этой задачи? Да даже если и не сделаю, попробовать стоит

russian-turist-2019
() автор топика

Ч.1

1. Объём кода современного ЯП - от 10 Мб и выше, время от начала разработки до выхода версии 1.0 - от 3 лет. Здраво оцени свои силы.

2. Постарайся подобрать готовый, максимально подходящий. Вот я прямо сейчас решаю примерно ту же задачу, что и ты. SBCL не подошёл. Попробую теперь CCL. Ещё смотрю в сторону TypeScript и Oberon

3. — не скажу :Р

Ч.2.

1. машинный

2. взять готовый

3. через FFI биндинги к Си, через пайпы, через сокеты. Последний вариант самый надёжный, с первого лучше не начинать.

4. См. выше.

5. Не знаю.

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

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

russian-turist-2019
() автор топика
Ответ на: комментарий от den73

Так, а почему сразу для JVM не писать?

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

JS был создан одним человеком за 10 дней

В нем не было и половины фишек, которые ты хочешь. Например. JS однопоточный до сих пор, JIT-компилятор появился через несколько лет (и писал его не один человек), FFI нет до сих пор.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от russian-turist-2019

JS был создан одним человеком за 10 дней

Видимо у него был опыт, к тому же он стыдится и извиняется за то, что он сделал за эти 10 дней.

Но почему вы думаете что для меня вообще принципиально не возможно решение этой задачи?

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

Чтобы создать нужный ЯП необходимо понимание с какими трудностями сталкиваются разработчики ПО. Нужны новые подходы в управлении памятью. А не очередной синтаксический сахар на базе GC.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от russian-turist-2019

Но почему вы думаете что для меня вообще принципиально не возможно решение этой задачи? Да даже если и не сделаю, попробовать стоит

Да нет, язык-то сделать можно.

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

В этом плане тот перечень, который ты привёл в ОП - он в пустоту. В чём будет именно киллер-фича твоего языка перед другими? А если таковой нет - то может, лучше обратить внимание на язык, уже существующий и развить его библиотеку? Скажем, D.

Понятно, что каждому по молодости хочется написать свою ОС, свой ЯП и свой оконный менеджер. У некоторых эта молодость продолжается всю жизнь. Но вот лично для себя я считаю пункт с ЯП уже не интересным. Есть более интересные точки приложения усилий.

hobbit ★★★★★
()

Найти грамотный, большой коллектив, который тебе в этом поможет. А созидать будете очень долго - вот так взять и написать, чтоб всем сразу нравилось, никак не получится. Да и что такое язык без своей экосистемы - библиотек, популяризаторов? В общем, понадобится куча заинтересованных в продвижении. Много работы, в общем, одному ни как не потянуть. Разве что хочешь написать язык - шутку (типа, brainfuck), или только для себя - тогда да, это не так сложно. Но это несерьёзно - тоже самое, что админить домашний локалхост или писать программки единственному клиенту (самому себе). :)

anonymous
()

Cтремись к лучшему. Собирай то, что тебе нравится. Будь оптимистом...

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

Ну это дело твоё, просто я олд скул и меня от байткода тошнит. Хотя клиппер был ничего.

den73 ★★★★★
()

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

Пример как - язык red https://ru.m.wikipedia.org/wiki/Red_(язык_программирования)

ism ★★★
()

Цель - создать быстрый и практичный язык для продакшена, чтобы писать на нём проги

Ахаха :-) Лол :-) Лол :-) Хахаха-хаха-хаха :-) Лол :-)

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

например java-байткод и будет написано однажды, работает везде

Лол :-) Лол:-) Лол :-) Ахаха-хаха-хаха :-) Лол :-) Хахаха :-) Лол :-)

anonymous
()

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

Несколько более сложной задачей является оптимизация, но там тоже ничего особенного изобретать не надо (по крайней мере для начала).

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

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

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

Ushenin
()

1. Байт-код или машинный код? И если первое, то регистровая машина или стековая?

лисп в рамках Common lisp
или scheme в рамках gambit/lambdanative или bigloo
И то и другое даст тебе машкод на лету забесплатно. Для прототипа более чем. А там разберешся.

2. Какие есть рекомендации по разработке сборщика мусора и оптимизатора?

Взять готовый из языка реализации или библиотку в случае С. Их есть ..

Как лучше организовать возможность обращения к объектам программы извне? В частности, как хранить вскомпилированной программе метаданные (имена и типы переменных)?

GObjectIntrospection например. Поищи сколько *.gir можно поставить в современном дистре, удивишся. не самая худшая компания.
DWARF. Если ты правда хочешь компилировать.

Как вообще лучше реализовать jit-компилятор?

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

antares0 ★★★★
()

Всю портянку не осилил, но, аффтар пеши исчо.

ashot ★★★★
()
Ответ на: комментарий от russian-turist-2019

JS был создан одним человеком за 10 дней

Потому что - это по сути реализация scheme c немного измененным синтаксисом. Которые все рано укладываются в расширения стандарта scheme.
Что забавно есть курс который так и назвается свой scheme за 10 дней. и там в конце как-это дело оттранслировать в C

antares0 ★★★★
()
Последнее исправление: antares0 (всего исправлений: 1)

пунт №0 : выбрать из уже знакомых языков наиболее понятный и вплотную глубоко заняться им. Сиречь закрывать баги в интерпретаторе/jit и коммитить в core. Другого пути понять как работает язык, управляется память и строиться его взаимодействие с миром НЕТ. Только практика

MKuznetsov ★★★★★
()

а можно посмотреть твои наработки? они как-то систематизированы?

not_rj45
()

Те, кто на это способен, приходят и пишут: «я сделал, посмотрите».

Неспособные лишь фантазируют на тему. При этом могут даже реально верить в это.

Ты не из первых. Вывод?

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

А ты не разрабочик. Так что пошел вон из /develpment:)

Он изначально задает правильные вопросы. Что уже половинв успеха.

antares0 ★★★★
()

Не ты ли свою операционку делал?

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

Жизненный опыт он такой.

Десятки и десятки подобных мечтателей без ничего. В самых разных сферах деятельности.

dk-
()
Ответ на: комментарий от russian-turist-2019

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

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

Как вообще лучше реализовать jit-компилятор?

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

Питонщики пытались использовать готовый JIT-компилятор. Ничего не вышло.

tailgunner ★★★★★
()
Ответ на: комментарий от russian-turist-2019

Судя по уточняющим вопросам, ты о проектировании современных языков не знаешь ничего. Так что, как обычно: сначала — учить математику, как минимум пару лет (если способности есть; если нет, то до бесконечности), потом — годик именно на предметку. Потом можно начинать. Иначе с гарантией скатится в говно.

Miguel ★★★★★
()

Язык планируется общего назначения, высокоуровневый, с автоматическим управлением памятью, многопоточный, мультипарадигменный, js-подобный

Коль скоро ты сам упомянул js, то вот тебе первый вопрос: а какой именно недостаток js ты хочешь исправить своим мега-языком?

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

Чтобы создать нужный ЯП необходимо понимание с какими трудностями сталкиваются разработчики ПО. Нужны новые подходы в управлении памятью. А не очередной синтаксический сахар на базе GC.

Бла-бла-бла. Нужен маркетинг и личная толпа смузихлёбов.

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

Он не брешил, а вопрошал. Задавать вопросы, когда чего-то не знаешь – это нормальное правильное поведение.

// ну, конкретно этот персонаж просто троллит, но ты же не отличаешь

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

Зачем мне эти говношейдеры, когда нормальные библиотеки есть?

А вообще, я последнее время GUI не занимаюсь. Решил, что буду в это говно лезть только в крайних случаях.

anonymous
()

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

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

Virtuos86 ★★★★★
()

Пока мой выбор остановился на LLVM, как считаете, хороший выбор?

Начни с рисования круга.

Ты шейдеры то осилил уже?

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

а можно посмотреть твои наработки? они как-то систематизированы?

Неа. Да там и смотреть особо не на что - в основном спецификация синтаксиса.

Неспособные лишь фантазируют на тему

Я не фантазирую, а советуюсь с людьми, которые в этом разбираются лучше. Может быть здесь кто-то сам пробовал создавать язык и может уберечь меня от каких-то распространённых ошибок.

russian-turist-2019
() автор топика

Если есть лишних лет 10 - вперёд. Иначе - даже не пытайтесь.

RazrFalcon ★★★★★
()
Ответ на: комментарий от russian-turist-2019

LLVM может время сэкономить, да. кстати, в чем суть твоего ЯП-то?

cetjs2 ★★★★★
()

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

Этот мусор никому не нужен. Нетипизированную парашу невозможно компилировать и оптимизировать. По определению.

1. Нужны ли классы? Мне нравится прототипное программирование и я не понимаю, зачем тогда нужно класс-ориентированное. Какие преимущества даёт класс по сравнению с прототипом?

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

И вот тогда, когда ты посмотришь на эти типизированные изваяния - ты поймёшь, в чём проблема недоскрипта.

2. Как лучше организовать области видимости? В разных языках это устроено по разному и трудно понять как именно лучше и удобнее в работе

Где это в разных? Ты опять перепутал реальность и твои потуги в протухшем жс. Любой вменяемый человек уже признал, что видимость «как в жс» - дерьмо, и все бегут от неё как можно дальше.

Во всех остальных(живых) языках - такой проблемы нет.

3. Какие фичи лично вам бы хотелось видетьв новом ЯП?

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

1. Байт-код или машинный код?

Байт-код, а вернее то, что ты в него вкладываешь - никому не нужно. Это сдохло и протухло.

И если первое, то регистровая машина или стековая?

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

2. Какие есть рекомендации по разработке сборщика мусора и оптимизатора?

Когда тебе говорят о том, что жс возможно оптимизировать - тебя обманывают. Это невозможно.

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

3. Как лучше организовать возможность обращения к объектам программы извне? В частности, как хранить в скомпилированной программе метаданные (имена и типы переменных)?

Это не имеет смысла. Что ты там собрался компилировать? Тебя обманули в том, что это что-то даст - ничего это не даст.

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

Никакие - зачем кому-то ещё один клон. Зачем кому-то язык от того, кто даже до конца не понимает, как его язык/рантайм работает.

5. Как вообще лучше реализовать jit-компилятор?

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

Поэтому, об этом не имеет смысла рассуждать, ведь то, о чём ты рассуждаешь - есть кастыль-нахлабучка на то, чего у тебя нет.

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