Как язык без стека работает?

export const foo: константы экспорта (ES6) export default foo: объект экспорта (ES6)

Вышеприведенные операторы представляют собой реализацию ECMA Script 2015 (также известную как ES6).

В обычном файле ES6 JS можно экспортировать любой объект (переменную) или константу. Пожалуйста, обратите внимание, что вы не можете изменить постоянную ссылку, хотя внутренняя структура может быть изменена (странно).

В ES6 можно иметь несколько экспортов в модуле (файл скрипта). который может быть добавлен в вызывающий скрипт как

import {Obj1, Obj2} from module_file

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

module.exports = foo; это более старая реализация, и это то же самое, что экспорт по умолчанию. за исключением того, что он импортируется с требованием вместо импорта

для получения дополнительной информации https://developer.mozilla.org/en/docs/web/javascript/reference/statements/export

57
задан ricree 19 June 2009 в 03:47
поделиться

7 ответов

Современные операционные системы, которые у нас есть (Windows, Linux), работают по тому, что я называю «моделью большого стека». И эта модель иногда ошибочна и мотивирует потребность в языках без стека.

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

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

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

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

Реализованный мной язык программирования PARLANSE выполняет пункты 1) и 2). Я работаю над 3).

85
ответ дан 24 November 2019 в 19:29
поделиться

В средах без стека, с которыми я более или менее знаком (машина Тьюринга, сборка и Brainfuck ), обычно можно реализовать собственный стек. Нет ничего принципиального в том, чтобы стек был встроен в язык.

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

РЕДАКТИРОВАТЬ: Я знаю, что в некоторых архитектурах есть выделенные стеки, но в них нет необходимости.

5
ответ дан 24 November 2019 в 19:29
поделиться

Stackless Python по-прежнему имеет стек Python (хотя он может иметь оптимизацию хвостового вызова и другие приемы слияния кадров вызовов), но он полностью отделен от стека C интерпретатора.

Haskell (как обычно реализуется) не имеет стека вызовов; оценка основана на сокращении графика .

14
ответ дан 24 November 2019 в 19:29
поделиться

На http://www.linux-mag.com/cache/7373/1.html есть хорошая статья о языковой структуре Parrot. Parrot не использует стек для вызова, и в этой статье немного объясняется техника.

6
ответ дан 24 November 2019 в 19:29
поделиться

В этой статье есть простое для понимания описание продолжений: http://www.defmacro.org/ramblings/fp.html

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

3
ответ дан 24 November 2019 в 19:29
поделиться

Зовите меня древним, но я помню, когда стандарты FORTRAN и COBOL не поддерживали рекурсивные вызовы и, следовательно, не требовали стека. В самом деле, я вспоминаю реализации машин серии CDC 6000, где не было стека, и FORTRAN делал бы странные вещи, если бы вы пытались вызвать подпрограмму рекурсивно.

Для записи, вместо стека вызовов, CDC Набор команд серии 6000 использовал команду RJ для вызова подпрограммы. Это сохранит текущее значение ПК в целевом местоположении вызова, а затем перейдет к следующему местоположению. В конце подпрограмма выполнит косвенный переход к месту назначения вызова. Этот перезагруженный сохраненный ПК фактически возвращается к вызывающему.

Очевидно, что это не работает с рекурсивными вызовами.

4
ответ дан 24 November 2019 в 19:29
поделиться

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

1
ответ дан 24 November 2019 в 19:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: