Sketch – новый язык программирования, способный самостоятельно оптимизировать и завершать незаконченные участки кода

Языки программирования

В оставшейся части лекции анализируется инструментарий, поддерживающий разработку ПО.

Программы не пишутся в машинном коде – в форме, доступной для непосредственного выполнения компьютером, они создаются на языке высокого уровня – языке программирования, ориентированном на человека.

Конечно, язык программирования также можно рассматривать как машинный код некоторого абстрактного компьютера, отличающегося от реальных процессоров. Мы будем говорить в таких случаях об абстрактных или виртуальных машинах.

Обратите внимание

Целью компиляции является реализация возможности выполнения реальным компьютером кода, написанного для абстрактной машины. Компиляция, однако, – лишь одна из двух базисных технологий, применяемых для достижения нашей цели.

Вместо компиляции программы можно ее интерпретировать. Рисунок ниже иллюстрирует разницу подходов, игнорируя роль входных данных.

Рис. 3.6. Компиляция и интерпретация (без ввода данных)

И компилятор, и интерпретатор являются программами, на вход которых подаются программы, написанные на языке программирования.

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

Обработка той же исходной программы интерпретатором не создает целевой программы, но непосредственно выполняет ее, получая выходные результаты.

Интерпретатор должен быть способен определить эффект выполнения каждой конструкции языка программирования. Как пример того, как интерпретатор выполняет свою задачу, рассмотрим интерпретацию присваивания x: = x +1.

Интерпретатор должен хранить таблицу всех используемых переменных и связанных с ними значений.

Он вычисляет новое значение x, добавляя 1 к старому значению, хранящемуся в таблице, а затем выполняет присваивание, заменяя старое значение x значением вычисленного выражения.

Важно

Компилятор будет генерировать машинный код, создающий тот же эффект, используя команды компьютера и адреса памяти (а не структуру более высокого уровня, такую как таблица).

В дополнительном упражнении для небольшого языка потребуется, применяя эти идеи, написать компилятор и интерпретатор.

Если рассматривать язык программирования как машинный код для абстрактной машины, можно сказать, что интерпретатор – это программа, моделирующая вычисление на этой машине. Машинная память в этом случае также абстрактна и представляет структуры данных в виде таблиц интерпретатора “переменные – значения”.

На следующем рисунке процессы компиляции и интерпретации дополнены вводом данных:

Рис. 3.7. Компиляция и интерпретация

Рисунок демонстрирует еще одну разницу между компилятором и интерпретатором. У интерпретатора два источника ввода – исходная программа и входные данные; а компилятору подается только программа. В последующем обсуждении этому различию придадим математическую форму.

Компилировать или интерпретировать? Эта проблема – предмет широко рассмотрения в компьютерных науках. Что лучше: непосредственно обрабатывать исходную информацию в том виде, как она есть, или предварительно привести ее к более удобной форме? Этот вопрос стоит не только при обработке программ, мы будем сталкиваться с ним и при изучении алгоритмов.

У компиляторов и интерпретаторов имеются свои достоинства. Возможны различные критерии. По производительности – времени выполнения программы – компиляторы побеждают.

  • Выход компилятора является машинным кодом, непосредственно выполняемым компьютером. Дополнительно при создании этого кода компилятор мог применять оптимизацию, улучшающую эффективность кода.
  • Интерпретация кода требует при выполнении каждого оператора его предварительной обработки. В результате интерпретация программы выполняется на порядок медленнее в сравнении с работой программы, созданной компилятором.

Все меняется, если в качестве критерия выбрать удобство и скорость разработки. Компилятор стоит между вами и реализацией вашей последней идеи: прежде чем увидеть результаты последнего изменения в программе, необходимо ждать результата компиляции (и связывания, о чем ниже пойдет речь). При интерпретации выполнение начинается незамедлительно.

В современных средах разработки этот недостаток компиляции не является столь критическим благодаря применяемой технологии “возрастающей компиляции”, когда при внесении изменений компилируются только те части программы, на которых это изменение сказывается. В конце этой лекции мы рассмотрим, как эта технология работает в EiffelStudio.

Еще один критерий, согласно которому предпочтение опять-таки отдается компиляции, состоит в надежности программы.

Совет

Компиляторы не просто транслируют программу – в процессе компиляции они осуществляют различные проверки, например, контроль типов для статически типизированных языков.

Тем самым многие ошибки устраняются еще на этапе компиляции, в то время как для режима интерпретации ошибки обнаруживаются в процессе выполнения на одном из сеансов работы.

В принципе, интерпретатор также способен выполнять некоторые из проверок перед выполнением программы. Фактически, чистые интерпретаторы не применяются, они представляют собой всегда некоторую смесь компиляции и интерпретации.

Схемы чистой компиляции и чистой интерпретации являются предельными вариантами: большинство практических решений является смесью. Это верно и для процесса компиляции в EiffelStudio, который будет рассмотрен позже в этой лекции.

Заметим, что 100% схема интерпретации имеет мало смысла: каждый раз, когда интерпретатор выполнял очередной оператор, например, оператор цикла, он должен был бы возвращаться многократно к фактической последовательности символов и осуществлять ее разбор. Любое реалистическое решение не могло бы согласиться с такой неразумной тратой ресурсов.

Так что фактически интерпретатор также начинает с преобразования входа в форму, приемлемую для интерпретации, например, строя абстрактное синтаксическое дерево. В ходе этого процесса, как отмечалось, возможен контроль проверки типов.

Так что даже тогда, когда можно прочесть, что используется интерпретатор языка, частичная компиляция подразумевается.

Обратите внимание

Комбинирование интерпретации и компиляции идет значительно дальше рассмотренной основной идеи. Выход компилятора не должен быть непосредственным машинным кодом, он может быть субъектом дальнейшего процесса обработки.

Рис. 3.8. Компиляция плюс интерпретация

Смешанная стратегия предполагает, что компилятор создает код на промежуточном языке, понимаемом некоторой виртуальной машиной – VM на рисунке. Такой подход объединяет преимущества компиляции и интерпретации. Благодаря тщательно спроектированной виртуальной машине возможно получить:

  • переносимость, так как VM-код не зависит от специфики физических процессоров;
  • повышение эффективности, поскольку создаваемый промежуточный код легко интерпретируется.

