Всем привет!
Сегодня у меня великая радость из-за пущего пустяка - Hello world! :)
То есть я написал мелку программку, окторая при выполнении пишет "Hello world". Но великая радость из-за того, что я шел к этому больше 10 лет :) Серьезно. Все потому что она на ассемблере. То есть первые попытки были еще более 10 лет назад, но к своему стыду я не мог даже компилятор установить (хотя в той же убунте есть свой компилятор ассемблера из коробки).
И вот сегодня я опять взялся за эксперименты (видимо весеннее психическое обострение, хоть и не весна сейчас (хоть и за окном плюсовая температура и дождь)), и таки получилось что-то сделать :)
Отдельное спасибо за это Андрею Викторовичу Столярову, который написал учебник по NASM и активно отвечает на вопросы на своем сайте. http://www.stolyarov.info/books/asm_unix
Благодаря этому материалу я таки сделал первые шаги и очень рад :)
А пишу не только потому что рад, но и потому что хотел раскрыть малоочевидную, но сильную сторону package.json - он годится не только для запуска JS-скриптов, но и в принципе является инструментов для запуска любых скриптов, в том числе и bash.
Казалось бы, при чем тут package.json и ассемблер?
Поясню: для компиляции кода и запуска конечной программы надо выполнить в терминале пару команд. При этом из-за того, что попутная библиотека написана для 32битной архитектуры, а у меня 64, приходится еще флаг передавать. Пока экспериментируешь, еще ничего, но через день уже забудешь и опять надо гуглить решение. В данной ситуации логично иметь возможность куда-то записать нужные команды и легко их потом вызывать. Часто для этого используют make + Makefile, но у меня мало стимула изучать еще и эту технологию, поэтому я взял то, что итак знаю. И вот что получилось:
{
"name": "NASM-examples.Hello-world",
"scripts": {
"start": "./build/main",
"build": "yarn compile && yarn ld",
"compile": "nasm -f elf main.asm -o build/main.o",
"ld": "ld -m elf_i386 build/main.o -o build/main"
}
}
Теперь можно выполнять в терминале вот так:
Удобно :)
Если кому это направление тоже интересно, исходники закинул сюда: https://github.com/Fi1osof/NASM-examples
Ассемблер - это, конечно, круто, но имхо более эффективно использовать С/С++ и webassembly https://habr.com/ru/post/342180/
Уровень практически ассемблера, но гораздо удобнее.
В случае с низким и высоким уровнем практически всегда так: высокий уровень удобней. А низкий надежней. И не понимая низкого, использовать высокий удобней, но не всегда эффективней. Это как и с тем же Реактом. Он во многом удобен, но бывают задачи, когда на нем ты их просто не решишь и надо работать с DOM напрямую. И TypeScript - безусловно удобней. Но бывает так, что его приходится нагибать, чтобы он понял что ты от него хочешь. Технически работает все, а он понять ничего не может.