Николай Ланец
24 янв. 2021 г., 22:08

package.json - не только для запуска JS-скриптов

Всем привет!

Сегодня у меня великая радость из-за пущего пустяка - 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"
}
}

Теперь можно выполнять в терминале вот так:
$ yarn build yarn run v1.22.5 $ yarn compile && yarn ld $ nasm -f elf main.asm -o build/main.o $ ld -m elf_i386 build/main.o -o build/main Done in 0.50s. $ yarn start yarn run v1.22.5 $ ./build/main Hello, world Hello, world Hello, world Hello, world Hello, world Done in 0.05s.
Удобно :)

Если кому это направление тоже интересно, исходники закинул сюда: https://github.com/Fi1osof/NASM-examples


Ассемблер - это, конечно, круто, но имхо более эффективно использовать С/С++ и webassembly https://habr.com/ru/post/342180/
Уровень практически ассемблера, но гораздо удобнее.
В случае с низким и высоким уровнем практически всегда так: высокий уровень удобней. А низкий надежней. И не понимая низкого, использовать высокий удобней, но не всегда эффективней. Это как и с тем же Реактом. Он во многом удобен, но бывают задачи, когда на нем ты их просто не решишь и надо работать с DOM напрямую. И TypeScript - безусловно удобней. Но бывает так, что его приходится нагибать, чтобы он понял что ты от него хочешь. Технически работает все, а он понять ничего не может.

Добавить комментарий