vbrus.narod.ru

Последнее обновление: 3 Ноября 2007 г.

Интересуетесь современными IT-технологиями? Заходите на специализированный портал посвященный IT-технологиям: rtportal.ru

 

Чтиво - программирование на Pascal

    00. История языка Паскаль
    01. Программа Hello World на Pascal
    02. Является ли число степенью двойки?- Pascal
    03. Является ли число степенью i(любого числа)? - Pascal
    04. Возведение в степень(положительные числа) - Pascal
    05. Как возвести (-1) в степень N? - Pascal
    06. Вычитание двоичных чисел с использованием строк. - Pascal
    07. Перемножение двоичных чисел с использованием строк. - Pascal
    08. Как вычислить арксинус аргумента?. - Pascal
    09. Как вычислить арккосинус аргумента?. - Pascal
    10. Как проверить простое ли число?. - Pascal
    11. Как скопировать файл?. - Pascal
    12. Как Включить/Выключить Курсор. - Pascal
    13. Как найти файлы на ВСЕХ дисках. - Pascal
    14. ПРОЦЕДУРЫ И ФУНКЦИИ С ПРИМЕРАМИ - Pascal
    15. Процедуры и функции для работы с файлами - Pascal
    16. ОДНОМЕРНЫЕ И ДВУМЕРНЫЕ МАССИВЫ - Pascal
    17. Работа с графикой в языке программирования Turbo Pascal
    19. Характеристика и особенности языка, основы языка, структура программы, операторы языка, простые и структурные типы данных, модули, файлы и куча другого :)
    20. ОБРАБОТКА МАТРИЦ
    21. Создание библиотек подпрограмм в Turbo Pascal
    22. Как определить сколько слов и сколько цифр в указанном текстовом файле - Pascal
    23. Как определить сколько раз встречается самое длинное слово указанном текстовом файле - Pascal
    24. Как найти строку в текстовом файле в Паскаль - Pascal
    25. Нахождение НОД и НОК. - Pascal
    28. Как преобразовать из Integer в String - Pascal
    29. Как преобразовать из String в Integer - Pascal
    30. Работа с дробями, Сокращение, Сложение, Вычитание, Умножение, Деление. - Pascal
    31. Вычисление произведения 2х(двух) квадратных матриц - Pascal
    32. Транспортировка матрицы - Pascal
    33. Как прочитать нажатия функциональных клавиш (Ctrl, Alt, Shift и.т.д.) - Pascal
    34. Как узнать состояние клавиш Shift, Alt, Ctrl, Num Lock, Caps Lock, Scroll Lock и искусственно переключать их? - Pascal
    35. Что быстpее: INC(X) или все таки X:=X+1; ? - Pascal
    36. Как сделать русские буквы заглавными. ? - Pascal
    37. Как написать программу которая выводит таблицу умножения? - Pascal
    38. Обмен значений двух переменных без использования третьей - Pascal
    39. Как написать электронные часы - Pascal
    40. Модуль Timer для Паскаля и не только - Pascal
    41. Как запустить внешний файл в Pascal'е?(как запустить другую программу из Паскаля) - Pascal
    42. Методы сортировки массива(Ранжирование) в Паскале - Pascal
    43. Как быстро очистить экран не используя модуль CRT? - Pascal
    44. Как убрать мигающий курсор в текстовом режиме? - Pascal
    45. Как сделать фиксированную задержку, вместо Delay()? - Pascal
    46. Сортировка(ранжирование) массива самым быстрым способом - Pascal
    47. Как вывести строку на экран не используя встроенные функции Write/writeln - Pascal
    48. Работа с графикой, рисование линий - Pascal
    49. Заполнить весь экран сердечками - Pascal

 

01. Программа Hello Word на Pascal

    Program Hello_World;
    begin
    Writeln('Здраствуй Мир!');
    Readln;
    End.
    Наверх

02. Является ли число степенью двойки? - Pascal

    Function is_power_2(x: Word): Boolean;
    Begin
    is_power_2 := (x > 0) and ((x and Pred(x)) = 0)
    End;
    var N:integer;
    begin
    Writeln('Введите число');
    Readln(N);
    if is_power_2(N)=TRUE then
    Writeln('Число является степенью 2')
    Else
    Writeln('Не я вляется степенью 2');
    Readln;
    End.

    -----------------------------------------------------------------
    Function is_power_2(x: Word): Boolean;
    Begin
    is_power_2 := ((x and Pred(x)) = 0)
    End;

    взято с: http://volvo71.narod.ru/faq_folder/math.htm

    Наверх

03. Является ли число степенью I(любого числа)? - Pascal

    var i,r:integer;
    begin
    Writeln('Введите число которое мы будем проверять на степень');
    readln(r);
    Writeln('На какую степень мы будем проверять?');
    readln(i);
    r:=abs(r);
    while (r>=i) do
    begin
    if r=i then write(', является степенью ',i);
    r := r div i;
    end;
    readln;
    end.

    Наверх

04. Возведение в степень(положительные числа) - Pascal

    Function Step(X,Y:real):real;
    begin
    Step:=Exp(ln(X)*Y);
    End;
    var x,y:real;
    Begin
    Writeln('Введите X и Y, X - Число которое надо возвести. Y - Степень.');
    Readln(x);
    Readln(y);
    Writeln(Step(x,y));
    Readln;
    End.
    Наверх

