Б С Бусигін - Прикладна інформатика - страница 52

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 

Ненужная, самодельная сложность порождает множество проблем.

Збделают нас посмешищем? К нашему сожалению, индустрия программирования сделала немного, чтобы помочь нам, преподавателям, преодолеть наши трудности.

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

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

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

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

новой дисциплиной том,    что    эта   долгосрочная порочность

постиндустриальной эры.        недостаточно признана. Однако

программирование как искусство

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

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

Порочный круг был однажды разорван, когда распространился Паскаль. При поддержке коллег-единомышленников и в упорном противостоянии рутинерам, Паскаль распространился в учебных заведениях и проник в индустрию. Это произошло, несмотря на могучую конкуренцию со стороны самой индустрии и других больших организаций, в соперничестве с языками PL/1, Алгол 6S и Ада. Однако наследники Паскаля, существенно его превосходившие, Модула-2 и Оберон, не получили должного внимания среди преподавателей, и сами пали перед лицом самого недостойного из соперников -

C.

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

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

И все же борьба с порочным кругом не совсем безнадежна. Мы указали на тех, кто должен возглавить атаку. Но как?

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

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

подняться до роли лидеров.

Збб

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

1. Начинаться сжатым введением в основные понятия программного проектирования.

2. Использовать лаконичную формальную нотацию, строго определенную не более чем на примерно 20 страницах.

3. Основываясь на этой нотации, вводятся основные понятия итерации, рекурсии, логического утверждения <аввегпоп> и инварианта.

4. Центральная тема - структурирование утверждений и типизация

данных.

5. За этим следуют концепции упрятывания информации, модульности и проектирование интерфейсов, продемонстрированные образцовыми примерами.

6. Книга устанавливает терминологию, которая столь же интуитивна, сколь и точна.

7. Книга имеет умеренный размер.

Позвольте мне заключить еще двумя замечаниями. Мой коллега, чьи слова

приведены в начале доклада, закончил так:

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

считаю первостепенными для информатики на ближайшие десятилетия.

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

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

решена.

Приветствие на открытии Конференции ITiCSE, Аархус (Дания), 24. 6. 2002

Перевод на русский язык: Ф.В.Ткачев, 4 июля 2002 г. Преподавание информатики: потерянная дорога (Никлаус Вирт)

Приветствие на открытии Международной конференции по преподаванию информатики ИЮБЕ г. Аархус (Дания), 24 июня 2002 г. http://www.inr.ac.ru/-info21/greetings/wirth_doklad_rus.htm

Додаток 2

Уведення у позиційні системи числення Д.2.1. Позиційні системи числення

Ми з Вами добре знайомі й звикли працювати з десятковою системою числення. Однак, при реалізації обчислень на комп'ютері фахівці зіштовхнулися з проблемою неможливості її технічної реалізації. Адже для відображення десяти стійких станів 0..9 вимагаються відповідні технічні рішення. Їх поки в природі не існує! Тому в комп'ютері повсюдно використовується тільки двійкова (рус. - двоичная) система числення. Це й зрозуміло, рішення лежать на поверхні: дві цифри "0" і "1" відобразити значно легше. Електричне реле може бути включено чи виключено, конденсатор -заряджений чи не заряджений, магнітний домен - поляризований чи ні, тригер знаходиться в стані "0" чи "1" і т.д. До речі, тригер - це основа конструкції всіх комп'ютерів.

Тригер - це послідовна електронна схема з двома станами, кожен з яких, за певних умов на входах схеми, підтримується постійним (тобто стабільним). Кожному з цих станів ставиться у відповідність логічне значення, що «зберігає» тригер. Таким чином, сукупний стан послідовної схеми, запам'ятовуючі властивості якої реалізовані на тригерах, являє собою просто комбінацію станів цих тригерів.

Тому, при введенні даних у комп'ютер у виді десяткових чисел вони автоматично перетворюються в їхній двійковий еквівалент, щоб їх було зручно представляти за допомогою тригерів. Разом із тим, користувачам, яким приходиться працювати з мовами програмування, а особливо з мовою Асемблера, необхідно добре уявляти собі процеси перетворення чисел з одних систем числення в іншу. Хоча двійкова система й забезпечує точне представлення чисел у пам'яті, проте з послідовністю тільки нулів та одиниць працювати дуже важко. Окрім того, зростає ймовірність робити помилки, оскільки при наборі числа виду "10110101" надзвичайно важко відстежити помилку при введенні.

