мая 6, 2012 | Published in Си и C++
Из серии:
- Введение в программирование на Си
- Переменные и типы данных в Си
- * Операторы, условия и циклы языка Си
Си включает в себя всего 3 цикла и 2 условных оператора. Набор арифметических операторов и операторов сравнения стандартен. В данной статье мы сначала бегло пробежимся по арифметическим операторам и операторам сравнения, а затем перейдем к изучению циклов и условий, в которых познакомимся с операторами еще более подробно. Операторы работы с бинарными данными мы рассмотрим в отдельной статье посвященной работе с битами и байтами.
Read the rest of this entry »
мая 2, 2012 | Published in Си и C++
Из серии:
- Введение в программирование на Си
- * Переменные и типы данных в Си
- Операторы, условия и циклы языка Си
Нужно быть полнейшим идиотом для того, чтобы не понять по заголовку о чем идет речь в статье. Очевидно, что читатели RubyDev в совершенстве адекватные люди с IQ не ниже среднего и достаточно широкими энциклопедическими знаниями и кругозором и потому с места мы сразу прыгаем в карьер минуя абсолютно бесполезное разлогое введение в тему статьи.
Переменные
Переменные — это именованные, понятные человеку ссылки на данные. Переменные в языке Си являются статическим и строготипизированными. На практике это проявляется в следующем:
- Переменная должна быть объявлена перед использованием.
- При объявлении переменной должен быть определен ее тип данных, а точнее тип данных, на который она ссылается.
- Тип данных переменной остается неизменным на протяжении всего выполнения программы.
- Переменная бронирует ячейку в памяти, которая соответствует указанному типу данных и не может эту ячейку как-либо расширить. По этой причине необходимо осторожно подбирать тип данных для того, чтобы быть уверенным, что памяти зарезервированной переменной хватит для сохранения данных.
Если сравнивать переменные Си и Ruby, то они весьма отличаются друг от друга. Например переменные в Ruby являются не статическими, но динамическими и не типизированными. Переменная в Ruby может ссылаться на любой тип данных и постоянно менять его. Это связано с тем, что в Ruby переменная не резервирует область памяти, а ссылается на объект в виртуальной таблице объектов. Визуально это можно представить себе как две таблицы, одна содержит два столбца, в одном хранятся все объекты (их данные), а в другом — идентификатор object_id. Во второй таблице у нас имеются также два столбца, в одном хранится object_id, а в другом имя переменной. Когда вы присваиваете переменной другое значение, то во второй таблице напротив имени переменной просто меняется object_id. В Си все совсем иначе. Переменная при объявлении захватывает область памяти, размер которой соответствует типу переменной, например 1 байт. Далее переменная ссылается на эту область данных, а вы можете помещать в нее любое значение.
Read the rest of this entry »
мая 2, 2012 | Published in Си и C++
Из серии:
- * Введение в программирование на Си
- Переменные и типы данных в Си
- Операторы, условия и циклы языка Си
Несмотря на название RubyDev старается охватить максимальное количество тем касающихся разработки. Одной из таких тем является программирование на языке Си. Си был выбран потому, что это достаточно популярный язык, который уже более 30 лет остается весьма актуальным. Кроме того, Си будет интересен программистам на Ruby тем, что на нем можно легко писать расширения ваших gem’ов или критические куски вашего приложения, где производительность крайне важна.
Мы не будем погружаться в исторический экскурс. Совершенно не важно знать кто и когда создал Си и почему. Это совершенно бесполезная информация для изучения Си и я зря потратил бы время пытаясь рассказать историю языка. С другой стороны важно знать, что Си является императивным (иначе говоря — процедурным) языком программирования. Как показала практика и исследования, процедурные языки совершили переворот в мире разработки, поскольку программы написанные на процедурных языках легче читать и поддерживать, чем программы написанные на функциональных языка.
Лично для меня Си — это такое увлечение, по факту я ничего серьезного на нем не писал — не было потребности, потому советую сильно не доверять всему, что здесь написано. В целях предотвращения священных кровопролитных войн касательно преимуществ императивной парадигмы над функциональной, замечу, что говоря об этом преимуществе я лишь цитировал классиков. Признаться честно, я также (в меньшей мере) увлекаюсь языками CommonLisp и Erlang, которые являются функциональными. Разумеется, в каждом языке имеются свои недостатки, преимущества и изюм — что-то, что делает его выделяющимся из подобных ему.
Read the rest of this entry »
октября 31, 2011 | Published in Си и C++
Объявление массива в Си
Массив (Array) относится к вторичным типам данных. Массив в Си представляет собой коллекция явно определенного размера элементов определенного типа. то есть в отличие от массивов в Ruby массивы в Си являются однотипными (хранят данные только одного типа) и имеют заранее определенную длину (размер).
В Си массивы можно грубо разделить на 2 типа: массив чисел и массив символов. Разумеется, такое деление абсолютно условное ведь символы — это также целые числа. Массивы символов также имеют несколько иной синтаксис. Ниже приведены примеры объявления массивов:
Read the rest of this entry »
октября 29, 2011 | Published in Си и C++
Почти в любом языке программирования данные обладают определенным типом. Типы данных необходимы для того, чтобы различать в наборе битов и байтов символы, числа и структуры данных. Кроме того, типы данных позволяют более рационально использовать память.
Первичные типы данных в Си включают в себя:
Целочисленные типы (integer)
Целочисленные типы используются для хранения чисел в диапазоне определяемом компилятором. Традиционно целые числа занимают 2 байта памяти и значения, которые относятся к типу int находятся в диапазоне от -32768 до +32767. Тип signed int (целое со знаком) использует один бит для хранения знака числа и 15 бит для хранения самого числа. Помимо канонического int, Си имеет еще 2 integer-типа данных:
- short int
- long int
Все три типа имеют как форму со знаком, так и беззнаковую форму (соотв. signed и unsigned). Short int обычно использует половину объема памяти int однако это не константное соотношение, например, в некоторых компиляторах int может занимать не 16 бит, а 32, а short int 16, а не 8. Тип long int обычно использует объем памяти в двое больший, чем int, то есть 4 байта, что опять-таки может изменяться в различных компиляторах. В signed-типах один бит всегда занимается хранением знака числа, в unsigned все биты занимаются исключительно хранением значения числа при этом unsigned-числа всегда считаются целыми.
Read the rest of this entry »
октября 29, 2011 | Published in Си и C++
Знакомство с языком Си мы начнем с написания простой программы «Hello, World!», которая будет заниматься печатью на экран сообщения «Hello, World!».
Язык Си относится к процедурным (императивным) языкам программирования, а значит программа на Си является ни чем иным, как описанием последовательности действий — алгоритма выполнения определенной задачи. Си обладает концепцией основной функцией программы, т.е. любая программа на Си должна содержать функцию main(). Функция main() как раз и занимается тем, что предоставляет алгоритм выполнения нашей программы без углубления в детали его работы. Детали работы алгоритма принято выносить в отдельные функции, а их, при необходимости, в библиотеки.
Первая программа:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return(0);
}
Read the rest of this entry »
февраля 5, 2011 | Published in Ruby, Основы, Расширения, Си и C++
Пишем расширение на Си для Ruby, ч. 1
Пишем расширение на Си для Ruby, ч. 2
Вчера на почтовый ящик мне пришло письмо от читателя блога RubyDev , к которому был приложен перевод понравившейся ему статьи авторства небезызвестного в Ruby сообществе (известного также под псевдонимом tenderlove). Большое спасибо Василию за приложенные усилия и за помощь!
А теперь собственно статья:
Мне нравится писать расширения для Ruby на C. В этом цикле статей мы разберемся, как это делать. Я раскрою такие темы, как создание рабочего окружения для написания расширения, TDD, отладку, взаимодействие со сборщиком мусора, кросс-компиляцию для windows и т.д.
К концу серии постов мы должны написать расширение, которое будет оберткой для libstree. libstree - это реализация суффиксного дерева на C.
В этой части мы подготовим все, что нам нужно для разработки, изучим шаблон обычного расширения на C и реализуем наш первый метод на C. Естественно, все это мы будем делать используя TDD и autotest.
Read the rest of this entry »