Схема умзч: Ламповый усилитель мощности звука — Hi-End усилитель

Содержание

Несколько схем транзисторных УМЗЧ, хронология радиолюбителя

Радиоэлектроника, схемы, статьи и программы для радиолюбителей.
  • Схемы
    • Аудио аппаратура
      • Схемы транзисторных УНЧ
      • Схемы интегральных УНЧ
      • Схемы ламповых УНЧ
      • Предусилители
      • Регуляторы тембра и эквалайзеры
      • Коммутация и индикация
      • Эффекты и приставки
      • Акустические системы
    • Спецтехника
      • Радиомикрофоны и жучки
      • Обработка голоса
      • Защита информации
    • Связь и телефония
      • Радиоприёмники
      • Радиопередатчики
      • Радиостанции и трансиверы
      • Аппаратура радиоуправления
      • Антенны
      • Телефония
    • Источники питания
      • Блоки питания и ЗУ
      • Стабилизаторы и преобразователи
      • Защита и бесперебойное питание
    • Автоматика и микроконтроллеры
      • На микроконтроллерах
      • Управление и контроль
      • Схемы роботов
    • Для начинающих
      • Эксперименты
      • Простые схемки
    • Фабричная техника
      • Усилители мощности
      • Предварительные усилители
      • Музыкальные центры
      • Акустические системы
      • Пусковые и зарядные устройства
      • Измерительные приборы
      • Компьютеры и периферия
      • Аппаратура для связи
    • Измерение и индикация
    • Бытовая электроника
    • Автомобилисту
    • Охранные устройства
    • Компьютерная техника
    • Медицинская техника
    • Металлоискатели
    • Оборудование для сварки

УНЧ и Звукотехника | Усилители мощности низкой частоты | Микросхема

Как много в этой аббревиатуре для сердца радиолюбителя слилось. Каждый, кто когда-нибудь занимался радиотехникой и электроникой, собирал различные усилители низкой частоты. Простые и сложные, маломощные и мощные. Сейчас, с развитием интегральных микросхем, стало вообще всё намного проще. Усилители не содержат каких-то уникальных радиодеталей. Одна микросхема, которая, собственно, и представляет собой уже готовый

усилитель мощности низкой частоты, и схема, практически, собрана. Как правило, выходная мощность таких усилителей и качество воспроизведения на высоте. А если прикупить головку динамическую прямого излучения Ватт так на 1500 — 2000 и встроить в корпус с фазоинвертором, выполненный по рассчитанным размерам, то вообще замечательно. Получится сабвуфер не хуже покупного. В большинстве случаев даже лучше.

Чистота и качество воспроизведения постоянно совершенствуются. Основные термины в данном разделе:
Бел (Б) — логарифмическая единица, соответствующая (при частоте 1000 Гц) десятикратному изменению силы звука.

Логарифмическая единица, соответствующая 1/10 бела, называется децибелом (дБ). Одному дБ соответствует изменение звукового давления в 1,12 раза.
Частота звуковых колебаний воспринимается на слух как высота тона. Самый низкий предел, воспринимаемый человеком, 20 Гц, а самый высокий — 20000 Гц.
Тембр — окраска звука, определяемая количеством, частотой и интенсивностью обертонов.
Уровень звукового давления — отношение данного звукового давления p к нулевому уровню p0, выраженное в дБ. Вычисляется как N=20 lg(p/p0).
Болевой порог — звуковое давление, которое вызывает болевое ощущение на коже. Уровень равен 120 дБ.

В радиолюбительской практике принято делить УНЧ на обычные и высокого качества (Hi-Fi класса). Максимальная выходная мощность всех звуковых усилителей определяется по простой формуле: Pвых=U2/Rн. Т.е. замеряете напряжение на выходе УНЧ (обязательно под нагрузкой), возводите в квадрат и делите на сопротивление нагрузки (обычно сопротивление динамика 4-8 Ом). Можно ещё упомянуть о предварительном усилении. К усилителям мощности обязательно нужны такие каскады, чтобы напряжение на его входе было достаточным.

Бывают ещё различные по сложности усилительные каскады. Однотактные, двухтактные, трансформаторные и бестрансформаторные, мостовые схемы включения усилительных элементов. Одна из возможных схем двухтактного трансформаторного каскада усилителя звуковой частоты приведена ниже. Номинальная выходная мощность 4 Вт, максимальная — 6 Вт.

Но такие, я думаю, уже никто не будет собирать. Слишком трудоёмко наматывать трансформатор, плюс ко всему нужно найти подходящий магнитопровод.

Приведу ещё пример двухтактного бестрансформаторного каскада УНЧ. Выходная мощность порядка 10 Вт.

У нас в наличии имеется более 850 схем УНЧ на интегральных микросхемах. По мере необходимости будем выкладывать их на сайт, особенно самые лучшие, на наш взгляд. Если Вам нужен какой-то усилитель и Вы не можете найти его схему, то пишите, пожалуйста, в комментариях или в форме обратной связи.

Мы обязательно поможем.


Ниже приведены ссылки на различные материалы по данной теме. Особо отметим, что среди них есть полностью опубликованные с полным описанием схемы, входящих радиоэлементов, различных настроек и замеров основных параметров (например, силы тока и напряжения) на разных участках цепи и между элементами. Также есть с кратким описанием, содержащие ссылку на скачивание всего документа в одном архиве, где, в свою очередь, содержится уже полное описание конструкции, печатной платы и прочее. Архивы имеют расширение *.rar (распаковать можно, например, программой WinRAR версии 2.9 и выше) и доступны для скачивания.

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


Простой усилитель Василича — audiohobby.ru

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

     В УМЗЧ использована современная элементная база. На АС (сопротивлением 6 ом) усилитель развивает мощность до 30 Вт. Этого вполне достаточно для большинства жилых помещений. Коэффициент гармонических искажений не превышает 0,005%. Усилитель охвачен глубокой обратной связью в широком диапазоне частот. Коэффициент усиления определяется отношением сопротивления R8 к R5 и равен 7. При желании, его можно увеличить, изменяя номинал сопротивления R8 в большую сторону. УМЗЧ имеет высокую скорость нарастания сигнала. Частоты верхнего слышимого диапазона он воспроизводит без искажений, на слух очень прозрачно. Не превращает звук тарелок в шипение, а барабана в бубнение, как некоторые УМЗЧ, собиравшиеся мною на интегральных микросхемах типа TDA 1558 и LM 3886. Шумовая полка данного усилителя ниже — 120 dB (что также не достижимо для усилителей на микросхемах).

     Для питания каждого из каналов усилителя был использован отдельный (не общий) блок питания без гальванической связи с общим проводом, что обеспечило защиту АС от постоянного тока. Трансформаторов может быть два, каждый мощностью по 60 — 80 Вт либо один мощностью 120 — 150 Вт с двумя вторичными обмотками по 40 В (отдельными для каждого канала). В своем компактном УМЗЧ  (160х160х105 мм) я использовал один тороидальный трансформатор на 120 Вт. Выбран тороид потому, что он наиболее компактный, тихий и создает минимум помех. Схема БП приведена ниже.

       В блоке питания могут использоваться любые выпрямительные диоды с максимальным током более 10 А и напряжением не ниже 100 В. Электролитические конденсаторы (по 2 на каждый канал) от 6800 до 15000 мкФ напряжением не ниже 50 В. Шунтирующие конденсаторы (С11 — С14) от 0,1 до 1,0 мкФ не электролитические (бумажные либо пропиленовые). 

      Для проектирования платы использовалась программа Sprint-layout.  В связи с использованием СМД резисторов, которые установлены со стороны дорожек, плата получилась очень компактной (57х42 мм).

              

Две платы для УМЗЧ изготовлены по ЛУТ-технологии (с помощью лазерного принтера и утюга).

Фотографии простого усилителя Василича приведены ниже.

     

  

     Усилитель прост в изготовлении, не требует сложных регулировок. В случае, если ток покоя оконечных транзисторов выходит из диапазона 100 — 200 мА необходимо подобрать резистор R14. С увеличением его номинала увеличивается ток покоя, с уменьшением — снижается. Полевые транзисторы на выходе усилителя обеспечивают отличную термостабилизацию без каких-либо дополнительных схемных решений. Правый и левый канал УМЗЧ не имеют общей земли. Даже входные разъемы не соединены между собой. Входной конденсатор С1 (от 0.22 до 1.0 мкФ) желательно поставить пропиленовый либо другой высококачественный, имеющий низкий уровень собственных шумов. Это обеспечит УМЗЧ минимальный уровень искажений. По этой же причине я отказался от регулятора громкости в самом усилителе. С регулировкой уровня сигнала прекрасно справляются медиа плееры и штатные средства операционной системы персонального компьютера.

     Рекомендую усилитель для изготовления начинающим радиолюбителям.

     Творческих успехов и приятного прослушивания музыки!

    Хочу еще поделится практическим опытом. При значительном увеличении емкости входного конденсатора усилителя С1 (более 1.0 мкФ) и уменьшении конденсаторов С15 и С16 в БП ниже 6800 мкФ возможно возбуждение усилителя на низкой частоте. В моем случае возбуждение одного из каналов произошло при емкости конденсаторов БП 6800 мкФ. Это проблема была решена путем уменьшения С1 усилителя с 1.0 мкФ до 0.68 мкФ. Второй канал оказался более устойчив и таких изменений не потребовал. 

Простой сверхлинейный УМ «Ностальгия» или наш ответ параллельникам Агеева.

… В давние лохматые времена усилители на «германских» транзисторах по топологии Лина мы называли просто и емко — пылесосы.
После этих «пылесосов» УМ «Агеев-82» казался просто чудом для начинающих радиогубителей — он был прост, как велосипед, не требовал дефицитных деталей, работал сразу после сборки, не требовал регулировок, звучал отлично и был надежен, как танк, несмотря на то, что разогревал небольшие радиаторы до 70-80 градусов и был при этом термостабилен.
.
Мягкое звучание, возможно, связано с тем, что на «первом ватте» и ниже параллельный усилитель (Diamond Buffer) был достаточно линеен, и мизерного петлевого усиления схемы хватало для его дальнейшей линеаризации.
Многие отмечали, что с хорошими ОУ (тогда — 544УД2, 574УД1) он звучал приятнее большинства схем из Радио тех времен.
Не исключаю тут момента субъективности и предвзятости, видимо нужно еще раз собрать усь по оригинальной схеме тридцатисемилетней давности и сравнить с …

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

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

Анализ схем Агеева от 82-го, 85-го и 87-го годов показывает следующее:

  1. Линеаризация «параллельника» диодом между базами выходников (Агеев-82) приводит к значительному повышению искажений.
  2. Вольтодобавка в ВК намного эффективнее. Обходится недорого — 2 резистора+2 конденсатора.
  3. Двухэтажное питание и ГСТ в плечах параллельника еще лучше, но усложнять схему нельзя по условиям задачи.
  4. Для линеаризации простого параллельного усилителя, имеющего собственный Кг порядка 0,1-0,2%, нужно, как минимум, 80 дБ петлевого усиления. Лучше — 100дБ.

С учетом Ку схемы, равного 20дБ, от УН требуется 100-120 дБ усиления на частоте 20кГц.
Самый компактный и быстрый способ набора усиления — композитные схемы.

Tvset электрические схемы и скачать сервис мануал в высоком качестве