Реализация современных языков – Java, C#, других языков .Net – основана на смешанном решении. Промежуточный код для Java называется байт-кодом.

В термине отражается тот факт, что виртуальная машина использует компактные команды, подобные командам фактического процессора, где каждая команда содержит код команды – типично задаваемый одним байтом, – после которого следует 0, 1 или 2 аргумента команды.

Альтернативой байт-коду могла бы выступать виртуальная машина, непосредственно работающая со структурами данных, например, с абстрактным синтаксическим деревом для представления структуры программы и с хэш-таблицами для хранения свойств переменных. Но байт-код обеспечивает лучшую эффективность периода выполнения, как по времени, так и по памяти.

Прием двухэтапной компиляции был использован еще в семидесятые годы при реализации компилятора с языка Паскаль. Он получил второе рождение с распространением Интернета, так как хорошо был приспособлен для локального выполнения Web-клиентами.

Поставщики апплетов – небольших программ – могли компилировать их в байт-код и поставлять их в такой форме.

Дополнительным преимуществом к компактности стала переносимость кода, поскольку в противном случае машинный код пришлось бы создавать для каждой возможной целевой платформы.

Для выполнения апплета пользователям необходим только интерпретатор байт-кода.

Они даже не должны знать, что такой интерпретатор существует, если он встроен в их Web-браузер, Поскольку при таком подходе возникают потенциальные риски, связанные с безопасностью, – жульнические или некорректные апплеты могут повредить ваш компьютер, – по этой причине для апплетов необходим интепретатор, который будет строго контролировать операции, разрешенные для апплетов.

Важно

Поставка программ через апплеты достигла некоторого успеха, но не стала основным способом распределенного ПО, как ожидалось в момент появления Java.

Частично это связано с проблемами безопасности, но главная причина – в потере эффективности, возникающей по причине интерпретации.

Большинство успешных апплетов являются небольшими программами, предназначенными для выполнения на Web-странице, включающие визуальную компоненту, при наличии которой потери времени представляются несущественными.

Для улучшения эффективности времени выполнения байт-кода применяются JIT (Just In Time) компиляторы, называемые джитерами, – осуществляющие компиляцию по требованию.

Основная идея состоит в том, что машинный код для некоторого модуля создается “на лету”, в тот момент, когда он первый раз вызывается на выполнение (не следует путать любителя джаза –jitterbug, с ошибками такого компилятора – jitter bug).

Внесем соответствующие дополнения в предыдущий рисунок, который теперь выглядит так:

Рис. 3.9. Компиляция плюс интерпретация и джитинг

Обычно, как показано на рисунке, наряду с компиляцией “на лету” (джитингом) остается и возможность интерпретации байт-кода. Компиляция “на лету” обычно имеет место при первом использовании модуля (метода или всего класса), так что она будет нужна только для кода, фактически используемого в этом сеансе выполнения.

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

Совет

Последнее является серьезным недостатком, поскольку к времени выполнения добавляются расходы на компиляцию, так что само время выполнения становится менее предсказуемым.

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

Конечно, нам хотелось бы, чтобы все необходимые проверки выполнялись на первом шаге компиляции при создании байт-кода, так, чтобы любой код, передаваемый джитеру, был безопасным.

К сожалению, эти утешительные предположения нереалистичны в распределенной среде, где опять возникают проблемы безопасности. Если вы загружаете байт-код из сайта, то можете ли вы знать, прошел ли он проверку? В общем случае – нет.

Но тогда нарушения типа могут стать не только причиной нарушения надежности и аварийного завершения программы, все может быть гораздо хуже: в результате атаки становится возможным нарушение безопасности.

С точки зрения специалистов по безопасности нарушения безопасности хуже аварийного завершения: при аварии все останавливается, при нарушениях безопасности программа может спокойно продолжить свою работу и даже дать правильные результаты, но при этом может быть утеряна конфиденциальная информация, стоящая дороже полученных результатов.

Как следствие, на практике компиляция на лету включает в любом случае проверку согласованности типов. Потери производительности при этом могут оставаться приемлемыми, поскольку система типов виртуальной машины с байт-кодом значительно проще, как правило, чем система типов исходной программы.

Стратегия компиляции в EiffelStudio также включает байт-код, но, как мы увидим, она использует различные способы комбинирования интерпретации и компиляции.

Источник: http://www.intuit.ru/studies/courses/683/539/lecture/12145?page=2

Виды ошибок в программировании – Блог веб-программиста

Виды ошибок в программировании

Подробности июля 04, 2014 Просмотров: 64952

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

В этой статье вы найдете описание самых распространенных ошибок программирования, cкоторыми может столкнуться каждый разработчик.

Если вы абсолютный новичок в области программирования то эта статья непременно будет вам интересна: Основы программирования для начинающих.

Обратите внимание

Ошибки программирования, более известные как «Баги» на жаргоне, бич любого разработчика программного обеспечения. Поскольку машины все чаще используются в автоматическом режиме, с бортовыми встраиваемыми системами или компьютерами, контролирующими их функционирование, программная ошибка может иметь серьезные последствия.

Были случаи, когда космические челноки и самолеты, разбивались из-за ошибки в программном обеспечении во встраиваемом компьютерном оборудовании. Одна лазейка, оставленная в коде операционной системы, может обеспечить точку входа для хакеров, которые могут использовать эту уязвимость.

К этим, ошибкам нужно относиться очень серьезно, так как мы все больше и больше полагаемся на компьютеры.

Основные виды ошибок в программировании

Компьютерное программирование это огромное поле с сотнями языков, которые используют миллионы приложений. Это программирование операционной системы, прикладное программирование, встроенное кодирование системы, веб-разработка, приложения для мобильных платформ, развитие программ, развернутых в интернете, научные вычисления. В таблице представлены основные виды ошибок.

 