05. Как возвести (-1) в степень N? - Pascal

    Способ xa = Exp(a*Ln(x)) не подходит, т.к. для вычисления по этой формуле основание степени x должно быть положительным. Используем функцию:
    Function minusOnePower(n: Integer): Integer;
    Begin
    minusOnePower := (1 - 2*Byte(Odd(n)));
    End;
    Наверх

06. Вычитание двоичных чисел с использованием строк. - Pascal

    function IntToBin(bin: longint): string;
    var
    bin_s: string;
    begin
    bin_s := '';
    if bin = 0 then bin_s := '0'
    else
    while bin <> 0 do begin
    if (bin and 1) = 1 then
    bin_s := '1' + bin_s
    else bin_s := '0' + bin_s;

    bin := bin shr 1;
    end;
    IntToBin := bin_s
    end;

    function BinToInt(bin_s: string): longint;
    var
    bin, mult: longint;
    i: integer;
    begin
    mult := 1; bin := 0;
    for i := length(bin_s) downto 1 do
    begin
    if bin_s = '1' then bin := bin + mult;
    mult := mult shl 1;
    end;
    BinToInt := bin
    end;

    var
    BO, BT: string;

    begin
    write('Введите первое число : ');
    readln(BO);
    write('Введите второе число : ');
    readln(BT);

    writeln( 'Результат: ', IntToBin(BinToInt(BO)-BinToInt(BT)) )
    end.
    Наверх

07. Перемножение двоичных чисел с использованием строк. - Pascal

    { Дополнительная функция, реализующая сложение двоичных чисел }
    function add_binary(s1, s2: string): string;
    var
    T, z: string;
    i: byte; shift: char;
    begin
    { Для удобства будем считать первой строкой более длинную строку... }
    if length(s1) < length(s2) then
    { Если же длиннее вторая строка, то меняем ее местами с первой }
    begin T := s1; s1 := s2; s2 := T end;

    T := '';
    { Дополняем короткую строку спереди нулями (если необходимо) }
    for i := 1 to length(s1) - length(s2) do
    s2 := '0' + s2;

    { переменная содержит "сдвиг" }
    shift := '0';

    { проходим по всей строке (с конца в начало) и выполняем "побитное"
    сложение строк с учетом сдвига }
    for i := length(s1) downto 1 do
    begin
    { z содержит тройку значений: (1, 2) - очередные "биты" строк
    (3) - сдвиг }
    z := s1 + s2 + shift;

    { проверяем все возможные комбинации "троек" и добавляем
    к результирующей строке спереди соответствующий "бит"
    (не забываем учитывать и изменять значение сдвига) }
    if z = '000' then T := '0' + T;

    if (z = '001') or (z = '010') or (z = '100') then
    begin
    T := '1' + T;
    shift := '0'
    end;

    if (z = '101') or (z = '011') or (z = '110') then
    begin
    T := '0' + T;
    shift := '1'
    end;

    if z = '111' then
    begin
    T := '1' + T;
    shift := '1'
    end;
    end;

    { если есть необходимость, добавляем "сдвиговый" "бит" к строке }
    if (shift = '1') then
    T := '1' + T;

    { и возвращаем результат - двоичную сумму строк s1 и s2 }
    add_binary := T
    end;

    const
    n = 4;

    { константы для проверки работоспособности...
    s1: string = '0111';
    s2: string = '0010';
    }
    result: string = '0';

    var
    i, j: byte;
    s1, s2, toadd: string;
    begin
    Write( 'Введите первое число: ' ); ReadLn(s1);
    Write( 'Введите второе число: ' ); ReadLn(s2);

    for i := 1 to n do
    begin
    { 1-я строка содержит в последнем бите 1 }
    if s2[ length(s2) ] = '1' then
    begin
    { для промежуточного результата нам необходимо значение
    второй строки... }
    toadd := s1;

    { ... сдвинутое на количество бит, соответствующее позиции
    единицы в 1-ой строке }
    for j := 1 to pred(i) do
    toadd := toadd + '0';

    { добавляем промежуточный результат к окончательному }
    result := add_binary(result, toadd)
    end;

    { по окончании обработки очередного бита 1-ой строки удаляем его... }
    delete(s2, length(s2), 1)
    end;

    { удаляем лидирующие (незначащие) нули из результата }
    while result[1] = '0' do
    delete(result, 1, 1);

    { печатаем результат }
    writeln( 'result = ', result );
    readln;
    end.
    Наверх

08. Как вычислить арксинус аргумента?. - Pascal

    Function ArcSin(x: Real): Real;
    Begin
    If Abs(x) = 1 Then ArcSin := 0
    Else ArcSin := ArcTan( x / Sqrt(1 - Sqr(x)) )
    End;
    Наверх

09.Как вычислить арккосинус аргумента?. - Pascal

    Function ArcCos(x: Real): Real;
    Begin
    If x = 0 Then ArcCos := Pi/2
    Else ArcCos := ArcTan(Sqrt(1 - Sqr(x)) / x) + Pi * Byte(x < 0)
    End;
    Наверх

10.Как проверить простое ли число?. - Pascal

    function isPrime(X: word): boolean;
    var
    i: integer;
    Begin
    isPrime:=false;
    for i:=2 to sqrt(x) do
    if x mod i = 0 then Exit;
    isPrime:=true;
    End;
    Наверх

