История изменений
Исправление KivApple, (текущая версия) :
Признаю, был не прав.
Но у Vala есть ещё пара фатальных недостатков:
1) Неоптимальность полученного сишного кода. А именно - каждое промежуточное вычисление внутри выражения помещается в отдельную переменную.
Ладно, допустим, компилятор Си это соптимизирует (поместит все эти переменные в регистры и по факту получится то же самое, что и без них). Но в случае асинхронного программирования это становится проблемой, потому что Vala помещает все эти временные переменные в структуру состояния асинхронной функции. Скомпилировал тестовый пример про асинхронный ввод-вывод и получил в сишном исходнике структуру с десятком всяких разных _temp_X_. А такое уже ни один компилятор не сможет соптизировать - ведь нельзя же выкидывать поля из структуры, как и запись значений в них (то есть мы будем зря хранить в памяти лишние данные, а ещё зря писать в эти данные всякие промежуточные значения вычислений, хотя они не должны были бы уйти дальше регистров процессора).
2) Vala не создаёт #line директивы. А это в свою очередь делает затруднительной отладку. Мой транслятор привязывает каждую строчку сгенерированного исхода к строчке исходного файла. В результате при отладке можно будет нормально ориентироваться по исходному файлу. Я вообще себе не представляю как должен отлаживаться код на Vala, потому что не вижу никакой возможности понять какая строчка сишного исходника соответствует какой строчке файла на языке Vala. Разве что выполнять что-то вроде декомпиляции, но это очень сложно и неоднозначно. У меня разве что в случае асинхронности придётся написать какой-нибудь плагин для GDB, тут же никакие плагины не помогут, причём для всего кода, а не для отдельных фич.
Исходная версия KivApple, :
Признаю, был не прав.
Но у Vala есть ещё пара фатальных недостатков:
1) Неоптимальность полученного сишного кода. А именно - каждое промежуточное вычисление внутри выражения помещается в отдельную переменную.
Ладно, допустим, компилятор Си это соптимизирует (поместит все эти переменные в регистры и по факту получится то же самое, что и без них). Но в случае асинхронного программирования это становится проблемой, потому что Vala помещает все эти временные переменные в структуру состояния асинхронной функции. Скомпилировал тестовый пример про асинхронный ввод-вывод и получил в сишном исходнике структуру с десятком всяких разных _temp_X_. А такое уже ни один компилятор не сможет соптизировать - ведь нельзя же выкидывать поля из структуры, как и запись значений в них (то есть мы будем зря хранить в памяти лишние данные, а ещё зря писать в эти данные всякие промежуточные значения вычислений, хотя они не должны были бы уйти дальше регистров процессора).
2) Vala не создаёт #line директивы. А это в свою очередь делает затруднительной отладку. Мой транслятор привязывает каждую строчку сгенерированного исхода к строчке исходного файла. В результате при отладке можно будет нормально ориентироваться по исходному файлу.