Scheme: відмінності між версіями

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
PipepBot (обговорення | внесок)
м робот змінив: hu:Scheme
Немає опису редагування
Рядок 1: Рядок 1:
{{Infobox programming language
'''Scheme''' — [[Мультипарадигмна мова програмування|мультипарадигмна мова програмування]], підтримує [[функціональне програмування|функціональну]] та [[Проецудрне програмування|процедурну]] [[Парадигма програмування|парадигми програмування]]. Словник мови можна розширювати засобами самої мови. Існують розширення, які додають підтримку [[Об’єктно-орієнтоване програмування|об'єктно-орієнтованої]], [[Декларативне програмування|декларативної]] і інших парадигм програмування. Є [[Діалект|діалектом]] [[Мова програмування|мови програмування]] [[Лісп]].
|name = Scheme
|logo = [[Image:Lambda lc.svg|100px]]
|paradigm = декілька
|year = 1970s
|designer = [[Гай Стіл]] та [[Джеральд Сассмен]]
|typing = сувора, динамічна
|dialects = [[T (мова програмування)|T]]
|implementations = [[PLT Scheme]], [[MIT/GNU Scheme]], [[Scheme 48]], [[Chicken (реалізація Scheme)|Chicken]], [[Gambit (реалізація Scheme)|Gambit]], [[GNU Guile|Guile]], [[Bigloo]], [[Chez Scheme]], [[STk]], [[STklos]], [[Larceny (реалізація Scheme)|Larceny]], [[SCM (Scheme implementation)|SCM]], [[Kawa]]
|influenced_by = [[Lisp]], [[Алгол]]
|influenced = [[Common Lisp]], [[JavaScript]], [[Ruby]], [[Dylan]]
}}
'''Scheme'''  [[Мультипарадигмна мова програмування|мультипарадигмна мова програмування]], підтримує [[функціональне програмування|функціональну]] та [[Проецудрне програмування|процедурну]] [[Парадигма програмування|парадигми програмування]]. Словник мови можна розширювати засобами самої мови. Існують розширення, які додають підтримку [[Об’єктно-орієнтоване програмування|об'єктно-орієнтованої]], [[Декларативне програмування|декларативної]] і інших парадигм програмування. Є [[Діалект|діалектом]] [[Мова програмування|мови програмування]] [[Лісп]].


== Історія створення ==
== Історія створення ==
Перше описання Scheme було написано в [[1975]] році. Творцями мови є [[Гай Стіл]] (Guy L. Steele) та [[Джеральд Сассмен]] (Gerald Jay Sussman) з Масачусетського Технологічного Інституту. В [[1981]] та [[1982]] роках почались три різних проекти по використанню Scheme для навчального процесу в університетах [[США]].
Перше описання Scheme було написано в [[1975]] році. Творцями мови є [[Гай Стіл]] ({{Guy L. Steele}}) та [[Джеральд Сассмен]] ({{lang-en|Gerald Jay Sussman}}) з Масачусетського Технологічного Інституту. В [[1981]] та [[1982]] роках почались три різних проекти по використанню Scheme для навчального процесу в університетах [[США]].


Остання версія описання стандарту мови програмування Scheme називається «Revised 5 Report on the Algorithmic Language Scheme».
Мова програмування Scheme визначається двома стандартами: стандартом де-юре в редації [[IEEE]], та стандартом де-фактор. Поточна версія описання стандарту де-факто має назву &laquo;Revised 5 Report on the Algorithmic Language Scheme&raquo;.<ref name="r5rs">{{cite journal
| author = Richard Kelsey, William Clinger, Jonathan Rees et al.
| month = August
| year = 1998
| title = Revised<sup>5</sup> Report on the Algorithmic Language Scheme
| url = http://www.schemers.org/Documents/Standards/R5RS/
| journal = Higher-Order and Symbolic Computation
| volume = 11
| issue = 1
| pages = 7-105
| doi = 10.1023/A:1010051815785
}}</ref> [[28 серпня]] [[2007]] року було затверджено наступну редакцію: '''R<sup>6</sup>RS'''<ref name="r6rs">{{cite web
| title = R6RS.org
| url = http://www.r6rs.org/
}}</ref>.


Основну увагу, при створенні діалекту, було приділено елегантності та концептуальній довершеності мови. Як наслідок, повна специфікація мови програмування [[Scheme (мова програмування)|Scheme]] вмістилася в 50 сторінок, в той час, як специфікація [[Common Lisp]] має розмір 1300 сторінок.
Основну увагу, при створенні діалекту, було приділено елегантності та концептуальній довершеності мови. Як наслідок, повна специфікація мови програмування [[Scheme (мова програмування)|Scheme]] вмістилася в 50 сторінок, в той час, як специфікація [[Common Lisp]] має розмір 1300 сторінок.
Рядок 11: Рядок 37:
Як і в [[Algol (мова програмування)|Алголі]], області видимості в Scheme статичні, кожне використання змінної відповідає лексично видимому значенню цієї змінної.
Як і в [[Algol (мова програмування)|Алголі]], області видимості в Scheme статичні, кожне використання змінної відповідає лексично видимому значенню цієї змінної.


Типи асоціюються із значеннями (об'єктами), а не із змінними. Іншими словами, Scheme &mdash; мова програмування із динамічною типізацією. Однак, існують діалекти Scheme із статичною типізацією.
Типи асоціюються із значеннями (об'єктами), а не із змінними. Іншими словами, Scheme&nbsp; мова програмування із [[Система типізації|динамічною типізацією]]. Однак, існують діалекти Scheme із статичною типізацією.


Всі об'єкти, які створюються під час виконання [[Програма|програми]], включаючи [[Процедура (програмування)|процедури]] та [[продовження]] існують до її завершення. Жоден із об'єктів не знищується. Однак, [[Інтерпретатор|інтерпретаторам]] та [[Компілятор|компіляторам]] Scheme дозволяється звільняти місце, зайняте об'єктом у випадку, якщо вони можуть довести що цей об'єкт в програмі більше не використовується. Цю задачу звільнення місця в пам'яті від невикористовуємих об'єктів виконує [[Прибиральник сміття (програмування)|прибиральник сміття]].
Всі об'єкти, які створюються під час виконання [[Програма|програми]], включаючи [[Процедура (програмування)|процедури]] та [[продовження]] існують до її завершення. Жоден із об'єктів не знищується. Однак, [[Інтерпретатор|інтерпретаторам]] та [[Компілятор|компіляторам]] Scheme дозволяється звільняти місце, зайняте об'єктом у випадку, якщо вони можуть довести що цей об'єкт в програмі більше не використовується. Цю задачу звільнення місця в пам'яті від невикористовуємих об'єктів виконує [[Прибирання сміття (в програмуванні)|прибиральник сміття]].


[[Процедура (програмування)|Процедури]] в Scheme є повноцінними об'єктами. Процедури можна створювати під час виконання програми, зберігати в структурах даних, повертати як результат роботи інших процедур, і так далі.
[[Процедура (програмування)|Процедури]] в Scheme є повноцінними об'єктами. Процедури можна створювати під час виконання програми, зберігати в структурах даних, повертати як результат роботи інших процедур, і так далі.
Рядок 19: Рядок 45:
Однією із відмінних рис Scheme є те, що [[продовження]] також мають статус звичайних об'єктів. Продовження корисні для реалізації багатьох складних конструкцій керування, включаючи нелокальні виходи (non-local exits), зворотнє виконання (backtracking), та [[Копрограми]] (coroutines).
Однією із відмінних рис Scheme є те, що [[продовження]] також мають статус звичайних об'єктів. Продовження корисні для реалізації багатьох складних конструкцій керування, включаючи нелокальні виходи (non-local exits), зворотнє виконання (backtracking), та [[Копрограми]] (coroutines).


Аргументи завжди передаються в Scheme процедури за значенням. Це значить, що всі значення аргументів обчислюються до того, як буде передано керування до процедури, не зважаючи на те, чи використовуються ці аргументи під час виконання процедури. Це відрізняється від семантики лінивого обчислення мови програмування [[Haskell]], або семантики виклику по імені [[Algol (мова програмування)|Algol 60]], в якій значення виразу аргумента обчислюється тільки в разі використання в процедурі.
Аргументи завжди передаються в процедури за значенням. Це значить, що всі значення аргументів обчислюються до того, як буде передано керування до процедури, не зважаючи на те, чи використовуються ці аргументи під час виконання процедури. Це відрізняється від семантики лінивого обчислення мови програмування [[Haskell]], або семантики виклику по імені [[Algol (мова програмування)|Algol 60]], в якій значення виразу аргумента обчислюється тільки в разі використання в процедурі.


Модель арифметики Scheme розроблялась таким чином, щоб залишатись як можна незалежнішою від представлення чисел в комп'ютері. В Scheme, кожне [[Цілі числа|ціле]] є [[Раціональні числа|раціональним числом]], кожне раціональне є [[Дійсні числа|дійсним]], а кожне дійсне &mdash; [[Комплексні числа|комплексне]]. Тому, різниця між арифметикою дійсних та комплексних чисел, яка присутня в інших мовах програмування, для Scheme не виникає. Замість цього розрізняється точна арифметика (яка відповідає математичним ідеалам), та наближена (яка базується на апроксимаціях). Як і в [[Common Lisp]], точна арифметика не обмежується операціями з цілими числами.
Модель арифметики Scheme розроблялась таким чином, щоб залишатись як можна незалежнішою від представлення чисел в комп'ютері. В Scheme, кожне [[Цілі числа|ціле]] є [[Раціональні числа|раціональним числом]], кожне раціональне є [[Дійсні числа|дійсним]], а кожне дійсне&nbsp; [[Комплексні числа|комплексне]]. Тому, різниця між арифметикою дійсних та комплексних чисел, яка присутня в інших мовах програмування, для Scheme не виникає. Замість цього розрізняється точна арифметика (яка відповідає математичним ідеалам), та наближена (яка базується на апроксимаціях). Як і в [[Common Lisp]], точна арифметика не обмежується операціями з цілими числами.


В Scheme наявні оператори [[Цикл програми|циклів]]. Ще одним способом організації циклічності виконання певного [[Блок (програмування)|блоку]] &mdash; використання [[Процедура рекурсивна|рекурсивних процедур]]. Всі реалізації Scheme мають виконувати правильну оптимізацію [[Хвостова рекусрія|хвостової рекурсії]].
В Scheme наявні оператори [[Цикл програми|циклів]]. Ще одним способом організації циклічності виконання певного [[Блок (програмування)|блоку]]&nbsp; використання [[Процедура рекурсивна|рекурсивних процедур]]. Всі реалізації Scheme мають виконувати правильну оптимізацію [[Хвостова рекусрія|хвостової рекурсії]].


== Приклади програм ==
== Приклади програм ==
Рядок 50: Рядок 76:


== Джерела інформації ==
== Джерела інформації ==
<references />
* ''Revised 5 Report on the Alogrithmic Language Scheme'', Richard Kelsey, William Clinger, Jonathan Rees, 1998.
* ''Revised 5 Report on the Alogrithmic Language Scheme'', Richard Kelsey, William Clinger, Jonathan Rees, 1998.
* ''Teach Yourself Scheme in Fixnum Days'', Dorai Sitaram, 2004.
* ''Teach Yourself Scheme in Fixnum Days'', Dorai Sitaram, 2004.


== Посилання ==
== Посилання ==
* [http://www.schemers.org schemers.org] Спільнота Scheme програмістів.
* [http://www.schemers.org schemers.org] Спільнота Scheme програмістів.{{ref-en}}
* [http://community.schemewiki.org/?scheme-faq-standards#implementations ЧАПи: перелік імплементацій]
* [http://community.schemewiki.org/?scheme-faq-standards#implementations ЧАПи: перелік реалізацій].
* [http://dmoz.org/Computers/Programming/Languages/Lisp/Scheme Open Directory: Scheme] посилання на різноманітні ресурси присвячені Scheme.
* [http://dmoz.org/Computers/Programming/Languages/Lisp/Scheme Open Directory: Scheme] посилання на різноманітні ресурси присвячені Scheme.


[[Категорія:Мови програмування]]
[[Категорія:Функціональні мови програмування]]
[[Категорія:Імперативні мови програмування]]


[[bat-smg:Scheme]]
[[bat-smg:Scheme]]

Версія за 11:20, 4 грудня 2007

Scheme
Парадигма декілька
Дата появи 1970s
Творці Гай Стіл та Джеральд Сассмен
Останній реліз
Система типізації сувора, динамічна
Основні реалізації PLT Scheme, MIT/GNU Scheme, Scheme 48, Chicken, Gambit, Guile, Bigloo, Chez Scheme, STk, STklos, Larceny, SCM, Kawa
Діалекти T
Під впливом від Lisp, Алгол
Вплинула на Common Lisp, JavaScript, Ruby, Dylan
Звичайні розширення файлів .scm або .ss
Вебсайт scheme-reports.org

Scheme — мультипарадигмна мова програмування, підтримує функціональну та процедурну парадигми програмування. Словник мови можна розширювати засобами самої мови. Існують розширення, які додають підтримку об'єктно-орієнтованої, декларативної і інших парадигм програмування. Є діалектом мови програмування Лісп.

Історія створення

Перше описання Scheme було написано в 1975 році. Творцями мови є Гай Стіл (Шаблон:Guy L. Steele) та Джеральд Сассмен (англ. Gerald Jay Sussman) з Масачусетського Технологічного Інституту. В 1981 та 1982 роках почались три різних проекти по використанню Scheme для навчального процесу в університетах США.

Мова програмування Scheme визначається двома стандартами: стандартом де-юре в редації IEEE, та стандартом де-фактор. Поточна версія описання стандарту де-факто має назву «Revised 5 Report on the Algorithmic Language Scheme».[1] 28 серпня 2007 року було затверджено наступну редакцію: R6RS[2].

Основну увагу, при створенні діалекту, було приділено елегантності та концептуальній довершеності мови. Як наслідок, повна специфікація мови програмування Scheme вмістилася в 50 сторінок, в той час, як специфікація Common Lisp має розмір 1300 сторінок.

Стисле описання

Як і в Алголі, області видимості в Scheme статичні, кожне використання змінної відповідає лексично видимому значенню цієї змінної.

Типи асоціюються із значеннями (об'єктами), а не із змінними. Іншими словами, Scheme — мова програмування із динамічною типізацією. Однак, існують діалекти Scheme із статичною типізацією.

Всі об'єкти, які створюються під час виконання програми, включаючи процедури та продовження існують до її завершення. Жоден із об'єктів не знищується. Однак, інтерпретаторам та компіляторам Scheme дозволяється звільняти місце, зайняте об'єктом у випадку, якщо вони можуть довести що цей об'єкт в програмі більше не використовується. Цю задачу звільнення місця в пам'яті від невикористовуємих об'єктів виконує прибиральник сміття.

Процедури в Scheme є повноцінними об'єктами. Процедури можна створювати під час виконання програми, зберігати в структурах даних, повертати як результат роботи інших процедур, і так далі.

Однією із відмінних рис Scheme є те, що продовження також мають статус звичайних об'єктів. Продовження корисні для реалізації багатьох складних конструкцій керування, включаючи нелокальні виходи (non-local exits), зворотнє виконання (backtracking), та Копрограми (coroutines).

Аргументи завжди передаються в процедури за значенням. Це значить, що всі значення аргументів обчислюються до того, як буде передано керування до процедури, не зважаючи на те, чи використовуються ці аргументи під час виконання процедури. Це відрізняється від семантики лінивого обчислення мови програмування Haskell, або семантики виклику по імені Algol 60, в якій значення виразу аргумента обчислюється тільки в разі використання в процедурі.

Модель арифметики Scheme розроблялась таким чином, щоб залишатись як можна незалежнішою від представлення чисел в комп'ютері. В Scheme, кожне ціле є раціональним числом, кожне раціональне є дійсним, а кожне дійсне — комплексне. Тому, різниця між арифметикою дійсних та комплексних чисел, яка присутня в інших мовах програмування, для Scheme не виникає. Замість цього розрізняється точна арифметика (яка відповідає математичним ідеалам), та наближена (яка базується на апроксимаціях). Як і в Common Lisp, точна арифметика не обмежується операціями з цілими числами.

В Scheme наявні оператори циклів. Ще одним способом організації циклічності виконання певного блоку — використання рекурсивних процедур. Всі реалізації Scheme мають виконувати правильну оптимізацію хвостової рекурсії.

Приклади програм

Наприклад, функція обчислення значення факторіалу з використанням операторів циклу матиме вигляд:

 (define (factorial n)
   (let loop ((total 1)
              (i n))
     (if (= i 0)
       total
       (loop (* i total) (- i 1)))))

Однак, цю функцію можна переписати із використанням рекурсії:

 (define (factorial n)
   (if (= n 0) 1
       (* n (factorial (- n 1)))))

Тут рекурсивний виклик в знаходиться в хвості тіла процедури, тобто, є прикладом хвостової рекурсії.

Інтерпретатори та компілятори

Для мови програмування Scheme існує велика кількість інтерпретаторів, та компіляторів. Деякі інтерпретатори використовуються в інших програмах для написання макросів і розширення функціональності (наприклад, в графічному редакторі GIMP використовується інтерпретатор Guile). Для повного переліку, дивіться відповідну сторінку ЧАПів.

Засоби розробки

Для Scheme, також, існує велика кількість допоміжних засобів розробки, інтегрованих середовищ. До інтегрованих середовищ належить Dr. Scheme. Для GNU Emacs та XEmacs існує спеціальний основний режим: scheme-mode.

Джерела інформації

  1. Richard Kelsey, William Clinger, Jonathan Rees та ін. (August 1998). Revised5 Report on the Algorithmic Language Scheme. Higher-Order and Symbolic Computation. 11 (1): 7—105. doi:10.1023/A:1010051815785. {{cite journal}}: Явне використання «та ін.» у: |author= (довідка)
  2. R6RS.org.
  • Revised 5 Report on the Alogrithmic Language Scheme, Richard Kelsey, William Clinger, Jonathan Rees, 1998.
  • Teach Yourself Scheme in Fixnum Days, Dorai Sitaram, 2004.

Посилання