Когда новый язык является подходящим инструментом для работы?

StackOverflow https://stackoverflow.com/questions/193941

  •  10-07-2019
  •  | 
  •  

Вопрос

В течение долгого времени я пробовал разные языки, чтобы найти нужный мне набор функций, но так и не смог его найти.У меня есть языки, которые хорошо подходят для различных моих проектов, но я придумал сочетание этих языков, которое позволит мне выполнять 99,9% моих проектов на одном языке.Я хочу следующее:

  • Построен на основе .NET или имеет реализацию .NET.
  • Имеет мало зависимостей от среды выполнения .NET как во время компиляции, так и во время выполнения (это важно, поскольку одним из основных случаев использования является разработка встроенных систем, где среда выполнения .NET полностью настраивается).
  • Имеет компилятор, который на 100% представляет собой код .NET без неуправляемых зависимостей.
  • Поддерживает произвольное вложение выражений (см. ниже).
  • Поддерживает пользовательские определения операторов
  • Поддерживает вывод типа
  • Оптимизирует хвостовые вызовы
  • Имеет явные неизменяемые/изменяемые определения (хорошо - мне это полюбилось, но я могу жить без этого)
  • Поддерживает настоящие макросы для сильного метапрограммирования (абсолютно необходимо)

Основные два языка, с которыми я работал, — это Boo и Nemerle, но я также экспериментировал с F#.

Основные претензии к Nemerle:Компилятор имеет ужасные отчеты об ошибках, реализация чертовски глючная (компилятор и библиотеки), макросы можно применять только внутри функции или как атрибуты, и это довольно тяжело с точки зрения зависимостей (хотя и недостаточно, чтобы это нарушало правила).
Основные претензии к Бу:Никакого произвольного вложения выражений (нарушитель условий), макросы сложно писать, нет определения собственного оператора (потенциальный нарушитель).
Основные претензии к F#:Уродливый синтаксис, трудное для понимания метапрограммирование, несвободная лицензия (эпический нарушитель соглашения).

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

Плюсы:

  • Получить точный синтаксис, который я хочу
  • Получите время обработки, которое будет намного быстрее;сложно оценить количественно, но я не удивлюсь, если производительность разработчиков увеличится в 1,5 раза, особенно благодаря тестовой инфраструктуре, которую это может обеспечить для определенных проектов.
  • Я могу легко добавить в компилятор собственные функции, чтобы они лучше работали с моей средой выполнения.
  • Я получаю что-то, что разработано и работает точно так, как я хочу - хотя это и похоже на НИЗ, это облегчит мою жизнь

Минусы:

  • Если он не станет популярным, мне придется нести бремя его обслуживания.Я знаю, что смогу, по крайней мере, переманить людей из Немерла, поскольку думаю, что каждый хочет чего-то более профессионального, но для этого нужна деревня.
  • Из-за первого минуса я опасаюсь использовать его в профессиональной среде.Тем не менее, я уже использую Nemerle и свой собственный модифицированный компилятор, поскольку они вообще его не поддерживают.
  • Если он не наберет популярности, найти разработчиков будет гораздо сложнее, настолько, что Пол Грэм может даже не оправдать.

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

Редактировать:Забыл добавить пример вложенности - вот случай в Nemerle:

def foo = 
    if(bar == 5)
        match(baz) { | "foo" => 1 | _ => 0 }
    else bar;

Редактировать № 2:Подумал, что не помешало бы привести пример типа кода, который будет конвертирован на этот язык, если он будет существовать (С.Одного ответа Лотта может быть достаточно, чтобы отпугнуть меня от этого).В коде активно используется собственный синтаксис (код операции, :=, блок кавычек и т. д.), вложенность выражений и т. д.Вы можете проверить хороший пример здесь: здесь.

Это было полезно?

Решение

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

На чем я это основываю?Два общих опыта.

  1. Один или два раза в год мне приходится выносить предложение о продукте/языке/инструменте/фреймворке, который полностью изменит все.Мой ответ был неизменным в течение последних 20 или около того лет.Покажите мне кого-нибудь, кто нуждается в поддержке, и моя компания поддержит его.И это все.Никогда больше о них не услышьте.Допустим, я услышал 25 из них.

  2. Один или два раза в год мне приходится работать с клиентом, у которого потеряна технология.В какой-то момент в прошлом некоторые умные программисты создали инструмент/фреймворк/библиотеку/пакет, который использовался внутри компании в нескольких проектах.Потом этот программист ушел.Никто больше не может разобраться в этой чертовой штуке, и они хотят, чтобы мы заменили/переписали ее.К сожалению, мы тоже не можем в этом разобраться, и наше предложение — переписать с нуля.И они жалуются, что их гений создал набор приложений за несколько недель, и нам не могут потребоваться месяцы, чтобы переписать их на Java/Python/VB/C#.Допустим, я написал около 25 подобных предложений.