XXChams TPM4.1 Телевизоры Philips 32PFL3605xx / 42PFL3605xx шасси TPM4.1E LA1) Интерфейс D-SUB. Память D-SUB EDID2) Разъемы НЧ вход-выход3) Разъемы НЧ вход-выход4) Разъемы S-video, HDMI3, PHONE и USB5) Усилитель для наушников6) Тюнер7) Принципиальная схема усилителя наушников. .. электрическая схема шасси телевизора S16A / B / C / D SAMSUNG В архиве принципиальная схема ЖК телевизоров Rolsen RL15T10 / RL20T10 и Roadstar TVL-151M / 201M: 1) Блок-схема ТВ2) Концепция цепей питания 3) Процессор управления (15.1-дюймовый ЖК-телевизор) (20,1-дюймовый ЖК-телевизор) 4) АЦП с ФАПЧ (15,1-дюймовый ЖК-телевизор) (20,1-дюймовый ЖК-телевизор) 5) Видеодекодер (15,1-дюймовый ЖК-телевизор) (20,1-дюймовый ЖК-телевизор) . .. 000. LE23R51B, LE26R51B, LE32R51B, LE40R51B от SAMSUNG: 1) Принципиальная схема резервного 2) Принципиальная схема базового блока питания шасси 3) Принципиальная схема подсветки силового инвертора 4) Осциллограф мс в контрольных точках 5) Принципиальная схема ту… В архиве
Принципиальные схемы LCD телевизоров Philips 32PFL3605xx / 42PFL3605xx шасси TPM4.1E LA LCD телевизоров Philips 32PFL3605xx / 42PFL3605xxChams
Схемы шасси телевизора 17MV18 шасси телевизора 17MV18 В архиве представлена ​​принципиальная схема шасси телевизора 17MV181) Блок-схема основной платы2) Графический контроллер и FLASH-память3) UOCIII процессор. Тюнер4) ЖК-панель LVDS-интерфейса 5) регулятор напряжения6) УМЗЧ. Аналоговые переключатели. LF ввод-вывод7) Панель управления8) Тюнеры и декодер MPEG-2 (опция для s …
Схема шасси M28 на базе однопроцессорного процессора TMPA8821 фирмы TOSHIBA шасси процессора M28 TMPA8821 TOSHIBA В архиве принципиальная схема электрического шасси М28 на базе однокристального процессора TOSHIBA TMPA8821 фирмы с питанием дискретных элементов1) на процессор, тюнер, вуфер ввода-вывода2) Кадровая и строчная развертка3) Блок питания4) ТВ процессор УМЗЧ , пульт, выход RGB видеоусилитель
Принципиальная электрическая схема питания 17IPS02-1 LCD телевизоров и RAINFORD VESTEL LCD телевизоров RAINFORD и VESTEL В архиве показаны принципиальные схемы 17IPS02-1 блока питания LCD Телевизоры и RAINFORD VESTEL1) Принципиальная схема основного источника питания2) Электропитание инверторной схемы лампы подсветки LCD панели
Базовая электрическая схема шасси ТВ КД-020 и ТД-173 Микроконтроллер TOSHIBA семейства TMRA 88хх В архиве принципиальная электрическая схема шасси ТВ КД-020 и ТД-173
Принципиальная электрическая схема телевизора Rolsen 029R55T / 029R55TI2 / D29R55T / D29R55TI2 Rolsen 029R55T / 029R55TI2 / D29R55T / D29R55TI2 В архиве приведена принципиальная схема телевизора Rolsen 029R55T / 029R55TI2 / D29R55T / 029R55T / 029R55T / 029555T / 02955TI2 SAMSUNG шасси телевизора S16A / B / C / D В архиве приведена принципиальная схема шасси телевизора S16A / B / C / D SAMSUNGChassis S16A1) низкий ввод-вывод (SCART, S-VIDEO, JACK), УМЗЧ3) ИБП. Кадровая и строчная развертка 3) Тюнер, радиоканал, микроконтроллер, EEPROM 4) Плата ЭЛТ, ЭЛТ, модуль PIP Шасси S16B5) УМЗЧ. НЧ вход-выход (SCART + JACK) 6) UOC-microco …
Принципиальная схема автомобильного lcd-TV ELENBERG-TV 807 ELENBERG-TV807 В архиве представлена ​​принципиальная электрическая схема автомобильный lcd-телевизор ELENBERG-TV807
Схемы телевизоров, выполненных на микросхемах семейств M37160M8xxx и M6126x MITSUBISHI Mitsubishi, микросхемы M37160M8xxx и M6126x микросхемы M037 на корпусе телевизоров M03xx представлены в архиве схемы M037 микросхемы M037 семейства M060. и M6126x фирмы MITSUBISHI1) Блок питания.Микроконтроллер. Тюнер. Тракт ПЧ и видеопроцессор. Декодеры сигналов цветности. УМЗЧ. Схема питания подсветки 2) Интерфейс ЖК-панели
Схемы шасси телевизора LC13E AA фирмы PHILIPS Шасси LC13E AA PHILIPS В архиве показана схема телевизионного шасси LC13E AA фирмы PHILIPS1) Расположение плат шасси телевизора LC13E AA компании PHILIPS и связи между ними 2) Блок-схема тюнера и схемы ПЧ видео (Tuner-IF-Video) 3) Блок-схема с печатной платой (Scaler Board) 4) Узлы цепочки поставок телевизионного шасси LC13E A. ..
Принципиальная схема ЖК телевизоров Panasonic TX-32LX60F / P, TX-26LX60F / P шасси GLP21 Panasonic шасси GLP21 В архиве принципиальная схема ЖК телевизоров Panasonic TX-32LX60F / P , TX-26LX60F / P шасси GLP211) Электромонтаж аналогового мультиплексора. Распределение входов и выходов на контактах разъема JK3001 и JK3002. 2) Подробная концепция Базовый блок с видеопроцессором IC1501.3) Подробная концепция Базовый модуль с процессором управления.4) Voltag …
Принципиальная схема источника и инвертора питания LCD TV PHILIPS (шасси TPS1.0E LA) PHILIPS шасси TPS1.0E LA В архиве принципиальная схема источник и инверторный блок питания ЖК-телевизора PHILIPS (шасси TPS1.0E LA) 1) Электрическая схема инверторного питания подсветки в 15-дюймовой модели 2) Электрическая схема инверторного питания подсветки в 19-дюймовой модели 3) Электрическая схема инверторной силовой подсветки в 20-дюймовой мод. ..
Принципиальная схема преобразователя платы LCD TV PHILIPS (шасси TPS1.0E LA) PHILIPS шасси TPS1.0E LA В архиве представлена ​​принципиальная схема LCD TV PHILIPS шасси TPS1.0E LA1 ) Понижающие DC / DC-преобразователи2) ТВ-процессор и графический контроллер3) Тюнер4) Входы RCA и S-VHS5) Вход ПК (D-SUB) 6) Вход SCART7) Вход DVI8) Флэш-память и SDRAM9) Интерфейсные разъемы ЖК-панели (15, 19 и 20 дюймов) 10) Dig …
Принципиальная схема ЖК-телевизоров Rolsen RL15T10 / RL20T10 и Roadstar TVL-151M / 201M Rolsen RL15T10 / RL20T10Roadstar TVL-150005M / 2014M
Принципиальная схема портативного ЖК-телевизора DESO TV809 (шасси JVV809726A00) DESO TV809 В архиве приведена принципиальная схема портативного ЖК-телевизора DESO TV809 (шасси JVV809726A00): 1. Блок питания подсветки ЖК-панели. Стабилизаторы 5, 3.3, 2.8 и 1.82. ТВ процессор 3. Интерфейсная ЖК-панель. Передняя панель 4. Аудиопереключатель.Аудио усилитель мощности part5. Узлы питания 6. Радиоканал 7. Принципиальная схема …
Схемы телевизоров фирмы GRUNDIG на шасси K1 GRUNDIG: Lenaro 55 Flat MF 555501 Top / Lenaro 55 Flat MF 555501/8 Top / Xentia 55 MFS 554601/8 Top / RAINFORD TFS5540 / 5506 В архиве представлены схемы телевизоров фирмы GRUNDIG шасси К1: 1) Принципиальная схема блока питания 2) Принципиальная схема выходного каскада горизонтального положения 3) Принципиальная схема основных агрегатов шасси (кроме блока питания и выходного каскада развертки) 4) Принципиальная схема кинескопа CRT Board Boards
Схемы ЖК-телевизоров LE23R51B, LE26R51B, LE32R51B, LE40R51B от SAMSUNG SAMSUNG LE23R51B / LE26R51B / LE32R51B 9000 Схема ЖК телевизора 9000 / LE32R51B 9000 в архиве Схема ЖК-телевизора
Принципиальная схема телевизора СОКОЛ 37/51 / 54Ц6254СП СОКОЛ 37/51 / 54ТС6254СП В архиве представлена ​​принципиальная схема телевизора «СОКОЛ 37/51 / 54ТС6254SP»
Принципиальная схема ЖК телевизора JVC LT-23S2 JVC LT-23S2 В архиве принципиальная схема ЖК телевизора JVC LT-23S2: 1) Напряжение 12,5, 3,3, 2,5 и 1,82) Напряжение 3,3 В Вход VGA . ADC3) Интерфейсы ИК-порта и клавиатуры 4) Интерфейсы низкого ввода-вывода и тюнера 5) Вход сигнала переключения LF.Контроллер телетекста 6) Видеодекодер 7) Контроллер деинтерливинга. Память SDRAM …
Принципиальная схема ЖК телевизоров Samsung LW32A23W / LW40A23W Samsung LW32A23W LW40A23W представлены схемы следующих устройств: 1) Принципиальная электрическая схема. Тюнеры, интерфейс DVI, стабилизаторы2) Схема. Видео VPC3230 и DPTV-3D 3) Схема осциллограмм сигналов в контрольных точках 4) Принципиальная схема. Контроллер LCD панели RRMM

Схема Понци — Простая английская Википедия, бесплатная энциклопедия

Схема Понци — это особый вид мошенничества.Он основан на фальшивых инвестициях, которым один интриган (или группа интриганов) заставляет других людей отдавать деньги.

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

Как только схема Понци привлекает слишком много инвесторов, система всегда терпит крах.Это потому, что все инвесторы ожидают больше денег, чем они вложили, и они будут нетерпеливыми.

Эти схемы всегда останавливаются одним из трех способов:

  1. Мошенник убегает с полученными деньгами. Это то, что пытаются делать махинаторы.
  2. У интригана кончаются деньги; Они не смогут сразу обещать деньги обратно. Это называется ликвидностью и заставляет инвесторов паниковать и требовать свои деньги обратно, часто все сразу.
  3. Власти (или иногда информаторы изнутри) узнают о схеме и пресекают ее.

Схема была названа в честь человека по имени Чарльз Понци . Он использовал эту схему после переезда из Италии в Соединенные Штаты в 1903 году. (Однако Понци не изобрел схему. В 1857 году Чарльз Диккенс написал книгу под названием Little Dorrit о подобной схеме. простая идея, и, вероятно, очень старая.) Однако схема Понци была настолько большой, что стала самой популярной. Его первоначальная схема была основана на использовании национальных валютных курсов для зарабатывания денег на основе международных почтовых марок. Но вскоре деньги перестали вкладываться в купоны и перешли к ранним инвесторам, а много — к самому Понци.

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

Люди, рекламирующие схемы Понци, часто используют впечатляющие слова, которые на самом деле очень расплывчаты. Примеры:

  • Хеджирование фьючерсами (хороший риск)
  • Высокодоходные инвестиционные программы (возвращают много денег)
  • Офшорные инвестиции (легко зарабатывают деньги в других странах)

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

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

Поскольку инвестиции очень расплывчаты, не так много инвесторов приходят очень быстро. Но схема часто набирает обороты вот так:

  1. Ранний инвестор зарабатывает деньги и оставляет их себе. На самом деле это деньги более позднего инвестора , но ранний инвестор этого не знает.
  2. Этот инвестор очень счастлив и рассказывает другим людям об «инвестициях», желая помочь этим «инвестициям» заработать больше денег для всех.
  3. Новые инвесторы рассказывают больше инвесторов и т. Д.

Планировщики часто пытаются склонить ранних инвесторов «реинвестировать» деньги, которые они «заработали». Планировщики иногда отправляют инвесторам «счета-фактуры», показывая инвесторам, сколько они «заработали» и сколько они будут «зарабатывать», если будут продолжать «инвестировать».

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

  • Многоуровневая пирамида — это , как схема Понци. Оба полагаются на фальшивые финансовые обещания и инвестиции, но есть различия:
    • В многоуровневой схеме инвесторы второго «уровня» находят своих собственных инвесторов для создания третьего «уровня», каждый из которых получает прибыль непосредственно от следующего уровня. Схемы Понци «сосредоточены» вокруг первоначального интригана.
    • Многоуровневые схемы только хвастаются деньгами инвесторов от привлечения новых инвесторов.Это делает многоуровневые схемы привлекательными для бедных людей. Схемы Понци хвастаются наличием особых связей с труднодоступными источниками. Это делает схемы Понци привлекательными для богатых людей
    • Многоуровневые схемы «вылетают» быстрее. Это потому, что многоуровневые схемы полностью зависят от поиска новых жертв. Мошенники Понци могут просто соблазнить первых инвесторов реинвестировать полученные деньги.
  • Пузырь : «Пузырь» — это перепродажа. Пузырь — это когда люди скупают весь продукт, который могут, чтобы перепродать его по более высокой цене столько раз, сколько они могут.Пузырь «лопается», когда покупатели перестают покупать продукт, а перепродавцы застревают на продукте, за который заплатили слишком много. (Товар может быть любым.) Пока покупатели продолжают платить больше, перепродавцы могут продолжать зарабатывать деньги. Пузырям даже не нужны центральные интриганы, потому что люди могут это сделать случайно. (Например, таким образом цены на землю могут «пузыриться». Цены могут расти из-за желания строить рядом с большими районами. Когда новых земель больше нет, перепродавцы застревают на своей земле.) Часто говорят, что пузыри основаны на теория «большего дурака» (в зависимости от людей, которых «обманули», заставив платить «большие» цены). Но на самом деле, согласно теории Austrian Business Cycle Theory , пузыри возникают из-за предоставления ссуд покупателям для определенного вида транзакций, и в этом случае они будут квалифицироваться как схема Понци. В данном случае ссудодатели — это интриганы, зарабатывающие деньги на проигравших перепродавцах.
  • «Ограбление Питера, чтобы заплатить Полу» : Это когда люди с долгами занимают деньги , выплачивают свой долг и занимают еще денег, чтобы выплатить этот долг .Это не схема Понци, потому что кредиторы не обещали высоких доходов или чего-то подобного. Кроме того, кредиторы не всегда зарабатывают деньги.
  • Многоуровневый маркетинг : Многоуровневый маркетинг (MLM) — это когда компании продают инвесторам вещи для перепродажи напрямую клиентам. Перепродавцы также могут зарабатывать деньги, направляя в компанию новых перепродавцов. Это может показаться похожим на схему пирамиды, но это не всегда одно и то же. Честные и легальные многоуровневые рынки действительно существуют, и многие из них просто зарабатывают деньги, покупая оптом..
  • Данн, Дональд (2004). Понци: Невероятная правдивая история короля финансовых асов (Библиотека воровства) (Мягкая обложка) . Нью-Йорк: Бродвей. ISBN 0767
    6
    .
  • Zuckoff, Митчелл (2005). Схема Понци: правдивая история финансовой легенды . Нью-Йорк: Random House. ISBN 1400060397 .

Использование схемы Chez

Использование схемы Chez

Chez Scheme часто используется в интерактивном режиме для поддержки разработки программ. и отладка, но его также можно использовать для создания автономных приложений без интерактивного компонента.В этой главе описаны различные способы использования схемы Chez Scheme обычно используется и, в более общем плане, как получить максимальную отдачу от система. Разделы 2.1, 2.2, и 2. 3 описывают, как один использует Chez Scheme в интерактивном режиме. В разделе 2.4 обсуждается, как библиотеки и RNRS программы верхнего уровня используются в Chez Scheme . Раздел 2.5 описывает поддержку написания и запуска Скрипты схемы, включая скомпилированные скрипты и скомпилированные Программы высшего уровня РНРС. Раздел 2.6 описывает, как структурировать и скомпилируйте приложение, чтобы получить максимально эффективный код компилятора.Раздел 2.7 описывает, как можно настроить процесс запуска, например, чтобы изменить или исключить параметры командной строки, для предварительной загрузки схемы или внешнего кода, или для запуска Chez Scheme в качестве подчиненного программа другой программы. Раздел 2.8 описывает, как создавать приложения. с использованием схемы Chez и схемы Petite Chez для поддержки во время выполнения. Наконец, в Разделе 2.9 рассматриваются параметры командной строки, используемые при вызывая Chez Scheme .

Раздел 2. 1. Взаимодействие с Chez Scheme

Один из самых простых и эффективных способов написать и протестировать Scheme программ состоит в том, чтобы составить их с помощью текстового редактора, такого как vi или emacs и протестируйте их в интерактивном режиме с помощью Chez Scheme , работающего в окно оболочки.Если Chez Scheme установлен с параметрами по умолчанию, введите команду схема в приглашении оболочки запускает интерактивную схему сеанс. Команда petite делает то же самое для Petite Chez Scheme . После ввода этой команды вы должны увидеть короткое приветствие, за которым следует угловой скобкой на отдельной строке, например:

Chez Scheme Version 8.1
Copyright (c) 1985-2010 Cadence Research Systems

>

Вы также должны увидеть, что курсор находится на один пробел от справа от угловой скобки.Угловая скобка — это запрос, выдаваемый системой «REPL,» что расшифровывается как «Read Eval Print Loop», так называемый, потому что он читает, оценивает и печатает выражение, а затем возвращается к прочитать, оценить и распечатать следующее и так далее. (В схеме Chez Scheme REPL также называется официантом.)

В ответ на приглашение вы можете ввести любое выражение схемы. Если выражение правильно сформировано, REPL выполнит выражение и распечатайте значение. Вот несколько примеров:

> 3
3
> (+ 3 4)
7
> (cons ‘a’ (b c d))
(a b c d)

