جدول کنترل

جدول کنترل به دسته‌ای از جداول گفته می‌شود که اطلاعات لازم برای کنترل جریان برنامه یا بخشی از این اطلاعات را در خود ذخیره کرده‌است. اطلاعات این جدول جزء اطلاعات سطح بالای سیستم تعریف می‌شود و معمولاً فقط برنامه‌نویس متخصص یا مدیر سیستم دسترسی تغییر در ساختار آن را دارد. جدول کنترل معمولاً به صورت جدول نشان داده می‌شود زیرا دیدن اطلاعات در جدول آسانتر است و ساختار دو بعدی آن مناسب نشان دادن رابطه اطلاعات است، اما جدول کنترل محدود به فقط جدول نیست می‌توان جدول را با استفاده از ماشین حالات متناهی یا ماشین حالات UML نشان داد.
در جدول‌های کنترل ساختار مشابه با ساختار شرطی و صدا زدن تابع وجود دارد و با استفاده از این جدول می‌توان از تکرار ساختارهای تکراری جلوگیری کرد.

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

معمولاً جدول‌های ساخته‌شده برای تفسیر زبان‌ها نیاز به مهارت زیادی دارند و قابل استفاده در سیستم‌های مختلف نیستند و برای یک سیستم خاص طراحی می‌شوند، اما در صورت ساخته شدن جدول کنترل کوچک سرعت اجرای برنامه می‌تواند بسیار بهتر شود.

جدول اسکی یک نمونه از جدول کنترل یک بعدی است، این جدول اطلاعات خام عددی را به نمادها و کاراکترها تبدیل می‌کند. همچنین جدول شاخه‌ای که کد زبان ماشین و شاخه‌ها در آن نوشته می‌شود یک نمونه از جدول کنترل یک بعدی است.

از جدول‌های کنترل چند بعدی می‌توان برای پیاده‌سازی درخت‌های تصمیم و تصمیم‌های چند مرحله‌ای استفاده کرد.

کاربردها 
جداول کنترل کاربردهای متعددی دارند، یک کاربرد اصلی آن‌هادر طراحی پردازنده‌ها و مفسرهاست، پردازنده‌ها و مفسرها می‌توانند از جداول کنترل برای مدیریت برنامه و کنترل جریان برنامه استفاده کنند. به طراحی پردازنده‌ها و مفسرها از این طریق طراحی با استفاده از جدول می‌گویند.

در موارد دیگر می‌توان از جدول کنترل برای پیاده‌سازی زبان‌های مبتنی بر ماشین‌های حالت متناهی و پیاده‌سازی درخت‌های تصمیم‌گیری استفاده کرد. از جدول کنترل برای ساختن جدول جستجو نیز استفاده می‌شود.

صفحات گسترده که برای ذخیره اطلاعات استفاده می‌شوند نیز می‌توانند یک نمونه از جدول کنترل باشند.

مثال‌ها 
می‌توان ساختار switch که در زبان‌های برنامه‌نویسی متعددی استفاده می‌شود را با استفاده از جدول جستجو که یک مثال از جدول کنترل است ساخت. مثلاً اگر برنامه بخواهد یک حرف ورودی از کنسول بخواند و بر حسب آن تصمیم بگیرد چه عملی انجام بدهد جدول زیر می‌تواند برای انجام این کار کمک کند:

CT1

{| class="wikitable"
! input 1!! pointer
|-
| A || -->جمع
|-
| S || -->تفریق
|-
| M || -->ضرب
|-
| D || -->تقسیم
|-
| ? || -->Default
|}

یک مثال دیگر از کاربرد این زبان ماشین IBM/360 است. این ماشین ۱۶MB حافظه قابل آدرس‌دهی دارد و برای بررسی کردن یک کاراکتر ۲۵۶ حالت مختلف وجود دارد که با استفاده از جدول کنترل بررسی کاراکترها در ۲۶۵ خط کد قابل انجام است اما با استفاده از دستورهای مقایسه و شاخه شاخه کردن نیاز به ۵۱۲ خط کد دارد که با توجه به حجم کم حافظه در این ماشین روش اول بسیار بهتر است.

  * ---- interpreter ----*
  LM R14,R0,=A(4,CT1,N) Set R14=4, R15 --> table, and R0 =no. of entries in table (N)
  TRY CLC INPUT1,0(R15) ********* Found value in table entry ?
  BE ACTION * loop * YES, Load register pointer to sub-routine from table
  AR R15,R14 * * NO, Point to next entry in CT1 by adding R14 (=4)
  BCT R0,TRY ********* Back until count exhausted, then drop through
. default action … none of the values in table match, do something else
  LA R15,4(R15) point to default entry (beyond table end)
  ACTION L R15,0(R15) get pointer into R15,from where R15 points
  BALR R14,R15 Perform the sub-routine ("CALL" and return)
  B END go terminate this program
  * ---- control table ----*
  * | this column of allowable EBCDIC or ASCII values is tested '=' against variable 'input1'
  * | | this column is the 3-byte address of the appropriate subroutine
  * v v
  CT1 DC C'A',AL3(ADD) START of Control Table (4 byte entry length)
  DC C'S',AL3(SUBTRACT)
  DC C'M',AL3(MULTIPLY)
  DC C'D',AL3(DIVIDE)
  N EQU (*-CT1)/4 number of valid entries in table (total length / entry length)
  DC C'?',AL3(DEFAULT) default entry - used on drop through to catch all
  INPUT1 DS C input variable is in this variable
  * ---- sub-routines ----*
  ADD CSECT sub-routine #1 (shown as separate CSECT here but might
. alternatively be in-line code)
. instruction(s) to add
  BR R14 return
  SUBTRACT CSECT sub-routine #2
. instruction(s) to subtract
  BR R14 return
. etc..

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

منابع 

ساختارهای کامپایلر
کامپایلرسازی
کنترل جریان