Тип ошибок программирования                               Описание
Логическая ошибка Это, пожалуй, наиболее серьезная из всех ошибок. Когда написанная программа на любом языке компилирует и работает правильно, но выдает неправильный вывод, недостаток заключается в логике основного программирования. Это ошибка, которая была унаследована от недостатка в базовом алгоритме. Сама логика, на которой базируется вся программа, является ущербной. Чтобы найти решение такой ошибки нужно фундаментальное изменение алгоритма. Вам нужно начать копать в алгоритмическом уровне, чтобы сузить область поиска такой ошибки.
Синтаксическая ошибка Каждый компьютерный язык, такой как C, Java, Perl и Python имеет специфический синтаксис, в котором будет написан код. Когда программист не придерживаться “грамматики” спецификациями компьютерного языка, возникнет ошибка синтаксиса. Такого рода ошибки легко устраняются на этапе компиляции.
Ошибка компиляции Компиляция это процесс, в котором программа, написанная на языке высокого уровня, преобразуется в машиночитаемую форму. Многие виды ошибок могут происходить на этом этапе, в том числе и синтаксические ошибки. Иногда, синтаксис исходного кода может быть безупречным, но ошибка компиляции все же может произойти. Это может быть связано с проблемами в самом компиляторе. Эти ошибки исправляются на стадии разработки.
Ошибки среды выполнения (RunTime) Программный код успешно скомпилирован, и исполняемый файл был создан. Вы можете вздохнуть с облегчением и запустить программу, чтобы проверить ее работу. Ошибки при выполнении программы могут возникнуть в результате аварии или нехватки ресурсов носителя. Разработчик должен был предвидеть реальные условия развертывания программы. Это можно исправить, вернувшись к стадии кодирования.
Арифметическая ошибка Многие программы используют числовые переменные, и алгоритм может включать несколько математических вычислений. Арифметические ошибки возникают, когда компьютер не может справиться с проблемами, такими как “Деление на ноль”, или ведущие к бесконечному результату. Это снова логическая ошибка, которая может быть исправлена  только путем изменения алгоритма.
Ошибки ресурса Ошибка ресурса возникает, когда значение переменной переполняет максимально допустимое значение. Переполнение буфера, использование неинициализированной переменной, нарушение прав доступа и переполнение стека – примеры некоторых распространенных ошибок.
Ошибка взаимодействия Они могут возникнуть в связи с несоответствием программного обеспечения с аппаратным интерфейсом или интерфейсом прикладного программирования. В случае веб-приложений, ошибка интерфейса может быть результатом неправильного использования веб-протокола.
Читайте также:  Искусственный интеллект вычислит хакеров по исходному коду программ

Интенсивное тестирование и фаза отладки неотъемлемая часть цикла разработки программного обеспечения, которое может помочь пресечь эти ошибки в зародыше, прежде чем произойдет полномасштабное развертывание программного обеспечения.

Много ошибок можно избежать с помощью предварительного планирования во время стадии кодирования. Большинство ошибок можно исправить в процессе разработки программного обеспечения через практику и строгие процедуры отладки.

Ошибки являются частью обучения, и их никогда нельзя полностью избежать, Тем не менее, у вас могут появляться новые ошибки, но повторять старые вы не должны!

Читайте также

Источник: http://juice-health.ru/programming/102

Записки программиста

Программисты постоянно занимаются оптимизацией программ. Это такая же неотъемлемая часть работы, как исправление багов или рефакторинг. Обычно, говоря «оптимизация», мы имеем в виду ускорение программы.

Несмотря на то, что под оптимизацией также может пониматься уменьшение объема используемой оперативной памяти или иных ресурсов (скажем, сетевого трафика или заряда батареи), в данной заметке речь пойдет именно об ускорении.<\p>

Для начала, немного прописных истин.

Никто не занимается оптимизацией до тех пор, пока не придет заказчик (или коллега из отдела QA — не суть важно) и не скажет, что в таком-то месте программа работает слишком медленно.

То есть, в первую очередь мы пишем программу с простым и понятным кодом, как следует тестируем ее и только потом, если понадобится, оптимизируем. Нет смысла оптимизировать программу, если (1) все работает и все довольны, (2) через полгода требования к программе поменяются и код придется переписать.

Примечание: Пожалуй, если вы пишите библиотеку, то позаботиться об ее оптимизации можно и заранее.

Также никто не бросается оптимизировать программу до тех пор, пока не станет понятно, насколько быстро она должна работать.

Формулировка «таблица должна отрисовываться не дольше, чем за одну секунду» является правильной, а «таблица должна отрисовываться быстро» — нет. То есть, вы должны знать, в каком случае считать работу выполненной.

Важно

Нельзя достичь цели, которая постоянно меняется. (Но если бизнес не хочет этого понимать, что ж… любой каприз за ваши деньги.)

Взявшись за оптимизацию, мы находим самое-самое тормозное место и ускоряем его. Если теперь программа работает достаточно быстро и ничего не сломалось, цель достигнута. Иначе переходим к первому шагу.

Искать медленные места можно, к примеру, с помощью профилировщика, записи метрик в Graphite, отладочного вывода с временными метками или логирования медленных SQL-запросов.

Можно, конечно, и наугад, если в вашем распоряжении много времени.

Теперь перейдем непосредственно к методам. Я подозреваю, что некоторые из них вызовут у вас удивление, тем не менее…

Обновление ПО. Это может показаться невероятным, однако переход на последнюю версию какой-нибудь используемой в проекте библиотеки, СУБД, виртуальной машины Erlang‘а или ядра Linux может очень существенно увеличить скорость работы вашего приложения. Простое и, как правило, быстрое решение.

Настройка окружения. Используемая СУБД или операционная система могут быть настроены неправильно. Настройки по умолчанию MySQL и PostgreSQL предполагают, что вы пытаетесь запустить СУБД на первопне.

Один мой коллега рассказывал, как однажды в его практике приложение удалось существенно ускорить, просто попробовав различные параметры JVM. Этот метод даже проще, чем обновление ПО. Однако применять его, по понятным причинам, нужно после обновления.

Или в случае, если обновление по каким-то причинам в обозримом будущем невозможно.