Считыватель, используемый REPL, более сложен, чем обычный читатель.Фактически, это полноценный «редактор выражений» (сокращенно «экспедитор») как обычный текстовый редактор, но только для одного выражения за раз. Одна вещь, которую вы можете вскоре заметить, это то, что система автоматически делает отступы вторая и последующие строки выражения. Например, допустим, мы хотим определить факт, процедуру, которая реализует факториальную функцию. Если мы введем (определить факт, за которым следует клавиша ввода, курсор должен находиться под первым e в define, так что если затем ввести (lambda (x), мы должны увидеть:

> (определить факт
(лямбда (x)

Экспедитор также позволяет нам перемещаться внутри выражения (даже поперек строк) и отредактируйте выражение, чтобы исправить ошибки. После ввода:

> (определить факт
(lambda (x)
(if (= n 0)
0
(* n (fact

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

> (определить факт
(lambda (n)
(if (= n 0)
0
(* n (fact

Затем мы можем вернуться к концу выражения с помощью стрелки ключи и завершите определение.

> (определить факт
(лямбда (n)
(если (= n 0)
0
(* n (факт (- n 1))))))

Теперь, когда у нас есть полная форма со сбалансированными круглыми скобками, если мы нажмем Enter с курсором сразу после последней скобки, Экспедитор отправит его оценщику. Мы узнаем, что он принял определение, когда мы получим другое подсказка под прямым углом.

Теперь мы можем проверить наше определение, введя, скажем, (факт 6) в ответ на запрос:

> (факт 6)
0

Напечатанное значение — не то, на что мы надеялись, начиная с 6! на самом деле 720. L (контроль L, я.е., клавиши Control и L спрессованные):

> (определить факт
(лямбда (n)
(если (= n 0)
0
(* n (факт (- n 1))))))

Теперь мы можем перейти к четвертой строке и заменить 0 на 1.

> (определить факт
(лямбда (n)
(если (= n 0)
1
(* n (факт (- n 1))))))

Теперь мы готовы ввести исправленное определение. Однако если курсор находится на четвертой строке и мы нажимаем Enter, он просто откройте новую линию между старой четвертой и пятой строками.C). В ответ система входит в обработчик отладки, который запрашивает ввод с помощью перерыв> подсказка. Обработчику прерывания может быть дана одна из нескольких команд (за которой следует новая строка), включая

«e»
или конец файла для выхода из обработчика и продолжения,
«r»
, чтобы остановить выполнение и сбросить на текущее кафе,
«a»
для отмены Chez Scheme ,
«n»
, чтобы войти в новое кафе (см. Ниже),
«i»
для проверки текущего продолжения,
«s»
для отображения статистики о прерванной программе и
«?»
, чтобы отобразить список этих параметров.

Когда возникает исключение, отличное от предупреждения, исключение по умолчанию обработчик выводит на консоль сообщение, описывающее исключение порт ошибки. Если REPL запущен, обработчик исключений затем возвращается к REPL, где программист может вызвать процедуру отладки, чтобы запустить при желании обработчик отладки. Обработчик отладки похож на обработчик прерывания и позволяет программист для проверки продолжения (контроль stack) исключения, чтобы помочь определить причину проблемы.Если REPL не запущен, как в случае со сценарием или программой верхнего уровня запустить через —script или —program параметры командной строки, обработчик исключений по умолчанию выходит из сценария или запрограммируйте после печати сообщения. Чтобы разрешить отладку скриптов и программ верхнего уровня, обработчик исключений по умолчанию можно принудительно настроить с помощью отладка при исключении параметр или — параметр командной строки —debug-on-exception для прямого вызова отладки.

Разработка большой программы полностью на REPL неуправляема, и мы обычно даже хотят сохранить небольшие программы в файле для будущего использования.(История экспедитора сохраняется для сеансов Scheme, но есть ограничить количество предметов, поэтому рассчитывать на программа остается в истории на неопределенный срок.) Таким образом, программист Scheme обычно создает файл, содержащий Scheme исходный код с помощью текстового редактора, такого как vi, и загружает файл в Chez Scheme , чтобы проверить их. Обычное расширение имени файла для исходных файлов Chez Scheme — «.ss», но файл может иметь любое расширение или даже не иметь расширения. совсем.Исходный файл можно загрузить во время интерактивного сеанса, набрав (загрузите « путь »). Загружаемые файлы также могут быть названы в командной строке, когда система запущена. Любую форму, которую можно ввести в интерактивном режиме, можно поместить в файл для загрузки.

Chez Scheme компилирует исходные формы так, как видит их на машине код перед их оценкой, т. е. «как раз вовремя». Чтобы ускорить загрузку большого файла или группы файлов, каждый файл можно скомпилировать заранее с помощью compile-файл, который помещает скомпилированный код в отдельный объектный файл.Например, (compile-file « path «) компилируется формы в файле путь .ss и помещает полученный объектный код в файле путь .so. Загрузка предварительно скомпилированного файла по сути не отличается от загрузка исходного файла, за исключением того, что загрузка выполняется быстрее, так как компиляция уже сделана.

При компиляции файла или набора файлов часто удобнее используйте команду оболочки, чем введите Chez Scheme в интерактивном режиме, чтобы выполнить сборник.Это легко сделать с помощью «конвейера» в команде для компиляции файл, как показано ниже.

echo ‘(файл-компиляция « filename «)’ | схема -q

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

При работе в этом «пакетном» режиме, особенно из «make» файлы, часто желательно принудительно завершить работу обработчика исключений по умолчанию сразу в оболочку с ненулевым статусом выхода.Это можно сделать, установив сбросить обработчик на прервать.

echo ‘(прерывание обработчика сброса) (файл компиляции « filename «)’ | схема -q

Можно также переопределить базовый обработчик исключений (Раздел 12.1) для достижения аналогичного эффекта при этом больше контроля над форматом сообщений, которые производятся.

Альтернативой запуску Chez Scheme в окне оболочки является использование Библиотека виджетов схемы (SWL), которая поставляется с Chez Scheme .После установки SWL можно запустить из командной строки через swl команда. В системах Windows его также можно запустить из меню «Файл» (или на рабочем столе значок, если он есть), а в системах MacOS X его также можно запустить через Chez Scheme / SWL Значок папки приложений. SWL — это интегрированная среда разработки с собственным окном REPL. и простой текстовый редактор, что делает его хорошим вариантом для начинающих Scheme программисты. Некоторые опытные программисты Scheme предпочитают использовать Chez Scheme из в GNU Emacs.

Раздел 2.2. Редактор выражений

Когда Chez Scheme используется интерактивно в окне оболочки, как описано выше, или когда new-cafe вызывается явно из верхнего уровня программа или скрипт запускаются через —program или —script, в процедуре официанта «подсказка и чтение» используется редактор выражений, позволяет вводить и редактировать однострочные и многострочные выражения, автоматически отступает от выражений по мере их ввода и поддерживает завершение имени на основе идентификаторов, определенных в интерактивном Окружающая среда.Редактор выражений также поддерживает историю выражений, набранных во время и между сеансами и поддерживает перемещение истории и поиск в стиле tcsh команды. Другие команды редактирования включают простое перемещение курсора с помощью клавиши со стрелками, удаление символов через backspace и delete, и перемещение, удаление и другие команды, использующие в основном привязки клавиш emacs.

Редактор выражений не запускается, если переменная среды TERM не установлена. установить (в системах на базе Unix), если стандартные файлы ввода или вывода имеют был перенаправлен, или если параметр командной строки —eedisable (Раздел 2.9). По умолчанию история сеансов сохраняется в файле «.chezscheme_history» в домашнем каталоге пользователя. Параметр командной строки —eehistory (Раздел 2.9) можно использовать для указания другого расположение файла истории или отключить сохранение и восстановление файл истории.

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

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

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

Подробное описание команд редактирования дано в Глава 14, в которой также описаны параметры, позволяющие контроль над редактором выражений, механизмы добавления или изменения ключа привязки и механизмы для создания новых команд.C удалить текущее содержимое записи; сбросить до конца истории

Отступ:

tab изменить отступ для текущей строки, если префикс идентификатора не
только что поступил; иначе вставьте завершение идентификатора
esc-tab безусловное изменение отступа в текущей строке
esc-q, esc-Q, esc- ^ Q изменить отступ для каждой строки ввода

Завершение идентификатора:

вкладка вставить завершение идентификатора, если только что введено
префикс идентификатора; иначе изменить отступ в текущей строке
tab-tab показать возможные дополнения идентификатора в конце
идентификатор только что набран, иначе отступ
^ R вставить завершение следующего идентификатора

Если в конце существующего идентификатора, т. е.N перейти к следующей записи из неизмененной записи esc-p поиск назад по истории для данного префикса esc-n поиск вперед по истории для данного префикса esc-P поиск назад по истории для данной строки esc-N поиск вперед по истории для данной строки

Для поиска введите префикс или строку, за которой следует один из ключей поиска последовательности.Следуйте дополнительным последовательностям клавиш поиска, чтобы искать дальше назад или вперед в истории. Например, введите «(определить», а затем одну или несколько последовательностей клавиш esc-p. для поиска в обратном направлении записей, которые являются определениями, или «(определить» за которыми следует одна или несколько последовательностей клавиш esc-P для записей, содержащих определения. U- n повторить следующую команду n раза

Раздел 2.3. Среда взаимодействия

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

В схеме Chez Scheme , когда вводятся определения или выражения в запрашивать или загружать их из файла, они работают с среда взаимодействия, которая является изменчивой средой, которая изначально содержит привязки только для встроенных ключевых слов и примитивов.Он может быть дополнен пользовательскими привязками идентификаторов через верхний уровень определения. Среда взаимодействия также называется верхним уровнем среды, поскольку она находится на верхнем уровне для целей определения объема. Программы, вводимые по запросу или загружаемые из файла посредством загрузки не следует путать с программами верхнего уровня RNRS, которые на самом деле больше похоже на библиотеки по своему поведению. В частности, хотя один и тот же идентификатор может быть определен несколько раз в среде взаимодействия, чтобы поддерживать инкрементную программу разработки, идентификатор может быть определен не более одного раза в RNRS программа высшего уровня.

Среда взаимодействия по умолчанию, используемая для любого кода, который происходит вне программы или библиотеки верхнего уровня РНРС (включая такой код, набранный на приглашение или загружено из файла) содержит все привязки (chezscheme) библиотека (или модуль схемы, который экспортирует тот же набор привязок). Этот набор содержит ряд привязок, которых нет в библиотеках RNRS. Он также содержит ряд привязок, расширяющих аналоги RNRS в каким-то образом и поэтому не строго совместимы с привязками RNRS для те же идентификаторы.Чтобы заменить их привязками, строго совместимыми с RNRS, просто импортировать библиотеки rnrs в среду взаимодействия с помощью введите следующее в REPL или загрузите его из файла:

(импорт
(rnrs)
(rnrs eval)
(изменяемые пары rnrs)
(изменяемые строки rnrs)
(rnrs r5rs))

Чтобы получить среду взаимодействия, содержащую все и только Привязки RNRS используйте следующее.

(взаимодействие-среда
(копия-среда
(среда
‘(rnrs)
‘ (rnrs eval)
‘(изменяемые пары rnrs)
‘ (изменяемые строки rnrs)
‘(rnrs r5rs))
# т))

Для большинства целей, библиотеки и импорта вероятно, также должен быть включен из библиотеки (chezscheme).

(взаимодействие-среда
(копия-среда
(среда
‘(rnrs)
‘ (rnrs eval)
‘(изменяемые пары rnrs)
‘ (изменяемые строки rnrs)
‘(rnrs r5rs)
‘ ( только (chezscheme) импорт библиотеки))
#t))

Также может быть полезно включить отладку в набор идентификаторы, импортированные из (chezscheme), чтобы позволить отладчику быть вводится после возникновения исключения.

Большинство идентификаторов привязаны к среде взаимодействия по умолчанию, которая не совсем совместимы с Пересмотренным отчетом 6 , переменные связаны с процедуры с расширенными интерфейсами, т.е.е., необязательные аргументы или расширенные домены аргументов. Остальные — это ключевые слова, связанные с трансформаторами, которые расширяют Revised 6 Синтаксис отчета каким-то образом. Это не должно быть проблемой, за исключением программ, которые исключения, возникающие в случаях, совпадающих с расширениями. Например, если программа передает процедуру = одно числовое аргумент и ожидает возникновения исключения, он потерпит неудачу в начальная среда взаимодействия, потому что = возвращает #t когда передан единственный числовой аргумент.

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

(set! Cons +) исключение: cons неизменен

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

(определить cons-count 0)
(определить исходные cons cons)
(определить cons
(lambda (x y)
(установить! Cons-count (+ cons-count 1))
(original-cons x y )))

переопределяет cons, чтобы подсчитать количество вызовов, и

(набор! Минусы оригинал-минусы)

присваивает cons к исходному значению.После определения переменной в среде взаимодействия с помощью определить, последующее определение той же переменной эквивалентно в набор !, так что

(определите минусы-минусы)

имеет тот же эффект, что и набор! над. Выражение

(импорт (только (chezscheme) минусы))

также привязывает cons к исходному значению. Он также возвращает его в исходное состояние только для чтения.

Более простое переопределение

(определить cons (let () (схема импорта) cons))

превращает cons в изменяемую переменную с тем же значением, что и изначально имел.Тот же эффект может быть получен оптом для всех переменных. в среде взаимодействия, вызвав возврат-взаимодействие-семантика без аргументов или передачи —revert-взаимодействия-семантика параметр в командной строке. Однако это не позволяет компилятору генерировать эффективный код. для примитивных вызовов или создания предупреждающих сообщений при неправильном использовании примитивов.

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

(определить инь (лямбда () (- (ян) 1)))

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

(определить ян (лямбда () (+ (инь) 1)))

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

Тонким следствием этой полезной особенности среды взаимодействия является то, что процедура свободный идентификатор =? (Раздел 8.3 документа , Язык программирования схем, 4-е издание ) не считает несвязанные идентификаторы библиотеки эквивалентными (пока) неопределенные идентификаторы верхнего уровня, даже если они имеют то же имя, потому что последние фактически считаются допустимыми привязками переменных.

(библиотека (A) (экспорт a)
(импорт (rnrs))
(define-syntax a
(lambda (x)
(syntax-case x ()
[(_ id) (free-identifier =? # ‘id #’ undefined)]))))
(let () (import (A)) (a undefined)) #f

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

(библиотека (A) (экспорт aux-a)
(import (rnrs) (only (chezscheme) syntax-error))
(define-syntax aux-a
(lambda (x)
(syntax-error x «недопустимый контекст»)))
(define-syntax a
(lambda (x)
(syntax-case x (aux-a)
[(_ aux-a) # » хорошо]]
[(_ _) # » ой]))))
(let () (import (A)) (a aux-a)) хорошо
(let () (import (only (A) a)) (a aux-a)) ой

Эта проблема не возникает, если библиотеки используются полностью в других библиотеки или в программах верхнего уровня РНРС, поскольку взаимодействие окружающая среда не играет роли.

Раздел 2.4. Использование библиотек и программ верхнего уровня

Библиотека R6RS может быть определена непосредственно в REPL, загружена явно из файла (с помощью load или load-library) или загруженного неявно из файла через импорт. При определении непосредственно в REPL или явной загрузке из файла форма библиотеки может быть использована для переопределения существующей библиотеки, но import никогда не перезагружает библиотеку после того, как она была определена.

Библиотека, загружаемая неявно через импорт должен находиться в файле, имя которого отражает имя библиотеки.Например, если имя библиотеки (инструменты сортировки), базовое имя файла должно быть сортируемым с допустимым расширением, и файл должен находиться в каталоге с именем tools, который сам находится в одном из каталогов, найденных при импорте. Набор каталогов, в которых выполняется поиск при импорте, определяется то библиотеки-каталоги параметр, а набор расширений определяется библиотеки-расширения параметр.

Значения обоих параметров представляют собой списки пар строк. Первая строка в каждой паре библиотеки-каталоги определяет исходный файл базового каталога, а второй идентифицирует соответствующий базовый каталог объектных файлов.Точно так же первая строка в каждой паре библиотека-расширения определяет расширение исходного файла, а второе определяет соответствующее расширение объектного файла. Полный путь к исходному или объектному файлу библиотеки состоит из источника или объектная база, за которой следуют компоненты имени библиотеки, разделенные знаком слэши, с добавлением расширения библиотеки в конце. Например, для базовой / usr / lib / scheme имя библиотеки (приложение lib1) и расширение .sls, полный путь /usr/lib/scheme/app/lib1.sls. Итак, если (библиотеки-каталоги) содержат пути «/ usr / lib / scheme / libraries» и «.», а также (библиотека-расширения) содержит расширения .ss и .sls, путь к (сортировка инструментов) библиотека должна быть одной из следующих.

/usr/lib/scheme/libraries/tools/sorting.ss
/usr/lib/scheme/libraries/tools/sorting.sls
./tools/sorting.ss
./tools/sorting.sls

При поиске библиотеки сначала импорт создает частичное имя из списка компонентов в имени библиотеки, например, a / b для библиотеки (а б). Затем он ищет частичное имя в каждой паре. базовых каталогов по порядку, пробуя каждое из исходных расширений, затем каждое из расширений объекта по очереди, прежде чем перейти к следующей паре базовые каталоги.Если частичное имя является абсолютным путем, например, ~ / .myappinit для библиотеки с именем (~ / .myappinit) только указанный абсолютный путь ищется сначала с каждым исходным расширением, затем с каждым объектом расширение. Если расширитель находит исходный файл до того, как найдет объект файл, он загружает соответствующий объектный файл, если объектный файл существует и не старше исходного файла. Если это не так, и параметр компилировать-импортированные-библиотеки установлен на #t, расширитель компилирует библиотеку через compile-library (описана ниже).В противном случае расширитель загрузит исходный файл. Во время этого процесса возникает исключение, если исходный или объектный файл существует, но не читается или объектный файл не может быть создан.

Процесс поиска, используемый расширителем при обработке импорта для библиотеки, которая еще не была загружена, можно отслеживать с помощью установив для параметра import-notify значение #t. Этот параметр можно установить из командной строки через Параметр командной строки —import-notify.

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

Когда импорт компилирует библиотеку, как описано выше, он не также загрузите скомпилированную библиотеку, потому что это вызовет часть библиотека будет переоценена. Из-за этого выражения времени выполнения в файле вне Библиотечная форма оцениваться не будет. Если такие выражения присутствуют и должны быть оценены, библиотека должны быть скомпилированы заранее или загружены явно.

Файл, содержащий библиотеку, может быть скомпилирован с помощью compile-file или компиляционная библиотека.Единственная разница между ними заключается в том, что последний обрабатывает источник файл, как если бы перед ним был неявный префикс #! r6rs, который отключает лексические расширения Chez Scheme , если не указано явное В файле появится маркер #! chezscheme. Любые библиотеки, от которых зависит библиотека, должны быть сначала скомпилированы. Это можно сделать вручную или установив параметр скомпилировать импортированные библиотеки в #t перед компиляцией импортирующая библиотека. Если одна из библиотек, импортированных библиотекой, впоследствии перекомпилирован (скажем, потому что он был изменен), импортирующая библиотека также должна перекомпилировать.

Как и в случае с файлом компиляции, можно использовать библиотеку компиляции. в «пакетном» режиме через команду оболочки:

echo ‘(библиотека компиляции « filename «)’ | схема -q

с одинарными кавычками, окружающими вызов библиотеки компиляции опущено для оболочек Windows.

Программа верхнего уровня RNRS обычно находится в файле, но можно также введите его прямо в REPL с помощью программы верхнего уровня формы, например:

(программа верхнего уровня
(импорт (rnrs))
(отображение «Что случилось? \ N»))

Программа верхнего уровня, хранящаяся в файле, не имеет программы верхнего уровня оболочка, поэтому та же программа верхнего уровня в файле просто:

(импорт (rnrs))
(отображение «Что случилось? \ N»)

Программа верхнего уровня, хранящаяся в файле, может быть загружена из файла через процедура загрузки программы. Программа верхнего уровня также может быть загружена через load, но не без влияющие на семантику. Программа, загруженная через load, имеет область видимости на верхнем уровне, где она может увидеть все привязки верхнего уровня, тогда как программа верхнего уровня, загруженная через load-program является самодостаточной, т. е. может видеть только привязки, видимые с помощью ведущей формы импорта. Кроме того, привязки переменных в программе, загружаемой через load, также становятся привязками верхнего уровня, тогда как они являются локальными для программы, когда программа загружается через load-program. Более того, load-program, как и load-library, обрабатывает исходный файл, как если бы перед ним был неявный префикс #! r6rs, который отключает лексические расширения Chez Scheme , если не указано явное В файле появится маркер #! chezscheme.Программа, загруженная через load, также будет менее эффективной. Поскольку переменные программы не являются локальными для программы, компилятор должны предположить, что они могут измениться в любое время, что препятствует многим из оптимизации.

Программы верхнего уровня могут быть скомпилированы с использованием компиляция программы, которая похожа на файл компиляции, но, как и в случае с программой загрузки, правильно реализует семантику и лексические ограничения программ верхнего уровня. compile-program также копирует ведущий #! линия, если есть, из исходного файла в объектный файл, в результате чего исполняемый объектный файл.Любые библиотеки, от которых зависит программа верхнего уровня, кроме встроенные библиотеки должны быть сначала скомпилированы. Это можно сделать вручную или установив параметр скомпилировать импортированные библиотеки в #t перед компиляцией программа. Программа должна быть перекомпилирована, если какая-либо из библиотек, на которой это зависит перекомпилированы.

Как и в случае с файлом компиляции и библиотекой компиляции, compile-программу можно использовать в «пакетном» режиме через оболочку команда:

echo ‘(программа-компиляция « filename «)’ | схема -q

с одинарными кавычками вокруг вызова программы компиляции опущено для оболочек Windows.

compile-program возвращает список библиотек, непосредственно вызываемых скомпилированная программа верхнего уровня. В сочетании с библиотечные требования и имя-файла-объекта-библиотеки процедуры, список библиотек, возвращаемых программой компиляции, может использоваться для определения набора файлов, которые должны распространяться с скомпилированный файл программы.

Раздел 2.5. Схема сценариев оболочки

Когда присутствует параметр командной строки —script, именованный файл рассматривается как сценарий оболочки Scheme, а командная строка доступно через параметр командная строка.Это в первую очередь полезно в системах на базе Unix, где файл сценария сам может быть выполнен исполняемым. Для поддержки исполняемых сценариев оболочки система игнорирует первый строка загруженного скрипта, если она начинается с #! с последующим пробел или косая черта. Например, если предположить, что исполняемый файл Chez Scheme был установлен как / usr / bin / scheme, следующий сценарий выводит его командную строку аргументы.

#! / usr / bin / scheme —script
(для каждого
(лямбда (x) (отображение x) (новая строка))
(cdr (командная строка)))

Следующий скрипт реализует традиционный Unix echo команда.

#! / usr / bin / scheme —script
(let ([args (cdr (command-line))])
(if (null? args)
(let-values ​​([(newline? args)
(if (equal ? (Car args) «-n»)
(значения #f (cdr args))
(values ​​#t args))])
(do ([args args (cdr args)] [sep «» «»])
((null? Args))
(printf «~ a ~ a» sep (car args)))
(когда перевод строки? (Newline)))))

Скрипты могут быть скомпилированы с использованием скрипта компиляции, который похож на compile-file, но отличается двумя способами: (1) копирует ведущий #! строка из скрипта исходного файла в объектный файл и (2) когда #! линия присутствует, он отключает сжатие по умолчанию итогового файла, что в противном случае предотвратить его распознавание как файл сценария.

Если установлен Petite Chez Scheme , но не Chez Scheme , / usr / bin / scheme может быть заменен на / usr / bin / petite.

Параметр командной строки —program похож на —script за исключением того, что файл сценария рассматривается как программа верхнего уровня RNRS (Глава 10). Следующая программа верхнего уровня RNRS реализует традиционный Unix echo, как в сценарии выше.

#! / usr / bin / scheme —program
(import (rnrs))
(let ([args (cdr (command-line))])
(if (null? args)
(let-values ​​([(newline? args)
(if (равно? (car args) «-n»)
(values ​​#f (cdr args))
(values ​​#t args))])
(do ([args args (cdr args)] [ sep «» «»])
((null? args))
(display sep)
(display (car args)))
(когда перевод строки? (newline)))))

Опять же, если установлен только Petite Chez Scheme , / usr / bin / scheme можно заменить на / usr / bin / petite.

схема-скрипт может использоваться вместо схемы — программа или petite —program, т.е.

#! / usr / bin / схема-сценарий

схема-сценарий запускает Chez Scheme , если есть, в противном случае Petite Chez Scheme .

Также можно использовать / usr / bin / env, как рекомендовано в Пересмотрено 6 Сообщить о нестандартных приложениях, что позволяет схема-скрипт должна появляться в любом месте пути пользователя.

#! / usr / bin / env схема-сценарий

Если программа верхнего уровня зависит от библиотек, отличных от встроенных в Chez Scheme , параметр —libdirs может использоваться для указания в каких каталогах источников и объектов искать.Точно так же, если библиотека, от которой зависит программа верхнего уровня, имеет расширение, кроме одного из стандартных расширений, Опция —libexts может использоваться для указания дополнительных расширений искать.

Эти параметры устанавливают соответствующие параметры Chez Scheme каталоги-библиотеки и расширения-библиотеки, которые описаны в разделе 2.4. Формат аргументов —libdirs и —libexts то же самое: последовательность подстрок, разделенных одним разделителем персонаж.Символ-разделитель — это двоеточие (:), за исключением Windows, где это точка с запятой (;). Между одиночными разделителями исходная и объектная строки, если обе указаны, разделены двумя символами-разделителями. Если в конце строки появляется один символ-разделитель, указанные пары добавляются в начало существующего списка; в противном случае указанные пары заменяют существующий список.

Например, если разделителем является двоеточие,

схема —libdirs «/ home / moi / lib:»

добавляет пару директорий источник / объект

(«/ home / moi / lib».»/ home / moi / lib»)

в начало набора библиотечных каталогов по умолчанию, и

схема —libdirs «/ home / moi / libsrc :: / home / moi / libobj:»

добавляет пару директорий источник / объект

(«/ home / moi / libsrc». «/ Home / moi / libobj»)

в начало набора библиотечных каталогов по умолчанию. Параметры устанавливаются после загрузки всех загрузочных файлов.

Если нет опции —libdirs и CHEZSCHEMELIBDIRS переменная среды установлена, строковое значение CHEZSCHEMELIBDIRS равно обрабатывается так, как если бы он был задан параметром —libdirs. Точно так же, если не появляется опция —libexts и CHEZSCHEMELIBEXTS переменная среды установлена, строковое значение CHEZSCHEMELIBEXTS равно обрабатывается так, как если бы он был задан параметром —libexts.

Раздел 2.6. Оптимизация

Чтобы получить максимальную отдачу от компилятора Chez Scheme , необходимо дайте ему небольшую помощь. Самая важная помощь — избегать использования верхнего уровня привязки (взаимодействие-среда). Привязки верхнего уровня удобны и уместны во время программы разработка, поскольку они упрощают тестирование, переопределение и отслеживание (Раздел 3.1) отдельных процедур и синтаксические формы. Однако за это удобство приходится платить.

Компилятор может распространять копии (одной переменной на другую или константа к переменной) и встроенные процедуры, привязанные к local, неназначенные переменные в одном выражении верхнего уровня. Для процедур, которые он не встроен, он может избежать построения и передача ненужных замыканий, обход проверки количества аргументов, переход к правильная точка входа в case-lambda и построение остальных аргументов (подробнее эффективно) на стороне вызывающего абонента, где длина оставшегося списка равна известно во время компиляции. Он также может отбрасывать определения переменных, на которые нет ссылок, поэтому есть нет штрафа за включение большой библиотеки подпрограмм, только несколько из которые действительно используются.

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

К счастью, программу легко реструктурировать, чтобы избежать ошибок верхнего уровня. привязки. Это естественно достигается для переносимого кода, помещая кода в единую программу верхнего уровня RNRS или помещая часть кода в программе верхнего уровня, а остаток в одном или больше отдельных библиотек.Хотя это не переносимо, можно также поместить весь код в единая форма модуля верхнего уровня или выражение let, возможно, используя include, чтобы добавить части код из отдельных файлов.

Если программа структурирована как программа верхнего уровня RNRS и набор одной или нескольких библиотек остается одна проблема: компилятор не оптимизируется за пределами библиотеки. Это не проблема, если взаимодействие между программой верхнего уровня и его библиотеки, а также между каждой парой библиотек встречаются нечасто.Например, компилятор может быть структурирован как набор невзаимодействующих проходит, каждый в своей собственной библиотеке, с программой верхнего уровня, которая просто вызывает каждый проход по очереди. Такая программа не будет работать значительно лучше, если все код библиотеки был перемещен в программу верхнего уровня. С другой стороны, если все проходы имеют общую библиотеку часто используемых записей определения и помощники для управления промежуточными формами компилятор, программа могла бы работать значительно лучше, если бы все код были объединены.Конечно, это предотвращает использование библиотек отдельно для другие цели. (Форма экспериментальной библиотеки-группы, описанная в Раздел 10.3 предназначен для решения этой проблемы.)

После того, как код приложения был помещен в одну программу верхнего уровня или в программа верхнего уровня и одна или несколько библиотек, код может быть загружен из исходного кода через загрузочную программу или скомпилированный через компилировать программу а также компиляционная библиотека, как описано в разделе 2. 4. Убедитесь, что вы не используете compile-file для программы верхнего уровня поскольку это не сохраняет семантику и не приводит к тому, что код столь же эффективен.

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

Во-первых, мы можем позволить компилятору генерировать «небезопасный» код, т. Е. позволить компилятору генерировать код, в котором обычный тип времени выполнения проверки отключены. Мы делаем это, используя «уровень оптимизации 3» компилятора при компиляции файлы программы и библиотеки.Этого можно добиться, установив параметр optimize-level до 3 при компиляции библиотеки или программа, например:

(параметризация ([уровень оптимизации 3]) (программа компиляции « имя файла «))

или в пакетном режиме с помощью параметра командной строки —optimize-level:

echo ‘(программа-компиляция « filename «)’ | схема -q —optimize-level 3

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

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

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

Раздел 2.7. Кастомизация

Chez Scheme и Petite Chez Scheme построены из нескольких подсистемы: «ядро», инкапсулированное в общую библиотека (библиотека динамической компоновки), содержащая операционную систему интерфейс и низкоуровневый код управления хранилищем, исполняемый файл, который анализирует аргументы командной строки и вызывает в ядро ​​для инициализации и запуска системы, базовый загрузочный файл (petite.boot), который содержит основную часть кода библиотеки времени выполнения, и дополнительный загрузочный файл (scheme.boot) только для Chez Scheme , который содержит компилятор.

Хотя ядро ​​и базовый загрузочный файл необходимы для работы всех программ, исполняемый файл может быть заменен или даже исключено, и загрузочный файл компилятора нужно загрузить только если компилятор действительно используется. Фактически, компилятор обычно никогда не загружается для распределенных приложений, поскольку для этого у каждого пользователя должен быть лицензия на запуск Chez Scheme .

Ядро экспортирует набор точек входа, которые используются для инициализации система схемы, загрузка файлов загрузки или кучи, запуск интерактивной схемы сеансе, запустите файлы сценариев и деинициализируйте систему. В потоковых версиях системы ядро ​​также экспортирует точки входа для активации, деактивации и уничтожения потоков. Эти точки входа можно использовать для создания собственного исполняемого образа. с разными (или отсутствующими) параметрами командной строки или для запуска Scheme в качестве подчиненной программы в другой программе, т.е.е., для использования в качестве язык расширения.

Эти точки входа описаны в Разделе 4.8, вместе с другими точками входа для доступа и изменения схемы структуры данных и вызывающие процедуры схемы.

Дистрибутивы tarball (tar.gz) Chez Scheme и Petite Chez Scheme включить в каталог распространения подкаталог под названием «custom». Файл custom.c в этом подкаталоге содержит «основная» процедура для распределенного исполняемого образа; смотреть на этот файл, чтобы понять, как запускается система используются точки входа.Подкаталог custom также содержит код конфигурации и создавать файлы, которые можно использовать для восстановления исполняемого файла и установить получившуюся систему.

Раздел 2.8. Сборка и распространение приложений

Хотя Chez Scheme не может распространяться бесплатно, код скомпилирован с использованием Chez Scheme распространяется свободно. Однако скомпилированные объектные файлы не содержат кода библиотеки времени выполнения. который неизменно требуется для запуска приложения, включая код для примитивные процедуры, код, необходимый для взаимодействия с операционной системой, и диспетчер хранилища.К счастью, этот код библиотеки также можно свободно распространять в виде Petite Chez Scheme , который могут использоваться и распространяться без лицензионных сборов или роялти за любые цели, в том числе за перепродажу в рамках коммерческого товар. В лицензии на программное обеспечение Petite Chez Scheme. Соглашение , которое доступно в каталоге распространения для Petite Chez Scheme на http://www.scheme.com.

Хотя это полезно как автономная система Scheme, Petite Chez Scheme была задумана как исполняющая система для скомпилированных Chez Scheme заявки.Остальная часть в этом разделе описывается, как создавать и распространять такие приложения используя Petite Chez Scheme . Он начинается с обсуждения характеристик Схема Petite Chez и ее сравнение со схемой Chez , затем описывает, как подготовить исходный код приложения, как создавать и запускать приложения и как их распространять.

Характеристики схемы Petite Chez. Хотя программа Petite Chez Scheme основана на интерпретаторе, оценивает исходный код схемы код быстрее, чем можно было ожидать.Некоторые из причин этого перечислены ниже.

  • Система времени выполнения полностью скомпилирована, поэтому реализации библиотеки примитивов от + и автомобиль до сортировки и printf так же эффективны, как и в Chez Scheme , хотя они не могут быть открытыми, как в коде, скомпилированном Chez Scheme на высоком уровне уровни оптимизации.
  • Интерпретатор сам по себе является скомпилированным приложением Scheme. Поскольку он написан на схеме, он напрямую извлекает выгоду из различных характеристики схемы, с которыми придется иметь дело явно и с дополнительными накладными расходами на большинстве других языков, включая правильное лечение хвостовых криков, первоклассные процедуры, автоматические управление хранением и продолжениями.
  • Интерпретатор использует препроцессор, который выполняет различные оптимизирует и преобразует код в форму, которую можно интерпретировать эффективно. Фактически, препроцессор делит свой интерфейс с компилятором, и этот интерфейс выполняет множество оптимизаций на уровне исходного кода.

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

Некоторые дополнительные ограничения возникают из-за того, что Petite Chez Scheme не включает компилятор:

  • Компилятор должен присутствовать для обработки внешней процедуры и выражения, вызываемые из-за рубежа, даже если эти формы оценивается переводчиком. Эти формы не могут быть обработаны одним переводчиком, поэтому они не могут появиться в исходном коде для обработки Petite Chez Scheme . Скомпилированные версии foreign-procedure и foreign-callable формы, однако, могут быть включены в скомпилированном коде, загруженном в Petite Chez Scheme .
  • Информация инспектора прикрепляется к объектам кода, которые генерируется только компилятором, поэтому исходная информация и имена переменных недоступны для интерпретируемых процедур или продолжений в интерпретированные процедуры. Это делает инспектор менее эффективным для отладки интерпретируемого кода. чем для отладки скомпилированного кода.
  • Имена процедур также прикрепляются к объектам кода, поэтому компилятор связывает имя с каждой процедурой, когда может быть определено подходящее имя, интерпретатор этого не делает.Это в основном влияет на качество сообщений об ошибках, например, сообщения об ошибке. может читать «неверное количество аргументов для # <процедура>» а не более полезное «неправильное количество аргументов для # <имя процедуры >. »
  • Компилятор обнаруживает во время компиляции некоторые потенциальные ошибки что интерпретатор не обнаруживает и сообщает о них во время компиляции предупреждения, которые идентифицируют выражение или местоположение в источнике файл, если есть, в котором появляется выражение.

За исключением указанного выше, схема Petite Chez Scheme не ограничивает программы могут делать, и, как и Chez Scheme , в нем практически нет ограничения на размер программ или создаваемых ими образов в памяти, за пределами неотъемлемых ограничений базового оборудования или операционная система.

Скомпилированные скрипты и программы. Один из простых механизмов распространения приложения — структурировать его как сценарий или программу верхнего уровня RNRS, используйте скомпилировать скрипт или compile-program, при необходимости чтобы скомпилировать его, как описано в разделе 2.5, и распространить полученный объектный файл вместе с полным распределением Схема Petite Chez . Когда этот механизм используется в системах на базе Unix, если исходный файл начинается с #! и последующий путь — это путь к Chez Scheme исполняемый файл, например, / usr / bin / scheme, тот, который находится перед объектным файлом следует заменить путь к Petite Chez Scheme Исполняемый файл, например / usr / bin / petite. Путь может быть изменен при установке приложения. программа, основанная на том, где Petite Chez Scheme установлена ​​на мишени система.При использовании под Windows программа установки приложения должна настройте соответствующий ярлык, который запускает Petite Chez Scheme с —script или —program, в зависимости от ситуации, после по пути к объектному файлу.

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

Подготовка кода приложения. Хотя можно распространять приложения в форме исходного кода, я. е., как набор исходных файлов Scheme для загрузки в Petite Chez Scheme конечным пользователем распространение скомпилированного кода имеет два основных преимущества перед распространением исходного кода. Во-первых, скомпилированный код обычно намного эффективнее, как обсуждается в предыдущий раздел, а второй — скомпилированный код в двоичной форме и таким образом обеспечивает большую защиту кода проприетарного приложения. По этим причинам мы предлагаем компилировать приложения.

Исходный код приложения обычно состоит из набора исходных кодов схемы. файлы, возможно, дополненные чужим кодом, разработанным специально для приложения и упакованы в общие библиотеки (также известные как общие объекты или, в Windows, библиотеки динамической компоновки).Ниже предполагается, что исходный код любой разделяемой библиотеки был преобразован в объектную форму; как это сделать, зависит от платформы. (Некоторые подсказки приведены в разделе 4.6.) В результате загружается набор из одной или нескольких разделяемых библиотек. явно исходным кодом схемы во время инициализации программы.

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

echo ‘(файл-компиляция « filename «)’ | схема

, который создает объектный файл filename.so из источника файл filename.ss.

Если код приложения разработан интерактивно или обычно загружается прямо из источника, может потребоваться внести некоторые изменения в файл, чтобы компилируется, если файл содержит выражения или определения, которые влияют на компиляцию последующих форм в файле.Это можно сделать с помощью eval-when (Раздел 12.4). Обычно в этом нет необходимости, если приложение состоит набора библиотек РНРС.

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

Процедура запуска схемы определяет, что делает система, когда он запущен. Процедура запуска по умолчанию загружает файлы, перечисленные в команде линия (через load) и запускает новое кафе, вот так.

(лямбда fns (для каждой загрузки fns) (new-cafe))

Процедуру запуска можно изменить с помощью параметра схема-старт. Следующий пример демонстрирует установку варианта процедура запуска по умолчанию, которая печатает имя каждого файла перед загружая это.

(начало схемы
(лямбда fns
(для каждого
(lambda (fn)
(printf «loading ~ a …» fn)
(load fn)
(printf «~%»))
fns )
(нью-кафе)))

Типичная процедура запуска приложения сначала вызывает процедуры инициализации приложения, а затем запустить само приложение:

(схема-запуск
(лямбда-фнс
(инициализация-приложение)
(запуск-приложение-фнс)))

Любые разделяемые библиотеки, которые должны присутствовать во время работы приложение должно быть загружено во время инициализации.Кроме того, должны выполняться все выражения внешней процедуры. после загрузки разделяемых библиотек, чтобы адреса иностранных программ доступны для записи с процедуры. Ниже показан один из способов инициализации. выполнено для приложения, которое ссылается на иностранную процедуру show_state в общей библиотеке Windows state.dll:

(определить состояние показа)

(определите app-init
(lambda ()
(load-shared-object «state. dll «)
(set! show-state
(foreign-procedure» show_state «(integer-32)
integer-32)))

(scheme-start
(lambda fns
(app-init)
(app -запустить фнс)))

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

Хотя это и не является строго необходимым, мы предлагаем объединить ваши Объедините объектные файлы схемы, если у вас их несколько, в один объектный файл.Это может быть сделано в системах Unix просто через cat программу или в Windows через копию. Размещение всего объектного кода в одном файле упрощает создание и распространение приложений.

С объектным кодом схемы, содержащимся в одном составном объектном файле, можно запустить приложение, просто загрузив составной объектный файл в Petite Chez Scheme , например:

petite app.so

где app.so — имя файла составного объекта, и запуск процедуры запуска для перезапуска системы:

> ((схема-старт))

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

  • Любое переопределение процедуры запуска схемы, т. Е. изменение к параметру scheme-start, вступает в силу до вызывается процедура запуска, поэтому нет необходимости вызывать новая версия, как показано выше.
  • Любой код и структуры данных, содержащиеся в загрузочном файле или созданные при загрузке автоматически уплотняется вместе с базовым временем выполнения код библиотеки и сделан статичным.Статический код и данные никогда не собираются диспетчером хранилища, поэтому Снижены накладные расходы на сборку мусора. (Также можно явно сделать код и данные статическими в любом время через процедуру сбора.)
  • Система автоматически ищет загрузочные файлы в наборе стандартных каталоги на основе имени исполняемого образа, поэтому вы можете установите копию исполняемого образа Petite Chez Scheme под ваш имя приложения и избавьте пользователей от необходимости указывать командную строку аргументы или запуск отдельного скрипта для загрузки кода приложения.

Загрузочный файл — это просто объектный файл, возможно, содержащий код для более одного исходного файла с префиксом загрузочного заголовка. Заголовок загрузки определяет базовый файл загрузки, на котором приложение напрямую зависит, или, возможно, две или более альтернатив, от которых приложение можно запустить. В большинстве случаев petite.boot будет определяться как базовая загрузка. файл, но в многоуровневом приложении это может быть другой загрузочный файл вашего создание, которое, в свою очередь, зависит от petite.boot. Базовый загрузочный файл и его базовый загрузочный файл, если таковой имеется, загружаются. автоматически при загрузке файла загрузки вашего приложения.

Загрузочные файлы создаются с помощью make-boot-file. Эта процедура принимает два или более аргумента. Первый — это строка с именем файла, в котором загружается заголовок и должен быть размещен объектный код, вторая — это список строк именования базы загрузочные файлы, а остальные — это строки с именами входных файлов. Например, звонок:

(make-boot-file «app.boot» ‘(«petite») «app1.so» «app2.ss» «app3.so»)

создает загрузочный файл app.boot, который определяет зависимость от petite.ботинок и содержит объектный код для app1.so, объектный код, полученный из компиляция app2.ss и объектный код для app3.so. Звонок:

(make-boot-file «app.boot» ‘(«scheme» «petite») «app.so»)

создает файл заголовка, который определяет зависимость либо scheme.boot или petite.boot с объектным кодом из app.so. В первом случае система автоматически загрузит petite.boot. когда загрузочный файл приложения загружен, а в последнем он будет загрузить scheme.boot, если он может его найти, в противном случае petite.загрузки. Это позволит вашему приложению работать поверх полной Chez Scheme , если присутствует, в противном случае Petite Chez Scheme .

Хотя Petite Chez Scheme распространяется свободно, Chez Scheme может использоваться только по прямой лицензии от Cadence Research Systems и не подлежат распространению. В большинстве случаев это означает, что вы должны создать свое приложение так что это не зависит от характеристик Chez Scheme , и вы следует указывать только «petite» в обращении к сделать загрузочный файл.Однако если ваше приложение вызывает eval, и вы хотите разрешить пользователям, имеющим лицензию Chez Scheme , принимать преимущество более высокой скорости выполнения скомпилированного кода, а затем указание и «схема», и «маленькая» Уместно.

Распространение приложения. Распространение приложения включает создание пакета распространения это включает, как минимум, следующие элементы:

  • распределение Petite Chez Scheme ,
  • загрузочный файл приложения,
  • любые разделяемые библиотеки для конкретных приложений,
  • сценарий установки приложения.

Скрипт установки приложения должен установить Petite Chez Scheme если он еще не установлен в целевой системе. Он должен установить загрузочный файл приложения в тот же каталог, что и установлен загрузочный файл Petite Chez Scheme petite. boot, и он должен установить разделяемые библиотеки приложения, если таковые имеются, либо в том же месте, либо в стандартном месте для общих библиотек в целевой системе. Он также должен создать ссылку или копию Petite Chez Scheme исполняемый файл под именем вашего приложения, т.е.е., имя данное в загрузочный файл вашего приложения. При необходимости следует также установить рабочий стол и меню «Пуск». ярлыки для запуска исполняемого файла. Ниже приведен пример сценария установки для платформ Unix. Для Windows мы предлагаем использовать программу сборки установки, например, система установки сценариев NullSoft с открытым исходным кодом (NSIS).

Пример сценария установки Unix. Приведенный ниже сценарий демонстрирует, как выполнить простой установка приложения Scheme на платформе Unix.Скрипт делает следующие предположения, любое из которых может быть изменено. путем изменения параметров конфигурации приложения скрипта:

  • имя устанавливаемого приложения — app,
  • тип машины, на которой будет производиться установка это i3le (Intel Linux),
  • включена единая разделяемая библиотека libapp. so в распределении, и
  • включен один загрузочный файл приложения app.boot в раздаче.

Сценарий также устанавливает расположение исполняемых файлов по умолчанию на / usr / bin и общие библиотеки в / usr / lib.Эти настройки обычно открыты для изменения конечным пользователем; более дружелюбный сценарий запросит пользователя проверить, что эти настройки уместны.

Сценарий сначала устанавливает Petite Chez Scheme , затем устанавливает загрузочную файл и общие библиотеки, а затем настраивает исполняемый файл.

# каталоги установки
prefix =

Актуальная TL-схема

Ниже приводится текст действующей схемы. Дальнейшие детали по TL »

Кроме того, вот подробная схема в формате JSON »

  boolFalse # bc799737 = Bool;
boolTrue # 997275b5 = Bool;

true # 3fedd339 = True;

вектор # 1cb5c415 {t: Type} # [t] = Вектор t;

error # c4b9f9bb код: int text: string = Error;

ноль # 56730bcc = ноль;

inputPeerEmpty # 7f3b18ea = InputPeer;
inputPeerSelf # 7da07ec9 = InputPeer;
inputPeerChat # 179be863 chat_id: int = InputPeer;
inputPeerUser # 7b8e7de6 user_id: int access_hash: long = InputPeer;
inputPeerChannel # 20adaef8 идентификатор_канала: int access_hash: long = InputPeer;
inputPeerUserFromMessage # 17bae2e6 peer: InputPeer msg_id: int user_id: int = InputPeer;
inputPeerChannelFromMessage # 9c95f7bb peer: InputPeer msg_id: int channel_id: int = InputPeer;

inputUserEmpty # b98886cf = InputUser;
inputUserSelf # f7c1b13f = InputUser;
inputUser # d8292816 user_id: int access_hash: long = InputUser;
inputUserFromMessage # 2d117597 одноранговый узел: InputPeer msg_id: int user_id: int = InputUser;

inputPhoneContact # f392b7f4 client_id: long phone: string first_name: string last_name: string = InputContact;

inputFile # f52ff27f id: длинные части: int name: string md5_checksum: string = InputFile;
inputFileBig # fa4f0bb5 id: длинные части: int name: string = InputFile;

inputMediaEmpty # 9664f57f = InputMedia;
inputMediaUploadedPhoto # 1e287d04 flags: # file: Наклейки InputFile: flags. 0? Вектор  ttl_seconds: flags.1? Int = InputMedia;
inputMediaPhoto # b3ba0635 flags: # id: InputPhoto ttl_seconds: flags.0? int = InputMedia;
inputMediaGeoPoint # f9c44144 geo_point: InputGeoPoint = InputMedia;
inputMediaContact # f8ab7dfb phone_number: string first_name: string last_name: string vcard: string = InputMedia;
inputMediaUploadedDocument # 5b38c6c1 flags: # nosound_video: flags.3? true force_file: flags.4? true file: InputFile thumb: flags.2? InputFile mime_type: строковые атрибуты: Vector  стикеры: flags.0? Вектор  ttl_seconds: flags.1? Int = InputMedia;
inputMediaDocument # 23ab23d2 flags: # id: InputDocument ttl_seconds: flags.0? int = InputMedia;
inputMediaVenue # c13d1c11 geo_point: InputGeoPoint название: строка адрес: строка поставщик: строка объект_в_идентификации: строка тип_места: строка = InputMedia;
inputMediaPhotoExternal # e5bbfe1a flags: # url: string ttl_seconds: flags.0? int = InputMedia;
inputMediaDocumentExternal # fb52dc99 flags: # url: string ttl_seconds: flags. 0? int = InputMedia;
inputMediaGame # d33f43f3 идентификатор: InputGame = InputMedia;
inputMediaInvoice # f4e096c3 flags: # title: string description: string photo: flags.0? InputWebDocument счет-фактура: Полезные данные счета: байты provider: string provider_data: DataJSON start_param: string = InputMedia;
inputMediaGeoLive # 971fa843 flags: # остановлено: flags.0? true geo_point: заголовок InputGeoPoint: flags.2? int период: flags.1? int бесконтактный_диус: flags.3? int = InputMedia;
inputMediaPoll # f94e5f1 flags: # poll: Poll corrective_answers: flags.0? Vector  solution: flags.1? string solution_entities: flags.1? Vector  = InputMedia;
inputMediaDice # e66fbf7b смайлик: строка = InputMedia;

inputChatPhotoEmpty # 1ca48f57 = InputChatPhoto;
inputChatUploadedPhoto # c642724e flags: # file: flags.0? Входной файл видео: флаги.1? Входной файл video_start_ts: flags.2? Double = InputChatPhoto;
inputChatPhoto # 8953ad37 id: InputPhoto = InputChatPhoto;

inputGeoPointEmpty # e4c123d6 = InputGeoPoint;
inputGeoPoint # 48222faf flags: # lat: double long: double precision_radius: flags. 0? int = InputGeoPoint;

inputPhotoEmpty # 1cd7bf0d = InputPhoto;
inputPhoto # 3bb3b94a id: long access_hash: long file_reference: bytes = InputPhoto;

inputFileLocation # dfdaabe1 volume_id: long local_id: int secret: long file_reference: bytes = InputFileLocation;
inputEncryptedFileLocation # f5235d55 id: long access_hash: long = InputFileLocation;
inputDocumentFileLocation # bad07584 id: long access_hash: long file_reference: bytes thumb_size: string = InputFileLocation;
inputSecureFileLocation # cbc7ee28 id: long access_hash: long = InputFileLocation;
inputTakeoutFileLocation # 29be5899 = InputFileLocation;
inputPhotoFileLocation # 40181ffe id: long access_hash: long file_reference: bytes thumb_size: string = InputFileLocation;
inputPhotoLegacyFileLocation # d83466f3 id: long access_hash: long file_reference: bytes volume_id: long local_id: int secret: long = InputFileLocation;
inputPeerPhotoFileLocation # 27d69997 flags: # big: flags.0? Истинный партнер: InputPeer volume_id: long local_id: int = InputFileLocation;
inputStickerSetThumb # dbaeae9 набор наклеек: InputStickerSet volume_id: long local_id: int = InputFileLocation;

peerUser # 9db1bc6d user_id: int = Peer;
peerChat # bad0e5bb chat_id: int = Peer;
peerChannel # bddde532 channel_id: int = Peer;

storage. fileUnknown # aa963b05 = storage.FileType;
storage.filePartial # 40bc6f52 = storage.FileType;
storage.fileJpeg # 7efe0e = storage.FileType;
storage.fileGif # cae1aadf = storage.FileType;
storage.filePng # a4f63c0 = хранилище.Тип файла;
storage.filePdf # ae1e508d = storage.FileType;
storage.fileMp3 # 528a0677 = storage.FileType;
storage.fileMov # 4b09ebbc = storage.FileType;
storage.fileMp4 # b3cea0e4 = storage.FileType;
storage.fileWebp # 1081464c = storage.FileType;

userEmpty # 200250ba id: int = User;
user # 938458c1 flags: # self: flags.10? true contact: flags.11? true взаимный_контакт: flags.12? true удален: flags.13? true bot: flags.14? true bot_chat_history: flags.15? true bot_nochats: flags.16? true проверено: flags.17? true ограничено: flags.18? true min: flags.20? True bot_inline_geo: flags.21? True support: flags.23? True scam: flags.24? True apply_min_photo: flags.25? True id: int access_hash: flags.0? Long first_name: flags.1? Строка last_name: flags.2? строка username: flags. 3? string phone: flags.4? string photo: flags.5? Статус UserProfilePhoto: flags.6? UserStatus bot_info_version: flags.14? int Restriction_reason: flags.18? Вектор  bot_inline_placeholder: flags.19? строка lang_code: flags.22? строка = Пользователь;

userProfilePhotoEmpty # 4f11bae1 = UserProfilePhoto;
userProfilePhoto # 69d3ab26 flags: # has_video: flags.0? True photo_id: long photo_small: FileLocation photo_big: FileLocation dc_id: int = UserProfilePhoto;

userStatusEmpty # 9d05049 = UserStatus;
userStatusOnline # edb93949 истекает: int = UserStatus;
userStatusOffline # 8c703f was_online: int = UserStatus;
userStatusRecently # e26f42f1 = UserStatus;
userStatusLastWeek # 7bf09fc = UserStatus;
userStatusLastMonth # 77ebc742 = UserStatus;

chatEmpty # 9ba2d800 id: int = Chat;
chat # 3bda1bde flags: # creator: flags.0? true kicked: flags.1? true left: flags.2? true деактивирован: flags.5? True id: int title: string photo: ChatPhoto members_count: int date: int version: int migrated_to: flags. 6? InputChannel admin_rights: flags.14? ChatAdminRights default_banned_rights: flags.18? ChatBannedRights = Chat;
chatForbidden # 7328bdb id: int title: string = Chat;
channel # d31a961e flags: # creator: flags.0? true left: flags.2? true широковещательный: flags.5? true проверенный: flags.7? true мегагруппа: flags.8? true limited: flags.9? true сигнатуры: flags.11? true min: flags.12? true scam: flags.19? true has_link: flags.20? true has_geo: flags.21? True slowmode_enabled: flags.22? True call_active: flags.23? True call_not_empty: flags.24? True id: int access_hash: flags.13? Длинный заголовок: строка имя пользователя: flags.6? Строка фото: ChatPhoto date: int версия: int Restriction_reason: flags.9? Вектор  admin_rights: flags.14? ChatAdminRights banned_rights: flags.15? ChatBannedRights default_banned_rights: flags.18? ChatBannedRights members_count: flags.17? int = Chat;
channelForbidden # 289da732 flags: # broadcast: flags.5? true megagroup: flags.8? true id: int access_hash: long title: string until_date: flags. 16? Int = Чат;

chatFull # 1b7c9db3 flags: # can_set_username: flags.7? true has_scheduled: flags.8? true id: int about: string участники: ChatParticipants chat_photo: flags.2? Photo notify_settings: PeerNotifySettings exported_invite: ExportedChatInvite bot_info: flags.3? Вектор < BotInfo> pinned_msg_id: flags.6? Int folder_id: flags.11? Int = ChatFull;
channelFull # f0e6672a flags: # can_view_participants: flags.3? true can_set_username: flags.6? true can_set_stickers: flags.7? true hidden_prehistory: flags.10? true can_set_location: flags.16? True has_scheduled: flags.19? True can_view_stats: flags.20? True blocked: flags.22? True id: int about: string members_count: flags.0? Int admins_count: flags.1? Int kicked_count: flags.2? int banned_count: flags.2? int online_count: flags.13? int read_inbox_max_id: int read_outbox_max_id: int unread_count: int chat_photo: Фото notify_settings: PeerNotifySettings exported_invite: ExportedChat 4? Int pinned_msg_id: flags.5? Int stickerset: flags. 8? StickerSet available_min_id: flags.9? Int folder_id: flags.11? Int connected_chat_id: flags.14? Int location: flags.15? ChannelLocation slowmode_seconds: flags.17? Int slowmode_next_send_date: flags.18 ? int stats_dc: flags.12? int pts: int = ChatFull;

chatParticipant # c8d7493e user_id: int inviter_id: int date: int = ChatParticipant;
chatParticipantCreator # da13538a user_id: int = ChatParticipant;
chatParticipantAdmin # e2d6e436 user_id: int inviter_id: int date: int = ChatParticipant;

chatParticipantsForbidden # fc900c2b flags: # chat_id: int self_participant: flags.0? ChatParticipant = ChatParticipants;
chatParticipants # 3f460fed chat_id: int members: Vector версия : int = ChatParticipants;

chatPhotoEmpty # 37c1011c = ChatPhoto;
chatPhoto # d20b9f3c flags: # has_video: flags.0? true photo_small: FileLocation photo_big: FileLocation dc_id: int = ChatPhoto;

messageEmpty # 83e5de54 id: int = Сообщение;
message # 58ae39c9 flags: # out: flags.1? true упомянуто: flags. 4? true media_unread: flags.5? true silent: flags.13? true post: flags.14? true from_scheduled: flags.18? True legacy: flags.19? True edit_hide: flags.21? True pinned: flags.24? True id: int from_id: flags.8? Peer peer_id: Peer fwd_from: flags.2? MessageFwdHeader via_bot_id: flags.11? int reply_to: flags.3? MessageReplyHeader date: int message: string media: flags.9? MessageMedia reply_markup: flags.6? Объекты ReplyMarkup: flags.7? Vector  просмотры: flags.10? int вперед: flags.10 ? int ответы: flags.23? MessageReplies edit_date: flags.15? int post_author: flags.16? строка grouped_id: flags.17? long Restriction_reason: flags.22? Вектор  = Сообщение;
messageService # 286fa604 flags: # out: flags.1? true упомянуто: flags.4? true media_unread: flags.5? true silent: flags.13? true post: flags.14? true legacy: flags.19? true id: int from_id: flags.8? Peer peer_id: Peer reply_to: flags.3? Дата MessageReplyHeader: int действие: MessageAction = Сообщение;

messageMediaEmpty # 3ded6320 = MessageMedia;
messageMediaPhoto # 695150d7 flags: # photo: flags. 0? Photo ttl_seconds: flags.2? int = MessageMedia;
messageMediaGeo # 56e0d474 geo: GeoPoint = MessageMedia;
messageMediaContact # cbf24940 phone_number: string first_name: string last_name: string vcard: string user_id: int = MessageMedia;
messageMediaUnsupported # 9f84f49e = MessageMedia;
messageMediaDocument # 9cb070d7 flags: # document: flags.0? Документ ttl_seconds: flags.2? Int = MessageMedia;
messageMediaWebPage # a32dd600 веб-страница: WebPage = MessageMedia;
messageMediaVenue # 2ec0533f geo: заголовок GeoPoint: строка адрес: строка provider: строка объект_id: строка тип_объекта: строка = MessageMedia;
messageMediaGame # fdb19008 game: Game = MessageMedia;
messageMediaInvoice # 84551347 flags: # shipping_address_requested: flags.1? true test: flags.3? true title: string description: string photo: flags.0? WebDocument Receiver_msg_id: flags.2? int currency: string total_amount: long start_param: string = MessageMedia;
messageMediaGeoLive # b940c666 flags: # geo: заголовок GeoPoint: flags. 0? Int период: int близости_notification_radius: flags.1? Int = MessageMedia;
messageMediaPoll # 4bd6e798 опрос: Результаты опроса: PollResults = MessageMedia;
messageMediaDice # 3f7ee58b значение: int emoticon: string = MessageMedia;

messageActionEmpty # b6aef7b0 = MessageAction;
messageActionChatCreate # a6638b9a title: string users: Vector  = MessageAction;
messageActionChatEditTitle # b5a1ce5a title: string = MessageAction;
messageActionChatEditPhoto # 7fcb13a8 фото: Photo = MessageAction;
messageActionChatDeletePhoto # 95e3fbef = MessageAction;
messageActionChatAddUser # 488a7337 пользователи: Vector  = MessageAction;
messageActionChatDeleteUser # b2ae9b0c user_id: int = MessageAction;
messageActionChatJoinedByLink # f89cf5e8 inviter_id: int = MessageAction;
messageActionChannelCreate # 95d2ac92 заголовок: строка = MessageAction;
messageActionChatMigrateTo # 51bdb021 channel_id: int = MessageAction;
messageActionChannelMigrateFrom # b055eaee title: string chat_id: int = MessageAction;
messageActionPinMessage # 94bd38ed = MessageAction;
messageActionHistoryClear # 9fbab604 = MessageAction;
messageActionGameScore # 92a72876 game_id: длинный счет: int = MessageAction;
messageActionPaymentSentMe # 8f31b327 flags: # currency: string total_amount: long payload: bytes info: flags. 0? PaymentRequestedInfo shipping_option_id: flags.1? String charge: PaymentCharge = MessageAction;
messageActionPaymentSent # 40699cd0 валюта: строка total_amount: long = MessageAction;
messageActionPhoneCall # 80e11a7f flags: # video: flags.2? true call_id: long reason: flags.0? PhoneCallDiscardReason duration: flags.1? int = MessageAction;
messageActionScreenshotTaken # 4792929b = MessageAction;
messageActionCustomAction # fae69f56 сообщение: строка = MessageAction;
messageActionBotAllowed # abe9affe domain: string = MessageAction;
messageActionSecureValuesSentMe # 1b287353 значения: Vector  учетные данные: SecureCredentialsEncrypted = MessageAction;
messageActionSecureValuesSent # d95c6154 типы: Vector  = MessageAction;
messageActionContactSignUp # f3f25f76 = MessageAction;
messageActionGeoProximityReached # 98e0d697 from_id: Peer to_id: Расстояние между одноранговыми узлами: int = MessageAction;

dialog # 2c171f72 flags: # pinned: flags.2? True unread_mark: flags. 3? True peer: Peer top_message: int read_inbox_max_id: int read_outbox_max_id: int unread_count: int unread_mentions_count: int notify_settings: PeerNotifySettings pts: flags.0? Int draft: flags.1? DraftMessage папка ? int = Диалог;
dialogFolder # 71bd134c flags: # pinned: flags.2? true folder: Peer peer: Peer top_message: int unread_muted_peers_count: int unread_unmuted_peers_count: int unread_muted_messages_count: int unread_unmuted_messages_count: int = Dialog;

photoEmpty # 2331b22d id: long = Photo;
фото # fb197a65 flags: # has_stickers: flags.0? True id: long access_hash: long file_reference: bytes date: int sizes: Vector  video_sizes: flags.1? Vector  dc_id: int = Photo;

photoSizeEmpty # e17e23c type: string = PhotoSize;
photoSize # 77bfb61b тип: строка расположение: FileLocation w: int h: int size: int = PhotoSize;
photoCachedSize # e9a734fa тип: расположение строки: FileLocation w: int h: int bytes: bytes = PhotoSize;
photoStrippedSize # e0b0bc2e тип: строка байтов: bytes = PhotoSize;
photoSizeProgressive # 5aa86a51 тип: строка расположение: FileLocation w: int h: int размеры: Vector  = PhotoSize;
photoPathSize # d8214d41 тип: строка байтов: bytes = PhotoSize;

geoPointEmpty # 1117dd5f = GeoPoint;
geoPoint # b2a2f663 flags: # long: double lat: double access_hash: long precision_radius: flags. 0? Int = GeoPoint;

auth.sentCode # 5e002502 flags: # type: auth.SentCodeType phone_code_hash: string next_type: flags.1? auth.CodeType timeout: flags.2? int = auth.SentCode;

auth.authorization # cd050916 flags: # tmp_sessions: flags.0? int user: User = auth.Authorization;
auth.authorizationSignUpRequired # 44747e9a flags: # terms_of_service: flags.0? help.TermsOfService = auth.Authorization;

auth.exportedAuthorization # df969c2d id: int bytes: bytes = auth.ExportedAuthorization;

inputNotifyPeer # b8bc5b0c peer: InputPeer = InputNotifyPeer;
inputNotifyUsers # 193b4417 = InputNotifyPeer;
inputNotifyChats # 4a95e84e = InputNotifyPeer;
inputNotifyBroadcasts # b1db7c7e = InputNotifyPeer;

inputPeerNotifySettings # 9c3d198e flags: # show_previews: flags.0? Bool silent: flags.1? Bool mute_until: flags.2? Int звук: flags.3? String = InputPeerNotifySettings;

peerNotifySettings # af509d20 flags: # show_previews: flags.0? Bool silent: flags.1? Bool mute_until: flags.2? int sound: flags.3? string = PeerNotifySettings;

peerSettings # 733f2961 flags: # report_spam: flags. 0? true add_contact: flags.1? true block_contact: flags.2? true share_contact: flags.3? true need_contacts_exception: flags.4? true report_geo: flags.5? true autoarchived: flags.7? true geo_distance: flags.6? int = PeerSettings;

wallPaper # a437c3ed id: long flags: # creator: flags.0? True по умолчанию: flags.1? True шаблон: flags.3? True dark: flags.4? True access_hash: длинный slug: string document: Параметры документа: flags.2? WallPaperSettings = WallPaper;
wallPaperNoFile # 8af40b25 flags: # по умолчанию: flags.1? true dark: flags.4? true настройки: flags.2? WallPaperSettings = WallPaper;

inputReportReasonSpam # 58dbcab8 = ReportReason;
inputReportReasonViolence # 1e22c78d = ReportReason;
inputReportReasonPornography # 2e59d922 = ReportReason;
inputReportReasonChildAbuse # adf44ee3 = ReportReason;
inputReportReasonOther # e1746d0a text: string = ReportReason;
inputReportReasonCopyright # 9b89f93a = ReportReason;
inputReportReasonGeoIrrelevant # dbd4feed = ReportReason;

userFull # edf17c12 flags: # blocked: flags. 0? True phone_calls_available: flags.4? True phone_calls_private: flags.5? True can_pin_message: flags.7? True has_scheduled: flags.12? True video_calls_available: flags.13? True user: User about: flags.1? Параметры строки: PeerSettings profile_photo: flags.2? Photo notify_settings: PeerNotifySettings bot_info: flags.3? BotInfo pinned_msg_id: flags.6? Int common_chats_count: int folder_id: flags.11? Int = UserFull;

контакт # f911c994 user_id: int взаимное: Bool = Контакт;

importContact # d0028438 user_id: int client_id: long = ImportedContact;

contactStatus # d3680c61 user_id: int status: UserStatus = ContactStatus;

контакты.contactsNotModified # b74ba9d2 = contacts.Contacts;
contacts.contacts # eae87e42 контакты: Vector  saved_count: int users: Vector  = contacts.Contacts;

contacts.importedContacts # 77d01c3b импортировано: Vector  popular_invites: Vector  retry_contacts: Vector  users: Vector  = contacts.ImportedContacts;

contacts.blocked # ade1591 заблокировано: Vector  чаты: Vector  пользователи: Vector  = contacts.Blocked;
контакты.blockedSlice # e1664194 count: int blocked: Vector  чаты: Vector  пользователи: Vector  = contacts.Blocked;

messages.dialogs # 15ba6c40 dialogs: Vector  messages: Vector  чаты: Vector  пользователи: Vector  = messages.Dialogs;
messages.dialogsSlice # 71e094f3 count: int dialogs: Vector  messages: Vector  chats: Vector  users: Vector  = messages.Dialogs;
messages.dialogsNotModified # f0e3e596 count: int = messages.Диалоги;

messages.messages # 8c718e87 messages: Vector  чаты: Vector  пользователи: Vector  = messages.Messages;
messages.messagesSlice # 3a54685e flags: # notact: flags.1? true count: int next_rate: flags.0? int offset_id_offset: flags.2? int сообщения: Vector  чаты: Vector  пользователи: Vector  = messages.Messages;
messages.channelMessages # 64479808 flags: # notact: flags.1? true pts: int count: int offset_id_offset: flags.2? int messages: Vector  чаты: Vector  пользователи: Vector  = messages.Сообщения;
messages.messagesNotModified # 74535f21 count: int = messages.Messages;

messages.chats # 64ff9fd5 chats: Vector  = messages.Chats;
messages.chatsSlice # 9cd81144 count: int chats: Vector  = messages.Chats;

messages.chatFull # e5d7d19c full_chat: ChatFull чаты: Vector  пользователи: Vector  = messages.ChatFull;

messages.affectedHistory # b45c69d1 pts: int pts_count: int смещение: int = messages.AffectedHistory;

inputMessagesFilterEmpty # 57e2f66c = MessagesFilter;
inputMessagesFilterPhotos # 9609a51c = MessagesFilter;
inputMessagesFilterVideo # 9fc00e65 = MessagesFilter;
inputMessagesFilterPhotoVideo # 56e9f0e4 = MessagesFilter;
inputMessagesFilterDocument # 9eddf188 = MessagesFilter;
inputMessagesFilterUrl # 7ef0dd87 = MessagesFilter;
inputMessagesFilterGif # ffc86587 = MessagesFilter;
inputMessagesFilterVoice # 50f5c392 = MessagesFilter;
inputMessagesFilterMusic # 3751b49e = MessagesFilter;
inputMessagesFilterChatPhotos # 3a20ecb8 = MessagesFilter;
inputMessagesFilterPhoneCalls # 80c99768 flags: # пропущено: flags.0? True = MessagesFilter;
inputMessagesFilterRoundVoice # 7a7c17a4 = MessagesFilter;
inputMessagesFilterRoundVideo # b549da53 = MessagesFilter;
inputMessagesFilterMyMentions # c1f8e69a = MessagesFilter;
inputMessagesFilterGeo # e7026d0d = MessagesFilter;
inputMessagesFilterContacts # e062db83 = MessagesFilter;
inputMessagesFilterPinned # 1bb00451 = MessagesFilter;

updateNewMessage # 1f2b0afd message: Сообщение pts: int pts_count: int = Update;
updateMessageID # 4e90bfd6 id: int random_id: long = Обновить;
updateDeleteMessages # a20db0e5 messages: Vector  pts: int pts_count: int = Update;
updateUserTyping # 5c486927 user_id: int действие: SendMessageAction = Update;
updateChatUserTyping # 9a65ea1f chat_id: int user_id: int action: SendMessageAction = Update;
updateChatParticipants # 7761198 участников: ChatParticipants = Update;
updateUserStatus # 1bfbd823 user_id: int status: UserStatus = Update;
updateUserName # a7332b73 user_id: int first_name: строка last_name: строка username: string = Update;
updateUserPhoto # 95313b0c user_id: int date: int photo: UserProfilePhoto предыдущая: Bool = Update;
updateNewEncryptedMessage # 12bcbd9a сообщение: EncryptedMessage qts: int = Update;
updateEncryptedChatTyping # 1710f156 chat_id: int = Update;
updateEncryption # b4a2e88d chat: EncryptedChat date: int = Update;
updateEncryptedMessagesRead # 38fe25b7 chat_id: int max_date: int date: int = Update;
updateChatParticipantAdd # ea4b0e5c chat_id: int user_id: int inviter_id: int date: int version: int = Update;
updateChatParticipantDelete # 6e5f8c22 chat_id: int user_id: int version: int = Update;
updateDcOptions # 8e5e9873 dc_options: Vector  = Update;
updateNotifySettings # beans268ef одноранговый узел: NotifyPeer notify_settings: PeerNotifySettings = Обновление;
updateServiceNotification # ebe46819 flags: # popup: flags.0? True inbox_date: flags.1? Int тип: строка message: string media: сущности MessageMedia: Vector  = Update;
updatePrivacy # ee3b272a key: PrivacyKey rules: Vector  = Update;
updateUserPhone # 12b9417b user_id: int phone: string = Update;
updateReadHistoryInbox # 9c974fdf flags: # folder_id: flags.0? int peer: Peer max_id: int still_unread_count: int pts: int pts_count: int = Update;
updateReadHistoryOutbox # 2f2f21bf peer: Peer max_id: int pts: int pts_count: int = Update;
updateWebPage # 7f8

веб-страница: Веб-страница pts: int pts_count: int = Update; updateReadMessagesContents # 68c13933 сообщения: Vector pts: int pts_count: int = Update; updateChannelTooLong # eb0467fb flags: # channel_id: int pts: flags.0? Int = Обновить; updateChannel # b6d45656 channel_id: int = Update; updateNewChannelMessage # 62ba04d9 message: Сообщение pts: int pts_count: int = Update; updateReadChannelInbox # 330b5424 flags: # folder_id: flags.0? int channel_id: int max_id: int still_unread_count: int pts: int = Update; updateDeleteChannelMessages # c37521c9 channel_id: int messages: Vector pts: int pts_count: int = Update; updateChannelMessageViews # 98a12b4b channel_id: int id: int views: int = Update; updateChatParticipantAdmin # b69 chat_id: int user_id: int is_admin: версия Bool: int = Update; updateNewStickerSet # 688a30aa набор стикеров: messages.StickerSet = Обновить; updateStickerSetsOrder # bb2d201 flags: # masks: flags.0? true order: Vector = Update; updateStickerSets # 43ae3dec = Обновить; updateSavedGifs # 9375341e = Обновить; updateBotInlineQuery # 54826690 flags: # query_id: long user_id: int query: string geo: flags.0? Смещение GeoPoint: string = Update; updateBotInlineSend # e48f964 flags: # user_id: int query: string geo: flags.0? GeoPoint id: string msg_id: flags.1? InputBotInlineMessageID = Update; updateEditChannelMessage # 1b3f4df7 message: Сообщение pts: int pts_count: int = Update; updateBotCallbackQuery # e73547e1 flags: # query_id: long user_id: int peer: Peer msg_id: int chat_instance: long data: flags.0? Байтов game_short_name: flags.1? String = Обновить; updateEditMessage # e40370a3 message: Сообщение pts: int pts_count: int = Update; updateInlineBotCallbackQuery # f9d27a5a flags: # query_id: long user_id: int msg_id: InputBotInlineMessageID chat_instance: long data: flags.0? bytes game_short_name: flags.1? string = Update; updateReadChannelOutbox # 25d6c9c7 channel_id: int max_id: int = Update; updateDraftMessage # ee2bb969 peer: Peer draft: DraftMessage = Update; updateReadFeaturedStickers # 571d2742 = Обновить; updateRecentStickers # 9a422c20 = Обновить; updateConfig # a229dd06 = Обновить; updatePtsChanged # 3354678f = Обновить; updateChannelWebPage # 40771900 channel_id: int веб-страница: WebPage pts: int pts_count: int = Update; updateDialogPinned # 6e6fe51c flags: # pinned: flags.0? True folder_id: flags.1? Int peer: DialogPeer = Update; updatePinnedDialogs # fa0f3ca2 flags: # folder_id: flags.1? int order: flags.0? Vector = Update; updateBotWebhookJSON # 8317c0c3 data: DataJSON = Update; updateBotWebhookJSONQuery # 9b9240a6 query_id: long data: DataJSON timeout: int = Update; updateBotShippingQuery # e0cdc940 query_id: long user_id: int payload: bytes shipping_address: PostAddress = Update; updateBotPrecheckoutQuery # 5d2f3aa9 flags: # query_id: long user_id: int payload: bytes info: flags.0? PaymentRequestedInfo shipping_option_id: flags.1? String currency: string total_amount: long = Обновить; updatePhoneCall # ab0f6b1e phone_call: PhoneCall = Обновить; updateLangPackTooLong # 46560264 lang_code: string = Update; updateLangPack # 56022f4d разница: LangPackDifference = Update; updateFavedStickers # e511996d = Обновить; updateChannelReadMessagesContents # 89893b45 channel_id: int messages: Vector = Update; updateContactsReset # 7084a7be = Обновить; updateChannelAvailableMessages # 70db6837 channel_id: int available_min_id: int = Update; updateDialogUnreadMark # e16459c3 flags: # unread: flags.0? Истинный партнер: DialogPeer = Update; updateMessagePoll # aca1657b flags: # poll_id: long poll: flags.0? Результаты опроса: PollResults = Update; updateChatDefaultBannedRights # 54c01850 peer: Peer default_banned_rights: Версия ChatBannedRights: int = Update; updateFolderPeers # 19360dc0 folder_peers: Vector pts: int pts_count: int = Update; updatePeerSettings # 6a7e7366 одноранговый узел: Параметры узла: PeerSettings = Update; updatePeerLocated # b4afcfb0 peers: Vector = Update; updateNewScheduledMessage # 39a51dfb сообщение: Сообщение = Обновление; updateDeleteScheduledMessages # cee peer: Peer messages: Vector = Update; updateTheme # 8216fba3 theme: Theme = Update; updateGeoLiveViewed # 871fb939 peer: Peer msg_id: int = Update; updateLoginToken # 564fe691 = Обновить; updateMessagePollVote # 42f88f2c poll_id: long user_id: int options: Vector = Update; updateDialogFilter # 26ffde7d flags: # id: int filter: flags.0? DialogFilter = Обновить; updateDialogFilterOrder # a5d72105 order: Vector = Update; updateDialogFilters # 3504914f = Обновить; updatePhoneCallSignalingData # 2661bf09 phone_call_id: long data: bytes = Update; updateChannelParticipant # 65d2b464 flags: # channel_id: int date: int user_id: int prev_participant: flags.0? ChannelParticipant new_participant: flags.1? ChannelParticipant qts: int = Update; updateChannelMessageForwards # 6e8a84df channel_id: int id: int вперед: int = Update; updateReadChannelDiscussionInbox # 1cc7de54 flags: # channel_id: int top_msg_id: int read_max_id: int broadcast_id: flags.0? Int broadcast_post: flags.0? Int = Обновить; updateReadChannelDiscussionOutbox # 4638a26c channel_id: int top_msg_id: int read_max_id: int = Update; updatePeerBlocked # 246a4b22 peer_id: Одноранговый узел заблокирован: Bool = Update; updateChannelUserTyping # ff2abe9f flags: # channel_id: int top_msg_id: flags.0? int user_id: int action: SendMessageAction = Update; updatePinnedMessages # ed85eab5 flags: # закреплено: flags.0? true peer: Одноранговые сообщения: Vector pts: int pts_count: int = Update; updatePinnedChannelMessages # 8588878b flags: # закреплено: flags.0? True channel_id: int messages: Vector pts: int pts_count: int = Update; updates.state # a56c2a3e pts: int qts: int date: int seq: int unread_count: int = updates.State; updates.differenceEmpty # 5d75a138 date: int seq: int = updates.Difference; updates.difference # f49ca0 new_messages: Vector new_encrypted_messages: Vector other_updates: Vector chats: Vector users: Vector state: updates.State = updates.Difference; updates.differenceSlice # a8fb1981 new_messages: Vector new_encrypted_messages: Vector other_updates: Vector chats: Vector users: Vector intermediate_state: updates.State = updates.Difference; updates.differenceTooLong # 4afe8f6d pts: int = updates.Difference; updatesTooLong # e317af7e = Обновления; updateShortMessage # 2296d2c8 flags: # out: flags.1? true упомянуто: flags.4? true media_unread: flags.5? true silent: flags.13? true id: int user_id: int message: string pts: int pts_count: int date : int fwd_from: flags.2? MessageFwdHeader via_bot_id: flags.11? int reply_to: flags.3? Объекты MessageReplyHeader: flags.7? Vector = Updates; updateShortChatMessage # 402d5dbb flags: # out: flags.1? True упомянуто: flags.4? True media_unread: flags. 5? True silent: flags.13? True id: int from_id: int chat_id: int message: string pts: int pts_count: int date: int fwd_from: flags.2 ? MessageFwdHeader via_bot_id: flags.11? Int reply_to: flags.3? Объекты MessageReplyHeader: flags.7? Vector = Updates; updateShort # 78d4dec1 update: Дата обновления: int = Updates; UpdatesCombined # 725b04c3 обновления: Vector пользователи: Vector чаты: Vector date: int seq_start: int seq: int = Updates; обновления # 74ae4240 обновления: Vector пользователи: Vector чаты: Vector date: int seq: int = Updates; updateShortSentMessage # 11f1331c flags: # out: flags.1? True id: int pts: int pts_count: int date: int media: flags 9? Сущности MessageMedia: flags 7? Vector = Updates; photos.photos # 8dca6aa5 photos: Vector пользователи: Vector = photos.Photos; photos.photosSlice # 15051f54 count: int photos: Vector пользователи: Vector = photos.Photos; photos.photo # 20212ca8 фото: Пользователи фото: Vector = photos.Photo; upload.file # 96a18d5 type: storage.FileType mtime: int bytes: bytes = upload.File; upload.fileCdnRedirect # f18cda44 dc_id: int file_token: байты encryption_key: bytes encryption_iv: bytes file_hashes: Vector = upload.Файл; dcOption # 18b7a10d flags: # ipv6: flags.0? true media_only: flags.1? true tcpo_only: flags.2? true cdn: flags.3? true static: flags.4? true id: int ip_address: string port: int секрет: flags.10? bytes = DcOption; config # 330b4067 flags: # phonecalls_enabled: flags.1? true default_p2p_contacts: flags.3? true preload_featured_stickers: flags.4? true ignore_phone_entities: flags.5? true revoke_pm_inbox: flags.6? true blocked_mode: flags.8? true pfs_enabled: flags.13? true date: int expires: int test_mode: Bool this_dc: int dc_options: Vector dc_txt_domain_name: string chat_size_max: int мегагруппа_size_max: int forwarded_count_max: int online_update_period_ms: intdeflued_lay_time_ms_index_client_ms: int_black_update_piod_ms: int notify_default_delay_ms: int push_chat_period_ms: int push_chat_limit: int saved_gifs_limit: int edit_time_limit: int revoke_time_limit: int revoke_pm_time_limit: int rating_e_decay: int stickers_recent_limit: int stickers_faved_limit: flags0? Int pinned_dialogs_count_max: int pinned_infolder_count_max: int call_receive_timeout_ms: int call_ring_timeout_ms: int call_connect_timeout_ms: int call_packet_timeout_ms: int me_url_prefix: string autoupdate_timeout_ms: int me_url_prefix: string autoupdate_flags_url_prefix.7? ? string static_maps_provider: flags.12? string caption_length_max: int message_length_max: int webfile_dc_id: inthibited_lang_code: flags.2? string lang_pack_version: flags.2? int base_lang_pack_version: flags.2? Int = Config; nearDc # 8e1a1775 country: string this_dc: int Ближайший_dc: int = NearestDc; help.appUpdate # 1da7158f flags: # can_not_skip: flags.0? true id: int version: string text: string entity: Vector document: flags.1? URL документа: flags.2? string = help.AppUpdate; help.noAppUpdate # c45a6536 = help.AppUpdate; help.inviteText # 18cb9f78 message: string = help.InviteText; encryptedChatEmpty # ab7ec0a0 id: int = EncryptedChat; encryptedChatWaiting # 3bf703dc id: int access_hash: длинная дата: int admin_id: int участник_id: int = EncryptedChat; encryptedChatRequested # 62718a82 flags: # folder_id: flags.0? Int id: int access_hash: длинная дата: int admin_id: int идентификатор участника: int g_a: bytes = EncryptedChat; encryptedChat # fa56ce36 id: int access_hash: длинная дата: int admin_id: int участник_id: int g_a_or_b: байты key_fingerprint: long = EncryptedChat; encryptedChatDiscarded # 13d6dd27 id: int = EncryptedChat; inputEncryptedChat # f141b5e1 chat_id: int access_hash: long = InputEncryptedChat; encryptedFileEmpty # c21f497e = EncryptedFile; encryptedFile # 4a70994c id: long access_hash: long size: int dc_id: int key_fingerprint: int = EncryptedFile; inputEncryptedFileEmpty # 1837c364 = InputEncryptedFile; inputEncryptedFileUploaded # 64bd0306 id: длинные части: int md5_checksum: string key_fingerprint: int = InputEncryptedFile; inputEncryptedFile # 5a17b5e5 id: long access_hash: long = InputEncryptedFile; inputEncryptedFileBigUploaded # 2dc173c8 id: длинные части: int key_fingerprint: int = InputEncryptedFile; encryptedMessage # ed18c118 random_id: long chat_id: int date: int bytes: bytes file: EncryptedFile = EncryptedMessage; encryptedMessageService # 23734b06 random_id: long chat_id: int date: int bytes: bytes = EncryptedMessage; Сообщения.dhConfigNotModified # c0e24635 random: bytes = messages.DhConfig; messages.dhConfig # 2c221edd g: int p: bytes version: int random: bytes = messages.DhConfig; messages.sentEncryptedMessage # 560f8935 date: int = messages.SentEncryptedMessage; messages.sentEncryptedFile # 9493ff32 дата: int файл: EncryptedFile = messages.SentEncryptedMessage; inputDocumentEmpty # 72f0eaae = InputDocument; inputDocument # 1abfb575 id: long access_hash: long file_reference: bytes = InputDocument; documentEmpty # 36f8c871 id: long = Document; document # 1e87342b flags: # id: long access_hash: long file_reference: bytes date: int mime_type: размер строки: int thumbs: flags.0? Vector video_thumbs: flags.1? Vector dc_id: int attributes: Vector = Document; help.support # 17c6b5f6 phone_number: string user: User = help.Support; notifyPeer # 9fd40bd8 peer: Peer = NotifyPeer; notifyUsers # b4c83b4c = NotifyPeer; notifyChats # c007cec3 = NotifyPeer; notifyBroadcasts # d612e8ef = NotifyPeer; sendMessageTypingAction # 16bf744e = SendMessageAction; sendMessageCancelAction # fd5ec8f5 = SendMessageAction; sendMessageRecordVideoAction # a187d66f = SendMessageAction; sendMessageUploadVideoAction # e9763aec прогресс: int = SendMessageAction; sendMessageRecordAudioAction # d52f73f7 = SendMessageAction; sendMessageUploadAudioAction # f351d7ab прогресс: int = SendMessageAction; sendMessageUploadPhotoAction # d1d34a26 прогресс: int = SendMessageAction; sendMessageUploadDocumentAction # aa0cd9e4 прогресс: int = SendMessageAction;

схема — Викисловарь

Английский [править]

Этимология [править]

От средневекового латинского schēma («фигура, форма»), от древнегреческого σχῆμα (skhêma, «форма, форма»), из ἔχω (ékhō, «я держу»).Дублет схемы . Сравните эскиз .

Произношение [править]

Существительное [править]

схема ( множественное число схемы )

  1. Систематический план будущих действий.
    • г. 1713 , Джонатан Свифт, Мысли на разные темы
      Стоическая схема удовлетворения наших потребностей путем отсечения наших желаний подобна отрезанию ног, когда мы хотим обувь.
    • 2013 1 июня, «Идеи идут по рельсам», в The Economist [1] , том 407, номер 8838, стр. 13 (Technology Quarterly):

      Схема «движущейся платформы» […] технологически более амбициозен, чем поезда на магнитной подвеске, даже несмотря на то, что он использует обычные рельсы. Местные поезда будут использовать рельсы, расположенные бок о бок, чтобы катиться вместе с междугородними поездами и позволять пассажирам переключаться между поездами, проходя через стыковочные отсеки.Эта установка решает несколько проблем […].

  2. Заговор или секретный коварный план.
  3. Упорядоченное сочетание связанных частей.
    • внешний вид и внешность схема вещей
    • 1706 , Фрэнсис Аттербери, Проповедь, проповеданная в соборной церкви Св. Павла; на похоронах Моего. Тхо. Беннет
      такая схема вещей, которая должна одновременно принять время и вечность
    • 1754 , Джонатан Эдвардс, Свобода воли
      аргументов […] достаточных для поддержки и демонстрации всей схемы моральной философии
  4. Диаграмма или диаграмма системы или объекта.
    • 29 апреля 1694 г. , Роберт Саут, Проповедь, прочитанная в Вестминстерском аббатстве
      , чтобы нарисовать точную схему Константинополя или карту Франции
  5. (математика) Тип геометрического объекта.
  6. (Великобритания, главным образом Шотландия) Муниципальный жилой комплекс.
    • 2008 , Джеймс Келман, Кирон Смит, Мальчик , Пингвин 2009, стр. 101:
      Это было слишком дорого. Все они просто завышали цены, потому что это было в схеме .
  7. (риторика) Ловкое отклонение от обычного расположения слов.
  8. (астрология) Представление аспектов небесных тел в любой момент или в данном событии.
    • 1815 24 февраля [Вальтер Скотт], Гай Мэннеринг; […] , том (укажите | volume = I, II или III), Эдинбург: […] Джеймс Баллантайн и Ко для Longman, Hurst, Rees, Orme, and Brown, […]; и Арчибальд Констебл и Ко., […], OCLC 742335644 :

      синий футляр, из которого была извлечена схема рождения

  9. (Интернет) Часть универсального идентификатора ресурса, указывающая протокол или другое назначение, например http: или news: .
  10. (Великобритания, пенсии) Портфель пенсионных планов с соответствующими выплатами, состоящий из нескольких независимых участников.
Примечания по использованию [править]

В США, как правило, имеет окольную коннотацию, а в Великобритании часто используется как нейтральный термин для обозначения проектов: «Дорога закрыта из-за схемы расширения тротуара».

Синонимы [править]
  • (систематический план будущих действий): план
Производные термины [править]
Переводы [править]

систематический план будущих действий

  • Еврейский: מְזִמָּה (он) f (мезима)
  • Исландский: ráð (is) n , ráðagerð f
  • Итальянский: schema (it) m , piano (it) m , progetto (it) m , programma (it) m
  • Японский: 計画 (ja) (け い か く, kēkaku), 企 画 (ja) (き か く, kikaku), 案 (ja) (あ ん, an), 計画 (ja) (ス キ ー ム, sukīmu), (базовая схема) 枠 組(わ く ぐ み, вакугуми)
  • яванский: упая
  • Occitan: план (oc) м , площадь м
  • Польский: план (пл) м , программа (пл) м
  • Португальский: planejamento (pt) m , esquema (pt) m
  • Русский: план (ru) м (план), програ́мма (ru) f (prográmma)
  • испанский: régimen (es) m , proyecto (es) m
  • Зулус: icebo (zu) 5 или 6 , isu 5 или 6

секрет, коварный план

  • Итальянский: macchinazione (it) f , stratagemma (it) m , intrigo (it) m
  • Японский: 陰謀 (ja) (い ん ぼ う, inbō), 計 略 (け い り ゃ く, kēryaku)
  • Среднеанглийский: compassement
  • Occitan: maquinacion f , intriga f
  • Польский: intryga (pl) f
  • Португальский: esquema (pt) m
  • Русский: план (ru) м (план), за́мысел (ru) м (zámysel)
  • Испанский: ardid (es) m , artimaña (es) f , maquinación f , estratagema (es) f , treta (es) f , intriga (es) fbre (urdima) es)
.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *