Как на самом деле создается / создается новый язык программирования?
Это многоступенчатый процесс:
Теоретики с заостренными головами и другие профессионалы постоянно предлагают новые языковые возможности. Вы можете прочитать о них в таких местах, как Материалы симпозиума ACM по принципам языков программирования (POPL) , который проводится ежегодно с 1973 года.
Многие из этих предложений фактически реализованы на некотором языке исследований ; некоторые исследовательские языки, которые я лично нахожу многообещающими, включают Coq и Agda. Haskell - бывший язык исследований, который сделал его большим. Исследовательский язык, который получает 10 пользователей, часто считается успешным. Многие исследовательские языки никогда не зашли так далеко.
От исследований к развертыванию я знаю две модели:
Модель A: Приходит талантливый любитель и синтезирует целый ряд существующих функций, возможно, включая некоторые новые идеи, в новый язык. У любителя есть талант, харизма и, возможно, убийственное приложение. Так рождаются C, Perl, Python, Ruby и Tcl.
Модель P: Талантливый профессионал жертвует карьерой, чтобы создать и издать новый язык. Профессионал обладает талантом, глубокими знаниями в этой области и, возможно, убийственным приложением. Так рождаются Хаскелл, Луа, М.Л., Паскаль, Скала и Схема.
Вы предлагаете другую модель:
Модель E: Талантливый человек, любитель или профессионал, расширяет или изменяет другой язык. Есть встроенная база пользователей, которая может быть заинтересована в расширении. Возможно, пользователи смогут исследовать новые идеи без больших затрат на переход. Так рождаются C # и C ++.
Мое определение профессионала - это тот, кому платят за знание языков программирования, за передачу этих знаний и за развитие новых знаний о языках программирования. К сожалению, это не то же самое, что разработка и внедрение новых языков, и это не то же самое, что создание реализаций, которые могут использовать многие люди. Вот почему большинство успешных языков программирования разрабатываются любителями, а не профессионалами.
Было довольно много интересных исследовательских языков, которые имели сотни или даже тысячи пользователей, но так и не достигли большого успеха. Одним из моих любимых, вероятно, является Icon . Я утверждал в другом месте , что никто действительно не знает, почему языки становятся популярными.
Расширяют ли новые языки родительские?
Это на самом деле очень редко. C ++ является наиболее популярным примером, и, возможно, Algol-W или PL / S подошли близко. Но гораздо чаще использовать родительский язык только для вдохновения, и некоторые языки (на ум приходит Python) признают нескольких «родителей» в качестве источников вдохновения.
Разве это не делает каждый следующий язык медленнее и требует больше памяти?
Не обязательно. C ++ работает медленнее и использует больше памяти не потому, что он произошел от C, а потому, что он был разработан с течением времени до такой степени, что только очень опытный пользователь может надежно писать код C ++, который работает так же быстро, как и C код. (Я хочу быть очень ясным: дело не в том, что C ++ не может быть быстрым; дело в том, что стоимость кода C всегда очевидна при чтении исходного кода, а стоимость кода C ++ иногда совсем не очевидна при чтении исходного кода. ) Для получения дополнительной информации об эволюции C ++ прочитайте книгу Джима Уолдо Эволюция C ++ .
Изначально Java работала медленно из-за своевременной компиляции и других дурацких вещей в реализации. Они также оседлали себя этими динамическими средствами загрузки классов, которые действительно трудно заставить вещи быть быстрыми (потому что класс может быть динамически расширен в любой момент). Кенни Задек, Роджер Гувер и Дэвид Чейз создали действительно быстрый компилятор с собственным кодом для Java без динамической загрузки классов.
В качестве контрпримера, я думаю, что программы на Scheme работали быстрее и использовали меньше памяти, чем программы на Лиспе, которые предшествовали им - отчасти потому, что Гай Стил - и блестящий дизайнер, и блестящий разработчик. (Редкая комбинация, та.)
Но есть что-то в том, что вы говорите: люди, которым не хватает опыта для создания хорошего компилятора с нуля, или которым не хватает опыта для разработки целого языка с нуля, вполне могут взломать реализацию чего-то, не слишком отличающегося от родительского. , В таких случаях вполне вероятно, что получится язык, который не так хорошо разработан, менее хорошо реализован, медленнее и использует больше памяти, чем его предшественник. (Тони Хоар сказал, что Algol 60 улучшил большинство его преемников [sic]).
Верно также и то, что чем позже разработан язык, тем больше вычислительных ресурсов доступно по той же цене. Ранние компиляторы C должны были эффективно работать всего за 128 КБ ОЗУ. Сегодняшние компиляторы C ++ не сталкиваются с такими ограничениями, и у них есть все основания использовать больше памяти: заполнение машины гигабайтами оперативной памяти действительно дешево, а ограничение использования только мегабайтами не экономит ничего; больший объем памяти уже оплачен.
Резюме: Языки возникают потому, что люди хотят улучшить программирование, и у них появляются новые идеи. Языки начинают свое существование, когда кто-то берет целую кучу идей, новых и проверенных, и объединяет их в единое целое. Это большая работа. Один из способов облегчить эту работу - использовать не только проверенные функции , но и проверенные конструкции одного или нескольких языков предшественников. Этот вид дизайна создает впечатление «родительских прав», но фактическое расширение или почти расширение (в случае C ++ - расширение C) встречается редко. Затраты времени и пространства не обязательно увеличиваются по мере развития языков, но часто люди создают языки, делая существующие конструкции более сложными, и чем сложнее дизайн, тем сложнее его реализовать. Поэтому нет ничего необычного в том, что программы, написанные на новом языке, кажутся медленнее или используют больше памяти, чем аналогичные программы, написанные на языке предка. Наконец, как и для всех других форм программного обеспечения, разработанные и созданные недавно компиляторы, как правило, используют больше ОЗУ и ЦП, чем компиляторы, построенные десять лет назад, просто потому, что по бросовым ценам можно купить большое количество циклов ОЗУ и ЦП.