**فکتور** (به انگلیسی: Factor) یک زبان برنامه‌نویسی پشته گرا است که توسط «اسلاوا پستو» ایجاد شده‌است. زبان برنامه‌نویسی Factor یک زبان پویا است و دارای مدیریت خودکار حافظه و همچنین ویژگی‌های قدرتمند «فرابرنامه‌نویسی» است. این زبان برنامه‌نویسی دارای یک پیاده‌سازی واحد است که مرکب از یک کامپایلر بهینه‌ساز خود میزبان و یک محیط توسعه تعاملی است. توزیع Factor شامل یک کتابخانه استاندارد بزرگ است.

تاریخچه
-------

"اسلاوا پستو" در سال 2003 Factor را به‌عنوان یک زبان برنامه‌نویسی برای یک بازی ویدئویی ایجاد کرد. پیاده‌سازی اولیه این زبان که در حال حاضر به آن JFactor گفته می‌شود، در جاوا پیاده‌سازی و در ماشین مجازی جاوا اجرا شده بود. اگرچه زبان اولیه از نظر "قالب دستورالعمل‌هاً شبیه زبان برنامه‌نویسی Factor جدید است، اما زبان جدید در شرایط عملی بسیار متفاوت بوده و اجرای فعلی آن بسیار سریع‌تر است.

این زبان برنامه‌نویسی به‌طور قابل توجهی در طول زمان تغییر کرده است. در اصل، برنامه‌های Factor بر روی «دست‌کاری اشیاء جاوا» و «قابلیت بازتاب جاوا» متمرکز شده‌اند. از همان ابتدا، فلسفه طراحی تغییر این زبان برنامه‌نویسی به‌منظور مناسب شدن برای برنامه‌های نوشته شده در آن است. با توجه به اینکه پیاده‌سازی و کتابخانه‌های استاندارد Factor دقیق‌تر شده‌اند، نیاز به ویژگی‌های خاص زبان مشخص و اضافه شده‌اند. JFactor فاقد یک «سیستم شیءای» بوده که در آن می‌توان کلاس‌های خود را تعریف کرد، نسخه‌های اولیه Factor اصلی نیز به همین شکل بوده‌اند؛ این زبان از این نظر مشابه اسکیم است.
(مترجم: بازتاب یا Reflection در برنامه‌های جاوا این امکان را فراهم می‌سازد که در زمان اجرای یک برنامه بتوان بدون دانستن نام یک کلاس، رابط، فیلد یا متد آن‌ها را فراخوانی کرده و اطلاعاتی دربارهٔ آن‌ها کسب کرد؛ به عبارت دیگر، Reflection عبارت است از توانایی اصلاح ساختار و رفتار برنامه در زمان اجرا (زمانی که برنامه در ماشین مجازی جاوا در حال اجرا است). از این قابلیت بیشتر برای نوشتن Framework استفاده می‌شود. این قابلیت ابزاری قدرتمند برای نوشتن برنامه‌هایی است که می‌توانند در زمان اجرا تصمیماتی را بگیرند). امروزه، سیستم شیءای یک بخش مرکزی (اصلی) از Factor است. ویژگی‌های مهم دیگر این زبان عبارت‌اند از کلاس‌های چندگانه، ترکیب کننده درون‌خطی، ماکروها، کلمات تجزیه کننده تعریف شده توسط کاربر و سیستم واژگان مدرن که به‌صورت مرحله به مرحله اضافه شده‌اند بطوریکه کاربرد (سودمندی) آن‌ها مشخص شده‌است.

«رابط عملکرد خارجی» از همان نسخه‌های اولیه Factor ارائه شده بود و یک سیستم مشابه با آن در JFactor وجود داشت. این رابط پیش از ایجاد یک پلاگین برای بخش C پیاده‌سازی هر کتابخانه خارجی که Factor باید با آن ارتباط برقرار کند، انتخاب شده بود و دارای مزایای تشریحی بودن، کامپایل سریع‌تر و نوشتن آسان‌تر است.

(مترجم: رابط عملکرد خارجی یا foreign function interface مکانیسمی است که وقتی برنامه‌ای به زبانی نوشته می‌شود، می‌تواند روتین‌هایی را فراخوانی کند یا از سرویس‌هایی که به زبان‌های دیگر نوشته شده‌استفاده کند)

پیاده‌ساز اولیه جاوای این زبان فقط مشتمل بر یک مفسر بود، اما بعداً یک کامپایلر به «کد بایت» جاوا به آن اضافه شد. این کامپایلر فقط در پروسه‌های خاصی کار می‌کرد. نسخه جاوای Factor با نسخه نوشته شده در C و Factor جایگزین شد. در ابتدا، این نسخه فقط شامل یک مفسر بود، اما این مفسر با دو کامپایلر جایگزین شد که در موارد متعددی استفاده می‌شود. با گذشت زمان، پیاده‌سازی Factor به‌طور قابل توجهی سریع‌تر رشد کرده‌است.