Удаление ненужного функционала. Вы можете увеличить быстродействие вашего приложения, выкинув ненужный код. Иногда оказывается, что программа делает что-то ненужное или не очень нужное. Возможно, одна из решаемых проблем потеряла свою актуальность.

Иногда заказчик вместо настоящей проблемы описывает программисту свое видение ее решения, а программист в силу своей неопытности просто кодирует это решение. Тем временем решение настоящей проблемы может быть намного проще. Иногда некий функционал обрастает костылями и подпорками.

В этом случае имеет смысл реализовать функционал с чистого листа, а старое решение выкинуть.

Покупка нового железа. Чем не метод? Часто намного быстрее и дешевле купить новое железо, чем оптимизировать код программы.

Совет

В ряде случаев удвоение числа ядер процессора может привести к удвоению скорости работы программы. Можно докупить оперативной памяти и хранить данные в ней, вместо того, чтобы брать их с диска или передавать по сети.

Можно перенести базу данных на SSD. Если программа масштабируется горизонтально, можно докупить десяток серверов.

Мемоизация и кэширование. Теперь перейдем к «настоящим» оптимизациям. Мемоизация — это сохранение значения, возвращаемого функцией для заданных аргументов. Кэширование — это сохранение результатов чего угодно. Например, кэшироваться могут веб-страницы или отчеты за месяц.

Кэширование может быть неприменимо, если кэшируемые данные быстро обновляются. Также в контексте кэширования часто встает проблема инвалидации кэша.

В контексте мемоизации такая проблема не возникает, так как мемоизации обычно подвергаются чистые функции, то есть, функции без побочных эффектов, возвращаемое значение которых зависит только от аргументов.

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

Распараллеливание. Распараллеливание может быть простой или сложной операцией, в зависимости от. Например, в Erlang очень многие задачи могут быть с легкостью распараллелены путем написания буквально десятка строк кода.

А в Scala вы можете без особого труда воспользоваться параллельными коллекциями вместо обычных. Однако некоторые задачи не могут быть решены параллельно по своей природе. И если программа работает на одноядерном процессоре, распараллеливание ничего не даст.

Недетерминированные функции и функции с побочными эффектами усложняют применение этой оптимизации, что есть еще один повод для написания чистых функций.

При написании веба или каких-то бэкендов распараллеливание не всегда возможно, так как нельзя занять все ядра обработкой запроса одного пользователя, заблокировав тем самым обработку остальных запросов.

Распределение нагрузки. Если нагрузка на СУБД мала, можно воспользоваться триггерами или хранимками, разгрузив тем самым само приложение и уменьшив трафик. Или, наоборот, можно перенести всю логику в приложение, разгрузив СУБД.

Обратите внимание

Для построения отчетов, создания резервных копий и выполнения других тяжелых операций над СУБД имеет смысл завести специальную реплику. СУБД можно настроить так, чтобы разные таблицы хранились на разных физических дисках. Можно отдать пользователю статическую страницу с JavaScript и общаться с ним исключительно при помощи REST API.

Пусть сам генерирует себе HTML. Статический контент можно держать на отдельном домене. Этим вы уменьшите трафик, так как на этот домен не будут отправляться кукисы. Незачем gzip’овать/шифровать данные в Apache или даже в самом приложении, если с этой задачей намного лучше справится nginx.

При помощи шардинга можно распределить нагрузку между несколькими репликами базы данных, процессами Erlang’а или экземплярами Memcached.

Ленивые вычисления. Грубо говоря, ленивые вычисления — это когда вместо конкретного значения возвращается анонимная функция, которая при вызове вычисляет это значение. В ряде языков программирования ленивые вычисления поддерживаются на уровне синтаксиса.

Фокус в том, чтобы значение было вычислено непосредственно перед его использованием. Представьте себе ситуацию, когда мы отдаем данные в формате CSV и пользователь может задать фильтр, определяющий, какие столбцы должны быть переданы.

В этом случае ленивые вычисления оказываются как нельзя кстати. Если окажется, что значение на самом деле не нужно, мы сэкономим время, которое было бы потрачено на его вычисление.

Однако следует отметить, что ленивые вычисления приводят к увеличению объема используемой памяти и могут плохо работать с грязными функциями.

Отложенные расчеты. Зачем считать что-то прямо сейчас, если это можно сделать потом? При обработке HTTP-запроса мы можем моментально вернуть пользователю OK, а непосредственную работу выполнить в фоновом процессе. Если запрос очень важен, мы можем положить его в персистентную очередь задач, обрабатываемую по cron’у.

Или группой непрерывно работающих процессов. В последнем случае мы даже имеем хорошие шансы получить горизонтальное масштабирование и, соответственно, реальное увеличение скорости, а не только видимое. Кроме того, отложенные задачи могут быть похожи. Например, им нужны одни и те же данные из БД.

В этом случае при отложенной обработке N задач одной пачкой можно сходить в базу в N раз меньше.

Более подходящие алгоритмы и структуры данных. Quicksort быстрее сортировки пузырьком, а эллиптические кривые быстрее RSA.

Важно

Если нужно проверить принадлежность элемента множеству, следует использовать хэш-таблицы, а не односвязные списки. Правильные индексы и денормализация схемы базы данных могут существенно сократить время выполнения SQL-запросов.

Если требуется синхронизировать некие данные, вместо полной их пересылки при каждом изменении лучше использовать схему снапшот + апдейты.

Аппроксимация. Это почти что случай более подходящего алгоритма, только с потерей точности. Вместо длинной арифметики часто можно обойтись обычными float’ами. При сборе статистики данные можно слать по UDP вместо TCP.

Пусть небольшая часть пакетов не дойдет, а часть — придет дважды. При сборе статистики намного важнее изменение цифр, а не конкретные значения. Также, например, незачем строить график по всем точкам, если можно взять их подмножество и построить кривую Безье.

Вместо дорогостоящего вычисления медианы часто можно посчитать среднее.

Переписывание на другой язык. Вполне может оказаться, что программу в существенной степени тормозит сборка мусора или, скажем, проверка типов на этапе выполнения.