11.Как скопировать файл?. - Pascal

    A:> Читать его в буфер через BlockWrite, а затем записывать через
    BlockWrite. Hапример:

    procedure FileCopy(fileFrom, fileTo: string);
    var
    f1,f2:file;
    p:pointer;
    rb:word;
    Begin
    Assign(f1,fs); FileMode:=0; Reset(f1,1);
    Assign(f2,fd); ReWrite(f1,1);
    GetMem(p,32768);
    If p=nil then begin WriteLn('Not enough memory !'); Halt; end;
    Repeat
    BlockRead(f1,p^,32768,rb);
    BlockWrite(f2,p^,rb);
    Until rb<>32768;
    FreeMem(p,32768);
    Close(f2); Close(f1);
    End;

    Наверх

12.Как Включить/Выключить Курсор. - Pascal

    Две процедуры для отключения и восстановления курсора на экране.

    Q:> А как убрать курсор в текстовом режиме?
    A:
    procedure CursorOff; assembler;
    asm
    mov ah,1
    mov cx,2020h {Убрать мерцание за пределы знакоместа}
    int 10h
    end;

    Q:> А как его потом обратно включить?
    A:
    procedure CursorOn; assembler;
    asm
    mov ah,1
    mov cx,0607h {Установить мерцание 6й и 7й строк}
    int 10h
    end;
    Наверх