(مترجم: وقتی‌که می‌خواهیم برنامه‌ای را اجرا کنیم، کدهای این برنامه توسط کامپایلر جاوا به «بایت کد» (bytecode) تبدیل می‌شوند و درون فایلی با همان نام قبلی اما این بار با پسوند .class ذخیره می‌شوند. سپس ماشین مجازی جاوا فایل .class را که همان برنامه است و به bytecode تبدیل شده را اجرا می‌کند. به عبارتی می‌توان گفت که Bytecode یک زبان سطح پایین با یک دستور زبان ساده می‌باشد که به‌جای متن مبتنی بر کدهای عددی است)

شیوه‌های برنامه‌نویسی
---------------------

Factor یک زبان برنامه‌نویسی پویا، تابعی و شیءگرا است. کد (کد برنامه در این زبان برنامه‌نویسی) مبتنی بر پروسه‌های کوچک است که word گفته می‌شوند. در کد معمولی، طول این پروسه‌ها 1-3 خط بوده و یک پروسه با بیش از 7 خط طولانی به ندرت استفاده می‌شود. موردی (برنامه‌ای) که اصطلاحاً با یک پروسه در زبان‌های برنامه‌نویسی دیگر بیان می‌شود می‌تواند به‌عنوان چند word در Factor نوشته شود.

هر word دارای تعداد مشخصی آرگومان ورودی (متغیر ورودی) و دارای تعداد ثابتی از مقادیر بازگشتی است. آرگومان‌ها با استفاده از "نشانه‌گذاری لهستانی معکوس" از یک پشته اطلاعات به word منتقل می‌شوند. پشته فقط برای سازمان‌دهی فراخوانی worldها و نه به‌عنوان یک ساختمان داده استفاده می‌شود. استفاده از پشته در زبان برنامه‌نویسی Factor مشابه استفاده از پشته در زبان برنامه‌نویسی Forth است؛ به همین دلیل، این دو زبان، (به‌عنوان زبان‌های) پشته‌ای در نظر گرفته می‌شوند. به‌عنوان مثال، در زیر یک قطعه کد که "hello world" را در جریان خروجی فعلی چاپ می‌کند، نمایش داده می‌شود:

(مترجم: نشانه‌گذاری لهستانی معکوس (Reverse Polish notation) یا نشانه‌گذاری پسوندی (postfix notation) یک روش نشانه‌گذاری عبارت محاسباتی، منطقی و جبری است که در آن هر عملگر مابعد عملوندهای خود نوشته می‌شود.
forth از زبان‌های سطح بالاست که باید به زبان ماشین ترجمه شود تا برای کامپیوتر قابل فهم باشد. این زبان جز زبان‌هایی است که از آن‌ها استفاده «علمی» و «تجاری» می‌شود و جز زبان‌های دهه 1970 است)

```
"hello world" print
```

PRINT یک کلمه از فهرست واژگان (یک دستور از مجموعه دستورها) "io" است که یک رشته را از پشته دریافت و چیزی را برنمی‌گرداند. این دستور رشته را در جریان خروجی فعلی چاپ می‌کند (به‌طور پیش فرض، در واحد ورودی-خروجی یا نشان دهنده گرافیکی).

الزاماً همه داده‌ها از طریق پشته منتقل نمی‌شوند. «متغیرهای محلی حوزه لغوی»، امکان ذخیره و دسترسی به داده‌های موقت در یک پروسه را به شما می‌دهند. به‌منظور انتقال اشیا در هنگام فراخوانی پروسه بدون استفاده از پشته، متغیرهای دینامیکی حوزه به‌صورت پویا استفاده می‌شوند. به‌عنوان مثال، جریان‌های ورودی و خروجی فعلی در متغیرهای دینامیکی حوزه به‌صورت پویا ذخیره می‌شود.

Factor به‌منظور توسعه این زبان، اهمیت زیادی به انعطاف‌پذیری و توانایی می‌دهد. [۵] یک سیستم برای ماکروها و همچنین برای توسعه اختیاری قالب دستورهای زبان برنامه‌نویسی Factor وجود دارد. قالب دستورهای Factor اغلب توسعه داده می‌شوند تا انواع جدیدی از تعاریف word و انواع جدیدی از «لفظ‌ها» برای ساختمان داده قابل استفاده باشد. این زبان نیز در کتابخانه XML به‌منظور فراهم کردن قالب دستورهای لفظی برای تولید XML استفاده شده‌است. به‌عنوان مثال، کلمه زیر یک رشته را دریافت و تولید یک شیء سند XML تولید می‌کند که یک سند HTML با تأکید بر رشته است:

(مترجم: لفظ یا لیترال (Literal) به نشانه‌هایی در کد منبع برنامه گفته می‌شود که در زمان کامپایل به مقادیر مشخصی تفسیر می‌شوند؛ به عبارت دیگر لفظ‌ها مقادیر ثابتی هستند که به‌صورت نشانه‌هایی در کد برنامه نوشته می‌شوند. برای نمونه در زبان برنامه‌نویسی پایتون، ۴ یک عدد صحیح لفظی، "ABC" یک رشته لفظی، False یک مقدار بولی لفظی و {۱, ۲} یک تاپل لفظی است. کلیه مقادیر قابل تعریف در یک زبان از هر نوعی که باشند باید به وسیله لفظ‌ها قابل نوشتن باشند)