Багато років тому програмісти переконалися, що у більшості випадків їм приходилося працювати не з окремими бітами, а з групами бітів. Перші мікропроцесори були 4-бітовими пристроями (вони обробляли по 4 біти за один прийом). Тому логічною альтернативою двійкової системі виявилася система, що оперувала четвірками бітів.

Як Вам відомо, чотирма бітами можна представити двійкове значення, від 0000 до 1111 (що еквівалентно десятковим значенням від 0 до 15), тобто усього 16 можливих комбінацій. Якщо в системі числення повинні бути позначені всі ці комбінації, то вона повинна мати 16 цифр. Така система числення називається шістнадцяткова (рос. - шестнадцатиричная). Із шістнадцяти цифр цієї системи числення перші 10 одержали позначення від 0 до 9 (десяткові значення від 0 до 9), а останні шість - від А до Б (десяткові значення від 10 до 15).

Необхідно уявляти собі, що звичайна десяткова система - це лише одна з багатьох позиційних систем числення. У цих системах використовується кінцевий набір різних символів. Кожен символ називається цифрою і позначає визначену кількість одиниць. Число різних символів у наборі називається основою системи числення. Якщо значення, що виражається, більше значення максимальної цифри в системі числення, то для його вираження використовується послідовний запис цифр цієї системи, який і утворює число. У залежності від конкретної позиції, яку кожна з цифр займає в числі, їй ставиться у відповідність ваговий множник, який дорівнює основі системи.

Розглянемо звичну для нас десяткову систему. У ній тільки 10 різних цифрових символів: 0, 1, ... 9. Тоді, наприклад, число 536,4 з урахуванням позиційності розташування цифр, виражається наступним поліномом:

5х102+3х101+6х100+4х10"1 .

Тут цифра 5 входить з вагою 100, цифра 3 - з вагою 10, цифра 6 - з вагою 1, а цифра 4 - з вагою 0,1.

Тоді в узагальненому виді, для будь-якої позиційної системи числення по деякій основі число може бути записано:

1Я=СІп-і СІп.2 ...Сії СІоСІСІ_2 ■ ■СІ-т . (2.1)

Виразу (1) буде відповідати поліном:

М=йп-іЬп1 +йп.2Ьп-2+... +й.тЬ~т. (2.2)

У цій загальній формі І - це цифри, які лежать у діапазоні 0<сіі<Ь; п -число цифр лівіше розділової, чи позиційної, крапки (у деяких випадках замість крапки використовується кома); т - число цифр правіше крапки, а Ь - основа системи числення. У таблиці 2.1 перелічені системи числення, що найбільш використовуються. Як правило, у системах з основою, меншою 10, як цифрові символи використовуються відповідні перші цифри десяткової системи; для систем же з основою, яка більше 10, використовуються десяткові цифри з додаванням перших букв латинського алфавіту. У таблиці 2.1 зазначена також відносна упорядкованість цифр у системах.

Таблица 2.1

Системи числення

Основа

Система числення

Цифрові символи

2

двійкова

0,1

3

трійкова

0,1,2

4

чотвіркова

0,1,2,3

5

п'ятіркова

0,1,2,3,4

8

вісімкова

0,1,2,3,4,5,6,7

10

десяткова

0,1,2,3,4,5,6,7,8,9

12

дванадцяткова

0,1,2,3,4,5,6,7,8,9,А,В

16

шістнадцяткова

0,1,2,3,4,5,6,7,8,9,А,В,САЕ,Б

Зі згаданих систем особливий інтерес при вивченні обчислювальної техніки становлять саме три системи - це двійкова, вісімкова (рос. ­восьмеричная) і шістнадцяткова. Запис деяких дробових чисел у цих системах виглядає у такий спосіб:

1011,1012

372,468 C65F,B3i6

За згодою десятковий індекс, що супроводжує число, указує основу системи числення. Індекс опускається, коли значення основи ясно з контексту.

Як і в десятковій системі, число представлене сукупністю виписаних поруч цифр (табл. 2.2). Дробова і ціла частини розташовуються відповідно праворуч і ліворуч від розділової коми. У випадку двійкової системи, цифри 0 і 1 називають бітами як скорочення від binary digits (двійкові цифри).

Таблиця 2.2

Перші 32 числа у двійковій, вісімковій і шістнадцятковій системах

та їхні десяткові еквіваленти

Десяткові

Двійкові

Вісімкові

Ші стнадцяткові

