Информация об изменениях

Сообщение Re: Критерии идеального ЯП от 06.08.2024 12:34

Изменено 06.08.2024 12:39 vsb

Re: Критерии идеального ЯП
Вообще весь девиз должен быть: "минимально достаточный"

1. Минимальный набор фич. Ничего лишнего. Честно говоря я не знаю, какой язык из существующих взять за пример. Очень грубо — Java 1.4. Но всё же не совсем то. Я на самом деле периодически начинаю думать над тем, какой набор фич минимальный и в то же время достаточный для создания софта произвольной сложности и вопрос этот сложный. Пока до готового результата не додумался.

2. Максимально простой и понятный инструментарий. Тут Go можно взять за пример. В стандартной поставке должны быть все инструменты, которые нужны любому программисту. Минимальные и при этом достаточные.

3. Максимально жёсткие и однозначные соглашения. Ни у кого не должно возникать мыслей о том, использовать ли пробел или таб для отступа. Система форматирования должна быть встроена в инструментарий, язык должен не давать никаких вольностей. Что-то вроде Prettier.

Язык должен переписать всё, не использовать ничего готового. Не использовать libc, ld, llvm, всё это на свалку истории.

Язык должен быть многоуровневым. На самом низу это ассемблер. Тут ничего изобретать не надо, ассемблер штука достаточно однозначная. Поверх него что-то вроде урезанного C. На этом наборе можно написать любой низкоуровневый софт, где надо считать байты и такты. Уровнем выше первая стандартная библиотека. Опять же что-то вроде libc, но сделанная по уму. На этом наборе можно писать низкоуровневый софт, где надо считать килобайты и миллисекунды.

Уровнем выше GC и вторая стандартная библиотека, всё, что требует GC или серьёзных "ненулевых" абстракций. На этом уровне уже можно писать софт произвольной сложности.

В целом стандартная библиотека должна быть минимальной и даже где-то недостаточной. Её главная цель — обеспечить общие интерфейсы. К примеру hashmap в стандартной библиотеке не нужен. sort в стандартной библиотеке не нужен. А вот некий интерфейс map — нужен. Для конкретной реализации подключайте популярную в этом году библиотеку. Все стандартные библиотеки устаревают со временем, но при этом выкинуть оттуда ничего нельзя. Поэтому в ней должно быть то, что со временем не устаревает и ничего более.

Система типов должна быть тоже минимально достаточной. Однозначно не должно быть ничего, похожего на генерики и тд. Повторюсь, что-то вроде Java 1.4.

Проблема метапрограммирования должна решаться через явную генерацию кода. Это должно быть встроено удобным образом в систему сборки, IDE должно показывать всё автосгенерированное, код должен быть хорошо отформатирован, должны быть удобные встроенные API для генерации кода в виде AST и тд. Т.е. если тебе очень захотелось написать hashmap<T>, то тебе это должно быть относительно легко доступно, но при этом весь сгенерированный код должен явно лежать в понятных местах и быть доступным программисту обычным образом.
Re: Критерии идеального ЯП
Вообще весь девиз должен быть: "минимально достаточный"

1. Минимальный набор фич. Ничего лишнего. Честно говоря я не знаю, какой язык из существующих взять за пример. Очень грубо — Java 1.4. Но всё же не совсем то. Я на самом деле периодически начинаю думать над тем, какой набор фич минимальный и в то же время достаточный для создания софта произвольной сложности и вопрос этот сложный. Пока до готового результата не додумался.

2. Максимально простой и понятный инструментарий. Тут Go можно взять за пример. В стандартной поставке должны быть все инструменты, которые нужны любому программисту. Минимальные и при этом достаточные.

3. Максимально жёсткие и однозначные соглашения. Ни у кого не должно возникать мыслей о том, использовать ли пробел или таб для отступа. Система форматирования должна быть встроена в инструментарий, язык должен не давать никаких вольностей. Что-то вроде Prettier.

Язык должен переписать всё, не использовать ничего готового. Не использовать libc, ld, llvm, всё это на свалку истории.

Язык должен быть многоуровневым. На самом низу это ассемблер. Тут ничего изобретать не надо, ассемблер штука достаточно однозначная. Поверх него что-то вроде урезанного C. На этом наборе можно написать любой низкоуровневый софт, где надо считать байты и такты. Уровнем выше первая стандартная библиотека. Опять же что-то вроде libc, но сделанная по уму. На этом наборе можно писать низкоуровневый софт, где надо считать килобайты и миллисекунды.

Уровнем выше GC и вторая стандартная библиотека, всё, что требует GC или серьёзных "ненулевых" абстракций. На этом уровне уже можно писать софт произвольной сложности. Также на этом уровне добавляются исключения, недо-ООП и похожие языковые средства, требующие нетривиальной реализации, но ощутимо упрощающие процесс разработки ПО.

В целом стандартная библиотека должна быть минимальной и даже где-то недостаточной. Её главная цель — обеспечить общие интерфейсы. К примеру hashmap в стандартной библиотеке не нужен. sort в стандартной библиотеке не нужен. А вот некий интерфейс map — нужен. Для конкретной реализации подключайте популярную в этом году библиотеку. Все стандартные библиотеки устаревают со временем, но при этом выкинуть оттуда ничего нельзя. Поэтому в ней должно быть то, что со временем не устаревает и ничего более.

Система типов должна быть тоже минимально достаточной. Однозначно не должно быть ничего, похожего на генерики и тд. Повторюсь, что-то вроде Java 1.4.

Проблема метапрограммирования должна решаться через явную генерацию кода. Это должно быть встроено удобным образом в систему сборки, IDE должно показывать всё автосгенерированное, код должен быть хорошо отформатирован, должны быть удобные встроенные API для генерации кода в виде AST и тд. Т.е. если тебе очень захотелось написать hashmap<T>, то тебе это должно быть относительно легко доступно, но при этом весь сгенерированный код должен явно лежать в понятных местах и быть доступным программисту обычным образом.