Задача лексического анализатора заключается в том, чтобы разбить исходный текст программы на лексемы или токены.
Так, например, код
print(1 + 2)
будет разбит на лексемы
print
, (
, 1
, +
, 2
и )
Читать полностью »
Задача лексического анализатора заключается в том, чтобы разбить исходный текст программы на лексемы или токены.
Так, например, код
print(1 + 2)
будет разбит на лексемы
print
, (
, 1
, +
, 2
и )
Читать полностью »
Содержание:
Что такое компьютер?
Вопрос кажется простым, но он затрагивает самую суть того, что делаем мы как программисты. Пока скажем, что «компьютер» — это нечто, исполняющее программу. «Программа» — это просто последовательность команд, а под исполнением программы подразумевается, что команды выполняются с начала и одна за другой. (Если вы читаете программу и сами исполняете команды, то поздравляю! Вы — компьютер!)
Читать полностью »
Осенью 1990 года родители подарили мне набор Nintendo Entertainment System Action Set: серую угловатую консоль (Control Deck), два контроллера, ярко-оранжевый световой пистолет "Zapper" и картридж, на котором были Super Mario Bros. и Duck Hunt.
Консоль NES с одним контроллером. Фото Эвана Эмоса.
Control Deck подключалась к стоявшему в чулане большому ЭЛТ-телевизору RF-переключателем — по сути, это была антенна, подававшая видеосигнал из консоли на телевизор на канале 3. Это была моя первая видеоигровая консоль, и я её обожал.
В том году я проводил в чулане много времени. Поначалу и отец тоже — он проходил Super Mario Bros., выяснял местоположение секретных Warp Zones и пытался проскользнуть через опасных Hammer Bro (прим. пер.: кидающихся молотками черепах). Однажды ему удалось победить Баузера («дракона», как он его называл) и спасти принцессу, после чего он практически перестал играть в игры на NES.
Читать полностью »
Мне по-прежнему интересны языки программирования. Но сегодня уже не так сильно, и не из-за того, что они позволяют мне делать, а, скорее, из-за того, что они мне делать не позволяют.
В конечном итоге, возможности того, что можно сделать при помощи языка программирования, редко ограничены самим языком: нет ничего, что можно сделать на C++, но нельзя повторить на C, при наличии бесконечного количества времени.
Если язык полон по Тьюрингу и компилируется в ассемблерный код, каким бы ни был интерфейс, вы общаетесь с одной и той же машиной. Вы ограничены возможностями оборудования, количеством его памяти (и её скоростью), подключенной к нему периферией, и так далее.
На самом деле, достаточно лишь команды
mov
.
Разумеется, существуют различия в выразительности: для выполнения определённых задач в разных языках может потребоваться больше или меньше кода. Язык Java печально известен своей многословностью: но благодаря другим его преимуществам он и сегодня является привлекательным выбором для многих компаний.
Кроме того, есть такие аспекты, как производительность, отладкопригодность (если такого слова нет, то его стоит придумать) и дюжина других факторов, которые стоит рассмотреть при «выборе языка».
Читать полностью »
Команда Rust публикует новую версию языка — 1.59.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Сегодняшний релиз выпал на день, когда внимание мира приковано к внезапному нападению сил Путина на Украину. До того, как погрузиться в детали нового релиза Rust, мы хотим заявить, что мы солидарны с народом Украины и выражаем нашу поддержку всем людям, затронутым этим конфликтом.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.59.0 вам достаточно выполнить команду:
rustup update stable
Сразу прошу прощения за несколько надоевший всем стиль «lytdybr», но уж очень хочется поделиться крайне приятным опытом и рассказать о по-своему замечательном компиляторном курсе. И это ещё хорошо, что я пишу сейчас, когда эмоции подугасли, а не когда я только закончил вторую главу курса и от эйфории чувствовал себя как «хомячок, которого капля никотина разрывает на части»! Сразу предупреждаю, наверняка для кого-то эта заметка — «ребёнок познаёт мир», тех прошу сразу закрыть вкладку и не судить строго. Здесь и далее, всегда и всюду, во всех четырёх сферах прошу учитывать, что я не только не создаю компиляторы, но даже и не обучаю этому и не пишу методички! ;-)
Сегодня мы будем анализировать бинарники на пару с CPU профилями, чтобы создать на их основе расширенные профили исполнения. Эти дополненные профили мы сможем использовать для оценки времени, которое программа тратит на проверки выхода за границу массивов и слайсов.
Без лишних слов, прямо к делу — вот какие новые вкусности будут нас ждать в C++23:
std::expected
— новый механизм сообщения об ошибках без использования исключений и без недостатков кодов возврата.std::ranges::to
— результаты работы алгоритмов можно легко превратить в контейнер.std::views::join_with
— добавление разделителя между элементами.
Что мы не увидим в C++23, на что ещё можно надеяться и что ещё приняли в текущий черновик стандарта? Всё это ждёт вас под катом.
Читать полностью »
Найти значительное узкое место в производительности стандартной библиотеки или зрелого приложения — это редкость.
Я был удивлён, когда в top10 списке CPU-профиля hugo при сборке digitalgov.gov на первой позиции находился метод reflect.Type.MethodByName()
.
flat flat% sum% cum cum%
8.84s 6.28% 6.28% 57.85s 41.10% reflect.(*rtype).MethodByName
7.93s 5.63% 11.92% 8.50s 6.04% reflect.name.readVarint
7.56s 5.37% 17.29% 111.79s 79.43% reflect.Value.call
7.53s 5.35% 22.64% 23.33s 16.58% runtime.mallocgc
7.29s 5.18% 27.82% 16.10s 11.44% reflect.name.name
В этой статье я расскажу вам о том, как так вышло и что с этим можно было бы сделать.