Переписывание небольших частей программы с Ruby на Scala или с Erlang на OCaml может привести к ускорению этой программы. Если переписываемый кусок кода достаточно прост, можно с небольшим риском переписать его на Си или C++.

Этот метод нужно использовать крайне осторожно. Он приводит к появлению зоопарка языков программирования, что усложняет поддержку проекта. Метод может не сработать, например, из-за накладных расходов на преобразование данных из одного представления в другое.

Читайте также:  Учителя будущего

Также он может быть опасен. Например, ошибка в NIF может привести к падению всей виртуальной машины Erlang’а, а не одного процесса.

В заключение хочу отметить, что приведенная классификация весьма и весьма условна. Совершенно очевидно, что граница между распараллеливанием и распределением нагрузки или отложенными расчетами и ленивыми вычислениями весьма размыта.

А что бы вы добавили к названным методам?

Дополнение: Почему на самом деле ваш бенчмарк ни на что не годится

Источник: https://eax.me/effective-optimization/

Sketch – новый язык программирования, способный самостоятельно оптимизировать и завершать незаконченные участки кода

Еще во время бытности аспирантом, Армандо Солар-Лесама (Armando Solar-Lezama), ныне адъюнкт-профессор Отдела электротехники и искусственного интеллекта Массачусетского технологического института, работал над разработкой нового языка программирования под названием Sketch.

Вся прелесть этого языка заключается в том, что он позволяет программистам при написании программ опускать некоторые из участков кода, и заполняет эти промежутки самостоятельно, оптимизируя при этом получившиеся конструкции.

Главной целью создания языка Sketch является облегчение участи программистов.

Тем не менее, создатели этого языка преследуют еще одну более глобальную цель, заключающуюся в создании программных инструментов, выполняющих функцию автоматического синтеза программ, создания программ самими компьютерами без участия в этом деле человека.

При помощи созданного компилятора языка Sketch специалистами Лаборатории информатики и искусственного интеллекта уже были реализованы несколько проектов.

Совет

Одним из таких проектов является система, предназначенная для учебных классов по информатике, способная преобразовать произвольно нарисованные диаграммы и блок-схемы алгоритмов в исполняемый машинный код.

Еще одним из проектов является система, производящая код запросов к базе данных SQL на языке Java.

Исследования, проведенные специалистами различных подразделений Массачусетского технологического института, показали, что самую высокая эффективность использования языка Sketch достигается при решении сложных многосторонних задач.

Более того, компилятор языка Sketch можно использовать в качестве своего рода корректировщика кода, последняя версия этого компилятора оказалась способной самостоятельно устранить ошибки, допущенные студентами в коде написанных ими программ.

Основной идеей, реализованной в виде компилятора языка Sketch, является метод поиска оптимального решения определенной задачи. Известно, что любая логическая и математическая задача может быть решена несколькими путями, количество которых, в некоторых случаях, может стремиться к бесконечности.

И если оцениваемая компилятором программа весьма сложна, то количество решений ее реализации очень и очень велико, а поиск оптимального решения может занять огромное время.

Создатели языка Sketch нашли способ значительно сократить область поиска решений, благодаря чему поиск оптимального решения занимает исчисляемое миллисекундами время.

Разработчики видят дальнейший путь развития языка Sketch в предоставлении возможностей программисту задать набор критериев, которым должны удовлетворять участки кода, отдельные функции и вся программа в целом, после чего компилятор Sketch сможет составить функции и участки кода, соответствующие этим критериям.

Обратите внимание

Фактически это может стать более сложной задачей для самого программиста, которому в некоторых случаях придется описывать множество разноплановых критериев. Тем не менее, такой подход позволит решать при помощи языка Sketch весьма сложные задачи, при этом гораздо быстрее, чем при традиционном программировании.

Разработчики языка Sketch признают, что им предстоит еще “перевернуть горы”, прежде чем язык Sketch сможет выйти на уровень практического применения. В некоторых тестах компилятору требуется много времени для синтеза машинного кода и это связано с изначально недостаточной точностью описания задачи.

“Пока все это требует от программиста глобального понимания всей задачи в целом и умения использовать все тонкости процесса автоматического синтеза программ.

Но по мере дальнейшего развития наш компилятор и наш язык будут становиться все более интеллектуальными, что позволит осуществить быстрый и безболезненный переход на язык Sketch с большинства популярных языков программирования”.

Источник: https://neuronus.com/stat/109-sketch-novyj-yazyk-programmirovaniya-sposobnyj-samostoyatelno-optimizirovat-i-zavershat-nezakonchennye-uchastki-koda.html

Инструкция для тех, кто хочет стать программистом с нуля

Начать свой путь к карьере программиста стоит с ответа на вопрос, нужно ли вам программирование вообще? Этот вопрос не относится к тем, кто учится или учился по специальности, близкой к программированию. Если вам в школе математика давалась лучше, чем гуманитарные науки, если вам нравится проводить много времени за компьютером, если вам хочется изучать что-то новое, тогда программирование вам подойдёт.

С чего начать

Есть несколько вариантов развития событий, в результате которых человек становится программистом. Первый — родители-программисты, которые всему научили своих детей.

Таким детям даже не нужно идти в университет. Второй вариант — модная профессия программиста. После школы нужно было выбрать, куда пойти учиться, и выбрали модное направление IT, вроде бы понравилось.

И последний вариант — хобби, которое переросло в работу.