Это только я, один консультант.

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

И движение было, конечно, в неожиданном направлении.Его язык и инструменты были в порядке, но мир начал внедрять реляционные базы данных, и у него не было абсолютно никакой возможности обновить свой мусор, чтобы отказаться от плоских файлов.Это было то, чего он не предвидел.Действительно, это было то, чего он не мог предвидеть.[Вы же не попадёте в эту ловушку, не так ли?]

Итак, мы поговорили.Он переписал множество приложений на Plain-Old VAX Fortran (да, это было очень давно). И он переписал их, чтобы использовать старый добрый реляционный SQL (в то время Ingres).

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

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

Другие советы

Я говорю: действуй.

  • Это будет потрясающий опыт, независимо от того, попадет ли он в производство или нет.
  • Если вы скомпилируете его в IL, вам не придется беспокоиться о том, что вы не сможете повторно использовать скомпилированные сборки с C#.
  • Если вы считаете, что у вас есть обоснованные жалобы на перечисленные выше языки, вполне вероятно, что многие будут думать так же, как вы.Конечно, на каждую 1000 заинтересованных людей может найтись 1 желающий помочь вам его поддерживать – но это всегда риск.

Но вот несколько вещей, о которых следует предостеречь:

  • Получите спецификацию языка IN STONE перед разработкой.Убедитесь, что все особенности языка проработаны заранее — даже те, которые вам могут понадобиться только в будущем.По моему мнению, C# постепенно попадает в ловушку «ох, еще одно расширение языка», которая в конечном итоге приведет к его гибели.
  • Обязательно сделайте его оптимизированным.Я не знаю того, что ты уже знаешь;но если вы не знаете, то учитесь;) Никому не понадобится язык с хорошим синтаксисом, но работающий так же медленно, как реализация javascript в IE.

Удачи :D

Когда я только начинал свою карьеру в начале 90-х, казалось, что было повальное увлечение разработкой собственных языков.Мой первый 3 рабочие места были в компаниях, которые это сделали.Одна компания даже разработала собственную операционную систему!

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

1) Вы потратите время на отладку самого языка, а также кодовой базы поверх него.
2) Всем разработчикам, которых вы нанимаете, придется пройти этап изучения языка.
3) Будет сложно привлечь и удержать разработчиков, поскольку работа на проприетарном языке — это тупик для чьей-то карьеры.

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

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

Основные претензии к Nemerle:Компилятор имеет ужасную отчетность об ошибках, реализация чертская как ад (компилятор и библиотеки), макросы могут применяться только внутри функции или в качестве атрибутов, и это довольно тяжело с точки зрения зависимости (хотя и недостаточно, что это является нарушителем сделки).

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

Если вы дадите ему шанс, вы не будете разочарованы.

НИКОГДА НИКОГДА не развивайте свой собственный язык.

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

Случаи, когда это неприменимо, в основном, если вы Ларри Уолл, ребята из AWK или часть значительной группы людей, занимающихся тестированием границ программирования.Если вы принадлежите к любой из этих категорий, вам не нужен мой совет, но я сильно сомневаюсь, что вы ориентируетесь на нишу, где нет подходящего языка программирования для задачи И характеристик людей, выполняющих эту задачу.

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

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

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

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

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

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

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

В Scala есть компилятор .NET.Хотя я не знаю статуса этого дела.Это своего рода гражданин второго сорта в мире Scala (который больше ориентирован на JVM).Но, возможно, было бы неплохо принять компилятор .NET вместо создания нового языка с нуля.

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

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

Возможно, вы захотите объединить два ваших любимых языка (в моем случае C# и Схема) и используйте их вместе.

Хотя с профессиональной точки зрения это, вероятно, не очень хорошая идея.

Было бы интересно услышать некоторые вещи, которые, по вашему мнению, невозможно сделать на существующих языках.Над какими проектами вы работаете, которые невозможно реализовать на C#?

Мне просто любопытно!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top