Таблицы имен при рекурсивном спуске с возвратами

| рубрика: Программирование | автор: st
Метки:

В заметке "Пишем транслятор" я сетовал на ситуации, когда грамматику не впихнуть в LL(n). В частности, это оборачивается необходимостью поддерживать транзакционность (!) добавления имен в таблицы имен.

Например, есть правило типа

p1 -> condition ; statement1
p1 -> condition ; statement11 statement2

statement1 -> statement EOL
statement11 -> statement ;
statement2 -> statement EOL

где EOL - конец строки …

Пишем транслятор или немного о Фортране

| рубрика: Программирование | автор: st
Метки:

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

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

Про интерфейсы или как не надо делать программы

| рубрика: Программирование | автор: st
Метки:

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

Начнем с недавней истории. Технология COM (позднее, другие, но суть та же) дала возможность разработчикам компонентов отделить интерфейсы от реализаций. Для прикладных разработчиков это означало, например, что при обновлении компонентов старые интерфейсы продолжали бы работать …

"Test drive" FreePascal/Lazarus

| рубрика: Программирование | автор: st
Метки: , ,

Тестировал FreePascal/Lazarus на предмет пригодности к профессиональной разработке. В качестве теста взял простенькое приложение из 3 компонентов (1 исполняемый модуль и 2 DLL-ки по принципу плагинов) с несложной обработкой XML внутри. Выводы.

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

Сколько места занимают таблицы?

| рубрика: Программирование | автор: st
Метки:

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

DECLARE @TableInfo TABLE (
    table_name sysname,
    row_count int,
    reserved_size_kb nvarchar(50),
    data_size_kb nvarchar(50),
    index_size_kb nvarchar(50),
    unused_size_kb nvarchar(50)
)

INSERT INTO @TableInfo
EXEC sp_MSforeachtable 'sp_spaceused ''?'''

UPDATE @TableInfo
SET
    data_size_kb     = replace(data_size_kb, 'KB', ''),
    reserved_size_kb = replace(reserved_size_kb, 'KB', ''),
    index_size_kb    = replace(index_size_kb, 'KB', ''),
    unused_size_kb …

SPM (SQL Programming Macroprocessor): создайте свой предметный язык

| рубрика: Программирование | автор: st
Метки: ,

Пример использования технологии представлен в статье "SQL и модульное тестирование".

Назначение

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

Работа с датами. SQL Server 2005

| рубрика: Программирование | автор: st
Метки:

Сюда складываю полезные функции и тонкие моменты при работе с датами на MS SQL Server.

BETWEEN - закрытый интервал

BETWEEN - закрытый интервал, но будьте вимательны со временем в датах...

SELECT *
FROM (
   SELECT '2008-02-03' AS d1
   UNION
   SELECT '2008-02-03 23:59:59' AS d1
   UNION
   SELECT '2008-02-04' AS d1
   UNION
   SELECT '2008-02-04 …

Случайная строка из таблицы. SQL Server 2005.

| рубрика: Программирование | автор: st
Метки:

Воспользуемся псевдослучайной последовательностью на основе механизма проекций (view) для выборки случайной строки из таблицы.

Проекция rand2 выдает новое случайное число в поле rand_value. Для выборки строки создадим еще одну проекцию:

CREATE VIEW random_row
AS
WITH t1_rows AS (
    SELECT id, row_number() OVER (order by id) as num FROM T1
)
SELECT id …

Псевдослучайная последовательность в SQL Server

| рубрика: Программирование | автор: st
Метки:

Использование встроенной функции rand() в запросах чревато проблемой получения последовательности одинаковых чисел. Например

CREATE TABLE T1 (id int);
GO

INSERT INTO T1
SELECT 1
UNION
SELECT 2
UNION
SELECT 3;

SELECT rand(), id FROM T1;

Выдает одинаковые значения

rand_value             id
---------------------- -----------
0,581556027773794      1
0,581556027773794      2
0,581556027773794      3

(3 …

Пронумеровать записи. Пример для MSSQL 2005

| рубрика: Программирование | автор: st
Метки:

Как пронумеровать записи в таблице в одном ее поле по порядку следования другого поля. Пример для MSSQL 2005.

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

UPDATE table1
SET field1 = T2.rownum
FROM table1 T1 INNER JOIN
    (SELECT ROW_NUMBER() OVER (ORDER BY field2 ASC) AS rownum, field2
        FROM table1 …