```
 : make-html ( string -- xml )
 dup
 <XML
 <html>
 <head><title><-></title></head>
 <body>
<h1><-></h1>
</body>
 </html>
 XML> ;

```
 کلمه dup مورد بالایی در پشته را تکثیر می‌کند. <-> منتظر پر شدن (جانشین شدن) یک بخش از سند XML با یک مورد از پشته است.

پیاده‌سازی و کتابخانه‌ها
------------------------

زبان برنامه‌نویسی Factor شامل یک کتابخانه استاندارد بزرگ است که به‌طور کامل در این زبان نوشته شده‌است. این کتابخانه شامل موارد زیر است:

* از یک بسته نرم‌افزاری رابط کاربری گرافیکی محیط میانجی، نوشته شده برمبنای OpenGL و سیستم‌های پنجره‌ای مختلفی برای توسعه این محیط استفاده شده‌است.
* اتصال به کتابخانه‌های پایگاه‌های داده مانند PostgreSQL و SQLite. .
* یک سرور HTTP و سرویس گیرنده، به همراه فریم ورک اینترنتی Furnace.
* • آرایه‌های همگن کارآمد از اعداد صحیح، ممیزی و structها در زبان C.
* یک کتابخانه که «عبارات باقاعده» را اجرا می‌کند، کد ماشین را برای تطابق تولید می‌کند.

«رابط عملکرد خارجی» که درون Factor ساخته شده‌است قابلیت ارتباط با برنامه‌های C، Objective-C و فرترن را فراهم می‌کند. همچنین پشتیبانی برای اجرا و برقراری ارتباط با shaderهای نوشته شده در GLSL فراهم می‌شود.

Factor در Factor و C++ پیاده‌سازی شده‌است. در حقیقت، قبل از پیاده‌سازی این زبان در جاوا، خود راه‌اندازی شده بود. امروزه، تجزیه کننده و کامپایلر بهینه‌سازی در این زبان (زبان برنامه‌نویسی Factor) نوشته شده‌اند. برخی بخش‌های اساسی این زبان مانند «زباله روب» و بخش‌های اولیه در C++ پیاده‌سازی شده‌اند.

زبان برنامه‌نویسی Factor از یک مدل مبتنی بر تصویر که مشابه بسیاری از پیاده‌سازی‌های Smalltalk است استفاده می‌کند که در آن کد کامپایل شده و داده‌ها در یک تصویر ذخیره می‌شوند. [۱۲] برای کامپایل کردن یک برنامه، این برنامه درون یک تصویر بارگذاری شده و تصویر ذخیره می‌شود. یک ابزار خاص در پروسه ایجاد یک تصویر حداقل برای اجرای یک برنامه خاص مشارکت کرده و نتیجه را صورتی که به‌عنوان یک برنامه مستقل باز شود، بسته‌بندی (پکیج) می‌کند.

(مترجم: زبان Smalltalk یک زبان شی‌گرا و دارای تایپ پویا و زبان برنامه‌نویسی انعکاسی است که برای هر چه بیشتر آسان نمودن استفاده از کامپیوتر توسط افراد عادی طراحی شده‌است)

کامپایلر Factor بهینه‌سازی‌های بسیار پیشرفته‌ای را انجام می‌دهد و به‌عنوان یک هدف برای تحقیق در تکنیک‌های بهینه‌سازی جدید استفاده می‌شود. .

منابع
-----

1. ↑  Diggins, Christopher (2008), "Simple Type Inference for Higher-Order Stack-Oriented Languages", *نسخه آرشیو شده* (PDF), archived from the original (PDF) on 16 November 2013, retrieved 4 April 2016
2. ↑  Herzberg, Dominikus; Reichert, Tim (2009), "Concatenative Programming: An Overlooked Paradigm in Functional Programming", *نسخه آرشیو شده* (PDF), archived from the original (PDF) on 27 February 2012, retrieved 4 April 2016
3. ↑  "Concatenative.org wiki: Factor/Implementation History",  `{{citation}}`: Missing or empty `|title=` (help)Missing or empty `|title=` (help)
4. 1 2 3  Pestov, Sviatoslav; Ehrenberg, Daniel (2010). "Factor: a dynamic stack-based programming language". *SIGPLAN Not*. ACM. **45** (12): 43–58. doi:10.1145/1899661.1869637.
5. ↑  Pestov, Slava, "Factor documentation: UI framework",  `{{citation}}`: Missing or empty `|title=` (help)Missing or empty `|title=` (help)
6. ↑  Pestov, Slava, "Factor documentation: HTTP server",  `{{citation}}`: Missing or empty `|title=` (help)Missing or empty `|title=` (help)
7. ↑  Pestov, Slava, "Factor documentation: Specialized arrays",  `{{citation}}`: Missing or empty `|title=` (help)Missing or empty `|title=` (help)
8. ↑  Ehrenberg, Daniel (2010), "Closure elimination as constant propagation", *نسخه آرشیو شده* (PDF), archived from the original (PDF) on 26 July 2011, retrieved 4 April 2016Missing or empty `|title=` (help)