13. Как найти файлы на ВСЕХ дисках. - Pascal

    Uses DOS,CRT;
    var
    Stop:boolean;
    Procedure FileFind(Dir,FindName : PathStr);
    Procedure SearchDir(Dir : PathStr);
    Var
    SRec : SearchRec;
    i:integer;
    begin
    if Stop then Exit;
    if Dir[Length(Dir)] <> '\' then Dir := Dir+'\';
    ClrEol;
    Write(Dir,#13);
    if KeyPressed then Stop := ReadKey = #27;

    FindFirst(Dir + FindName, AnyFile, SRec);
    While DosError = 0 do
    begin
    With SRec do
    if Attr and (VolumeID + Directory) = 0 then
    WriteLn(Dir + Name);
    FindNext(SRec);
    end;

    FindFirst(Dir+'*.*', $17, SRec);
    While DosError = 0 do
    begin
    With SRec do
    if (Attr and Directory <> 0) and (Name[1] <> '.') then
    SearchDir(Dir+Name);
    FindNext(SRec);
    end;
    end;
    begin
    Stop:=False;
    SearchDir(Dir);
    end;

    function GetCurDrive: Char;
    var
    r: Registers;
    begin
    r.ah := $19;
    MSDOS(r);
    GetCurDrive := Char(r.al + $41);
    end;

    procedure SetCurDrive(Drive: Char);
    var
    r: Registers;
    begin
    r.ah := $0E;
    r.dl := Byte(Drive) - $41;
    MSDOS(r);
    end;

    procedure WalkDrives(Name : String);
    var
    SaveDrive, Drive, Ch: Char;
    begin
    if Pos('.', Name) = 0 then Name := Name + '*.*';
    SaveDrive := GetCurDrive;
    for Ch := 'C' to 'Z' do
    begin
    SetCurDrive(Ch);
    Drive := GetCurDrive;
    if Drive = Ch then
    begin
    FileFind(Drive + ':\',Name);
    if Stop then Break;
    end;
    end;
    SetCurDrive(SaveDrive);
    end;

    begin
    FileFind('C:','*.bak'); {search *.bak in C:}
    WalkDrives('*.pas'); {search *.pas in all drives}
    end.
    Наверх

00. История языка Паскаль. - Pascal

    Рождение

    В 1971 г., в первом номере журнала Acta Informatica было опубликовано первое описание языка. Автором этого технического отчёта является - Никлаус Вирт, на тот момент профессор Швейцарского федерального технологического института ETH (Eidgenoessische Technische Hochschule).



    Вирт, во многом стал известен именно благодаря появлению Паскаля. Анализируя его последующие проекты – можно открыть главный секрет Никлауса: “Ключ к тайнам компьютеров — в гармонии математики, инженерии и программирования”. И если подойти к делу c необходимыми знаниями, то можно реализовать языки, операционные системы и даже создать компьютеры, превосходящие промышленные образцы, силами обычных студентов.

    Паскаль нередко противопоставляют другому языку — Си. Но вот что сказал в присутствии Вирта по этому поводу Деннис Ритчи, автор Си (1993): «Я утверждаю, что Паскаль очень близок языку Си. Одни, быть может, этому удивятся, другие — нет... Даже интересно, насколько они близки друг другу. Эти языки больше расходятся в деталях, но в основе своей одинаковы. Если вы взглянете на используемые типы данных, а также на операции над типами, то обнаружите очень большую степень совпадения... И это несмотря на то, что намерения Вирта при создании Паскаля весьма отличались от наших в языке Си. Он создавал язык для обучения, а потому преследовал дидактические цели. И, как я заметил это по Паскалю и по его более поздним языкам, Вирт был во власти своего стремления ограничить выразительные средства как можно сильнее...»

    Да, Паскаль, в отличие от Си, изначально не создавался как язык системного программирования. Во имя простоты и эффективности на том уровне понимания программирования Вирт сознательно пошел на заведомое ограничение возможностей языка, прежде всего в отношении общения с внешним миром (ввод-вывод и системно-зависимые средства). Все же думать, что Паскаль — язык исключительно для преподавания, было бы неверно. Послушаем на этот счет мнение самого Вирта (1984): «Утверждалось, что Паскаль был разработан в качестве языка для обучения. Хотя это утверждение справедливо, но его использование при обучении не являлось единственной целью. На самом деле я не верю в успешность применения во время обучения таких инструментов и методик, которые нельзя использовать при решении каких-то практических задач. По сегодняшним меркам Паскаль обладал явными недостатками при программировании больших систем, но 15 лет назад он представлял собой разумный компромисс между тем, что было желательно, и тем, что было эффективно».

    Противостояние Си и Паскаля

    Языки Паскаль и Си во многом определили пути развития программирования в конце XX столетия. Их противостояние напомнило романтическую эпоху 60-х годов, когда сторонники Фортрана и Алгола-60 также оказались по разные стороны баррикад.

    При всем уважении к таким масштабным языкам, как Кобол, ПЛ/1 и Алгол-68, господствовавшим в 70-е годы, столь явно выраженную борьбу людей и идей нам удалось наблюдать лишь в 80-е (Паскаль и Си) и в самом конце 90-х годов — Си++ и Java.

    Можно назвать как минимум три десятка языков, которые сыграли заметную роль в развитии программирования, но все же именно эти три пары — Алгол-60 и Фортран, Паскаль и Си, Java и Си++ — стали самыми яркими, самыми заметными на компьютерном небосклоне.

    Кто - то назовёт это, субъективным мнением, но в определенные моменты эволюции можно было наблюдать едва ли не безоговорочное господство того или иного языка, что тут же отражалось на требованиях промышленности, на составлении учебных планов в вузах и университетах. В 70-е годы на пике популярности среди универсальных языков был Фортран, в 80-е — Паскаль, в 90-е годы — Си++. Intel до сих пор выпускает компиляторы Фортран, наравне с компилятором Си++ - из этого можно сделать вывод, что языки не умирают, а эволюционируют, иногда даже в результате эволюции рождается новый язык.

    Рассматривая абстрактно все языки программирования можно выделить их главную цель - упорядочивание наборов знаков и символов. Первым держать курс на традиционную и устоявшуюся математическую символику предложил Х. Рутисхаузер (1952), ставший родоначальником идеи языков программирования и одним из авторов языка Алгол-60. Широкое распространение и применение его идеи получили лишь в 1957 г., после того, как корпорация IBM опубликовала описание языка Фортран и реализовала для него компилятор, транслировавший программы в машинный код. По сути, с этого момента и началась эпоха языков программирования.

    Если взглянуть на историю языков с точки зрения географии их создания, то несложно заметить, что две ныне самые известные ветви генеалогического древа — Паскаль и Си, давшие жизнь многим своим потомкам, являются яркими представителями европейской и американской школ. При этом в Старом Свете архитекторы языков активно используют наработки американских исследовательских центров и лабораторий, а представители Нового Света стараются обогащаться идеями европейских специалистов (Швейцария, Норвегия, Англия, Дания). Европейская школа чаще ратует за чистоту и компактность своих языков программирования, тогда как заокеанская не в силах избежать сумбурного включения новомодных решений. Отчасти можно сравнить языки программирования с обычными разговорными языками - консерватизм французского языка против заимствований английского в его американском диалекте. Так и в Паскале – переменные можно определить только в определённых местах, а при использовании процедуры класса, класс загружается полностью. В Си ++, переменную можно определить в любом месте, а при использовании процедуры класса – весь класс не загружается, поэтому иногда очень трудно разобраться в исходном “запутанном” коде и протестировать программу на Си++.

    Первый компилятор Паскаля - ETH Pascal и P-код

    Первый компилятор Паскаля (ETH Pascal (по названию института)) был написан в 1970 г. Первое официальное описание Паскаля с изложением синтаксиса и семантики было опубликовано Виртом в конце 1970 г. Новая версия языка вышла в свет в 1972 г. Тогда же Вирт и его английский коллега Чарльз Энтони Хоар (Charles Anthony Richard Hoare) выпустили аксиоматическое описание Паскаля.

    «Наш первый компилятор Паскаля был реализован на семействе компьютеров CDC-6000 и написан на самом Паскале. Никакого PL6000 не потребовалось, и я рассматривал это как существенный шаг вперед», — вспоминает Вирт. Несуществующий язык PL6000 Вирт упомянул в связи с тем, что несколькими годами раньше для эффективной реализации компилятора языка Algol-W на компьютере IBM/360 ему понадобилось разработать низкоуровневый язык PL360. Теперь же в этом необходимости не было.

    Почему был выбран именно компьютер фирмы Control Data Corporation? Ответ прост: к тому моменту в ETH активно использовались именно эти машины, а выбор языков на них был более чем скромным: ассемблер или Фортран. Конкурировать с Фортраном в эффективности на этой платформе было непросто, ведь набор команд CDC-6000 создавался с прицелом именно на реализацию Фортрана.

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

    Вторая попытка создать компилятор началась с того, что он сразу формулировался на самом Паскале (в соответствии с описанием 1970 г.). Синтаксический анализ нового однопроходного компилятора осуществлялся методом рекурсивного спуска. Теперь в команду разработчиков вошли У. Амман, Э. Мармье и Р. Шилд. После того как компилятор был написан на еще не существующем языке, Шилд был отправлен к себе домой на две недели, где все это время он вручную транслировал программу во вспомогательный низкоуровневый язык, доступный на CDC-6000. Итак, в середине 1970 г. компилятор ETH Pascal был готов.

    ETH Pascal был интересен не только тем, что стал одной из первых реализаций языков высокого уровня на самом себе, примерно на два года опередив компилятор Си. В ходе работ над ним в 1973 г. была придумана абстрактная Pascal-машина (P-машина), исполняющая специальный P-код. Чтобы решить проблему переноса компилятора Паскаля на разные платформы, Вирт решил воспользоваться испытанными временем методами интерпретации. Из наиболее известных решений, предшествовавших P-коду, можно назвать реализацию языка Snobol-4 (Р. Грисуолд, 1967), где в качестве кода абстрактной машины использовался язык SIL (System Implementation Language).

    Как известно, введение виртуальной (абстрактной) машины Java преподносилось ее разработчиками из Sun Labs едва ли как не фундаментальное открытие в практике языков программирования. Один из учеников Вирта, Михаэль Франц, заметил по этому поводу следующее: «Переносимость Java основана на наличии виртуальной машины, позволяющей легко имитировать большое число архитектур. Идея виртуальной машины была очень популярна уже более двадцати лет назад, хотя впоследствии о ней забыли. Тогда речь шла о Pascal-P — созданной в ETH реализации Паскаля, которая сыграла решающую роль в распространении этого языка. Интересно, что виртуальные машины для Паскаля и Java весьма схожи по архитектуре: в обеих используются однобайтовые инструкции без адресов (операнды помещаются в стек)».

    Идеи P-кода нашли применение не только в платформах Java и NET, не только в других языках и машинах баз данных, но и в реализации аппаратных средств. Например, для непосредственного исполнения P-кода в Western Digital в 1979 г. был разработан специальный набор WD9000 P-Engine. В Стэнфордском университете в 1980 г. был создан экспериментальный процессор POMP. Появившаяся в 1978 г. коммерческая реализация Паскаля — UCSD Pascal стала еще более известной, и многие забыли, где же впервые возникли P-код и P-машина. Вот что говорит об этом Вирт: «После того как стало известно о существовании Паскаля, несколько человек попросили нас помочь в его реализации на различных машинах, подчеркивая, что они намерены использовать его для обучения и что быстродействие для них не имеет первостепенного значения. После этого мы решили создать версию компилятора, которая генерировала бы код для машины нашей собственной конструкции. Позднее этот код стал известен как P-код... Pascal-P оказался исключительно удачным языком для распространения среди большого числа пользователей. И если бы у нас хватило мудрости предвидеть масштабы такого развития событий, то мы приложили бы больше усилий и тщательности при разработке и документировании P-кода».

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

    Третья попытка реализации в ETH компилятора Паскаля, ставшего впоследствии известным под названием P2, была предпринята учеником Вирта Урсом Амманом; в 1974 г. она завершилась успехом. Благодаря высокому качеству Р2 получил широкое распространение в университетах и компаниях.

    Начало коммерческого распространения - UCSD Pascal

    В 1975 г. профессор Кеннет Боулес, работавший в Университете Калифорнии в Сан-Диего (University of California at San Diego — UCSD), получил из Цюриха P-инструментарий, который вместе с компилятором P2 и был положен в основу UCSD Pascal. В Институте изучения информации калифорнийского университета Боулес вместе со Стефеном Франклином и Альфредом Борком занялись созданием системы программирования и операционной системы на базе Паскаля для микрокомпьютерных архитектур. В UCSD Pascal были внесены изменения как на уровне языка (в плане расширения и использования низкоуровневых вставок кода, в том числе и P-кода), так и на уровне P-машины. Она была переделана. Для эффективности использования Паскаля на разных компьютерах была включена дополнительная возможность генерирования машинного кода для нужной архитектуры сразу после получения P-кода. Весьма значительным усовершенствованием языка в UCSD Pascal стало введение unit-блоков, необходимых для поддержки раздельной компиляции. Впоследствии они были унаследованы в языке Turbo Pascal.

    Интересно, что взята эта идея была из спецификаций языка Ада, которые к тому моменту подходили к своему завершению. В то же время сам Вирт из языка Mesa позаимствовал куда более совершенную конструкцию, ввел ее в Модулу-2 и назвал «модулем» (module). Она и дала название новому языку Вирта Modula-2 (MODUlar LAnguage).

    За три года команда Боулеса разработала законченную систему, в которую вошли текстовый редактор, файловая система, а также отладчик. По сравнению с тем режимом работы, к которому уже привыкли пользователи больших машин (ввод программ и данных с перфолент и перфокарт, а также упрощенный терминальный ввод-вывод), это был огромный шаг вперед. Появился прообраз того, что сегодня называют IDE-средой (интегрированной средой разработки). UCSD Pascal стала прародительницей системы Turbo Pascal, добившейся небывалой популярности.

    Что касается UCSD Pascal, то эта реализация для Паскаля означала серьезный прорыв: благодаря Боулесу сфера применения языка значительно расширилась, что, в свою очередь, дало заметный импульс развитию микрокомпьютерной революции.

    Разработкой UCSD Pascal, сумевшей стать законченным коммерческим продуктом, заинтересовались многие компании. Причем их внимание привлекла и перспективная P-машина, на которую UCSD продал немало лицензий. В качестве одного из примеров можно привести процессор ITS, созданный в Nippon Electric (1980) и предназначенный для исполнения P-кода UCSD Pascal. Но и сейчас, в эпоху Java, интерес к UCSD-реализации не остыл. Так, в частности, английская компания Cabot International продает новые версии P-машины по лицензии UCSD. Это предлагается в качестве альтернативы для Java в области ТВ-приставок и бытовой электроники (интерактивное цифровое ТВ). Turbo Pascal

    Огромную роль в массовом распространении Паскаля сыграла компания Borland International. На основе идей UCSD Pascal она сумела создать знаменитую Turbo-среду разработки. Это был значительный шаг вперед в облегчении процесса программирования. Удобство визуальных средств в сочетании с тесной интеграцией инструментария стали для сотен тысяч программистов большим подспорьем.

    Правда, язык в исполнении Borland отдаленно напоминал то, что когда-то носило имя Паскаль. В Turbo-Borland-Object Pascal не язык стал определять реализацию, а наоборот. После того как деликатные вопросы изменения языка оказались уделом узкого круга лиц внутри одной компании, стало ясно, что рассчитывать на поддержку промышленностью не переносимого на другие платформы языка просто бессмысленно. В это время, уже существовали новые языки Вирта — Модула-2 и Оберон-2.

    Что касается Модулы-2, добившейся утверждения своего ISO-стандарта, то компилятор для этого языка (Turbo Modula-2) не только был создан в компании Borland (для CP/M), что весьма тщательно скрывается, но и поступил в продажу (в Северной Америке и Европе). Однако руководство компании (Филипп Кан) отказалось порождать собственного конкурента крайне успешному Turbo Pascal. Возмущенный вице-президент Borland Нильс Йенсен (один из основателей компании) вместе со своей командой разработчиков в 1987 г. ушел из Borland, выкупил права на Turbo Modula-2 и создал компанию JPI (Jensen & Partners International). В Англии ими под маркой TopSpeed была выпущена одна из лучших линеек компиляторов для процессоров семейства x86: Assembler, Modula-2, Pascal, C/C++, Ada.

    Turbo Pascal в исполнении Borland видоизменялся едва ли не с каждой версией среды разработки. В версии 3.0 появилась встроенная графика, в версии 4.0 — модули, в версии 5.5 — средства объектно-ориентированного программирования. Начиная с версии 7.0 Turbo Pascal был переименован в Borland Pascal (среда разработки), а с эволюцией языка Pascal в Object Pascal. Object Pascal — полностью объектно-ориентированный диалект языка Pascal, разработанный фирмой Borland. Начиная с Delphi 7 фирма Borland начала официально называть свой язык Delphi . Однако Object Pascal поддерживается и развивается другими разработчиками. Наиболее серьёзные реализации Object Pascal (помимо Delphi) — это TMT Pascal, Virtual Pascal и Free Pascal.

    В отношении языка Turbo Pascal Никлаус Вирт высказывается довольно дипломатично (1993): «Фактический стандарт для Паскаля был определен компанией Borland просто потому, что ими был создан компилятор, который распространялся широко и дешево. Borland расширяла Паскаль на протяжении ряда лет, и некоторые из этих нововведений были не столь хорошо интегрированы в язык, как мне бы того хотелось. Я был менее компромиссным в отношении собственных расширений и потому дал новому проекту иное имя (речь идет о языке Модула-2). Например, то, что Borland назвала UNIT, мы называли MODULE. Однако UNIT — это вставки в виде исходного текста, тогда как MODULE является отдельной единицей компиляции, которая допускает полный контроль типов и компоновку на этапе загрузки». На вопрос о том, какую бы оценку Вирт поставил Модуле-2, если исходить из того, что Фортран заслужил «2», а Паскаль — «5», он ответил: «6» (наивысший бал в школах Швейцарии).

    В тени марки Borland оказалось имя автора Turbo Pascal датчанина Андерса Хейльсберга. В 1983 г. Borland выкупила лицензию на компилятор Хейльсберга и приняла автора на работу. В ноябре того же года на рынке появился Turbo Pascal 1.0 для CP/M и компьютеров 8086. История сохранила даже данные о компактности той реализации: размер исполняемого .COM-файла компилятора составлял 33 Кбайт, а все файлы занимали 130 Кбайт. В январе 1989 г. Microsoft выпустила Quick Pascal, позиционировавшийся как конкурент Borland Pascal. Но он продержался недолго. Microsoft с Borland поделили рынок, разведя ветви Си и Паскаля еще дальше друг от друга.

    Что касается Хейльсберга, то он 13 лет проработал в компании и стал руководителем проекта Delphi. В октябре 1996 г. Андерса Хейльсберга за 3 млн. долл. приобрела корпорация Microsoft, и теперь он ведущий архитектор языков .NET, а также автор языка C#. (При разработке C#, по словам Хейльсберга, рассматривались Си++, Java, Модула-2, Smalltalk.)

    Borland после нескольких лет работы под вывеской Inprise, предпринимало активные шаги по укреплению позиций своего Паскаля в бурно развивающейся ОС Linux. Обеспечивая простоту миграции программ, созданных для Windows на Visual Basic и Object Pascal, в среду Linux под единым инструментарием Kylix. Но на 3 версии разработка Kylix была прекращена, а разработчики компилятора выделены в отдельную фирму - “CodeGear”.

    Особенности Паскаля и его преемники

    Язык Паскаль явился не просто ревизией Algol-W. Он создавался Виртом под воздействием идей Чарльза Энтони Хоара, опубликованных впоследствии в работе «Заметки по структуризации данных» (Hoare C.A.R. Notes on Data Structuring Academic Press, 1972). Вклад английского ученого в разработку языка был столь значителен, что его называют крестным отцом Паскаля.

    От языка Паскаль принято отсчитывать эпоху структурного программирования. Всё началось с того, что известный голландский специалист Эдсгер Дейкстра опубликовал статью «Структурное программирование» (Dijkstra E.W. Structured Programming // NATO Science Committee, 1969). В ней он предложил ограничить логику управления программы всего тремя формами: следованием (sequence), ветвлением (selection) и циклом (iteration). Из этого вытекало, что в языках Алгол и ПЛ/1 оператор безусловного перехода (goto) был уже попросту не нужен. Вирт, правда, не рискнул изъять его из Паскаля. Но главное было в другом: структурное программирование задавало нисходящий принцип разработки (пошаговая декомпозиция), предусматривало структурирование логики и данных, за счет простоты и математической основы повышало надежность программного обеспечения.

    «Почти все в программном обеспечении может быть реализовано, продано и даже использовано, если проявить достаточную настойчивость... Но существует одно качество, которое нельзя купить таким образом, — это надежность. Цена надежности — это погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить» — так Энтони Хоар определил для себя главный критерий, ставший доминантой и для Вирта.

    Взвешенный подход, простота и лаконичность — вот залог надежности. Вирт отмечает: «Поддержание языка максимально простым и регулярным всегда было приоритетом в моей работе: описание Паскаля занимало около 50 страниц, Модулы-2 — около 40, а Оберона — и вовсе 16. И я рассматриваю эту тенденцию как прогрессивную. Истинная ценность языков программирования зависит от качества и практичности их абстракций».

    Характеризуя замысел своего языка, Вирт пишет: «Главной инновацией Паскаля было введение вариативности структур и типов данных подобно тому, как Алгол ввел вариативность управляющих структур. Алгол предлагал только три базовых типа данных: целые и вещественные числа, значения истинности, массивы; Паскаль ввел дополнительные базовые типы и дал возможность определять новые базовые типы (перечисление, диапазоны), а также новые виды структурирования: запись, множество, файл (последовательность), часть которых была представлена в Коболе. Наиболее важной стала, конечно, рекурсивность структурных описаний и вытекающая из нее возможность осуществлять комбинирование и вложение структур».

    А что же говорили противники языка? Из всех критических работ по Паскалю, пожалуй, наибольшую известность получила статья Брайана Кернигана «Почему Паскаль не является моим любимым языком программирования». В 1981 г. она появилась на свет в виде препринта AT&T Bell Laboratories. Поскольку ряд авторитетных журналов отказались ее публиковать, она стала расходиться «нелегальными» путями. В широкой печати ей довелось выйти лишь в 1984 г. в сборнике «Comparing and Assessing Programming Languages» (Prentice-Hall, 1984).

    Как известно, Керниган вместе с Ритчи готовил подробное описание языка Си, а потому его мнение особенно интересно. Началось все с того, что Керниган решил адаптировать исходные тексты своей книги «Software Tools» с Си для Паскаля. К работе над примерами из книги, как пишет Керниган, он приступил весной 1980 г. и завершил ее лишь в январе 1981 г.

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

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

    Многие конкретные претензии сделаны по существу. Однако, по всей видимости, Керниган немного лукавил, говоря о недостатках Паскаля и умалчивая о работах Вирта, направленных на их устранение.

    Просчеты при создании Паскаля были устранены в последующих языках швейцарской школы (Вирта и его коллег). Все они четко следовали основным тенденциям развития технологии программирования. Программирование структурное (Паскаль), модульное (Модула-2), объектно-ориентированное (Оберон-2), компонентное (Component Pascal) — все это значительные шаги в индустрии программного обеспечения.

    «Наша конечная цель, — пишет Вирт, — расширяемое программирование (extensible programming). Под этим я понимаю возможность конструирования таких иерархий модулей, когда каждый модуль добавляет новую функциональность в систему. Расширяемое программирование подразумевает, что добавление модуля возможно без необходимости вносить какие-либо изменения в существующие модули — не должно быть необходимости даже их перекомпилировать. Новые модули не только добавляют новые процедуры, но, что более важно, добавляют также новые (расширенные) типы данных. Мы продемонстрировали практичность и экономичность этого подхода при проектировании Oberon System».

    Будущее Паскаля…

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

    В самом деле, противостояние двух лагерей — Си и Паскаля — все эти годы намеренно поощрялось. Между ними методично возводили высокую стену, а затем принялись уничтожать поодиночке. В лице UNIX язык Си нашел себе надежную защиту от чересчур агрессивных модернистов-реформаторов. У Паскаля же такого «панциря» не оказалось, но он продолжает свой путь благодаря преданности своих почитателей, которая подчас просто поражает.

    Смотря в будущее можно сказать – что будущее у Паскаля весьма перспективное. Существуют варианты компиляторов языка для разных платформ от Linux до Windows, а некоторые из них кросс платформенные – “Free pascal”.

    Free Pascal (полное название Free Pascal Compiler) — свободный компилятор языка программирования Pascal. Компилятор предназначен для различных платформ, в частности Linux, Windows, PowerPC SPARC и других. Важной особенностью данного компилятора, в отличие, например, от GNU Pascal, является ориентация на распространённые коммерческие диалекты языка: Object Pascal и Delphi. В настояще время в рамках проекта также разрабатывается Lazarus - свободный аналог среды программирования Delphi и Lazarus Components Library (LCL) - свободная библиотека виджетов, аналогичная Delphi VCL.

    В то же время самый популярная среда разработки Паскаля (под windows) является – “Delphi” (на сегодняшний момент – Delphi 2007). Delphi 2007 уже нельзя назвать компилятором - это скорее редактор программ. В нём вы с помощью диаграмм создаёте архитектуру программы и генерируете по ней исполняемый код, а множество компонентов поможет решить любую задачу при создании вашей программы с минимальным количеством написанных строк. Поэтому создание программ занимает минимальное количество времени. Используя компоненты, многие забывают, что Delphi позволяет программировать и на уровне API, а так же забывают об оптимизации и объектно-ориентированном подходе в своих программах.

    Биография Н. Вирта
    Профессор Никлаус Вирт (Niklaus K. Wirth), автор языка Паскаль, закончил Швейцарский федеральный технологический институт ETH (Eidgenoessische Technische Hochschule) в родном Цюрихе (1958). В Лавальском университете в Квебеке (Канада) он получил степень магистра (1960). В 1963 г. в Университете Калифорнии в Беркли (США) Вирт под руководством профессора Гарри Хаски реализовал расширение Алгола-60 (язык Euler) и защитил диссертацию. В 1963—1967 гг. Вирт преподавал в Стэнфордском университете (США). В это же время он был приглашен в международную экспертную группу IFIP Working Group 2.1, занимавшуюся проектированием языка Алгол-68.

    В 1967 г. Вирт вернулся на родину и стал доцентом Университета Цюриха. В 1968 г. он перешел в ETH, где занялся разработкой языка Паскаль. В 1970 г. был завершен первый компилятор Паскаля. В период 1978—1981 гг. Вирт возглавлял проект, в результате которого был разработан язык Модула-2, ориентированный на него 16-разрядный персональный компьютер Лилит (Lilith) и ОС Medos. Все ПО, включая системное, было полностью реализовано на Модуле-2. В 1984 г. Никлаус Вирт за большой вклад в развитие языков программирования и за создание персонального компьютера Лилит был удостоен премии Алана Тьюринга — самой престижной и почетной в компьютерном мире, которая по своему значению стоит в одном ряду с Нобелевской премией.

    В период 1986—1989 гг. Вирт вел проект по созданию нового языка Oberon, расширяемой объектно-ориентированной ОС Oberon и 32-разрядной рабочей станции Ceres. Многие идеи того проекта были положены сотрудниками Sun Labs в основу языка и технологии Java.

    С 1990 г. Вирт руководил Институтом компьютерных систем при ETH. В 1999 г. он ушел на заслуженный отдых и стал почетным профессором родного ETH.

    Стандарты Паскаля
    В 1977 г. во время конференции по Паскалю в Саутгемптоне Э. Эддиман попросил оказать помощь в формировании комитета по стандартизации при Британском институте стандартов BSI (British Standards Institute). В 1978 г. для обсуждения расширения Паскаля на конференции в Сан-Диего, проходившей под руководством Кеннета Боулеса, встретились представители промышленных кругов. С этого и началась стандартизация языка.

    В 1982 г. Международная организация по стандартизации (ISO) выпустила стандарт ISO 7185:1983. В это же время вышел американский стандарт ANSI/IEEE 770X3.97:1983. Принято выделять три принципиально разных стандарта: Unextended Pascal (исходный), Extended Pascal (расширенный) и Object-Oriented Extensions to Pascal (объектно-ориентированный). В 1989 г. стандарт ISO 7185:1983 был подкорректирован, после чего надобность в самостоятельном ANSI-стандарте отпала и он был заменен ссылкой на ISO 7185:1990. Одним из главных отличий Extended Pascal стало введение модульности, необходимой для раздельной компиляции. Extended Pascal закреплен в международном стандарте ISO/IEC 10206 (1991) и американском ANSI/IEEE 770X3.160:1989. В 1993 г. объектно-ориентированные расширения по отношению к Extended Pascal были сформулированы в техническом отчете ANSI/X3-TR-13:1994.

    Что касается самой распространенной реализации языка — Turbo Pascal, а также Object Pascal (Delphi), то ни одному из этих стандартов они не соответствуют. В свою очередь, они неявно сами задают соглашения, которым пытаются следовать некоторые реализации.
    Литература

    1. Мир ПК (04 – 2001) - Летопись языков Паскаль
    2. ru.wikipedia.org

    Наверх
Hosted by uCoz