You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/03-garbage-collection/article.md
+8-44Lines changed: 8 additions & 44 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -74,11 +74,7 @@ let admin = user;
74
74
user =null;
75
75
```
76
76
77
-
<<<<<<< HEAD
78
-
...سپس شیء هنوز توسط متغیر global `admin` قابل دسترس است، پس در حافظه وجود دارد. اگر ما `admin` را هم بازنویسی کنیم، سپس این شیء حذف میشود.
79
-
=======
80
-
...Then the object is still reachable via `admin` global variable, so it must stay in memory. If we overwrite `admin` too, then it can be removed.
81
-
>>>>>>> 7000ede297bfd688f9a3767e8ca43abd9242f322
77
+
...سپس شیء هنوز توسط متغیر گلوبال `admin` قابل دسترس است، پس در حافظه وجود دارد. اگر ما `admin` را هم بازنویسی کنیم، سپس این شیء حذف میشود.
82
78
83
79
## شیءهای بهم پیوسته
84
80
@@ -173,19 +169,11 @@ family = null;
173
169
174
170

175
171
176
-
<<<<<<< HEAD
177
-
سپس مرجعهای آنها علامت گذاری میشود:
172
+
سپس مرجعهای آنها را دنبال میکنیم و شیءهایی که به آنها رجوع شده است را علامت گذاری میکنیم:
178
173
179
174

180
175
181
-
...و تا جایی که ممکن باشد، مرجعهای آنها:
182
-
=======
183
-
Then we follow their references and mark referenced objects:
184
-
185
-

186
-
187
-
...And continue to follow further references, while possible:
188
-
>>>>>>> 7000ede297bfd688f9a3767e8ca43abd9242f322
176
+
...و تا جایی که ممکن باشد، دنبال کردن مرجعهای بعدی را ادامه میدهیم:
189
177
190
178

191
179
@@ -195,54 +183,30 @@ Then we follow their references and mark referenced objects:
195
183
196
184
همچنین میتوانیم فرایند را اینگونه فرض کنیم که یک سطل رنگ بسیار بزرگ از ریشه ریخته میشود که بین تمام مرجعها جریان مییابد و تمام شیءهای قابل دسترس را علامت گذاری میکند. سپس شیءهایی که علامت گذاری نشدهاند پاک میشوند.
197
185
198
-
<<<<<<< HEAD
199
-
این مفهوم کلی چگونگی کار کردن زبالهروبی است. موتورهای جاوااسکریپت بهینهسازیهای زیادی را اعمال میکنند تا آن را سریعتر کنند و روی اجراشدن برنامه تاثیری نگذارد.
200
-
=======
201
-
That's the concept of how garbage collection works. JavaScript engines apply many optimizations to make it run faster and not introduce any delays into the code execution.
202
-
>>>>>>> 7000ede297bfd688f9a3767e8ca43abd9242f322
186
+
این مفهوم کلی چگونگی کار کردن زبالهروبی است. موتورهای جاوااسکریپت بهینهسازیهای زیادی را اعمال میکنند تا آن را سریعتر کنند و باعث ایجاد تاخیر در اجرا شدن برنامه نشوند.
203
187
204
188
بعضی از بهینهسازیها:
205
189
206
-
<<<<<<< HEAD
207
-
-**جمعآوری نسلی** -- شیءها به دو دسته تقسیم میشوند: "جدیدها" و " قدیمیها". بسیاری از شیءها به وجود میآیند، کارشان را انجام میدهند و به سرعت میمیرند، آنها میتوانند به سرعت پاک میشوند. شیءهایی که برای مدت زیاد باقی میمانند، "قدیمی" میشوند و کمتر بررسی میشوند.
208
-
-**جمعآوری افزایشی** -- اگر شیءهای زیادی وجود داشته باشند و ما تلاش کنیم که یک باره برویم و تمام دسته شیء را علامت گذاری کنیم، ممکن است این کار زمان ببرد و اختلالهای قابل رویت را در اجرا ایجاد کند. پس موتور سعی میکند که جمعآوری زباله را به چند بخش تقسیم کند. سپس هر بخش یکی یکی به صورت جداگانه انجام میشود. این کار برای دنبال کردن تغییرات به ثبت کردن بیشتری نیاز دارد، اما ما به جای اختلالی بزرگ اختلالهای خیلی کوچک را خواهیم داشت.
209
-
-**جمعآوری زمان بیکاری** -- زباله جمعکن سعی میکند که فقط زمانی که پردازنده (CPU) بیکار است کار خود را انجام دهد تا تاثیر ممکن روی اجراشدن را کاهش دهد.
210
-
=======
211
-
-**Generational collection** -- objects are split into two sets: "new ones" and "old ones". In typical code, many objects have a short life span: they appear, do their job and die fast, so it makes sense to track new objects and clear the memory from them if that's the case. Those that survive for long enough, become "old" and are examined less often.
212
-
-**Incremental collection** -- if there are many objects, and we try to walk and mark the whole object set at once, it may take some time and introduce visible delays in the execution. So the engine splits the whole set of existing objects into multiple parts. And then clear these parts one after another. There are many small garbage collections instead of a total one. That requires some extra bookkeeping between them to track changes, but we get many tiny delays instead of a big one.
213
-
-**Idle-time collection** -- the garbage collector tries to run only while the CPU is idle, to reduce the possible effect on the execution.
214
-
>>>>>>> 7000ede297bfd688f9a3767e8ca43abd9242f322
190
+
-**جمعآوری نسلی** -- شیءها به دو دسته تقسیم میشوند: "جدیدها" و " قدیمیها". در کد معمولی، بسیاری از شیءها به وجود میآیند، کارشان را انجام میدهند و به سرعت میمیرند، آنها میتوانند به سرعت پاک میشوند، پس منطقی است که شیءهای جدید تحت نظر قرار بگیرند و اگر این موضوع صادق باشد آنها را از حافظه پاک کنیم. شیءهایی که برای مدت زیاد باقی میمانند، "قدیمی" میشوند و کمتر بررسی میشوند.
191
+
-**جمعآوری افزایشی** -- اگر شیءهای زیادی وجود داشته باشند و ما تلاش کنیم که یک باره برویم و تمام دسته شیء را علامت گذاری کنیم، ممکن است این کار زمان ببرد و اختلالهای قابل رویت را در اجرا ایجاد کند. پس موتور تمام شیءهای موجود را به چند بخش تقسیم کند. سپس هر بخش یکی پس از دیگری پاکسازی میشوند. زبالهروبیهای کوچک زیادی به جای یک زبالهروبی کامل وجود خواهد داشت. این کار برای دنبال کردن تغییرات به ثبت کردن بیشتری نیاز دارد، اما ما به جای اختلالی بزرگ اختلالهای خیلی کوچک را خواهیم داشت.
192
+
-**جمعآوری زمان بیکاری** -- زباله جمعکن سعی میکند که فقط زمانی که پردازنده (CPU) بیکار است کار خود را انجام دهد تا تاثیر ممکن روی اجرا شدن را کاهش دهد.
215
193
216
194
بهینهسازی و روشهای دیگری هم برای الگوریتمهای زبالهروبی وجود دارد. همان قدر که دوست دارم آنها را اینجا توضیح دهم، نباید ادامه دهم، چون موتورهای مختلف تکنیک و فنهای مختلفی را پیادهسازی میکنند. و این حتی مهم تر است که همانطور که موتورها پیشرفت میکنند چیزهایی هم تغییر میکنند، پس مطالعهی عمیقتر "پیشرفته" بدون نیاز واقعی احتمالا ارزش ندارد. مگر اینکه، موضوع کاملا مربوط به علاقه باشد که در این صورت لینکهایی برای شما در پایین قرار داده شده است.
217
195
218
196
## خلاصه
219
197
220
198
چیزهای مهم که باید بدانیم:
221
199
222
-
<<<<<<< HEAD
223
200
- زبالهروبی به صورت خودکار انجام میشود. ما نمیتوانیم آن را مجبور یا از آن جلوگیری کنیم.
224
201
- شیءها تا زمانی که قابل دسترس باشند در حافظه باقی میمانند.
225
-
- مرجع بودن با قابل دسترس بودن (از یک ریشه) یکسان نیست : یک دستهی شیءهای بهم پیوسته میتوانند به طور کامل غیر قابل دسترس شوند.
226
-
=======
227
-
- Garbage collection is performed automatically. We cannot force or prevent it.
228
-
- Objects are retained in memory while they are reachable.
229
-
- Being referenced is not the same as being reachable (from a root): a pack of interlinked objects can become unreachable as a whole, as we've seen in the example above.
230
-
>>>>>>> 7000ede297bfd688f9a3767e8ca43abd9242f322
202
+
- مرجع بودن با قابل دسترس بودن (از یک ریشه) یکسان نیست: همانطور که در مثال بالا دیدیم، یک دستهی شیءهای بهم پیوسته میتوانند به طور کامل غیر قابل دسترس شوند.
231
203
232
204
موتورهای مدرن الگوریتمهای پیشرفتهی زبالهروبی را پیادهسازی میکنند.
233
205
234
206
کتاب کلی "The Garbage Collection Handbook: The Art of Automatic Memory Management" (R. Jones و بقیه افراد) بعضی از آنها را پوشش میدهد.
235
207
236
-
<<<<<<< HEAD
237
208
اگر شما با برنامهنویسی سطح پایین آشنایی دارید، اطلاعاتی با جزییات درباره زبالهروبی V8 در این مقاله است [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection).
238
209
239
210
[بلاگ V8](https://v8.dev/) هم هر چند گاهی مقالههایی درباره تغییرات مدیریت حافظه منتشر میکند. طبیعتا، برای یادگیری زبالهروبی، شما بهتر است به طور کلی با یاد گرفتن چیزهای داخلی V8 آماده شوید و بلاگ [Vyacheslav Egorov](http://mrale.ph) که یکی از مهندسهای V8 بود را بخوانید. من میگویم: "V8" چون مقالههای زیادی درباره آن در اینترنت وجود دارد. برای موتورهای دیگر، بیشتر روشها مشابه هستند، اما زبالهروبی در جنبههای زیادی متفاوت است.
240
211
241
212
اگر شما بهینهسازیهای سطح پایین را نیاز دارید، دانایی عمیق موتورها چیز خوبی است. این کار عاقلانهای است که بعد از آشنایی با زبان برای آن برنامهریزی کنید.
242
-
=======
243
-
If you are familiar with low-level programming, more detailed information about V8's garbage collector is in the article [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection).
244
-
245
-
The [V8 blog](https://v8.dev/) also publishes articles about changes in memory management from time to time. Naturally, to learn more about garbage collection, you'd better prepare by learning about V8 internals in general and read the blog of [Vyacheslav Egorov](http://mrale.ph) who worked as one of the V8 engineers. I'm saying: "V8", because it is best covered by articles on the internet. For other engines, many approaches are similar, but garbage collection differs in many aspects.
246
-
247
-
In-depth knowledge of engines is good when you need low-level optimizations. It would be wise to plan that as the next step after you're familiar with the language.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/04-object-methods/article.md
-9Lines changed: 0 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -50,13 +50,8 @@ let user = {
50
50
*!*
51
51
// اول تعریف میکنیم
52
52
functionsayHi() {
53
-
<<<<<<<HEAD
54
53
alert("سلام!");
55
54
};
56
-
=======
57
-
alert("Hello!");
58
-
}
59
-
>>>>>>>7000ede297bfd688f9a3767e8ca43abd9242f322
60
55
61
56
// سپس به عنوان متد آن را اضافه میکنیم
62
57
user.sayHi= sayHi;
@@ -95,11 +90,7 @@ user = {
95
90
96
91
همانطور که نشان داده شد، ما میتوانیم `"function"` را حذف کنیم و فقط `sayHi()` را بنویسیم.
97
92
98
-
<<<<<<< HEAD
99
93
حقیقتا این دو روش کاملا یکسان نیستند. تفاوتهایی جزئی و مربوط به وراثت شیء (بعدا آن را میآموزیم) وجود دارند، اما آنها الان مهم نیستند. تقریبا در تمام موارد سینتکس کوتاهتر ترجیح داده میشود.
100
-
=======
101
-
To tell the truth, the notations are not fully identical. There are subtle differences related to object inheritance (to be covered later), but for now they do not matter. In almost all cases, the shorter syntax is preferred.
اینجا، در هر دو خط، ما ابتدا از نقطه (`userAdmin.admin`) برای گرفتن ویژگی `admin` استفاده میکنیم به خاطر اینکه فرض میکنیم که شیء `user` حتما وجود دارد پس خواندن از آن مطمئن است.
184
184
185
-
<<<<<<<HEAD
186
185
سپس `().?` عبارت سمت چپ را بررسی میکند: اگر تابع admin وجود داشته باشد اجرا میشود (برای `userAdmin` صدق میکند). در غیر اینصورت (برای `userGuest`) ارزیابی بدون خطا متوقف میشود.
187
-
=======
188
-
Then `?.()` checks the left part:if the `admin`function exists, then it runs (that's so for `userAdmin`). Otherwise (for `userGuest`) the evaluation stops without errors.
189
-
>>>>>>> 7000ede297bfd688f9a3767e8ca43abd9242f322
190
186
191
187
سینتکس `[].?` نیز کار میکند، اگر ما میخواهیم از براکت به جای نقطه `.` برای دستیابی به ویژگیها استفاده کنیم. مشابه موارد قبلی، این سینتکس اجازه می دهد تا با خیال راحت یک ویژگی از شیءای که ممکن است وجود نداشته باشد را بخوانیم.
0 commit comments