Если с вами ничего из вышеперечисленного не произошло, значит, у вас есть выбор из четырёх вариантов:

  • Самообразование. Этот вариант можно использовать как самостоятельно, так и в паре с другими методами. В интернете полно сайтов, книг и приложений, которые помогают изучать различные языки программирования и технологии. Но это самый тяжёлый путь для начинающих.
  • Университет. Если вы оканчиваете школу и хотите быть программистом, тогда идите в университет. Если не за знаниями, тогда за корочкой. Она может послужить бонусом при устройстве на работу. Хотя и какие-то знания вы тоже получите. Но не забывайте заниматься и самообучением. К выбору вуза стоит подойти очень ответственно. Внимательно изучите программы обучения и выбирайте лучшие технические вузы.
  • Ментор. Будет очень неплохо, если вы найдёте человека, который согласится помочь вам и направит вас в правильную сторону. Он подскажет подходящие книги и ресурсы, проверит ваш код, даст полезные советы. Кстати, мы уже писали о полезном ресурсе, где вы сможете найти ментора. Наставника можно искать среди знакомых программистов, на IT-тусовках и конференциях, на онлайн-форумах и так далее.
  • Специализированные практические курсы. Попробуйте поискать в своём городе курсы, где вас обучат какому-нибудь языку программирования или технологии. Я был приятно удивлён количеством таких курсов в Киеве, в том числе бесплатных и с последующим трудоустройством.

Какой язык, технологию и направление выбрать

Когда вы станете программистом, через годик-другой будете вольны выбирать любой язык, который вам нравится. Но при выборе первого языка программирования новичок должен учитывать следующие критерии:

  • Наличие на рынке вакансий. Конечная цель этого пути — найти работу программистом. А это будет трудно сделать, если на рынке вакансий никто не будет искать разработчиков на вашем языке программирования. Проверьте сайты с вакансиями, посмотрите, кого больше ищут, выпишите десяток языков. И переходите к следующему критерию.
  • Низкий уровень вхождения. Если вам придётся потратить длительное время на изучение языка, это может отбить у вас охоту к программированию вообще. Почитайте о тех языках, которые вы выбрали выше. Просмотрите литературу, которую нужно будет прочитать, чтобы изучить эти языки. И выберите те, о которых пишут, что они лёгкие, или которые вам показались лёгкими. Такими языками могут оказаться PHP, Ruby, Python.
  • Кайф от процесса. Если вам не нравится писать код на выбранном языке, вы не будете получать удовольствия от этого процесса, от работы и от жизни. А оно вам надо? Делайте правильный выбор.

Также вам придётся определиться с направлением программирования. Мобильное, десктопное, игры, веб, низкоуровневое программирование и так далее.

Самые популярные и относительно лёгкие отрасли — разработка под веб, мобильные и десктопные клиенты. Под каждое направление может подходить один язык и совсем не подходить другой.

То есть при выборе языка программирования также стоит отталкиваться и от этого фактора.

В любом случае изучите веб-технологии. Это язык разметки HTML, стили CSS и JavaScript, который позволит сделать вашу страницу динамической. На следующем этапе изучите серверный язык (Python, PHP, Ruby и другие) и подходящие для него веб-фреймворки. Изучите базы данных: практически в каждой вакансии программиста это упоминается.

Как получить начальный опыт

Без опыта вы не получите работу. Без работы вы не получите опыт. Замкнутый круг реальной жизни. Но ничего страшного, мы из него выберемся.

Во-первых, не стоит ждать, пока вы прочитаете все книги по выбранному языку программирования. Начинайте писать свои первые строки кода уже после второй главы книги. Выполняйте все задания из книг, перепечатывайте примеры, разбирайтесь в них. Усложняйте примеры и задания из книг своими идеями. Создавайте свои задачи к пройденному материалу. Решайте эти задачи.

Во-вторых, вам нужно найти свои первые проекты. Это, наверное, самый сложный вариант, но рабочий. Вам придётся самому искать заказы, выполнять их, заморачиваться с оплатой.

Важно

Для новичка это архисложно, но зато затем все остальные варианты покажутся плёвым делом. Выполненные проекты можно будет записать в опыт и показать вашему будущему работодателю.

Реальные проекты являются большим плюсом в вашем резюме.

Если вы знаете английский язык, регистрируйтесь лучше на англоязычных биржах. Рынок там больше. Если не знаете английского, учите его. А пока что вам доступны русскоязычные биржи фриланса.

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

Но если одна-две заявки выстрелят, у вас будет шанс получить реальный опыт.

Ещё одним неплохим вариантом для получения реального опыта является open source. Таким проектам всегда нужны новые люди, пусть даже и новички. Вы можете поискать в проекте баги или посмотреть в баг-трекере и предложить методы их решения. Найти такие проекты легко на GitHub или других сервисах для хостинга кода. Не стесняйтесь задавать там вопросы.

Четвёртый вариант получения опыта — помощь знакомым программистам. Попросите их передать вам маленькие и несложные задания. Если что-то не будет получаться, у вас всегда будет к кому обратиться. И при этом вы будете участвовать в реальном проекте.

Последний способ — собственные проекты, различные хакатоны или работа в коворкинге. Свои проекты сложно начинать самому, лучше поискать знакомых или друзей.

Почему стоит выбрать Python

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

Код программы на Python читабелен. Вам даже не нужно быть программистом, чтобы в общих чертах понять, что происходит в программе. Из-за несложного синтаксиса Python вам понадобится меньше времени для написания программы, чем, например, на Java.

Огромная база библиотек, которая сэкономит вам кучу сил, нервов и времени. Python является высокоуровневым языком. А значит, вам не нужно особо думать о ячейках памяти и о том, что там разместить. Python — язык широкого назначения.

И он такой простой, что даже дети могут его выучить.

Совет

Справедливости ради стоит упомянуть и о других языках программирования. Java может стать неплохим выбором для новичка. Этот язык популярнее, чем Python, но и немного сложнее. Зато инструменты для разработки гораздо лучше проработаны. Стоит только сравнить Eclipse и IDLE. После Java вам будет проще перейти к работе с низкоуровневыми языками программирования.

PHP — ещё один очень популярный язык. И, мне кажется, он даже проще, чем Python. Очень легко найти себе ментора или решение какой-нибудь проблемы на форуме.

Всё потому, что в мире существует огромное количество PHP-программистов разного уровня. В PHP нет нормального импорта, есть множество вариантов решения одной и той же задачи. А это усложняет обучение.

И PHP заточен исключительно под веб.

Языки C и C# очень сложны для новичка. Ruby — хороший выбор в качестве второго языка, но не первого. JavaScript — очень простой язык, но ничему хорошему он вас не научит. А задача первого языка программирования всё-таки научить вас чему-то правильному, задать какую-то логику.

