Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
То есть очевидное нарушение системного подхода – как будто разработчики языков высокого уровня рассматривали свои системы без учета взаимодействия с внешним миром. В итоге, программируя на типизированном языке разработчик должен предсматривать все возможные виды «неправильных» входных данных, и искать способы обхода неопределенностей. И вот тут на сцену выходят монструозные системы поддержки регулярных выражений, обработки исключительных ситуаций, сигнатуры методов/процедур для разных типов значений и прочая прочая генерация костылей.
Вы можете объяснить, пожалуйста, зачем нужно программирование на ассемблере в современных десктопных или мобильных операционных системах?Можно тот же самый вопрос задать про С++, VB, F#, Haskel. Да, С условно можно считать портируемым языком (хотя тот же Python, или Java «портируемы» еще как), пока дело не касается низкоуровнего программирования. Например нам понадобится что-то прочитать из порта ввода-вывода. Тут вся «портируемость» летит высоко и быстро. Или же Вы имеете ввиду, что просто вызов «библиотечной» функции решит проблемы? Так на чем писать эту самую библиотечную функцию? Если на С, то о какой портируемости идет речь, если переносите функционал с архитектуры, где фактически нет портов ввода выводы (они замаплены на адреса памяти) на архитектуру, где они есть?
Гораздо важнее скорость разработки, простота поддержки и портируемость приложений.Ассемблер проигрывает в «портируемости» между архитектурами, но не между ОС. Что касается скорости разработки, так проигрышь получается по причинам, описанным выше — борьба со «специфическим» использованием архитектуры языками высокого уровня.
Также не очень понятен ваш скепсис в отношении компиляторов. Неужели вы считаете, что вы сами лучше будете знать, как именно и где лучше применить, скажем, какую-нибудь из инструкций расширения SSSE3?Насчет SSSE. Там нет такого уж кошмара, вопрос лишь в подготовке данных. Сможете сами сделать — отлично, не сможете, нестрашно, есть, например, Фортран. А про «низкоуровневую модель памяти» я не понял. Что это?
Что значит — предусматривать все возможные виды «неправильных» входных данных? Вы имеете в виду валидацию, то есть, проверку содержимого, вроде того, представляет ли строка адрес электронной почты? Но это понятие не тождественно типизации. Более того, наоборот, типизация помогает валидации данных, потому что типизация ограничивает множество значений конкретной переменной. Валидация данных необходима в любом языке, независимо от системы типов.Так типизация и решает задачу валидации данных. Чтобы быть уверенным, что вы умножаете вещественное число, а не строку. Но при этом, кроме удобства для компилятора, вносит дополнительные сложности как для программиста, так и для пользователя.
Можно тот же самый вопрос задать про С++, VB, F#, Haskel.
хотя тот же Python, или Java «портируемы» еще как
пока дело не касается низкоуровнего программирования
Ассемблер проигрывает в «портируемости» между архитектурами, но не между ОС.
int $0x80
. Естественно, набор этих функций абсолютно разный. Работа с памятью тоже немного другая — форматы бинарников разные. Поэтому если вы хотите перенести программу из одной ОС в другую, даже если они работают на одной архитектуре, вам придётся её переписывать.Насчет SSSE. Там нет такого уж кошмара, вопрос лишь в подготовке данных.
Сможете сами сделать — отлично, не сможете, нестрашно, есть, например, Фортран.
А про «низкоуровневую модель памяти» я не понял. Что это?
Так типизация и решает задачу валидации данных.
Как пример, у нас есть некий телефонный справочник. Номер телефон это что? Целое число или строка? При отсутствии типизации мы может обрабатывать его и как число (для поиска и сравнения так будет быстрее) и как строку — для хранения номера в том виде, в каком его ввел пользователь.
Нет, нельзя. Все эти языки так или иначе позволяют писать кроссплатформенные программы с высокой скоростью разработки и достаточным уровнем корректности.VB, например, с кроссплатформенностью не сильно дружит. F# тоже не далеко ушел. Да даже С++ есть далеко не для всех архитектур и операционок. Тут спорить можно до хрипоты, но нам это ничего не даст.
Не понимаю вашего сарказма. Python и Java являются кроссплатформенными языками, и программы на них именно что портируемы.Они не «портируемы», они «кроссплатформенны» в силу своей интерпретируемости (как бы это сейчас не называлось).
Хотя, на мой взгляд, здесь и C можно обойтись, потому что, скорее всего, под ту архитектуру, которая вам нужна, уже кто-нибудь написал соответствующую обёртку.Отличное замечание. То есть мы сравниваем не языки, а наличие/отсутствие библиотек? Тут конечно, наличие библиотеки всегда лучше ее отсутствия. При этом, «почемуто», априори считается что программист на ассемблере не должен пользоваться сторонними библиотеками вообще, а Сшник — только и и обязан что их применять. В статье и говорится, что в силу неизвестных мне причин, библиотеки используют крайне спорные методы передачи параметров, которые, в дополнении ко всему, еще и не очень удобны при использовании асемблера.
Вы же против высокоуровневых языков, нет?Почему если человеку нравится программировать на ассемблере, то это обзательно должен быть «красноглазый ретроград»? Я за любые языки программирования. Но это не повод плодить и оправдывать «корявые» решения что на С, что на ассемблере, что на любой другом языке.
Статическая или динамическая типизация — весьма холиварная тема. Лично я считаю, что статическая типизация есть благо, по разным причинам — начиная от обеспечения минимальной корректности программы и до упрощения создания мощных IDE. Однако типизация ни в коем случае не составляет сложности для пользователя программы.К сожалению Вы наверно меня не поняли. Я всего лишь говорю, что преждевременная типизация, равно как и преждевременная оптимизация — это больше недостаток, чем преимущество. И дело не только в удобстве пользователя (как например, странность, почему в результате умножения переменной (с гарантированно вещественным значением) на целое значение «куда-то» пропадает дробная часть, это из SQL), но и в эффективности программы. Когда для вычисления A * B может быть использована и целочисленная (быстрая), так и вещественная (медленная) арифметика, в зависимости от фактических значений этих переменных на момент вычисления.
Пожалуйста, продемонстрируйте, как вы будете обрабатывать +7-909-78956234 и как число, и как строку. Желательно, на вашем любимом ассемблере.А что тут демонстрировать? При преобразовании значения (например для поиска) — игнорируем все символы, кроме цифр. При этому исходное значение в строком виде не изменяем. В чем сложность то?
VB, например, с кроссплатформенностью не сильно дружит. F# тоже не далеко ушел. Да даже С++ есть далеко не для всех архитектур и операционок. Тут спорить можно до хрипоты, но нам это ничего не даст.
Отличное замечание. То есть мы сравниваем не языки, а наличие/отсутствие библиотек? Тут конечно, наличие библиотеки всегда лучше ее отсутствия. При этом, «почемуто», априори считается что программист на ассемблере не должен пользоваться сторонними библиотеками вообще, а Сшник — только и и обязан что их применять. В статье и говорится, что в силу неизвестных мне причин, библиотеки используют крайне спорные методы передачи параметров, которые, в дополнении ко всему, еще и не очень удобны при использовании асемблера.
Почему если человеку нравится программировать на ассемблере, то это обзательно должен быть «красноглазый ретроград»? Я за любые языки программирования. Но это не повод плодить и оправдывать «корявые» решения что на С, что на ассемблере, что на любой другом языке.
Я всего лишь говорю, что преждевременная типизация, равно как и преждевременная оптимизация — это больше недостаток, чем преимущество. И дело не только в удобстве пользователя (как например, странность, почему в результате умножения переменной (с гарантированно вещественным значением) на целое значение «куда-то» пропадает дробная часть, это из SQL), но и в эффективности программы. Когда для вычисления A * B может быть использована и целочисленная (быстрая), так и вещественная (медленная) арифметика, в зависимости от фактических значений этих переменных на момент вычисления.
А что тут демонстрировать? При преобразовании значения (например для поиска) — игнорируем все символы, кроме цифр. При этому исходное значение в строком виде не изменяем. В чем сложность то?
ColibriOS
кроме написания компилятора С для совершенно новой архитектуры.
fprintf(stderr, "Operation fail. Error code %d\n", errno)
на x86-64 не будет использовать стек для передачи параметров — все три аргумента поместятся в регистры.Я предложил первый параметр использовать как маску значимых параметров. То есть, после увеличение количества передаваемых параметров старые модули/программы так и будут заполнять только известные им поля.
После чего начинаются свистопляски, а где же хранить это значения, потому что регистры нам нужны для работы, а их (регистров) всего 16? Или вдруг понадобилось добавить 17й параметр? Здравствуй стек.
«тут и меньший расход памяти неизвестно на что»
отсутствие излишней нагрузки на исполнительные устройства процессора (что экономит немного электричества).
Да в конце концов — удовольствие от работы. Вам нравится писать на С, мне приятно писать на ассемблере. Я не вижу ничего в этом плохого. :)
При соглашении о вызовах в формате cdecl такой проблемы как бы не существует. Конструкция языка Си… (три точки) позволяет объявлять функции с произвольным числом параметров. При cdecl стек подчищает вызывющий код.
Не факт. В случае 17 параметров, наверное, оптимальнее будет положить их в структуру и передавать указатель на неё. Причём, это будет справедливо как для языков высокого уровня, так и для ассемблера — Вы ведь сами утверждаете, что регистров не хватит. А в случае рекрурсии получится ещё и хорошая экономия — меньше работы со стеком.Именно! Однако fastcall продразумевает только расширение в стек. Программист сам должен выбирать иные варианты передачи параметров.
Кстати, Ваша идея с первым параметром не так уж и нова.Она (идея) и не может быть никаким нововведением — это лежит на поверхности. Но совершенно не понятно, почему не используется. Выгоды от такого подхода намного больше. чем от того, что применяется сейчас.
Мысли о программирование на ассемблере