0

0

0

0

1

1

1

1

2

10

2

2

3

11

3

3

4

100

4

4

5

101

5

5

6

110

6

6

7

111

7

7

8

1000

10

8

9

1001

11

9

10

1010

12

A

11

1011

13

B

12

1100

14

C

13

1101

15

D

14

1110

16

E

15

1111

17

F

16

10000

20

10

17

10001

21

11

18

10010

22

12

19

10011

23

13

20

10100

24

14

21

10101

25

15

22

10110

26

16

23

1011

27

17

24

11000

30

18

25

11001

31

19

26

11010

32

1A

27

11011

33

1B

28

11100

34

1C

29

11101

35

1D

30

11110

36

1E

31

11111

37

1F

Д.2.2. Перетворення чисел з однієї системи числення в іншу

Будь-яке число може бути інтерпретовано відповідним поліномом по основі обраної системи числення (двійковій, вісімковій або шістнадцятковій і т.д. системах). При роботі з комп'ютерами часто доводиться переводити числа з однієї системи числення в іншу. Тоді вихідне число і переведене в нову систему числення - можна вважати еквівалентними представленнями однієї й тієї ж величини в різних системах числення.

Д.2.2.1. Переклад у десяткову систему чисел з не десяткової системи

Розглянемо етапи перетворення числа з не десяткової позиційної системи в еквівалентну десяткову форму. Таке перетворення легко виходить простим обчисленням значення полінома, що відповідає числу. Це обчислення можна, наприклад, виконати у такий спосіб:

1. Записуємо число у виді полінома

іп-і іп-2оі^]^і-т=іп-]Ьп-1+іп-2Ьп-2+^+іоЬ0+і-]Ь-1+^+і-тЬ-т,

де Ь - основа системи, виражена в десятковій формі, а і - цифри вихідної системи числення. Для тих систем, де цифри представляються буквами, останні при обчисленні заміняються на десяткові еквіваленти, наприклад 4=10, 5=11, С=12 і т.д.

2. Обчислюємо значення полінома, користуючись десятковою системою числення.

Для ілюстрації перекладу з двійкової системи в десяткову систему розглянемо двійкове число 1110,12. Записуючи його у виді полінома по ступіням основи 2, одержимо:

1110,12=1х23 + 1х22+1х21+0х2°+1х2-1 =1x8+1x4+1x2+0x1+1x0,5 =8+4+2+0+0,5 =14,5ю

Таким чином, 14,5 є десятковим еквівалентом двійкового числа 1110,1. Як інший приклад, перетворимо у десяткову систему шістнадцяткове число В3Б,416:

В3Б,416= Эх 162+3х 161+Бх 160+4х 16-1

= 13х162+3х161+15х160+4х16-1

= 13x256+3x16+15x1+4x0,0625

= 3328+48+15+0,25

=3391,25ю

Д.2.2.2. Переклад з десяткової системи в будь-яку позиційну систему

Переклад десяткового числа в еквівалентну форму в іншій системі числення більш складний. У процесі перетворення приходиться порізно трансформувати цілу і дробову частини даного числа.

Розглянемо спочатку перетворення цілого десяткового N[ у систему числення з основою b (b - ціле позитивне число). Оскільки число в системі з основою b можна записати у виді полінома по ступенях b, з відповідними коефіцієнтами, ми одержуємо:

N = dn-1b"-1  d„ 2b" 2 ...  d1b1 d0b0

dn-1bn-1 +dn-2bn-2+...+d1b1+ d0 ( . )

Тепер потрібно з (2.3) знайти цифри dn-1 ,...Ді, do , які задовольнять записаному рівнянню. Для цього розділимо обидві частини виразу на Ь. Одержимо цілу частку (2.4):

і залишок:

N' = dn-1bn-2 + ...d2b1+d1b0 (2.4)

Залишок pb-j = d0 (2.5)

Таким чином, залишок дорівнює молодшій цифрі числа в системі числення з основою Ь, тобто d0 . У результаті ділення, в залишку може виявитися більш однієї десяткової цифри, якщо Ь більше 10. Однак, оскільки залишок завжди менше Ь, то його значення буде відповідати цифрі d0.

Якщо процес ділення повторити для цілої частки ТУ', ми одержимо знову цілу частку

і залишок:

N" = dn-1bn-3  ...d:b" (2.6)

Залишок І Nl \ = d (2.7)

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 


Похожие статьи

Б С Бусигін - Прикладна інформатика