Читайте также:  Израильские танки оборудуют системой искусственного интеллекта

Важен ли английский язык

Важен! Не знаете? Учите. Знаете? Совершенствуйте. Учитесь читать, писать, слушать и говорить на английском. Делайте упор на техническую литературу. Слушайте англоязычные подкасты. Читайте англоязычные учебники по программированию.

Что нужно знать, кроме языка программирования

Конечно же, кроме языка программирования и английского, нужно знать что-то ещё. А вот что — зависит от направления, которое вы выберете. Веб-программист обязан знать HTML, CSS, JavaScript. Десктоп-программист учит API операционной системы и различные фреймворки. Разработчик мобильных приложений учит фреймворки Android, iOS или Windows Phone.

Всем нужно выучить алгоритмы. Попробуйте пройти курс на Coursera или найти подходящую для себя книгу по алгоритмам. Кроме этого, нужно знать одну из баз данных, паттерны программирования, структуры данных. Стоит также познакомиться с репозиториями кода.

Хотя бы с одним. Обязательно знание систем версионного контроля. Выбирайте Git, он самый популярный. Вам нужно знать инструменты, с которыми вы работаете, операционную систему и среду разработки. И главный навык программиста — уметь гуглить.

Без этого вы не проживёте.

Последние шаги

Вам нужно подготовить резюме. Не просто резюме, а хорошее резюме. Не стоит писать там лишней информации, но и умалчивать о своих умениях тоже не нужно. После того как вас пригласят на интервью, вы должны к нему подготовиться.

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

И вперёд — к светлому будущему с новой профессией программиста.

Источник: https://Lifehacker.ru/kak-stat-programmistom/

Производительность языков программирования и выбор языка для разработки ПО

Команда Facebook сделала оценку влияния на производительность используемых языков программирования и представила критику используемого в качестве уровня представления данных языка php. Чем ниже значение на графике, тем лучше.

Сама команда Facebook использовала в качестве уровня представления данных язык php в силу разных причин, начиная от “исторически сложилось” и заканчивая “легко писать”, “понятный интерфейс”, “Легко найти разработчиков”,…

Обзор интерпретируемых и компилируемых языков программирования

Некоторые языки преобразуется непосредственно в машинный код (прямые инструкции процессору) путем компиляции: Ассемблер, C,C++,Pascal.

Другие языки являются интерпретируемыми, то есть в процессе выполнения написанные на этих языках программы транслируются в машинный код. К интерпретируемым языкам программирования относятся Basic, JavaScript, Java и C#. Интерпретируемый язык обрабатывается во время выполнения. Каждая строка читается, анализируется, и выполняется. Обработка каждой команды в цикле требует время.

Из-за дополнительных накладных расходов на интерпретацию программы код выполняется между 5 – 10 раз медленнее, чем скомпилированный код. Интерпретированные языки, как Basic или JavaScript являются самыми медленными.

Их преимущество заключается в отсутствии необходимости перекомпилировать исходный код после любых изменений, что бывает очень удобно, когда вы только учитесь программировать.

Интерпретируемые программы очень легко остановить, изменить и вновь запустить приложение, написанное на интерпретируемом языке, и именно поэтому они популярны для обучения программированию.

Там не требуется этап компиляции. Компиляция может быть довольно медленным процессом.

Приложение на С++ с большоий визуализацией элементов может потребовать для компиляции от нескольких минут до нескольких часов.

Обратите внимание

Скомпилированные программы почти всегда будут работать быстрее, чем интерпретируемые, языки, такие как C и C++, как правило, самыми популярными для написания игр. Java и C# компилируются в интерпретируемый язык, который является очень эффективным.

Поскольку виртуальная машина, которая интерпретирует Java и.

NET Framework, который работает на C#, в большой степени оптимизирована, есть утверждение, что использование данных языков является высокопроизводительным, но все равно не так, как программы, написанные на языке С++.

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

Машинный код является языком с самым низким уровнем абстракции, Ассемблер находится прямо над ним. C++ выше, чем С, так как C++ обеспечивает большую абстракцию.

Java и C # еще выше, чем C++, потому что они компилируются в промежуточный язык, называемый байт-код.

Программы на Ассемблере самые быстрые по исполнению, но самые медленные по написанию.

Язык ассемблера считается читаемой версией машинного кода и выглядит следующим образом

Mov A,$45

Ассемблер привязан к конкретному ЦП или семейству родственных процессоров. Ассамблер требует много времени, чтобы научиться на нем писать.

Такие языки, как C-подобные, сократили потребность в Ассемблере как языке программирования, за исключением случаев, когда ОЗУ ограничено или  необходим критичными ко времени код.

Важно

Как правило, он используется в коде ядра операционной системы или в драйвере видеокарты.

Язык ассемблера является очень низко уровеневым. Большая часть кода просто перемещает значения между регистрами процессора и памяти.

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

Программист может думать в терминах предметной области (заработная плата, отчисления и начисления), а не аппаратных терминах (регистры, память и инструкции).

Язык С был разработан в начале 1970-х Деннисом Ритчи.

Его можно было рассматривать как полезный и мощный инструмент широкого круга мми стан, но в программ на языке С можно было легко допустить ошибки, через которые программы становились уязвимыми со стороны системы безопасности.

C является языком низкого уровня, и был описан как улучшение языка ассемблера. Синтаксис многих языков сценариев основан на С, например JavaScript, PHP и ActionScript.

Perl: сайты и утилиты. Очень популярны в мире Linux , Perl был одним из первых веб-языков и остается очень популярным сегодня. Он делает “быструю и грязную”  работу по программирование в Интернете.

Разработка сайтов с  помощью PHP. PHP был разработан как язык для веб-серверов и оказался очень популярен в сочетании с Linux , Apache, MySQL и PHP или LAMP для краткости.

Совет

Код PHP интерпретируется, но предварительно скомпилированный код выполняется достаточно быстро. Он широко используется для разработки веб-сайтов, но не так широко используется для разработки приложений для настольных компьютеров.

