Рубрики
Без рубрики

Почему языки программирования медленно

Почему люди говорят, что языки программирования, как Ruby, Python, PHP, являются медленными. Давайте глубоко в свой дизайн. Помечено программированием, рубиновым, Python, производительностью.

Введение

Григорий Петров от Evrone имеет пару увлекательных переговоров на YouTube о языках программирования. Он много узнал о проектировании языков программирования и как компиляторы работают под микроскопом, и он нашел ответы на вопросы о производительности языков программирования.

Вот мой обзор его лекций ( 1 , 2 ) на английском языке. Если вы попытаетесь найти ответ на вопрос, почему Python или Ruby медленно, статья для вас.

Главный вопрос

Некоторые люди не хотят учиться и использовать Ruby, Python и т. Д., Поскольку они слышали, что эти языки медленные. ” Почему мне нужно использовать медленный язык ” – они думают. ” Лучше учиться и использовать Golang или JavaScript, потому что я слышал, что они быстро. «Кроме того, некоторые младшие программисты, которые изучали Руби, Питон беспокоится о своем выборе. Они сделали правильный выбор, потому что они слышали, что язык медленный? Давайте найдем ответ, почему некоторые языки медленно.

Процессор

Чтобы описать, как языки программирования работают, мы должны начать с процессора на машине. Современный ЦП имеет множество ядер для его производительности. Современная архитектура CPU сложная, чтобы учиться и описать. В простых терминах можно сказать, что скорость выполнения кода – это количество инструкций машинного кода, которые один CPU Core может выполняться на один момент.

ЦП читает каждую инструкцию из памяти. Операция чтения всегда медленная операция. Поэтому каждый современный CPU хэш многоуровневой кэш-памяти (L1, L2, Cache Cache) и реестры процессора. Они помогают не читать данные из памяти.

Проще говоря, производительность скорости кода равна насколько эффективным наш код (машинный код) работает с памятью. Можем ли мы хранить данные в CPU Cache или мы должны прочитать данные из памяти?

Взглянуть на языки

Какие языки программирования как C, C ++, Rust, Objective-C и Golang имеют общего? Когда программист пишет код, он всегда думает о памяти: мы должны указать тип данных каждой переменной; Мы должны выделить память в куче; Всегда думайте о указателях, блоках; и Т. Д.

В качестве преимущества исходный код будет скомпилирован в машинный код, и он выполняется так быстро. Тем не менее, все знают, что код записи в C, C ++, ржавчины сложно. Это происходит потому, что синтаксис сложно, и вы должны всегда заботиться о памяти.

Если программист/разработчик не хочет беспокоиться о памяти, он может делегировать рутину к компилятору. Компилятор – это инструмент, который преобразует ваш исходный код в машинный код. Он пытается сделать это эффективно. Исходный код, преобразованный в машинный код, будет легко обрабатываться процессором, а данные будут храниться в кэше и регистрах

Языки программирования как Java, C # JavaScript следуют за тем, как. Когда вы пишете код в Java, вам не нужно беспокоиться о памяти, потому что вы делегируете работу до компилятора.

Java, C #, JavaScript обладает высоким уровнем и красивым синтаксисом. Код все еще выполнен быстро. К сожалению, у них проблемы с расширением. Компилятор преобразует исходный код и изолирует уровень памяти. Трудно написать расширение для кода Java или использовать сторонний код, написанный на C/C ++. Для того, чтобы написать дизайнер удлинитель, пришлось реализовать интерфейс как внутренний интерфейс Java (JNI), но используя его уменьшит производительность вашего кода.

Третий путь – делегировать рутину до времени выполнения, виртуальную машину (VM). Это означает, что язык не будет компилировать исходный код в машинный код, он будет компилировать исходный код к Bytecode и выполнить Bytecode в VM. Языки программирования как Python, Ruby, PHP Следуйте по пути. Эти языки имеют потрясающий высокоуровневый и сладкий синтаксис и возможность писать расширение легко и быстро. Но цена использования виртуальной машины – скорость – производительность кода медленная.

Три навыка

Мы можем представить каждый компьютерный язык как символ в видео ролевой игры (RPG). В типичном RPG, когда мы создаем персонаж, имеем ограниченное количество точек и мало навыков, чтобы поставить точки в (прочность, оборону, интеллект, ловкость и т. Д.). Каждый язык имеет три навыка, чтобы поставить очки в:

  • Скорость – скорость исполнения
  • Синтаксис – приятный и элегантный синтаксис высокого уровня
  • Расширяемость – совместимость на память для удобства записи и использования стороннего кода или расширение.

Когда человек, группа людей начинает создавать новый язык программирования, они могут выбрать только два навыка в качестве основы. Третий всегда будет трудно достичь. Например, C, C ++, Rust, Objective-C, Go быстро и имеют расширяемость, но у них есть низкоуровневый синтаксис нелегантного.

Если язык быстро и имеет хороший синтаксис – будет сложно написать расширение или использовать сторонний код. Java, C #, JavaScript быстро и имеет хороший синтаксис высокого уровня. Но трудно написать расширение для кода Java или использовать сторонний код, написанный на C/C ++.

Ruby, Python и PHP выбрали третий путь. У них есть удивительный сладкий синтаксис, код легко написать. Когда вы пишете код, вы думаете только о бизнес-логике и не беспокойтесь о памяти. Кроме того, легко использовать сторонний код или писать расширение как Numpy, Scipy в Python; Или Nokogiri, Ruby-Opencv, RedCarpet в Ruby. Цена является производительностью, эти языки медленнее, чем предыдущие языки.

Вывод

Всякий раз, когда мы говорим или слышим, что N язык медленно помните, что это значимое решение в дизайне языка. Вы можете задать вопрос: « Как быстро стать языком? Является ли это возможным? “. Да, это возможно, но не легко достичь.

В противном случае медленные языки гибкими. Легко написать расширение в C ++ и сделать какой-то тип операции быстрее. Например, Numpy и Scipy в Python. Когда мы делаем ML в Python или использовать Ruby, чтобы записать бизнес вход в систему, мы используем преимущества Python/Ruby на языке высокого уровня и быстро напишите код. Кроме того, мы можем делегировать медленную работу для быстрого расширения в сторонних библиотеках, чтобы работать с данными, делать математические операции, анализа текста и т. Д.

Честно говоря, в настоящее время JavaScript является единственным языком, который пытается иметь все три навыка. Но это тяжело. Он пытается проводить все ресурсы, чтобы быть гармоничным. Я считаю, что в ближайшее время все современные языки будут в гармонии будут все три навыка.

Оригинал: “https://dev.to/kopylov_vlad/why-programming-languages-are-slow-1b2d”