Здравствуйте, vsb, Вы писали:
vsb>Можно делить на ошибки и предупреждения, но в релизном коде не должно быть ни тех, ни других. Хотя я бы вообще предложил кардинальный подход — не делить на ошибки и предупреждения, а генерировать в отладочном режиме бинарник, даже если встречаются ошибки, которые можно локализовать. Я давным давно писал на жава в эклипсе, вот там такая фича была. И это было очень удобно. Не дописал функцию, и ладно. Если туда управление придёт, то вместо недокомпилированного кода вылетит ошибка.
Прикольно. Для этого требовался особый JDK, или Eclipse внутри себя это делал?
vsb>Что касается автоматической генерации кода, на мой взгляд правильно требовать от генератора генерировать нормальный код, а не подстраивать язык под него.
Вот в том, что такое "нормальный" код, тут и есть засада. Go не пропускает, например, код с неприменённым импортом. Генератор должен следить за тем, вызвал он что-то по этому импорту или нет? Я думаю, что не должен. Даже если по умолчанию это полезно (Go рассчитывался на написание кода низкоуровневыми ширнармассами, и жёсткий контроль имеет смысл), опция компиляции для убирания этого (вписанная в исходник) была бы очень полезна.
N>>Надо смотреть на практику Питона, где эта диверсия по умолчанию.
vsb>Вот, кстати, да. Я на питоне не то, чтобы много писал, но немного писал. И конкретно эта фича мне проблем кажется не доставляла.
А мне доставляла — и нетипизированностью, и тем, что сложно понимать, определена переменная в принципе или нет.
vsb>>>Автовывод типа это уже давно стандарт де-факто почти во всех языках и подразумевается сам собой.
N>>Да вот не совсем. Ты смешиваешь два автовывода — автовывод по инициализации и автовывод по всему использованию.
N>>Первый — удел процедурных языков. Второй — группы *ML/Haskell/etc.
vsb>Я про первый. Автовывод типов для функций — вопрос сложный.
Не обязательно для функций.
r = 0;
... какие-то действия в цикле... {
++r;
}
Если оно умеет подсчитать, что r достигает 2000, и 1 байта мало, нужно два — это и есть второй вариант.
vsb>>>Все типы локальных переменных выводятся и это не опционально.
N>>Ну да, ещё скажи, что ты не можешь сказать "int x" для локальной переменной, только "var x"
N>>Непонятно, что ты имел в виду на самом деле, но сказано безнадёжно коряво. Перефразируй.
vsb>Не очень понял, что не понятно. У нас ведь в гипотетическом языке нет ни var ни int. У нас есть только x = 1 или x = get_int_value(). Иными словами типы всех локальных переменных выводятся автоматически и отказаться от этого нельзя. Максимум — добавить каст в инициализирующее выражение, чтобы привести его к нужному типу.
Значит, таки типы есть, раз касты есть. Но зачем тогда запрещать тип для переменной?