Разработан на основе синтаксиса C, также включает в себя объекты и классы.

Pascal Паскаль был разработан в качестве учебного языке за несколько лет до С, но был очень ограничен в обработке строк и файлов.

Некоторые производители расширили язык, но он не стал абсолютным лидером, пока Borland, Turbo Pascal (для DOS) и Delphi (для Windows) не появился.

Это были мощные реализации, которые добавили достаточно функций, чтобы сделать их пригодными для коммерческого развития. Однако Borland не выстоял против гораздо большей Microsoft и проиграл битву.

C++ – шикарный язык!
C++ или C+классы , как это было изначально объявлено, пришел около десяти лет после того, как  в C была успешно внедрена объектно-ориентированная модель программирования, а также функции, такие как исключения и шаблоны. Обучение C++ является большой задачей. Он, безусловно, самый сложный из языков программирования, но как только вы освоили его, вы не будете иметь никаких трудностей в освоении любого другого языка.

C# – Большая ставка от Microsoft
C# был создан по проекту архитектора Delphi Андерс Хейлсбергом, после того как он перешел разработчиком в Microsoft, который считал, что разработчики Delphi будет чувствовать себя как дома с такими функциями, как формы Windows.

C# синтаксис очень похож на Java, что не удивительно, так как Хейлсберг также работал на J++ после того как он переехал в Microsoft. Узнайте C#, и вы на пути к знанию Java.

Оба языка являются полу-компилируемыми, так как вместо компиляции в машинный код, они компилируются в байт-код (C# компилируется в CIL, что аналогично байт-коду) , а затем интерпретируются.

Обратите внимание

Javascript – Программы в вашем браузере. Javascript – язык сценариев на основе синтаксиса C, но с добавлением объектов, в основном используется в браузерах .

JavaScript интерпретируется намного медленнее, чем скомпилированный код, но работает хорошо в браузере.

Изобретенный Netscape он оказался очень успешным , и после нескольких лет упадка переживает новую жизнь благодаря AJAX ; Асинхронный JavaScript и XML. Он позволяет обновлять части веб-страниц без перерисовки всей страницы.

ActionScript –  кричащий язык! ActionScript является реализацией JavaScript , но существует только в приложениях Macromedia Flash. Позволяет использование векторных основ графики, используется в основном для игр, воспроизведения видео и других визуальных эффектов и для разработки сложных пользовательских интерфейсов, работающих в браузере.

Basic для начинающих. Универсальная символическая система команд была создана, чтобы научить программированию в 1960-х годах. Microsoft сделали язык самостоятельным, включая VbScript для веб-сайтов и очень успешного Visual Basic. В последней версии, что является VB.NET, работает на той же платформе. NET, как C# и производит тот же CIL байт-код.

Как сравнить языки программирования?

1. По быстроте компиляции

  • Ассемблер (Assembly)
  • C
  • C++
  • Pascal
  • C#
  • Java

    2. Быстро интерпретируемые языки

  • Perl
  • PHP

    3. Медленно интерпретируемые языки

  • JavaScript
  • ActionScript
  • Basic

Что сделали facebook для оптимизации работы php-кодов?

Для оптимизации работы своих приложений facebook разработала решение HipHop – транслятор исходного кода, превращающий исходный php код в высокооптимизированный код на С++, который затем использует компилятор  g++ для его компиляции.

HipHop решение включает в себя:- транслятор исходного кода;- альтернативную реализацию среды выполнения php;- множество наиболее распространенных расширений php, переписанных на С++ с целью увеличения производительности.

Ими же были разработаны решения HPHPi, экспериментальный интерпретатор PHP для отладки и быстрого прототипирования кода, и HHVM, экспериментальная виртуальная машина для исполнения и JIT оптимизации PHP-кода.

Важно

JIT-комиляция (Just In Time – точно во время) используется для увеличение скорости работы приложения за счет выполнения компиляции на лету байт-кода в машинный код за счет увеличения памяти для хранения результатов компиляции и затрат на время компиляции. Впервые JIT компиляция была использована в SmallTalk.

В языках программирования Java, PHP, C#, Lua, Perl, GNU CLISP исходный код транслируется в байт код.Java, JavaScript, .Net Framework, PyPy (реализация Python) используют JIT-компиляцию.

PHP, Ruby, Perl, Python используют неполную или ограниченную JIT-компиляцию.

Как работает механизм JIT на Java?

При запуске команды
> java MyNewCLass

запускается JVM (виртуальная машина Java), в которой происходит вызов процедуры загрузки классов с параметром MyNewCLass. Затем загруженный класс передается интерпретатору, который исполняет байт-код (инструкции виртуальной машине).

Если интерпретатор видит, что какаой-то метод используется часто, он вызывает JIT-компилятор, который транслирует методы в машинный код. Таким образом при исполнении программы используется смесь из интерпретируемых и транслируемых кодов.

Какой выбрать язык программирования для разработки?

Для оценки технических возможностей конкретных языков раммированприсутствует целый ряд нетехнических критериев, которые должны быть рассмотрены:

1.

Какой язык знают ваши разработчики?
2. Какими компетенциями обладают разработчики на местном рынке?
3.

Если вы аппаратная платформа уже выбрана, какой язык программирования хорошо поддерживается на этой платформе, или, наоборот, какоие ограничения платформы будут существенны для выбора языка программирования.ог
4.

Если выбрана база данных, какой язык программирования хорошо взаимодействует с этой базы данных, или, наоборот, как будет выбор языка ограничивать параметры выбора базы данных.
5.

Есть ли “стандартный язык “, используемый в вашей предметной области; наработанные функции, пакеты могут ограничивать ваш выбор языков.
6. Если вы планируете взаимодействовать с другим приложениями, на чем они написаны? Часто преимуществом является работа на одном языке программирования.
7. Оцените требование проекта с позиций скорости разработки, эффективности, надежности и гибкости. Можете оставить два из четырех критерия.

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

Источник: http://alfalavista.ru/idxfldr/2013-06-18-22-25-47/271-2014-02-11-16-52-54.html

Ссылка на основную публикацию
Adblock
detector