කොන්වේ ගේම් ඔෆ් ලයිෆ් හි ටෙට්‍රිස්ගේ ක්‍රියාකාරී ක්‍රීඩාවක් ගොඩනඟන්න


1069

මෙන්න න්‍යායාත්මක ප්‍රශ්නයක් - ඕනෑම අවස්ථාවක පහසු පිළිතුරක් ලබා ගත නොහැකි එකක්, සුළු කාරණයක්වත් නොවේ.

කොන්වේ ගේම් ඔෆ් ලයිෆ් හි, මෙටපික්සල් වැනි ඉදිකිරීම් පවතින අතර එමඟින් ගේම් ඔෆ් ලයිෆ් වෙනත් ඕනෑම ගේම්-ඔෆ්-ලයිෆ් රීති පද්ධතියක් අනුකරණය කිරීමට ඉඩ ලබා දේ. ඊට අමතරව, ගේම් ඔෆ් ලයිෆ් ටියුරින්-සම්පූර්ණ බව දන්නා කරුණකි.

ඔබේ කර්තව්‍යය වන්නේ ටෙට්රිස් ක්‍රීඩාවට ක්‍රීඩා කිරීමට ඉඩ සලසන කොන්වේගේ ජීවිතයේ ක්‍රීඩාවේ නීති භාවිතා කරමින් සෛලීය ස්වයංක්‍රීය යන්ත්‍රයක් තැනීමයි.

බාධාවක් නිරූපණය කිරීම සඳහා නිශ්චිත පරම්පරාවක ස්වයංක්‍රීය යන්ත්‍රයේ තත්වය අතින් වෙනස් කිරීමෙන් ඔබේ වැඩසටහනට ආදානය ලැබෙනු ඇත (උදා: කෑල්ලක් වමට හෝ දකුණට ගෙනයාම, එය අතහැරීම, භ්‍රමණය කිරීම හෝ අහඹු ලෙස විදුලිබල පද්ධතියට ස්ථානගත කිරීම සඳහා නව කෑල්ලක් උත්පාදනය කිරීම), ගණන් කිරීම නිශ්චිත පරම්පරා ගණනක් බලා සිටීමේ කාලය සහ ප්‍රති result ලය ස්වයංක්‍රීයව කොතැනක හෝ ප්‍රදර්ශනය කිරීම. පෙන්වන ප්‍රති result ලය දෘශ්‍යමය වශයෙන් සත්‍ය ටෙට්රිස් ජාලයකට සමාන විය යුතුය.

(ඉහළ නිර්ණායක සඳහා ටයිබ්‍රේකර් ලෙස ක්‍රියා කරන අඩු නිර්ණායක සහිතව) ඔබේ වැඩසටහන පහත සඳහන් කරුණු මත ලකුණු කරනු ලැබේ:

  • මායිම් පෙට්ටියේ ප්‍රමාණය - දී ඇති විසඳුම මුළුමනින්ම අඩංගු කුඩාම ප්‍රදේශය සහිත සෘජුකෝණාස්රාකාර කොටුව ජය ගනී.

  • ආදානයේ කුඩා වෙනස්කම් - බාධා කිරීම් ජයග්‍රහණයන් සඳහා අතින් සකස් කළ යුතු අවම සෛල (ඔබේ ස්වයංක්‍රීය යන්ත්‍රයේ නරකම අවස්ථාව සඳහා).

  • වේගවත්ම ක්‍රියාත්මක කිරීම - සමාකරණයේ එක් ටික් එකක් ඉදිරියට ගෙන යන පරම්පරා කිහිපය ජය ගනී.

  • ආරම්භක සජීවී සෛල ගණන - කුඩා ගණන ජය ගනී.

  • පළ කිරීමට පළමුව - පෙර පෝස්ට් ජය.


100
“නිරූපිත ලෙස වැඩ කරන උදාහරණය” යන්නෙන් අදහස් වන්නේ පැය කිහිපයකින් ධාවනය වන දෙයක්ද, නැතහොත් විශ්වයේ තාපය මිය යන තෙක්ම එය නිවැරදි බව ඔප්පු කළ හැකි දෙයක්ද?
පීටර් ටේලර්

38
මට හොඳටම විශ්වාසයි මේ වගේ දෙයක් කරන්න පුළුවන් කියලා. ලෝකයේ වඩා විචක්ෂණශීලී “එකලස් කිරීමේ භාෂාවක්” ලෙස වැඩසටහන්ගත කිරීමට තරම් විශේෂ ise තාව ඇත්තේ ඉතා සුළු පිරිසකට පමණි.
ජස්ටින් එල්

59
මෙම අභියෝගය ක්‍රියාත්මක වෙමින් පවතී! කතාබස් කාමරය | ප්‍රගතිය | බ්ලොග්
mbomb007

50
අද උදේ 5: 10 වන විට (9:10 යූටීසී), මෙම ප්‍රශ්නය පීපීසීජී ඉතිහාසයේ පිළිතුරක් ලබා නොගෙන ඡන්ද 100 ක් ලබා ගත් පළමු ප්‍රශ්නයයි! හැමෝටම හොඳයි.
ජෝ ඉසෙඩ්

79
මම මෙය විසඳීමට උත්සාහ කරමි ... දැන්, මම නින්දට යන විට, සෑම තැනකම ග්ලයිඩර් දකින අතර, යෝධ අවුලක ගැටේ. මගේ නින්ද නපුරු සිහින වලින් පිරී ඇති අතර ස්පන්දන පෙන්ටඩෙකැත්ලෝන් මගේ මාර්ගය අවහිර කරන අතර හර්ෂල්ස් මාව අවශෝෂණය කර ගැනීමට පරිණාමය වෙමින් පවතී. කරුණාකර, ජෝන් කොන්වේ, මා වෙනුවෙන්
අඳුරු

Answers:


1013

මෙය ගවේෂණයක් ලෙස ආරම්භ වූ නමුත් ඔඩිසි ලෙස අවසන් විය.

ටෙට්රිස් ප්‍රොසෙසරය සඳහා ගවේෂණය, 2,940,928 x 10,295,296

රටා ගොනුව, එහි සියලු තේජසින්, මෙහි බ්‍රව්සරයේ දැකිය හැකිය .

මෙම ව්‍යාපෘතිය පසුගිය වසර 1 සහ 1/2 කාලය තුළ බොහෝ පරිශීලකයින්ගේ උත්සාහයේ කූටප්‍රාප්තියයි. කාලයත් සමඟ කණ්ඩායමේ සංයුතිය වෙනස් වුවද, ලිවීමේදී සහභාගිවන්නන් පහත දැක්වේ:

7H3_H4CK3R, කොනෝර් ඕ බ්‍රයන් සහ මෙම අභියෝගය විසඳීමට උත්සාහ කළ බොහෝ පරිශීලකයින්ට අපගේ ස්තූතිය පිරිනැමීමට අපි කැමැත්තෙමු .

මෙම සහයෝගීතාවයේ පෙර නොවූ විරූ විෂය පථය හේතුවෙන්, මෙම පිළිතුර මෙම කණ්ඩායමේ සාමාජිකයන් විසින් ලියන ලද බහු පිළිතුරු හරහා කොටස් වලට බෙදා ඇත. සෑම සාමාජිකයෙක්ම විශේෂිත උප මාතෘකා ගැන ලියනු ඇත, දළ වශයෙන් ඔවුන් වැඩිපුරම සම්බන්ධ වූ ව්‍යාපෘතියේ ක්ෂේත්‍රයන්ට අනුරූප වේ.

කරුණාකර කණ්ඩායමේ සියලුම සාමාජිකයින් හරහා ඕනෑම ඉහළ නැංවීමක් හෝ ත්‍යාගයක් බෙදා දෙන්න.

පටුන

  1. දළ විශ්ලේෂණය
  2. මෙටාපික්සල් සහ වර්ලයිෆ්
  3. දෘඩාංග
  4. QFTASM සහ කොගෝල්
  5. එකලස් කිරීම, පරිවර්තනය සහ අනාගතය
  6. නව භාෂාව සහ සම්පාදකය

අපගේ විසඳුමේ කොටසක් ලෙස අප විසින් ලියන ලද කේත සියල්ලම තබා ඇති අපගේ GitHub සංවිධානය පරීක්ෂා කිරීමද සලකා බලන්න . ප්‍රශ්න අපගේ සංවර්ධන චැට් රූම් වෙත යොමු කළ හැකිය .


1 වන කොටස: දළ විශ්ලේෂණය

මෙම ව්‍යාපෘතියේ මූලික අදහස වියුක්ත කිරීමයි. කෙලින්ම ජීවිතයේ ටෙට්‍රිස් ක්‍රීඩාවක් වර්ධනය කරනවා වෙනුවට, අපි පියවර කිහිපයකින් සාරාංශය සෙමෙන් තක්සේරු කළෙමු. සෑම ස්ථරයකම, අපි ජීවිතයේ දුෂ්කරතා වලින් and ත් වී වෙනත් ඕනෑම ක්‍රමලේඛනය කිරීමට පහසු පරිගණකයක් තැනීමට සමීප වෙමු.

පළමුව, අපි අපගේ පරිගණකයේ පදනම ලෙස OTCA මෙටපික්සල් භාවිතා කළෙමු . මෙම මෙටපික්සල් ඕනෑම "ජීවිතයට සමාන" රීතියක් අනුකරණය කළ හැකිය. Wireworld සහ Wireworld පරිගණකය මෙම ව්‍යාපෘතිය සඳහා වැදගත් ආශ්වාදයක් ලබා දුන් ප්‍රභවයන් වන අතර, එබැවින් අපි මෙටාපික්සල් සමඟ සමාන ව්‍යුහයක් නිර්මාණය කිරීමට උත්සාහ කළෙමු. OTCA මෙටපික්සෙල් සමඟ වයර් වර්ල්ඩ් අනුකරණය කළ නොහැකි වුවද, විවිධ මෙටපික්සල් විවිධ නීති පැවරීමට සහ වයර් වලට සමානව ක්‍රියා කරන මෙටා පික්සල් සැකසුම් ගොඩනගා ගත හැකිය.

ඊළඟ පියවර වූයේ පරිගණකයේ පදනම ලෙස සේවය කිරීම සඳහා විවිධාකාර මූලික තර්කන දොරටු තැනීමයි. දැනටමත් මෙම අවස්ථාවෙහිදී අපි සැබෑ ලෝක සකසනය නිර්මාණයට සමාන සංකල්ප සමඟ කටයුතු කරන්නෙමු. OR දොරටුවකට උදාහරණයක් මෙන්න, මෙම රූපයේ සෑම සෛලයක්ම ඇත්ත වශයෙන්ම සමස්ත OTCA මෙටාපික්සල් වේ. ඔබට "ඉලෙක්ට්‍රෝන" (එක් එක් දත්ත ටිකක් නියෝජනය කරන) ගේට්ටුවෙන් ඇතුළු වී පිටව යා හැකිය. අපගේ පරිගණකයේ අප භාවිතා කළ විවිධ මෙටපික්සල් වර්ග සියල්ලම ඔබට දැක ගත හැකිය: කළු පසුබිම ලෙස B / S, නිල් පැහැයෙන් B1 / S, කොළ පැහැයෙන් B2 / S සහ රතු පැහැයෙන් B12 / S1.

රූප

මෙතැන් සිට අපි අපගේ සකසනය සඳහා ගෘහ නිර්මාණ ශිල්පයක් නිර්මාණය කළෙමු. අපූර්ව නොවන හා හැකි තරම් පහසුවෙන් ක්‍රියාත්මක කළ හැකි ගෘහ නිර්මාණ ශිල්පයක් සැලසුම් කිරීම සඳහා අපි සැලකිය යුතු උත්සාහයක් ගත්තෙමු. වයර්වර්ල්ඩ් පරිගණකය මූලික ප්‍රවාහන-ප්‍රේරිත ගෘහ නිර්මාණ ශිල්පයක් භාවිතා කර ඇති අතර, මෙම ව්‍යාපෘතිය වඩාත් නම්‍යශීලී RISC ගෘහ නිර්මාණ ශිල්පයක් භාවිතා කරයි. අපගේ ප්‍රොසෙසරය ඉදිකිරීමට මඟ පෙන්වන QFTASM (ටෙට්රිස් එකලස් කිරීම සඳහා වූ ගවේෂණය) නමින් එකලස් කිරීමේ භාෂාවක් අපි නිර්මාණය කළෙමු.

අපගේ පරිගණකය ද අසමමුහුර්ත වේ, එයින් අදහස් වන්නේ පරිගණකය පාලනය කරන ගෝලීය ඔරලෝසුවක් නොමැති බවයි. ඒ වෙනුවට, දත්ත පරිගණකය වටා ගලා යන විට ඔරලෝසු සං signal ාවක් ඇත, එයින් අදහස් කරන්නේ අප අවධානය යොමු කළ යුත්තේ පරිගණකයේ දේශීය නමුත් ගෝලීය වේලාවන් කෙරෙහි පමණක් නොවන බවයි.

මෙන්න අපගේ ප්‍රොසෙසර් ගෘහ නිර්මාණ ශිල්පයේ නිදර්ශනයක්:

රූප

මෙතැන් සිට එය පරිගණකයේ ටෙට්රිස් ක්‍රියාත්මක කිරීම පිළිබඳ කාරණයක් පමණි. මෙය සාක්ෂාත් කර ගැනීම සඳහා, QFTASM වෙත ඉහළ මට්ටමේ භාෂාව සම්පාදනය කිරීමේ විවිධ ක්‍රම පිළිබඳව අපි කටයුතු කර ඇත්තෙමු. අප සතුව මූලික භාෂාවක් වන කොගෝල්, දෙවන, වඩා දියුණු භාෂාවක් සංවර්ධනය වෙමින් පවතින අතර, අවසානයේදී අපට ඉදිවෙමින් පවතින ජීසීසී පසුබිමක් තිබේ. වර්තමාන ටෙට්රිස් වැඩසටහන කොගොල් වෙතින් ලියා / සම්පාදනය කරන ලදී.

අවසාන ටෙට්රිස් QFTASM කේතය ජනනය කළ පසු, අවසාන පියවර වූයේ මෙම කේතයේ සිට අනුරූප ROM වෙත එක්රැස් කිරීම, ඉන්පසු මෙටපික්සල් සිට යටින් පවතින ගේම් ඔෆ් ලයිෆ් දක්වා අපගේ ඉදිකිරීම් සම්පූර්ණ කිරීමයි.

ටෙට්රිස් ධාවනය

පරිගණකය සමඟ පටලවා නොගෙන ටෙට්රිස් වාදනය කිරීමට කැමති අයට, ඔබට ටෙට්‍රිස් ප්‍රභව කේතය QFTASM පරිවර්තකය මත ධාවනය කළ හැකිය . මුළු ක්‍රීඩාවම බැලීමට RAM දර්ශන ලිපින 3-32 ලෙස සකසන්න. පහසුව සඳහා පර්මාලින්ක් එකක් මෙන්න: QFTASM හි ටෙට්රිස් .

ක්‍රීඩා විශේෂාංග:

  • සියලුම ටෙට්රොමිනෝ
  • චලනය, භ්රමණය, මෘදු බිංදු
  • රේඛාව නිෂ්කාශනය සහ ලකුණු කිරීම
  • පෙරදසුන කෑල්ලක්
  • ක්‍රීඩක යෙදවුම් අහඹු ලෙස එන්නත් කරයි

දර්ශනය කරන්න

අපගේ පරිගණකය ටෙට්රිස් පුවරුව එහි මතකයේ ඇති ජාලයක් ලෙස නිරූපණය කරයි. ලිපින 10-31 පුවරුව ප්‍රදර්ශනය කරයි, 5-8 ලිපිනයන් පෙරදසුන කොටස පෙන්වයි, සහ ලිපිනය 3 හි ලකුණු අඩංගු වේ.

ආදානය

RAM ලිපිනයෙහි අන්තර්ගතය අතින් සංස්කරණය කිරීමෙන් ක්‍රීඩාවට ආදානය සිදු කෙරේ. QFTASM පරිවර්තකය භාවිතා කරමින්, මෙයින් අදහස් කරන්නේ ලිපිනයට සෘජු ලිවීම් සිදු කිරීමයි. සෑම පියවරකටම අවශ්‍ය වන්නේ එක් RAM ප්‍රමාණයක් සංස්කරණය කිරීම පමණක් වන අතර ආදාන සිදුවීම කියවීමෙන් පසු මෙම ආදාන ලේඛනය ස්වයංක්‍රීයව නිෂ්කාශනය වේ.

value     motion
   1      counterclockwise rotation
   2      left
   4      down (soft drop)
   8      right
  16      clockwise rotation

ලකුණු ක්‍රමය

එක් වාරයකදී පේළි කිහිපයක් ඉවත් කිරීම සඳහා ඔබට ප්‍රසාද දීමනාවක් ලැබේ.

1 row    =  1 point
2 rows   =  2 points
3 rows   =  4 points
4 rows   =  8 points

16
@ Christopher2EZ4RTZ මෙම දළ විශ්ලේෂණ සටහන මඟින් ව්‍යාපෘති සාමාජිකයින් බොහෝ දෙනෙකු විසින් සිදු කරන ලද කාර්යයන් විස්තර කරයි (දළ විශ්ලේෂණ සටහනේ සත්‍ය ලිවීම ඇතුළුව). එනිසා එය සීඩබ්ලිව් වීම සුදුසුය. එක් පුද්ගලයෙකුට තනතුරු දෙකක් තිබීම වළක්වා ගැනීමට ද අපි උත්සාහ කළෙමු. මක්නිසාද යත්, ඔවුන්ට අසාධාරණ ලෙස නියෝජිතයින් ප්‍රමාණයක් ලැබෙනු ඇත, මන්ද අපි නියෝජිතයා පවා තබා ගැනීමට උත්සාහ කරන බැවිනි.
මෙගෝ

30
පළමුවෙන්ම +1, මෙය අතිශය පුදුමාකාර ජයග්‍රහණයක් වන නිසා (විශේෂයෙන් ඔබ ටෙට්රිස් වලට වඩා ජීවිතයේ ක්‍රීඩාවේ පරිගණකයක් ගොඩනඟා ඇති බැවින්). දෙවනුව, පරිගණකය කෙතරම් වේගවත්ද සහ ටෙට්රිස් ක්‍රීඩාව කොතරම් වේගවත්ද? එය දුරස්ථව වාදනය කළ හැකිද? (නැවතත්: මෙය නියමයි)
සොක්‍රටික් ෆීනික්ස්

21
මෙය ... මෙය සම්පූර්ණයෙන්ම උමතුවකි. සියලු පිළිතුරු සඳහා වහාම +1.
ස්කොටිනෙට්

29
පිළිතුරු වලට වඩා කුඩා වරප්‍රසාද බෙදා හැරීමට කැමති ඕනෑම කෙනෙකුට අනතුරු ඇඟවීමකි: සෑම අවස්ථාවකදීම ඔබේ ත්‍යාග මුදල දෙගුණ කළ යුතුය (ඔබ 500 ට පහර දෙන තෙක්), එම නිසා එක් පුද්ගලයෙකුට සෑම පිළිතුරකටම සමාන මුදලක් ලබා දිය නොහැක.
මාටින් එන්ඩර්

26
ඉතා සුළු වශයෙන් අවබෝධ කර ගනිමින් මම මෙතෙක් අනුචලනය කළ එකම ශ්‍රේෂ් greatest තම දෙය මෙයයි.
ඉංජිනේරු ටෝස්ට්

730

2 වන කොටස: OTCA Metapixel සහ VarLife

OTCA මෙටාපික්සල්

OTCA මෙටාපික්සල්
( මූලාශ්‍රය )

මෙම OTCA Metapixel ලයිෆ් කොන්වෝයි ගේ ගේම් දී ඉදිකිරීමක් හෝ ජීවිත වැනි සෙලියුලර් automata අනුකරනය කිරීමට භාවිතා කළ හැකි බව ය. ලයිෆ්විකි (ඉහත සබැඳිය) පවසන පරිදි,

OTCA මෙටපික්සෙල් යනු බ්‍රයිස් ඩියු විසින් සාදන ලද 2048 × 2048 කාල පරිච්ඡේද 35328 සෛලයකි ... එයට බොහෝ වාසි ඇත ... ඕනෑම ජීවිතයට සමාන සෛලීය ස්වයංක්‍රීය යන්ත්‍රයක් අනුකරණය කිරීමේ හැකියාව සහ විශාලනය කළ විට ON සහ OFF සෛල වෙන්කර හඳුනා ගැනීම පහසුය ...

කුමක්ද ලයිෆ් වැනි සෙලියුලර් automata මාර්ගයෙන් මෙහි සෛල උපත බව අනිවාර්යයෙන්ම, හා සෛල ජීවතුන් අතර කොපමණ තම අසල්වැසියාට සෛල අට අනුව ජීවත්. මෙම නීතිරීති සඳහා වන වාක්‍ය ඛණ්ඩය පහත පරිදි වේ: බී පසු උපතකට හේතු වන සජීවී අසල්වැසියන්ගේ සංඛ්‍යාව, පසුව කප්පාදුවක්, පසුව එස් සහ සෛල සජීවීව තබා ගන්නා සජීවී අසල්වැසියන්ගේ සංඛ්‍යාව. ටිකක් නරකයි, ඉතින් මම හිතන්නේ උදාහරණයක් උදව් වේවි. කැනොනිකල් ගේම් ඔෆ් ලයිෆ් B3 / S23 රීතිය මගින් නිරූපණය කළ හැකි අතර, එයින් කියවෙන්නේ සජීවී අසල්වැසියන් තිදෙනෙකු සිටින ඕනෑම මළ සෛලයක් ජීවමාන වන බවත් සජීවී අසල්වැසියන් දෙදෙනෙකු හෝ තිදෙනෙකු සිටින ඕනෑම සජීවී සෛලයක් ජීවතුන් අතර සිටින බවත් ය. එසේ නොමැතිනම් සෛලය මිය යයි.

2048 x 2048 සෛලයක් වුවද, OTCA මෙටපික්සෙල් සතුව ඇත්ත වශයෙන්ම සෛල 2058 x 2058 ක මායිම් පෙට්ටියක් ඇත, එයට හේතුව එය සෑම දිශාවකටම සෛල පහකින් එහි විකර්ණ අසල්වැසියන් සමඟ අතිච්ඡාදනය වීමයි. අතිච්ඡාදනය වන සෛල ග්ලයිඩර් අන්තර්ග්‍රහණය කිරීමට උපකාරී වේ - ඒවා පිටවන අසල්වැසි මෙටාසෙල් සං signal ා කිරීම සඳහා විමෝචනය වේ - එවිට ඒවා වෙනත් මෙටපික්සල් වලට ඇඟිලි ගැසීමට හෝ දින නියමයක් නොමැතිව පියාසර නොකරයි. උපත් සහ පැවැත්ම පිළිබඳ නීති තීරු දෙකක් ඔස්සේ නිශ්චිත ස්ථානවල ආහාර අනුභව කරන්නන් සිටීම හෝ නොපැවතීම මගින් මෙටපික්සෙල් හි වම් පැත්තේ ඇති සෛලවල විශේෂ කොටසක කේතනය කර ඇත (එකක් උපත සඳහා, අනෙක පැවැත්ම සඳහා). අසල්වැසි සෛලවල තත්වය හඳුනා ගැනීම සඳහා, එය සිදු වන ආකාරය මෙන්න:

9-LWSS ප්‍රවාහයක් පසුව සෛලය වටා දක්ෂිණාවර්තව ගමන් කරයි, මී පැණි ප්‍රතික්‍රියාවක් අවුලුවන සෑම යාබද 'ඔන්' සෛලයකටම LWSS අහිමි වේ. අතුරුදහන් වූ LWSSes ගණන ගණනය කරනු ලබන්නේ ඉදිරිපස LWSS හි පිහිටීම හඳුනා ගැනීමෙන් තවත් LWSS එකක් ප්‍රතිවිරුද්ධ දිශාවට කඩා වැටීමෙනි. මෙම ision ට්ටනය ග්ලයිඩර් මුදාහරින අතර, උපත් / පැවැත්මේ තත්ත්වය පෙන්නුම් කරන ආහාර අනුභව කරන්නන් නොමැති නම් තවත් මී පැණි ප්‍රතික්‍රියා එකක් හෝ දෙකක් අවුලුවයි.

OTCA මෙටාපික්සල් හි සෑම අංශයකම සවිස්තරාත්මක රූප සටහනක් එහි මුල් වෙබ් අඩවියෙන් සොයාගත හැකිය: එය ක්‍රියා කරන්නේ කෙසේද? .

VarLife

මම ජීවිතයට සමාන නීති රීති සමඟ අමුත්තන් සිමියුලේටරයක් ​​ගොඩනඟා, ඔබට ඕනෑම සෛලයකට ඕනෑම ජීවිතයකට සමාන රීතියක් අනුව හැසිරීමට හැකි වන අතර එය "ජීවිතයේ විචල්‍යතා" ලෙස නම් කරන ලදී. වඩාත් සංක්ෂිප්ත වීමට මෙම නම "VarLife" ලෙස කෙටි කර ඇත. මෙන්න එහි තිර රුවක් (මෙහි සබැඳිය: http://play.starmaninnovations.com/varlife/BeeHkfCpNR ):

VarLife තිර රුව

කැපී පෙනෙන ලක්ෂණ:

  • සජීවී / මියගිය අය අතර සෛල ටොගල කර විවිධ නීති රීති වලින් පුවරුව තීන්ත ආලේප කරන්න.
  • සමාකරණය ආරම්භ කිරීමට සහ නැවැත්වීමට ඇති හැකියාව සහ වරකට එක් පියවරක් කිරීමට ඇති හැකියාව. කිනිතුල්ලන් තත්පරයට සහ මිලි තත්පරයට ටික් පෙට්ටිවල නියම කර ඇති අනුපාතයට අනුව, ලබා දී ඇති පියවර ගණනක් හැකි තරම් වේගයෙන් හෝ වඩා සෙමින් කළ හැකිය.
  • සියලුම සජීවී සෛල ඉවත් කරන්න හෝ පුවරුව හිස් තත්වයකට යලි සකසන්න.
  • සෛල හා පුවරු ප්‍රමාණය වෙනස් කළ හැකි අතර, ටොරොයිඩ් එතීම තිරස් අතට සහ / හෝ සිරස් අතට සක්‍රීය කළ හැකිය.
  • පර්මලින්ක්ස් (යූආර්එල් හි සියලුම තොරතුරු සංකේතවත් කරන) සහ කෙටි යූආර්එල් (සමහර විට ඕනෑවට වඩා තොරතුරු ඇති නමුත් ඒවා කෙසේ හෝ හොඳයි).
  • රීති කට්ටල, බී / එස් ​​පිරිවිතර, වර්ණ සහ විකල්ප අහඹු බව සමඟ.
  • අන්තිම නමුත් නිසැකවම අවම නොවේ, විදැහුම්කරණය!

Render-to-gif විශේෂාංගය මගේ ප්‍රියතම දෙය වන්නේ එය ක්‍රියාත්මක කිරීම සඳහා ටොන් ගණනක් වැඩ කළ නිසා, අවසානයේදී උදේ 7 ට මම එය ඉරිතලා ගිය විට එය ඇත්තෙන්ම තෘප්තිමත් වූ අතර VarLife ඉදිකිරීම් අන් අය සමඟ බෙදා ගැනීම ඉතා පහසු වන බැවිනි. .

මූලික VarLife පරිපථය

සියල්ලට ම, VarLife පරිගණකයට අවශ්‍ය වන්නේ සෛල වර්ග හතරක් පමණි! මියගිය / ජීවත්ව සිටින රාජ්‍යයන් ගණන් කිරීමේදී ප්‍රාන්ත අටක්. අර තියෙන්නේ:

  • B / S (කළු / සුදු), B / S සෛල කිසි විටෙකත් ජීවත්විය නොහැකි බැවින් සියලු සංරචක අතර බෆරයක් ලෙස සේවය කරයි.
  • සං 1 ා ප්‍රචාරණය කිරීම සඳහා භාවිතා කරන ප්‍රධාන සෛල වර්ගය වන බී 1 / එස් ​​(නිල් / සයන්).
  • සං 2 ා පාලනය සඳහා ප්‍රධාන වශයෙන් භාවිතා කරන බී 2 / එස් ​​(කොළ / කහ), එය පසුගාමී නොවන බව සහතික කරයි.
  • සං 12 ා තරණය කිරීම සහ දත්ත ටිකක් ගබඩා කිරීම වැනි විශේෂිත අවස්ථා කිහිපයකදී භාවිතා කරන B12 / S1 (රතු / තැඹිලි).

දැනටමත් සංකේතවත් කර ඇති මෙම නීති සමඟ VarLife විවෘත කිරීමට මෙම කෙටි url එක භාවිතා කරන්න: http://play.starmaninnovations.com/varlife/BeeHkfCpNR .

වයර්

විවිධ ලක්‍ෂණ සහිත විවිධ වයර් මෝස්තර කිහිපයක් තිබේ.

වර්ලයිෆ් හි ඇති පහසුම හා මූලිකම වයරය මෙයයි, කොළ පැහැති තීරු වලින් මායිම් වූ නිල් පැහැති තීරුවකි.

මූලික වයර්
කෙටි url: http://play.starmaninnovations.com/varlife/WcsGmjLiBF

මෙම වයරය ඒක දිශානුගත වේ. එනම්, එය ප්‍රතිවිරුද්ධ දිශාවට ගමන් කිරීමට උත්සාහ කරන ඕනෑම සං signal ාවක් විනාශ කරයි. එය මූලික වයරයට වඩා එක් සෛලයක් පටු ය.

ඒක දිශානුගත වයර්
කෙටි url: http://play.starmaninnovations.com/varlife/ARWgUgPTEJ

විකර්ණ වයර් ද පවතින නමුත් ඒවා එතරම් භාවිතා නොවේ.

විකර්ණ වයර්
කෙටි url: http://play.starmaninnovations.com/varlife/kJotsdSXIj

ගේට්ස්

එක් එක් තනි ගේට්ටුව සෑදීම සඳහා ඇත්ත වශයෙන්ම බොහෝ ක්‍රම තිබේ, එබැවින් මම පෙන්වන්නේ එක් එක් වර්ගයට එක් උදාහරණයක් පමණි. මෙම පළමු gif පිළිවෙලින් AND, XOR සහ OR ගේට්ටු නිරූපණය කරයි. මෙහි මූලික අදහස නම් හරිත සෛල AND ලෙස ක්‍රියා කරයි, නිල් සෛල XOR ලෙස ක්‍රියා කරයි, සහ රතු සෛලයක් OR ලෙස ක්‍රියා කරයි, සහ අවට ඇති අනෙකුත් සියලුම සෛල නිසි ලෙස ප්‍රවාහය පාලනය කිරීම සඳහා ඇත.

සහ, XOR, හෝ තාර්කික දොරටු
කෙටි url: http://play.starmaninnovations.com/varlife/EGTlKktmeI

“ANT ගේට්ටුව” ලෙස කෙටියෙන් දක්වා ඇති AND-NOT ගේට්ටුව ඉතා වැදගත් අංගයක් බවට පත්විය. එය A වෙතින් සං signal ාවක් පසු කරන ගේට්ටුවක් වන අතර B වෙතින් සං signal ාවක් නොමැති නම් පමණි. එබැවින් "A AND NOT B".

සහ-ගේට්ටුව
කෙටි url: http://play.starmaninnovations.com/varlife/RsZBiNqIUy

හරියටම ගේට්ටුවක් නොවූවත් , කම්බි තරණය කරන ටයිල් එකක් තවමත් ඉතා වැදගත් හා ප්‍රයෝජනවත් වේ.

කම්බි තරණය
කෙටි url: http://play.starmaninnovations.com/varlife/OXMsPyaNTC

අහම්බෙන්, මෙහි NOT ගේට්ටුවක් නොමැත. එයට හේතුව එන සං signal ාවක් නොමැතිව නියත ප්‍රතිදානයක් නිපදවිය යුතු අතර එය වර්තමාන පරිගණක දෘඩාංග සඳහා අවශ්‍ය වන කාල වේලාවන් සමඟ හොඳින් ක්‍රියා නොකරයි. කෙසේ හෝ එය නොමැතිව අපි හොඳින් ගමන් කළෙමු.

එසේම, බොහෝ සංරචක හිතාමතාම නිර්මාණය කර ඇත්තේ 11 සිට 11 දක්වා මායිම් පෙට්ටියක් ( ටයිල් එකක් ) තුළට ගැලපෙන පරිදි ය . එහිදී ටයිල් එකෙන් පිටවීම සඳහා ටයිල් 11 ක් කිනිතුල්ලන් ගනී. මෙමඟින් සංරචක වඩාත් මොඩියුලය සහ පරතරය හෝ වේලාව සඳහා වයර් සකස් කිරීම ගැන කරදර නොවී අවශ්‍ය පරිදි එකට ගැසීමට පහසු කරයි.

පරිපථ සංරචක ගවේෂණය කිරීමේ ක්‍රියාවලියේදී සොයාගත් / ඉදිකරන ලද තවත් ගේට්ටු බැලීමට, ෆිනොට්පී විසින් මෙම බ්ලොග් සටහන බලන්න: ගොඩනැඟිලි කොටස්: ලොජික් ගේට්ස් .

ප්‍රමාද සංරචක

පරිගණකයේ දෘඩාංග සැලසුම් කිරීමේ ක්‍රියාවලියේදී, KZhang පහත දැක්වෙන බහු ප්‍රමාද සංරචක නිර්මාණය කළේය.

4-ටික් ප්‍රමාදය: කෙටි url: http://play.starmaninnovations.com/varlife/gebOMIXxdh
4 ටික් ප්‍රමාදය

5-ටික් ප්‍රමාදය: කෙටි url: http://play.starmaninnovations.com/varlife/JItNjJvnUB
5 ටික් ප්‍රමාදය

8-ටික් ප්‍රමාදය (වෙනස් ප්‍රවේශ ස්ථාන තුනක්): කෙටි url: http://play.starmaninnovations.com/varlife/nSTRaVEDvA
ටික් 8 ප්‍රමාදය

11-ටික් ප්‍රමාදය: කෙටි url: http://play.starmaninnovations.com/varlife/kfoADussXA
11 ටික් ප්‍රමාදය

12-ටික් ප්‍රමාදය: කෙටි url: http://play.starmaninnovations.com/varlife/bkamAfUfud
12 ටික් ප්‍රමාදය

14-ටික් ප්‍රමාදය: කෙටි url: http://play.starmaninnovations.com/varlife/TkwzYIBWln
14 ටික් ප්‍රමාදය

15-ටික් ප්‍රමාදය ( මේ සමඟ සංසන්දනය කිරීමෙන් සත්‍යාපනය වේ ): කෙටි url: http://play.starmaninnovations.com/varlife/jmgpehYlpT
15 ටික් ප්‍රමාදය

හොඳයි, එය VarLife හි මූලික පරිපථ සංරචක සඳහා වේ! පරිගණකයේ ප්‍රධාන පරිපථ සඳහා KZhang හි දෘඩාංග සටහන බලන්න !


6
VarLife මෙම ව්‍යාපෘතියේ වඩාත් ආකර්ෂණීය කොටස් වලින් එකකි; උදාහරණයක් ලෙස වයර් වර්ල්ඩ් ෆීනෝමිනල් හා සසඳන විට එය බහුකාර්යතාව සහ සරල බව . OTCA Metapixel අවශ්‍ය ප්‍රමාණයට වඩා විශාල බව පෙනේ, එය ගොල්ෆ් කිරීමට යම් උත්සාහයක් ගෙන තිබේද?
primo

1
@ ප්‍රිමෝ: ඩේව් ග්‍රීන් ඒ වෙනුවෙන් වැඩ කරන බව පෙනේ. chat.stackexchange.com/transcript/message/40106098#40106098
එල්එන්ඩියා ස්ටාර්මන්

8
ඔව්, මේ සති අන්තයේ 512x512 හැෂ්ලයිෆ්-හිතකාමී මෙටසෙල් ( conwaylife.com/forums/viewtopic.php?f=&p=51287#p51287 ) හදවතේ යහපත් ප්‍රගතියක් ලබා ඇත. ඔබ විශාලනය කළ විට සෛලයේ තත්වය සං signal ා කිරීමට "පික්සෙල්" ප්‍රදේශයක් කොතරම් විශාලද යන්න මත පදනම්ව මෙටසෙල් තරමක් කුඩා කළ හැකිය. ගොලීගේ හැෂ්ලයිෆ් ඇල්ගොරිතම මඟින් පරිගණකය වේගයෙන් ධාවනය කළ හැකි නිසා එය හරියටම 2 ^ N ප්‍රමාණයේ ටයිල් එකක නතර කිරීම වටී.
ඩේව් ග්‍රීන්

3
වයර් සහ ගේට්ටු අඩු “නාස්තිකාර” ආකාරයකින් ක්‍රියාත්මක කළ නොහැකිද? ඉලෙක්ට්‍රෝනයක් ග්ලයිඩර් හෝ අභ්‍යවකාශ නැවක් මගින් නිරූපණය කෙරේ (දිශාව අනුව). ඒවා නැවත හරවා යැවීමේ විධිවිධාන මම දැක ඇත්තෙමි (අවශ්‍ය නම් එකිනෙකාගෙන් වෙනස් වේ) සහ ග්ලයිඩර් සමඟ වැඩ කරන සමහර ගේට්ටු. ඔව්, ඔවුන් වැඩි ඉඩක් ගනී, සැලසුම වඩාත් සංකීර්ණ වන අතර වේලාව නිවැරදි විය යුතුය. නමුත් ඔබට එම මූලික ගොඩනැඟිලි කොටස් ඇති විට, ඒවා එකට එකතු කිරීමට තරම් පහසු විය යුතු අතර OTCA භාවිතා කර ක්‍රියාත්මක කරන VarLife වලට වඩා අඩු ඉඩ ප්‍රමාණයක් ඔවුන් විසින් ගනු ඇත. එය ද වේගයෙන් ධාවනය වනු ඇත.
හෙයිම්ඩෝල්

E හයිම්ඩෝල් එය හොඳින් ක්‍රියාත්මක වුවද ටෙට්‍රිස් ක්‍රීඩා කරන විට එය හොඳින් නොපෙන්වයි.
මිල්කිවේ 90

701

3 වන කොටස: දෘඩාංග

තාර්කික ගේට්ටු සහ ප්‍රොසෙසරයේ සාමාන්‍ය ව්‍යුහය පිළිබඳ අපගේ දැනුමෙන් අපට පරිගණකයේ සියලුම අංග සැලසුම් කිරීම ආරම්භ කළ හැකිය.

Demultiplexer

ඩිමියුටිප්ලෙක්සර් නොහොත් ඩිමූක්ස් යනු ROM, RAM සහ ALU සඳහා තීරණාත්මක අංගයකි. දී ඇති තේරීම් දත්ත මත පදනම්ව බොහෝ ප්‍රතිදාන සං als ා වලින් එකකට ආදාන සං signal ාවක් යොමු කරයි. එය ප්‍රධාන කොටස් 3 කින් සමන්විත වේ: අනුක්‍රමික සිට සමාන්තර පරිවර්තකය, සං signal ා පරීක්ෂක සහ ඔරලෝසු සං signal ා විභේදනය.

අපි ආරම්භ කරන්නේ අනුක්‍රමික තේරීම් දත්ත "සමාන්තර" බවට පරිවර්තනය කිරීමෙනි. මෙය සිදු කරනුයේ උපායමාර්ගිකව දත්ත බෙදීම හා ප්‍රමාද කිරීමෙනි, එවිට වම් කෙළවරේ දත්ත වම්පස 11x11 චතුරස්රයේ ඔරලෝසු සං signal ාව හා සම්බන්ධ වේ, ඊළඟ දත්ත බිටු ඊළඟ 11x11 චතුරස්රයේ ඔරලෝසු සං signal ාව හා සම්බන්ධ වේ. සෑම 11x11 වර්ගයකම සෑම දත්ත ප්‍රමාණයක්ම ප්‍රතිදානය කරනු ලැබුවද, සෑම දත්ත ප්‍රමාණයක්ම ඔරලෝසු සං signal ාව සමඟ එක් වරක් පමණක් සම්බන්ධ වේ.

සමාන්තර පරිවර්තකයට අනුක්‍රමය

ඊළඟට, සමාන්තර දත්ත පෙර සැකසූ ලිපිනයකට ගැලපේදැයි පරීක්ෂා කර බලමු. අපි මෙය කරන්නේ ඔරලෝසුව සහ සමාන්තර දත්ත මත AND සහ ANT ගේට්ටු භාවිතා කිරීමෙනි. කෙසේ වෙතත්, සමාන්තර දත්ත ද ප්‍රතිදානය කර ඇති බවට වග බලා ගත යුතු අතර එමඟින් එය නැවත සංසන්දනය කළ හැකිය. මා විසින් ඉදිරිපත් කරන ලද දොරටු මේවා ය:

සං al ා පරීක්ෂා කිරීමේ ගේට්ටු

අවසාන වශයෙන්, අපි ඔරලෝසු සං signal ාව බෙදී, සං signal ා පිරික්සුම් පොකුරක් (එක් එක් ලිපිනය / ප්‍රතිදානය සඳහා එකක්) ගොඩ ගසා අපට බහුකාර්යයක් ඇත!

බහුකාර්යය

ROM

ROM විසින් ලිපිනයක් ආදානයක් ලෙස ගෙන එහි ලිපිනය එහි ප්‍රතිදානය ලෙස යැවිය යුතුය. අපි උපදෙස් වලින් එකක් වෙත ඔරලෝසු සං signal ාව යොමු කිරීම සඳහා බහුකාර්යයක් භාවිතා කිරීමෙන් ආරම්භ කරමු. ඊළඟට, අපට කම්බි හරස් මාර්ග හෝ දොරටු භාවිතා කරමින් සං signal ාවක් ජනනය කළ යුතුය. කම්බි හරස් මාර්ග මඟින් ඔරලෝසු සං signal ාවට උපදෙස් බිටු 58 න් පහළට ගමන් කිරීමට හැකි වන අතර, ජනනය කරන ලද සං signal ාවක් (දැනට සමාන්තරව) ROM හරහා පහළට ගමන් කිරීමට ඉඩ සලසයි.

ROM බිටු

ඊළඟට අපට අවශ්‍ය වන්නේ සමාන්තර සං signal ාව අනුක්‍රමික දත්ත බවට පරිවර්තනය කිරීමයි, එවිට ROM සම්පූර්ණයි.

අනුක්‍රමික පරිවර්තකයට සමාන්තරව

ROM

ROM දැනට ජනනය කරනුයේ ගොලි භාෂාවෙන් ස්ක්‍රිප්ට් එකක් ධාවනය කිරීමෙන් වන අතර එය ඔබේ ක්ලිප්බෝඩ් එකේ එකලස් කිරීමේ කේතය ROM බවට පරිවර්තනය කරයි.

එස්ආර්එල්, එස්එල්, එස්ආර්ඒ

මෙම තාර්කික ද්වාර තුන බිට් මාරුව සඳහා භාවිතා කරන අතර ඒවා ඔබේ සාමාන්‍ය AND, OR, XOR යනාදියට වඩා සංකීර්ණ වේ. මෙම ගේට්ටු වැඩ කිරීමට නම්, අපි පළමුව ඔරලෝසු සං signal ාව ප්‍රමාද කර “මාරුවක්” ඇති කිරීමට සුදුසු කාලයක් ලබා දෙන්නෙමු. දත්ත තුළ. මෙම දොරටුවලට ලබා දී ඇති දෙවන තර්කය මඟින් බිටු කීයක් මාරු කළ යුතුද යන්න නියම කරයි.

ශ්‍රී ලංකාව සහ එස්ආර්එල් සඳහා අපට අවශ්‍යයි

  1. වඩාත්ම වැදගත් බිටු 12 සක්‍රිය නොවන බවට වග බලා ගන්න (එසේ නොමැතිනම් ප්‍රතිදානය හුදෙක් 0 වේ), සහ
  2. අවම වශයෙන් සැලකිය යුතු බිටු 4 මත පදනම්ව දත්ත නිවැරදි ප්‍රමාණය ප්‍රමාද කරන්න.

AND / ANT ගේට්ටු පොකුරක් සහ බහුකාර්යයක් සමඟ මෙය කළ හැකිය.

එස්.ආර්.එල්

SRA තරමක් වෙනස් ය, මන්ද මාරුවීමේදී අපට සං bit ා බිට් පිටපත් කළ යුතු බැවිනි. අපි මෙය කරන්නේ ඔරලෝසු සං signal ාව සං sign ා බිට් සමඟ ඇන්ඩින් කිරීමෙන් පසුව, එම ප්‍රතිදානය කම්බි බෙදීම් සහ OR ගේට්ටු සමඟ කිහිප වතාවක් පිටපත් කරන්න.

එස්.ආර්.ඒ.

Set-Reset (SR) අගුල

ප්‍රොසෙසරයේ ක්‍රියාකාරීත්වයේ බොහෝ කොටස් දත්ත ගබඩා කිරීමේ හැකියාව මත රඳා පවතී. රතු බී 12 / එස් ​​1 සෛල 2 ක් භාවිතා කිරීමෙන් අපට එය කළ හැකිය. සෛල දෙක එකිනෙකා මත තබා ගත හැකි අතර එකට රැඳී සිටිය හැකිය. අමතර කට්ටලයක්, යළි පිහිටුවීම සහ කියවීමේ පරිපථ භාවිතා කරමින් අපට සරල SR අගුලක් සෑදිය හැකිය.

SR අගුල

සමමුහුර්තකරණය

අනුක්‍රමික දත්ත සමාන්තර දත්ත බවට පරිවර්තනය කිරීමෙන්, පසුව SR අගුලු පොකුරක් සැකසීමෙන්, අපට සම්පූර්ණ දත්ත වචනයක්ම ගබඩා කළ හැකිය. ඉන්පසුව, දත්ත නැවත ලබා ගැනීම සඳහා, අපට සියලු අගුල් කියවා නැවත සැකසිය හැකිය, ඒ අනුව දත්ත ප්‍රමාද කරන්න. මෙමඟින් දත්ත වචනයක් (හෝ වැඩි ගණනක්) තවත් එකක් එනතුරු ගබඩා කිරීමට අපට හැකි වන අතර විවිධ වේලාවට පැමිණෙන දත්ත වචන දෙකක් සමමුහුර්ත කිරීමට ඉඩ සලසයි.

සමමුහුර්තකරණය

කවුන්ටරය කියවන්න

මෙම උපාංගය RAM වෙතින් තවත් කී වතාවක් ආමන්ත්‍රණය කළ යුතුද යන්න නිරීක්ෂණය කරයි. එය මෙය කරන්නේ SR අගුලට සමාන උපකරණයක් භාවිතා කරමිනි: T flip flop. ටී ෆ්ලිප් ෆ්ලොප් මඟින් ආදානයක් ලැබෙන සෑම අවස්ථාවකම එය තත්වය වෙනස් කරයි: එය ක්‍රියාත්මක වූයේ නම් එය ක්‍රියා විරහිත වන අතර අනෙක් අතට. ටී ෆ්ලිප් ෆ්ලොප් එක අක්‍රියව ඇති විට, එය ප්‍රතිදාන ස්පන්දනයක් යවන අතර එය තවත් ටී ෆ්ලිප් ෆ්ලොප් එකකට පෝෂණය කර බිට් 2 කවුන්ටරයක් ​​සාදයි.

බිට් කවුන්ටරය දෙකක්

කියවීමේ කවුන්ටරය සෑදීම සඳහා, අපි කවුන්ටරය ANT ගේට්ටු දෙකක් සහිත සුදුසු ලිපින ප්‍රකාරයට සැකසිය යුතු අතර, ඔරලෝසු සං signal ාව යොමු කළ යුත්තේ කොතැනටද යන්න තීරණය කිරීම සඳහා කවුන්ටරයේ ප්‍රතිදාන සං signal ාව භාවිතා කරන්න: ALU හෝ RAM වෙත.

කවුන්ටරය කියවන්න

පෝලිම් කියවන්න

RAM හි ප්‍රතිදානය නිවැරදි ස්ථානයට යැවිය හැකි වන පරිදි කියවීමේ කවුන්ටරය RAM වෙත ආදානයක් යැවූයේ කුමන කියවීමේ කවුන්ටරයද යන්න පිළිබඳව විමසිල්ලෙන් සිටිය යුතුය. එය සිදු කිරීම සඳහා, අපි SR අගුල් කිහිපයක් භාවිතා කරමු: එක් එක් ආදානය සඳහා එක් අගුලක්. කියවන කවුන්ටරයකින් RAM වෙත සං signal ාවක් යවන විට, ඔරලෝසු සං signal ාව බෙදී කවුන්ටරයේ SR අගුල සකසයි. RAM හි ප්‍රතිදානය SR අගුල සමඟ ANDed වන අතර RAM වෙතින් ලැබෙන ඔරලෝසු සං signal ාව SR අගුල නැවත සකසයි.

පෝලිම් කියවන්න

අළු

ALU කියවීමේ පෝලිමට සමානව ක්‍රියා කරයි, එමඟින් සං SR ාවක් යැවිය යුත්තේ කොතැනදැයි සොයා බැලීමට SR අගුලක් භාවිතා කරයි. පළමුව, උපදෙස්වල දෘෂ්ටි කේතයට අනුරූප වන තාර්කික පරිපථයේ SR අගුල සකසා ඇත්තේ බහුකාර්යයක් භාවිතා කරමිනි. ඊළඟට, පළමු හා දෙවන තර්කයේ අගයන් SR අගුල සමඟ ANDed කර පසුව තාර්කික පරිපථ වෙත යවනු ලැබේ. ඔරලෝසු සං signal ාව පසුකර යන විට අගුල නැවත සකසයි, එවිට ALU නැවත භාවිතා කළ හැකිය. (බොහෝ පරිපථ ගොල්ෆ් කර ඇති අතර, ප්‍රමාද කළමනාකරණය ටොන් ගණනක් ගෙන යනු ලැබේ, එබැවින් එය ටිකක් අවුල් ජාලයක් සේ පෙනේ)

අළු

RAM

මෙම ව්‍යාපෘතියේ වඩාත්ම සංකීර්ණ කොටස වූයේ RAM ය. දත්ත ගබඩා කරන එක් එක් SR අගුල මත නිශ්චිත පාලනයක් අවශ්‍ය වේ. කියවීම සඳහා, ලිපිනය බහුකාර්යයකට යවා RAM ඒකක වෙත යවනු ලැබේ. RAM ඒකක සමාන්තරව ගබඩා කරන දත්ත ප්‍රතිදානය කරයි, එය අනුක්‍රමික බවට පරිවර්තනය කර ප්‍රතිදානය කරනු ලැබේ. ලිවීම සඳහා, ලිපිනය වෙනත් බහුකාර්යයකට යවනු ලැබේ, ලිවිය යුතු දත්ත අනුක්‍රමික සිට සමාන්තරව පරිවර්තනය කරනු ලැබේ, සහ RAM ඒකක RAM පුරා සං signal ාව ප්‍රචාරණය කරයි.

සෑම 22x22 මෙටාපික්සල් RAM ඒකකයකම මෙම මූලික ව්‍යුහය ඇත:

RAM ඒකකය

මුළු RAM එක එකට තබා, අපට මේ වගේ දෙයක් ලැබෙනවා:

RAM

සියල්ල එකට දැමීම

දළ විශ්ලේෂණයෙහි විස්තර කර ඇති මෙම සියලු සංරචක සහ සාමාන්‍ය පරිගණක ගෘහ නිර්මාණ ශිල්පය භාවිතා කරමින් අපට වැඩ කරන පරිගණකයක් තැනිය හැකිය!

බාගැනීම්: - නිමි ටෙට්රිස් පරිගණකය - ROM නිර්මාණය කිරීමේ ස්ක්‍රිප්ට්, හිස් පරිගණකය සහ ප්‍රයිම් සෙවීමේ පරිගණකය

පරිගණකය


61
මෙම ලිපියේ ඇති පින්තූර, කුමන හේතුවක් නිසා හෝ මගේ මතය අනුව ඉතා අලංකාර බව මම කියන්නට කැමැත්තෙමි. : P +1
HyperNeutrino

9
මෙය මා මෙතෙක් දැක ඇති පුදුම සහගත දෙයයි .... මට හැකි නම් මම +20 කරන්නෙමි
ෆැන්ටාසී

4
ftfbninja ඔබට එය ත්‍යාගයක් ලෙස හැඳින්විය හැකි අතර ඔබට කීර්තිය 200 ක් ලබා දිය හැකිය.
ෆේබියන් රෝලිං

15
මෙම ප්‍රොසෙසරය ස්පෙක්ටර් සහ මෙල්ට්ඩවුන් ප්‍රහාරයට ගොදුරු විය හැකිද? :)
ෆෙරිබිග්

10
Er ෆෙරිබිග් ශාඛා අනාවැකි නැත, එබැවින් මට එය සැක සහිතය.
ජාඩ්

670

4 වන කොටස: QFTASM සහ කොගෝල්

ගෘහ නිර්මාණ දළ විශ්ලේෂණය

කෙටියෙන් කිවහොත්, අපගේ පරිගණකයේ බිට් 16 අසමමුහුර්ත RISC හාවඩ් ගෘහ නිර්මාණ ශිල්පයක් ඇත. අතින් ප්‍රොසෙසරයක් තැනීමේදී RISC ( අඩු කරන ලද පරිගණක කට්ටල ) ගෘහ නිර්මාණ ශිල්පය ප්‍රායෝගිකව අවශ්‍යතාවයකි. අපගේ නඩුවේදී, මෙයින් අදහස් කරන්නේ ඔප්කෝඩ් ගණන කුඩා වන අතර වඩා වැදගත් වන්නේ සියලු උපදෙස් ඉතා සමාන ආකාරයකින් සකසන බවයි.

යොමු කිරීම සඳහා, වයර් වර්ල්ඩ් පරිගණකය ප්‍රවාහනය-අවුලුවන ගෘහ නිර්මාණ ශිල්පයක් භාවිතා කළ අතර, එහි එකම උපදෙස් වූ MOVඅතර ගණනය කිරීම් සිදු කරනු ලැබුවේ විශේෂ ලේඛණ ලිවීම / කියවීමෙනි. මෙම ආදර්ශය ඉතා පහසුවෙන් ක්‍රියාත්මක කළ හැකි ගෘහ නිර්මාණ ශිල්පයකට මඟ පෑදුවද, ප්‍රති result ලය දේශසීමා භාවිතා කළ නොහැකි ය: සියලුම ගණිත / තර්කන / කොන්දේසි සහිත මෙහෙයුම් සඳහා උපදෙස් තුනක් අවශ්‍ය වේ . අපට අවශ්‍ය වූයේ ඊට වඩා අඩු එසෝටරික් ගෘහ නිර්මාණ ශිල්පයක් නිර්මාණය කිරීමට බව අපට පැහැදිලි විය.

භාවිතාව වැඩි කරන අතරම අපගේ ප්‍රොසෙසරය සරලව තබා ගැනීම සඳහා, අපි වැදගත් සැලසුම් තීරණ කිහිපයක් ගත්තෙමු:

  • ලේඛනයක් නැත. RAM හි සෑම ලිපිනයක්ම එක හා සමානව සලකනු ලබන අතර ඕනෑම මෙහෙයුමක් සඳහා ඕනෑම තර්කයක් ලෙස භාවිතා කළ හැකිය. එක් අතකින්, මෙයින් අදහස් කරන්නේ සියලුම RAM රෙජිස්ටර් ලෙස සැලකිය හැකි බවයි. මෙයින් අදහස් කරන්නේ විශේෂ පැටවුම් / ගබඩා උපදෙස් නොමැති බවයි.
  • ඒ හා සමානව, මතක සිතියම්ගත කිරීම. කොටස් වලට ලිවීමට හෝ කියවීමට හැකි සෑම දෙයක්ම ඒකාබද්ධ ලිපින යෝජනා ක්‍රමයක්. මෙයින් අදහස් කරන්නේ ක්‍රමලේඛ කවුන්ටරය (PC) ලිපිනය 0 වන අතර, සාමාන්‍ය උපදෙස් සහ පාලන ප්‍රවාහ උපදෙස් අතර ඇති එකම වෙනස වන්නේ පාලන ප්‍රවාහ උපදෙස් ලිපිනය 0 භාවිතා කිරීමයි.
  • දත්ත සම්ප්‍රේෂණයේ දී අනුක්‍රමික වන අතර සමාන්තරව ගබඩා වේ. අපගේ පරිගණකයේ “ඉලෙක්ට්‍රෝන” පාදක ස්වභාවය නිසා, අනුක්‍රමික කුඩා-එන්ඩියන් (අවම වශයෙන් සැලකිය යුතු පළමු බිට්) ආකාරයෙන් දත්ත සම්ප්‍රේෂණය වන විට එකතු කිරීම හා අඩු කිරීම සැලකිය යුතු ලෙස පහසු කරයි. තවද, අනුක්‍රමික දත්ත මගින් කාලානුරූපව සැබවින්ම පුළුල් හා අවුල් සහගත දත්ත බස්රථවල අවශ්‍යතාවය ඉවත් කරයි (දත්ත එකට රැඳී සිටීමට නම්, බස් රථයේ සියලුම “මංතීරු” එකම ගමන් ප්‍රමාදයක් අත්විඳිය යුතුය).
  • හාවඩ් ගෘහ නිර්මාණ ශිල්පය, එනම් වැඩසටහන් මතකය (ROM) සහ දත්ත මතකය (RAM) අතර බෙදීමකි. මෙය ප්‍රොසෙසරයේ නම්‍යශීලී බව අඩු කළද, මෙය ප්‍රමාණ ප්‍රශස්තිකරණයට උපකාරී වේ: වැඩසටහනේ දිග අපට අවශ්‍ය RAM ප්‍රමාණයට වඩා විශාලය, එබැවින් අපට වැඩසටහන ROM වලට බෙදිය හැකි අතර පසුව ROM සම්පීඩනය කෙරෙහි අවධානය යොමු කළ හැකිය. , එය කියවීමට පමණක් වන විට එය වඩාත් පහසු වේ.
  • 16-බිට් දත්ත පළල. සම්මත ටෙට්‍රිස් පුවරුවකට (කුට්ටි 10) වඩා පුළුල් වන දෙකක කුඩාම බලය මෙයයි. මෙය අපට -32768 සිට +32767 දක්වා දත්ත පරාසයක් ලබා දෙන අතර උපරිම වැඩසටහන් දිග 65536 කි. (සෙල්ලම් ප්‍රොසෙසරයක් කිරීමට අපට අවශ්‍ය විය හැකි බොහෝ සරල දේ සඳහා 2 ^ 8 = 256 උපදෙස් ප්‍රමාණවත් නමුත් ටෙට්‍රිස් නොවේ.)
  • අසමමුහුර්ත නිර්මාණය. පරිගණකයේ වේලාව නියම කරන මධ්‍යම ඔරලෝසුවක් (හෝ, ඒ හා සමානව, ඔරලෝසු කිහිපයක්) තිබෙනවා වෙනුවට, සියලු දත්ත සමඟ “ඔරලෝසු සං signal ාවක්” ඇති අතර එය පරිගණකය වටා ගලා යන විට දත්ත සමඟ සමාන්තරව ගමන් කරයි. සමහර මාර්ග අනෙක් ඒවාට වඩා කෙටි විය හැකි අතර, මෙය මධ්‍යගතව ඔරලෝසුවක් සහිත සැලසුමක් සඳහා දුෂ්කරතා ඇති කරන අතර, අසමමුහුර්ත සැලසුමකට විචල්‍ය-කාල මෙහෙයුම් සමඟ පහසුවෙන් කටයුතු කළ හැකිය.
  • සියලුම උපදෙස් සමාන ප්‍රමාණයේ ය. සෑම උපදේශනයකටම ඔපෙන්ඩ් 3 ක් සහිත (අගය අගය ගමනාන්තය) 1 ගෘහ නිර්මාණ ශිල්පයක් ඇති නම්‍යශීලී විකල්පය බව අපට හැඟුණි. මෙය ද්විමය දත්ත මෙහෙයුම් මෙන්ම කොන්දේසි සහිත චලනයන් ද ඇතුළත් වේ.
  • සරල ලිපින මාදිලිය. අරා හෝ පුනරාවර්තනය වැනි දේ සඳහා සහය දැක්වීමට විවිධාකාර ලිපින ක්‍රම තිබීම ඉතා ප්‍රයෝජනවත් වේ. සාපේක්ෂව සරල පද්ධතියක් සමඟ වැදගත් ලිපින ක්‍රම කිහිපයක් ක්‍රියාත්මක කිරීමට අපට හැකි විය.

අපගේ ගෘහ නිර්මාණ ශිල්පය පිළිබඳ නිදර්ශනයක් දළ විශ්ලේෂණ ලිපියේ අඩංගු වේ.

ක්‍රියාකාරීත්වය සහ ALU මෙහෙයුම්

මෙතැන් සිට, අපගේ ප්‍රොසෙසරයට තිබිය යුතු ක්‍රියාකාරිත්වය තීරණය කිරීම වැදගත් කාරණයක් විය. ක්‍රියාත්මක කිරීමේ පහසුව මෙන්ම එක් එක් විධානයන්හි බහුකාර්යතාව කෙරෙහි විශේෂ අවධානයක් යොමු කරන ලදී.

කොන්දේසිගත චලනයන්

කොන්දේසි සහිත චලනයන් ඉතා වැදගත් වන අතර කුඩා පරිමාණ සහ මහා පරිමාණ පාලන ප්‍රවාහයක් ලෙස සේවය කරයි. “කුඩා පරිමාණය” යන්නෙන් විශේෂිත දත්ත චලනයක් ක්‍රියාත්මක කිරීම පාලනය කිරීමේ හැකියාව අදහස් කරන අතර “මහා පරිමාණ” යන්නෙන් අදහස් කරන්නේ ඕනෑම අත්තනෝමතික කේතයකට පාලන ප්‍රවාහය මාරු කිරීම සඳහා කොන්දේසි සහිත පැනීමේ මෙහෙයුමක් ලෙසය. විශේෂිත සිතියම්ගත කිරීම් හේතුවෙන් කොන්දේසි සහිත පියවරක් මඟින් සාමාන්‍ය RAM වෙත දත්ත පිටපත් කර ගමනාන්ත ලිපිනය පළාත් සභාවට පිටපත් කළ හැකිය. ඒ හා සමාන හේතුවක් නිසා කොන්දේසි විරහිත පියවර සහ කොන්දේසි විරහිත පැනීම් යන දෙකම අත්හැරීමට අපි තෝරා ගත්තෙමු: දෙකම සත්‍යයට තදින් කේත කර ඇති කොන්දේසියක් සහිත කොන්දේසි සහිත පියවරක් ලෙස ක්‍රියාත්මක කළ හැකිය.

අපි කොන්දේසි සහිත චලනයන් දෙකක් තෝරා ගත්තෙමු: "බිංදුව නොවේ නම් චලනය කරන්න" ( MNZ) සහ "බිංදුවට වඩා අඩු නම් චලනය කරන්න" ( MLZ). ක්‍රියාකාරීව, MNZදත්තවල කිසියම් බිට් 1 ක් දැයි පරීක්ෂා කිරීමට සමාන වේMLZ යන්න පරීක්ෂා කිරීමට සමාන වන අතර, සං bit ා බිට් 1 දැයි පරීක්ෂා කිරීමට සමාන වේ. ඒවා පිළිවෙලින් සමානතා හා සැසඳීම් සඳහා ප්‍රයෝජනවත් වේ. අපි එවැනි "පියවර නම් ශුන්ය" (අන් අය කෙරෙහි මේ දෙක තෝරා හේතුව MEZ) හෝ "බිංදුවට වඩා වැඩි නම්, පියවර" ( MGZ) බවයි MEZ, හිස් සංඥා සිට සැබෑ සංඥා නිර්මාණය අවශ්ය වනු ඇත අතර, MGZඑම අඩුවක් අවශ්ය වේ, වඩාත් සංකීර්ණ වෙතියි සං bit ා බිට් 0 වන අතර අවම වශයෙන් තවත් බිට් 1 ක් විය යුතුය.

අංක ගණිතය

ප්‍රොසෙසරයේ සැලසුම මෙහෙයවීමේදී ඊළඟ වැදගත්ම උපදෙස් වන්නේ මූලික ගණිතමය මෙහෙයුම් ය. මා මුලින් සඳහන් කළ පරිදි, අපි භාවිතා කරන්නේ කුඩා-එන්ඩියන් අනුක්‍රමික දත්ත, එකතු කිරීමේ / අඩු කිරීමේ මෙහෙයුම් වල පහසුව අනුව එන්ඩියනස් තෝරා ගැනීම තීරණය කරනු ලැබේ. අවම වශයෙන් සැලකිය යුතු බිටු පළමුව පැමිණීමෙන්, අංක ගණිත ඒකකවලට පහසුවෙන් ගෙන යා හැකි බිට් නිරීක්ෂණය කළ හැකිය.

Negative ණ සංඛ්‍යා සඳහා 2 හි අනුපූරක නිරූපණය භාවිතා කිරීමට අපි තෝරා ගත්තෙමු, මෙය එකතු කිරීම හා අඩු කිරීම වඩාත් ස්ථාවර කරයි. වයර් වර්ල්ඩ් පරිගණකය 1 හි අනුපූරකය භාවිතා කළ බව සඳහන් කිරීම වටී.

එකතු කිරීම සහ අඩු කිරීම යනු අපගේ පරිගණකයේ ස්වදේශීය ගණිත ආධාරකයේ ප්‍රමාණයයි (පසුව සාකච්ඡා කෙරෙන බිට් මාරුවලට අමතරව). ගුණ කිරීම වැනි වෙනත් මෙහෙයුම් අපගේ ගෘහ නිර්මාණ ශිල්පය විසින් හැසිරවිය නොහැකි තරම් සංකීර්ණ වන අතර ඒවා මෘදුකාංග තුළ ක්‍රියාත්මක කළ යුතුය.

බිට්වේස් මෙහෙයුම්

අපගේ සකසනය ඇත AND, ORසහ XORඔබ බලාපොරොත්තු වන දේ ඉටු වන උපදෙස්. ඇති කරනවාට වඩා NOTඋපදෙස්, අපි "නැහැ-" (ඇති කිරීමට තීරණය කළා ANT) උපදෙස්. NOTඋපදෙස් සමඟ ඇති දුෂ්කරතාවය නැවතත් එය සං signal ා lack නතාවයෙන් සං signal ා නිර්මාණය කළ යුතු අතර එය සෛලීය ස්වයංක්‍රීය යන්ත්‍රයක් සමඟ දුෂ්කර වේ. මෙම ANTඋපදෙස් ප්රතිලාභ 1 පළමු තර්කය ටිකක් 1 වන අතර, එම දෙවැනි තර්කයේ ටිකක් මේ අනුව, 0 වන අතර, නම් පමණක් NOT xසමාන වේ ANT -1 x(මෙන්ම XOR -1 x). තව දුරටත්, ANTබහුකාර්ය වන අතර එය ආවරණ කිරීමේදී එහි ප්‍රධාන වාසිය ඇත: ටෙට්‍රිස් වැඩසටහනේ දී අපි එය ටෙට්‍රොමිනෝ මකා දැමීමට භාවිතා කරමු.

බිට් මාරුව

බිටු මාරුවීමේ මෙහෙයුම් ALU විසින් හසුරුවන වඩාත් සංකීර්ණ මෙහෙයුම් වේ. ඔවුන් දත්ත යෙදවුම් දෙකක් ගනී: මාරුවීමට අගයක් සහ එය මාරු කිරීමට මුදලක්. ඒවායේ සංකීර්ණත්වය තිබියදීත් (විචල්ය මාරුවීමේ ප්රමාණය හේතුවෙන්), ටෙට්රිස් හා සම්බන්ධ බොහෝ "චිත්රක" මෙහෙයුම් ඇතුළුව බොහෝ වැදගත් කාර්යයන් සඳහා මෙම මෙහෙයුම් ඉතා වැදගත් වේ. කාර්යක්ෂම ගුණ කිරීම / බෙදීම් ඇල්ගොරිතම සඳහා පදනම ලෙස බිට් මාරුව ක්‍රියා කරයි.

අපගේ ප්‍රොසෙසරයට බිට් ෂිෆ්ට් මෙහෙයුම් තුනක් ඇත, “ෂිෆ්ට් වම්” ( SL), “ෂිෆ්ට් දකුණ තාර්කික” ( SRL) සහ “ෂිෆ්ට් දකුණ ගණිතය” ( SRA). පළමු බිට් මාරුව දෙක ( SLසහ SRL) නව බිටු සියලු ශුන්‍යයන්ගෙන් පුරවන්න (එයින් අදහස් වන්නේ දකුණට මාරුවූ negative ණ සංඛ්‍යාවක් තවදුරටත් .ණ නොවන බවයි). මාරුවේ දෙවන තර්කය 0 සිට 15 දක්වා පරාසයකින් පිටත නම්, ප්‍රති result ලය ඔබ බලාපොරොත්තු වන පරිදි සියලු ශුන්‍ය වේ. අන්තිම බිට් මාරුව සඳහා,SRA බිට් මාරුව ආදානයේ ලකුණ ආරක්ෂා කරයි, එබැවින් සත්‍ය බෙදීමක් ලෙස දෙකකින් ක්‍රියා කරයි.

උපදෙස් නල මාර්ගගත කිරීම

දැන් ගෘහ නිර්මාණ ශිල්පයේ අමිහිරි තොරතුරු කිහිපයක් ගැන කතා කිරීමට කාලයයි. සෑම CPU චක්‍රයක්ම පහත පියවර පහකින් සමන්විත වේ:

1. ROM වෙතින් වත්මන් උපදෙස් ලබා ගන්න

පරිගණකයේ වත්මන් අගය ROM වෙතින් අනුරූප උපදෙස් ලබා ගැනීමට භාවිතා කරයි. සෑම උපදෙස් සඳහාම එක් ඔප්කෝඩ් එකක් සහ ඔපෙරන්ඩ් තුනක් ඇත. සෑම මෙහෙයුමක්ම එක් දත්ත වචනයක් සහ එක් ලිපින මාදිලියකින් සමන්විත වේ. මෙම කොටස් ROM වෙතින් කියවන විට එකිනෙකාගෙන් බෙදී යයි.

අද්විතීය කේත 16 ක් සඳහා සහය දැක්වීම සඳහා ඔප්කෝඩ් බිටු 4 ක් වන අතර ඉන් 11 ක් පවරා ඇත:

0000  MNZ    Move if Not Zero
0001  MLZ    Move if Less than Zero
0010  ADD    ADDition
0011  SUB    SUBtraction
0100  AND    bitwise AND
0101  OR     bitwise OR
0110  XOR    bitwise eXclusive OR
0111  ANT    bitwise And-NoT
1000  SL     Shift Left
1001  SRL    Shift Right Logical
1010  SRA    Shift Right Arithmetic
1011  unassigned
1100  unassigned
1101  unassigned
1110  unassigned
1111  unassigned

2. පෙර උපදෙස්වල ප්‍රති result ලය (අවශ්‍ය නම්) RAM වෙත ලියන්න

පෙර උපදෙස්වල තත්වය මත පදනම්ව (කොන්දේසි සහිත පියවරක් සඳහා පළමු තර්කයේ වටිනාකම වැනි), ලිවීමක් සිදු කරනු ලැබේ. ලිවීමේ ලිපිනය තීරණය කරනු ලබන්නේ පෙර උපදෙස්වල තුන්වන ක්‍රියාකාරිත්වය මගිනි.

ලිවීම සිදු වන්නේ උපදෙස් ලබා ගැනීමෙන් පසුව බව සැලකිල්ලට ගැනීම වැදගත්ය. මෙය ශාඛා ප්‍රමාදයක් ඇති කිරීමට හේතු වේශාඛා ඉලක්කයේ පළමු උපදෙස් වෙනුවට ශාඛා උපදෙස් (පළාත් සභාවට ලියන ඕනෑම මෙහෙයුමක්) ක්‍රියාත්මක වූ වහාම .

සමහර අවස්ථා වලදී (කොන්දේසි විරහිතව පැනීම වැනි), ශාඛා ප්‍රමාද විවරය ප්‍රශස්තිකරණය කළ හැකිය. වෙනත් අවස්ථාවල දී එය කළ නොහැකි අතර, ශාඛාවකට පසු උපදෙස් හිස්ව තැබිය යුතුය. තවද, මෙම වර්ගයේ ප්‍රමාද විවරය යන්නෙන් අදහස් වන්නේ ශාඛා ඉලක්කයක් සත්‍ය ඉලක්කගත උපදෙස් වලට වඩා ලිපිනය 1 ක් අඩු වන අතර එය සිදුවන පළාත් සභා වර්ධක සඳහා ගණනය කළ යුතු බවයි.

කෙටියෙන් කිවහොත්, ඊළඟ උපදෙස් ලබා ගැනීමෙන් පසු පෙර උපදෙස්වල ප්‍රතිදානය RAM වෙත ලියා ඇති හෙයින්, කොන්දේසි සහිත පැනීම් වලට පසු හිස් උපදෙස් තිබිය යුතුය, එසේ නොමැතිනම් පැනීම සඳහා පරිගණකය නිසි ලෙස යාවත්කාලීන නොවනු ඇත.

3. RAM වෙතින් වත්මන් උපදෙස් තර්ක සඳහා දත්ත කියවන්න

කලින් සඳහන් කළ පරිදි, එක් එක් මෙහෙයුම් තුනෙන් දත්ත වචනයක් සහ ලිපින ක්‍රමයක් ඇත. දත්ත වචනය බිටු 16 ක් වන අතර පළල RAM ට සමාන වේ. ලිපින මාදිලිය බිටු 2 කි.

බොහෝ තාත්වික ලිපින ක්‍රම වලට බහු-පියවර ගණනය කිරීම් (ඕෆ්සෙට් එකතු කිරීම වැනි) ඇතුළත් වන බැවින්, ආමන්ත්‍රණය කිරීමේ මාතයන් මෙවැනි ප්‍රොසෙසරයක් සඳහා සැලකිය යුතු සංකීර්ණත්වයේ ප්‍රභවයක් විය හැකිය. ඒ අතරම, ප්‍රොසෙසරයේ භාවිතයට බහුකාර්ය ලිපින ක්‍රම වැදගත් කාර්යභාරයක් ඉටු කරයි.

දෘඩ කේත අංක ඔපෙරන්ඩ් ලෙස භාවිතා කිරීම සහ දත්ත ලිපින ඔපෙරන්ඩ් ලෙස භාවිතා කිරීම යන සංකල්ප ඒකාබද්ධ කිරීමට අපි උත්සාහ කළෙමු. මෙය ප්‍රති-පාදක ලිපින ක්‍රම නිර්මාණය කිරීමට හේතු විය: ඔපෙරන්ඩ් එකක ලිපින ප්‍රකාරය හුදෙක් RAM කියවන ලූපයක් වටා දත්ත යැවිය යුතු වාර ගණන නිරූපණය කරයි. මෙය ක්ෂණික, සෘජු, වක්‍ර සහ ද්වි-වක්‍ර ඇමතුම් ඇතුළත් වේ.

00  Immediate:  A hard-coded value. (no RAM reads)
01  Direct:  Read data from this RAM address. (one RAM read)
10  Indirect:  Read data from the address given at this address. (two RAM reads)
11  Double-indirect: Read data from the address given at the address given by this address. (three RAM reads)

මෙම විරූපණය සිදු කිරීමෙන් පසුව, උපදෙස් තුනෙහි විවිධ භූමිකාවන් ඇත. පළමු ඔපෙරන්ඩ් සාමාන්‍යයෙන් ද්විමය ක්‍රියාකරු සඳහා වන පළමු තර්කය වන අතර වර්තමාන උපදෙස් කොන්දේසි සහිත පියවරක් වන විට තත්වය ලෙසද ක්‍රියා කරයි. දෙවන ඔපෙරන්ඩ් ද්විමය ක්‍රියාකරු සඳහා දෙවන තර්කය ලෙස සේවය කරයි. තෙවන මෙහෙයුම උපදෙස්වල ප්‍රති result ල සඳහා ගමනාන්ත ලිපිනය ලෙස සේවය කරයි.

පළමු උපදෙස් දෙක දත්ත ලෙස සේවය කරන අතර තෙවනුව ලිපිනයක් ලෙස සේවය කරන බැවින්, ඇමතීමේ මාතයන් ඒවා භාවිතා කරන්නේ කුමන ස්ථානය අනුවද යන්නට වඩා වෙනස් අර්ථකථන ඇත. නිදසුනක් ලෙස, ස්ථාවර RAM ලිපිනයකින් දත්ත කියවීමට සෘජු ප්‍රකාරය භාවිතා කරයි (සිට එක් RAM කියවීමක් අවශ්‍ය වේ), නමුත් ස්ථාවර RAM ලිපිනයකට දත්ත ලිවීමට ක්ෂණික මාදිලිය භාවිතා කරයි (RAM කියවීම් අවශ්‍ය නොවන බැවින්).

4. ප්‍රති .ලය ගණනය කරන්න

ද්විමය මෙහෙයුමක් සිදු කිරීම සඳහා ඔප්කෝඩ් සහ පළමු මෙහෙයුම් දෙක ALU වෙත යවනු ලැබේ. අංක ගණිත, බිට්වේස් සහ මාරුව මෙහෙයුම් සඳහා, මෙයින් අදහස් කරන්නේ අදාළ මෙහෙයුම සිදු කිරීමයි. කොන්දේසි සහිත චලනයන් සඳහා, මෙයින් අදහස් කරන්නේ දෙවන මෙහෙයුම නැවත ලබා දීමයි.

තත්වය ගණනය කිරීම සඳහා ඔප්කෝඩ් සහ පළමු ඔපෙරන්ඩ් භාවිතා වන අතර එමඟින් ප්‍රති result ලය මතකයට ලිවිය යුතුද නැද්ද යන්න තීරණය වේ. කොන්දේසිගත චලනයන් සම්බන්ධයෙන්, මෙයින් අදහස් කරන්නේ ඔපෙරන්ඩ් හි කිසියම් බිට් එකක් 1 (සඳහා MNZ) ද යන්න තීරණය කිරීම හෝ සං bit ා බිට් 1 (සඳහා ) ද යන්න තීරණය කිරීමයි MLZ. ඔප්කෝඩ් එක කොන්දේසිගත පියවරක් නොවේ නම්, ලිවීම සැමවිටම සිදු කරයි (තත්වය සැමවිටම සත්‍ය වේ).

5. වැඩසටහන් කවුන්ටරය වැඩි කරන්න

අවසාන වශයෙන්, වැඩසටහන් කවුන්ටරය කියවීම, වැඩි කිරීම සහ ලිවීම සිදු කරයි.

උපදෙස් කියවීම සහ උපදෙස් ලිවීම අතර පළාත් සභා වර්ධකයේ පිහිටීම නිසා, මෙයින් අදහස් කරන්නේ පරිගණකය 1 කින් වැඩි කරන උපදෙස් විකල්පයක් නොවන බවයි. පරිගණකය තමාටම පිටපත් කරන උපදෙස් මඟින් ඊළඟ උපදෙස් එකවර දෙවරක් ක්‍රියාත්මක වේ. එහෙත්, අවවාද කරන්න, පේළි කිහිපයක ඇති උපදෙස් මඟින් ඔබ උපදෙස් නල මාර්ගයට අවධානය යොමු නොකරන්නේ නම්, අසීමිත ලූප ඇතුළු සංකීර්ණ බලපෑම් ඇති කළ හැකිය.

ටෙට්රිස් එක්රැස්වීම සඳහා ගවේෂණය

අපගේ සකසනය සඳහා අපි QFTASM නමින් නව එකලස් කිරීමේ භාෂාවක් නිර්මාණය කළෙමු. මෙම එකලස් කිරීමේ භාෂාව පරිගණකයේ ROM හි යන්ත්‍ර කේතය සමඟ 1 සිට 1 දක්වා අනුරූප වේ.

ඕනෑම QFTASM වැඩසටහනක් පේළියකට එකක් උපදෙස් මාලාවක් ලෙස ලියා ඇත. සෑම පේළියක්ම මේ ආකාරයට සංයුති කර ඇත:

[line numbering] [opcode] [arg1] [arg2] [arg3]; [optional comment]

ඔප්කෝඩ් ලැයිස්තුව

කලින් සාකච්ඡා කළ පරිදි, පරිගණකයට සහය දක්වන ඔප්කෝඩ් එකොළහක් ඇත, ඒ සෑම එකක්ම ඔපෙරන්ඩ් තුනක් ඇත:

MNZ [test] [value] [dest]  – Move if Not Zero; sets [dest] to [value] if [test] is not zero.
MLZ [test] [value] [dest]  – Move if Less than Zero; sets [dest] to [value] if [test] is less than zero.
ADD [val1] [val2] [dest]   – ADDition; store [val1] + [val2] in [dest].
SUB [val1] [val2] [dest]   – SUBtraction; store [val1] - [val2] in [dest].
AND [val1] [val2] [dest]   – bitwise AND; store [val1] & [val2] in [dest].
OR [val1] [val2] [dest]    – bitwise OR; store [val1] | [val2] in [dest].
XOR [val1] [val2] [dest]   – bitwise XOR; store [val1] ^ [val2] in [dest].
ANT [val1] [val2] [dest]   – bitwise And-NoT; store [val1] & (![val2]) in [dest].
SL [val1] [val2] [dest]    – Shift Left; store [val1] << [val2] in [dest].
SRL [val1] [val2] [dest]   – Shift Right Logical; store [val1] >>> [val2] in [dest]. Doesn't preserve sign.
SRA [val1] [val2] [dest]   – Shift Right Arithmetic; store [val1] >> [val2] in [dest], while preserving sign.

ඇමතීමේ මාතයන්

සෑම ඔපෙරන්ඩ් එකකම දත්ත වටිනාකමක් සහ ආමන්ත්‍රණ පියවරක් අඩංගු වේ. දත්ත අගය -32768 සිට 32767 දක්වා වූ දශම සංඛ්‍යාවක් මගින් විස්තර කෙරේ. ලිපින මාදිලිය දත්ත අගයට එක් අකුරු උපසර්ගයක් මගින් විස්තර කෙරේ.

mode    name               prefix
0       immediate          (none)
1       direct             A
2       indirect           B
3       double-indirect    C 

උදාහරණ කේතය

පේළි පහකින් ෆිබොනාච්චි අනුක්‍රමය:

0. MLZ -1 1 1;    initial value
1. MLZ -1 A2 3;   start loop, shift data
2. MLZ -1 A1 2;   shift data
3. MLZ -1 0 0;    end loop
4. ADD A2 A3 1;   branch delay slot, compute next term

මෙම කේතය Fibonacci අනුක්‍රමය ගණනය කරන අතර RAM ලිපිනය 1 සමඟ වර්තමාන පදය අඩංගු වේ. එය 28657 න් පසු ඉක්මනින් පිටාර ගැලේ.

අළු කේතය:

0. MLZ -1 5 1;      initial value for RAM address to write to
1. SUB A1 5 2;      start loop, determine what binary number to covert to Gray code
2. SRL A2 1 3;      shift right by 1
3. XOR A2 A3 A1;    XOR and store Gray code in destination address
4. SUB B1 42 4;     take the Gray code and subtract 42 (101010)
5. MNZ A4 0 0;      if the result is not zero (Gray code != 101010) repeat loop
6. ADD A1 1 1;      branch delay slot, increment destination address

මෙම වැඩසටහන අළු කේතය ගණනය කරන අතර 5 වන ලිපිනයේ සිට කේතය සාර්ථක ලිපිනවල ගබඩා කරයි. මෙම වැඩසටහන මඟින් වක්‍ර ආමන්ත්‍රණය සහ කොන්දේසි සහිත පැනීම වැනි වැදගත් අංග කිහිපයක් භාවිතා කරයි. ප්‍රති result ලයක් ලෙස අළු කේතය වූ විට එය නතර වේ 101010, එය 56 වන ලිපිනයේ 51 ආදානය සඳහා සිදු වේ.

ඔන්ලයින් පරිවර්තකය

එල්'එන්ඩියා ස්ටාර්මන් මෙහි ඉතා ප්‍රයෝජනවත් සබැඳි පරිවර්තකයෙකු නිර්මාණය කර ඇත . ඔබට කේතය හරහා ගමන් කිරීමට, බ්‍රේක්පොයින්ට් සැකසීමට, RAM වෙත අත්පොත ලිවීමට සහ RAM දර්ශනයක් ලෙස දෘශ්‍යමාන කිරීමට හැකිය.

කොගොල්

ගෘහ නිර්මාණ ශිල්පය සහ එකලස් කිරීමේ භාෂාව නිර්වචනය කළ පසු, ව්‍යාපෘතියේ “මෘදුකාංග” පැත්තේ ඊළඟ පියවර වූයේ ඉහළ මට්ටමේ භාෂාවක් නිර්මාණය කිරීමයි, එය ටෙට්‍රිස්ට සුදුසු ය. මේ අනුව මම කොගොල් නිර්මාණය කළා . මෙම නම "COBOL" හි ද pun ුවමක් වන අතර "C of Game of Life" යන්නෙහි සංක්ෂිප්තයකි. කොගොල් යනු C ට අපගේ පරිගණකය සැබෑ පරිගණකයකට ලබා දෙන බව සඳහන් කිරීම වටී.

කොගොල් පවතින්නේ එකලස් කිරීමේ භාෂාවට මදක් ඉහළින්ය. සාමාන්‍යයෙන්, කොගොල් වැඩසටහනක බොහෝ රේඛා එකලස් කිරීමේ එක පේළියකට අනුරූප වේ, නමුත් භාෂාවේ වැදගත් ලක්ෂණ කිහිපයක් තිබේ:

  • මූලික ලක්ෂණ අතර නම් කළ හැකි විචල්‍යයන් සහ පැවරුම් සහිත ක්‍රියාකරුවන් සහ කියවිය හැකි සින්ටැක්ස් ඇති ක්‍රියාකරුවන් ඇතුළත් වේ. උදාහරණයක් ලෙස, ADD A1 A2 3බවට පත් වෙයි z = x + y;ලිපින මතට සම්පාදකවරයා සිතියම් විචල්ය.
  • වැනි ප්රහාරක නිර්මාණය කරන if(){}, while(){}සහ do{}while();සම්පාදකවරයා මගින් හසුරුවනු අතු බෙදී එසේ.
  • ටෙට්රිස් පුවරුව සඳහා භාවිතා කරන ඒක මාන අරා (දර්ශක අංක ගණිතය සමඟ).
  • සබ්ට්‍රවුටින් සහ ඇමතුම් තොගයක්. කේත විශාල කැබලි අනුපිටපත් කිරීම වැළැක්වීමට සහ පුනරාවර්තනයට සහාය වීමට මේවා ප්‍රයෝජනවත් වේ.

සම්පාදකයා (මම මුල සිටම ලියා ඇති) ඉතා මූලික / බොළඳ ය, නමුත් කෙටි සම්පාදනය කරන ලද වැඩසටහන් දිගක් ලබා ගැනීම සඳහා භාෂා ව්‍යුහයන් කිහිපයක් අතින් ප්‍රශස්ත කිරීමට මම උත්සාහ කර ඇත්තෙමි.

විවිධ භාෂා විශේෂාංග ක්‍රියාත්මක වන ආකාරය පිළිබඳ කෙටි දළ විශ්ලේෂණ කිහිපයක් මෙන්න:

ටෝකනකරණය

ප්‍රභව කේතය ටෝකනගත කර ඇත්තේ රේඛීයව (තනි පාස්), ටෝකනයක් තුළ යාබදව සිටීමට අවසර දී ඇති අක්ෂර පිළිබඳ සරල නීති භාවිතා කරයි. වත්මන් ටෝකනයේ අවසාන අක්‍ෂරයට යාබදව තිබිය නොහැකි අක්ෂරයක් හමු වූ විට, වත්මන් ටෝකනය සම්පුර්ණ යැයි සලකන අතර නව චරිතය නව ටෝකනයක් ආරම්භ කරයි. සමහර අක්ෂර (වැනි {හෝ ,) වෙනත් අක්ෂරවලට යාබදව තිබිය නොහැකි අතර එම නිසා ඒවායේ සංකේත වේ. අන් අය (මෙන් >හෝ =) පමණක් ඔවුන්ගේ පන්තිය තුල තවත් චරිත යාබදව සඳහා අවසර ඇති අතර, ඒ අනුව වැනි කාර්යභාරය අගයනු ගත හැක >>>, ==හෝ >=වැනි, නමුත් =2. වයිට්ස්පේස් අක්ෂර ටෝකන අතර මායිමක් බල කරන නමුත් ප්‍රති result ලයට ඒවා ඇතුළත් නොවේ. ටෝකනකරණය කිරීමට වඩාත්ම දුෂ්කර චරිතය වන්නේ- මක්නිසාද යත් එය අඩු කිරීම සහ ඒකීය නිෂේධනය යන දෙකම නිරූපණය කළ හැකි නිසා විශේෂ ආවරණයක් අවශ්‍ය වේ.

විග්‍රහ කිරීම

විග්‍රහ කිරීම ද තනි පාස් ආකාරයකින් සිදු කෙරේ. එක් එක් විවිධ භාෂා සැකසුම් හැසිරවීමේ ක්‍රම සම්පාදකයා සතුව ඇති අතර විවිධ සම්පාදක ක්‍රම මගින් පරිභෝජනය කරන බැවින් ටෝකන ගෝලීය ටෝකන් ලැයිස්තුවෙන් ඉවත් වේ. සම්පාදකයා කවදාවත් බලාපොරොත්තු නොවන ටෝකනයක් දුටුවහොත් එය සින්ටැක්ස් දෝෂයක් මතු කරයි.

ගෝලීය මතක වෙන් කිරීම

සම්පාදකයා විසින් එක් එක් ගෝලීය විචල්‍යය (වචනය හෝ අරාව) තමන්ගේම නම් කරන ලද RAM ලිපිනය (es) පවරයි. යතුරුපදය භාවිතයෙන් සියලු විචල්‍යයන් ප්‍රකාශ කිරීම අවශ්‍ය වන අතර myඑමඟින් ඒ සඳහා ඉඩ වෙන් කිරීමට සම්පාදකයා දනී. නම් කරන ලද ගෝලීය විචල්‍යයන්ට වඩා සිසිල් වන්නේ සීරීම් ලිපින මතක කළමනාකරණයයි. බොහෝ උපදෙස් (විශේෂයෙන් කොන්දේසි සහ බොහෝ අරාව ප්‍රවේශයන්) අතරමැදි ගණනය කිරීම් ගබඩා කිරීම සඳහා තාවකාලික “සීරීම්” ලිපින අවශ්‍ය වේ. සම්පාදනය කිරීමේ ක්‍රියාවලියේදී සම්පාදකයා අවශ්‍ය පරිදි සීරීම් ලිපින වෙන් කරයි. සම්පාදකයාට තවත් සීරීම් ලිපින අවශ්‍ය නම්, එය සීරීම් ලිපින ලෙස වැඩි RAM ප්‍රමාණයක් කැප කරනු ඇත. සෑම සීරීම් ලිපිනයක්ම බොහෝ වාරයක් භාවිතා කරනු ඇතත්, වැඩසටහනකට සීරීම් ලිපින කිහිපයක් පමණක් අවශ්‍ය බව මම විශ්වාස කරමි.

IF-ELSE ප්රකාශ

if-elseප්‍රකාශ සඳහා වන වාක්‍ය ඛණ්ඩය සම්මත C ආකෘතියයි:

other code
if (cond) {
  first body
} else {
  second body
}
other code

QFTASM බවට පරිවර්තනය කළ විට, කේතය මේ ආකාරයට සකසා ඇත:

other code
condition test
conditional jump
first body
unconditional jump
second body (conditional jump target)
other code (unconditional jump target)

පළමු ශරීරය ක්‍රියාත්මක කරන්නේ නම්, දෙවන සිරුර මඟ හැරේ. පළමු ශරීරය මඟ හැරියහොත්, දෙවන සිරුර ක්‍රියාත්මක වේ.

එකලස් කිරීමේදී, කොන්දේසි පරීක්ෂණයක් සාමාන්‍යයෙන් අඩු කිරීමක් පමණක් වන අතර, ප්‍රති result ලයේ සං sign ාව තීරණය කරනුයේ පැනීම සිදු කරන්නේද නැතහොත් ශරීරය ක්‍රියාත්මක කරන්නේද යන්නයි. ක MLZවැනි අසමානතාවයන් හැසිරවීමට උපදෙස් භාවිතා >හෝ <=. ක MNZඋපදෙස් හැසිරවීම භාවිතා ==වෙනස (එබැවින් තර්ක සමාන නොවන විට) ශුන්ය නොවේ විට එය ශරීරය පුරා පනී සිට. බහු ප්‍රකාශන කොන්දේසි දැනට සහය නොදක්වයි.

elseප්‍රකාශය මඟ හැරී ඇත්නම් , කොන්දේසි විරහිතව පැනීම ද මඟ හැරී ඇති අතර QFTASM කේතය මේ ආකාරයට පෙනේ:

other code
condition test
conditional jump
body
other code (conditional jump target)

WHILE ප්රකාශ

whileප්‍රකාශ සඳහා වන වාක්‍ය ඛණ්ඩය ද සම්මත C ආකෘතියයි:

other code
while (cond) {
  body
}
other code

QFTASM බවට පරිවර්තනය කළ විට, කේතය මේ ආකාරයට සකසා ඇත:

other code
unconditional jump
body (conditional jump target)
condition test (unconditional jump target)
conditional jump
other code

කොන්දේසි පරීක්ෂා කිරීම සහ කොන්දේසි සහිත පැනීම බ්ලොක් එක අවසානයේ ඇති අතර එයින් අදහස් වන්නේ බ්ලොක් එකෙහි එක් එක් ක්‍රියාත්මක කිරීමෙන් පසුව ඒවා නැවත ක්‍රියාත්මක වන බවයි. තත්වය සාවද්‍ය වූ විට ශරීරය නැවත නොකෙරෙන අතර ලූපය අවසන් වේ. ලූප් ක්‍රියාත්මක කිරීම ආරම්භයේදී, පාලක ප්‍රවාහය කොන්දේසි කේතය වෙත ලූප ශරීරය හරහා පනින අතර පළමු වරට තත්වය අසත්‍ය නම් ශරීරය කිසි විටෙකත් ක්‍රියාත්මක නොවේ.

MLZවැනි අසමානතාවයන් හැසිරවීමට උපදෙස් භාවිතා >හෝ <=. ifප්‍රකාශයන් මෙන් නොව , වෙනසක් ශුන්‍ය නොවන විට (එම නිසා තර්ක සමාන නොවන විට) එය ශරීරයට පනින බැවින්, MNZහැසිරවීමට උපදෙස් භාවිතා කරයි !=.

DO-WHILE ප්රකාශ

අතර ඇති එකම වෙනස whileහා do-whileකරන ලෙස ද බව ය do-whileඑය සෑම විටම අවම වශයෙන් එක් වරක් ක්රියාත්මක වන නිසා පුඩුවක් ශරීරය මුලින් පුරා ගියේ නැත. do-whileඑකලස් කිරීමේ කේත පේළි කිහිපයක් සුරැකීමට මම සාමාන්‍යයෙන් ප්‍රකාශ භාවිතා කරමි .

අරා

ඒක මාන අරා ක්‍රියාත්මක වන්නේ මතකයේ පරස්පර කොටස් ලෙස ය. සියළුම අරා ඒවායේ ප්‍රකාශය මත පදනම්ව ස්ථාවර දිගකින් යුක්ත වේ. අරා එසේ ප්‍රකාශ වේ:

my alpha[3];               # empty array
my beta[11] = {3,2,7,8};   # first four elements are pre-loaded with those values

අරාව සඳහා, මෙය හැකි RAM සිතියම්ගත කිරීමක් වන අතර, 15-18 ලිපිනයන් අරාව සඳහා වෙන් කර ඇති ආකාරය පෙන්වයි:

15: alpha
16: alpha[0]
17: alpha[1]
18: alpha[2]

ලේබල් කරන alphaලද ලිපිනය පිහිටීම සඳහා දර්ශකයකින් පුරවා ඇත alpha[0], එබැවින් මෙම නඩුවේ ලිපිනය 15 හි 16 අගය අඩංගු වේ. alphaවිචල්‍යය කොගෝල් කේතයේ ඇතුළත භාවිතා කළ හැකිය, සමහර විට ඔබට මෙම අරාව තොගයක් ලෙස භාවිතා කිරීමට අවශ්‍ය නම් තොග දර්ශකයක් ලෙස විය හැකිය. .

අරාවෙහි මූලද්‍රව්‍යයන්ට ප්‍රවේශ වීම සම්මත array[index]අංකනය සමඟ සිදු කෙරේ . අගය indexනියතයක් නම්, මෙම සඳහන ස්වයංක්‍රීයව එම මූලද්‍රව්‍යයේ නිරපේක්ෂ ලිපිනය සමඟ පුරවනු ලැබේ. එසේ නොමැතිනම් එය අපේක්ෂිත නිරපේක්ෂ ලිපිනය සොයා ගැනීම සඳහා දර්ශක අංක ගණිතය (එකතු කිරීම) සිදු කරයි. වැනි කූඩු සුචිගත කිරීම ද කළ හැකිය alpha[beta[1]].

සබ්ට්‍රවුටින් සහ ඇමතුම්

සබ්ට්‍රෝටීන් යනු කේත වල කොටස් වන අතර එය විවිධ සන්දර්භයන්ගෙන් හැඳින්විය හැකිය, කේත අනුපිටපත් කිරීම වළක්වයි සහ පුනරාවර්තන වැඩසටහන් නිර්මාණය කිරීමට ඉඩ දෙයි. ෆයිබොනාච්චි සංඛ්‍යා උත්පාදනය කිරීම සඳහා පුනරාවර්තන සබ්ට්‍රවුටින් සහිත වැඩසටහනක් මෙන්න (මූලික වශයෙන් මන්දගාමී ඇල්ගොරිතම):

# recursively calculate the 10th Fibonacci number
call display = fib(10).sum;
sub fib(cur,sum) {
  if (cur <= 2) {
    sum = 1;
    return;
  }
  cur--;
  call sum = fib(cur).sum;
  cur--;
  call sum += fib(cur).sum;
}

යතුරුපදය සමඟ සබ්ට්‍රවුටින් එකක් ප්‍රකාශයට පත් කරන අතර sub, වැඩසටහන තුළ ඕනෑම තැනක සබ්ට්‍රවුටින් එකක් තැබිය හැකිය. සෑම සබ්මැරීනයකටම දේශීය විචල්‍යයන් කිහිපයක් තිබිය හැකි අතර ඒවා එහි තර්ක ලැයිස්තුවේ කොටසක් ලෙස ප්‍රකාශයට පත් කෙරේ. මෙම තර්ක වලට පෙරනිමි අගයන් ද ලබා දිය හැකිය.

පුනරාවර්තන ඇමතුම් හැසිරවීම සඳහා, සබ්මැරීනයක දේශීය විචල්‍යයන් තොගයේ ගබඩා කර ඇත. RAM හි අවසාන ස්ථිතික විචල්‍යය වන්නේ ඇමතුම් සිරස් දර්ශකය වන අතර ඉන් පසුව ඇති සියලුම මතකය ඇමතුම් තොගය ලෙස සේවය කරයි. සබ්ට්‍රවුටින් එකක් කැඳවූ විට, එය ඇමතුම් තොගයේ නව රාමුවක් නිර්මාණය කළ අතර එයට සියලු දේශීය විචල්‍යයන් මෙන්ම ආපසු එන (ROM) ලිපිනයද ඇතුළත් වේ. වැඩසටහනේ සෑම සබ්මැරීනයකටම දර්ශකයක් ලෙස සේවය කිරීම සඳහා තනි ස්ථිතික RAM ලිපිනයක් ලබා දී ඇත. මෙම දර්ශකය ඇමතුම් තොගයේ ඇති සබ්ට්‍රවුටින් හි "වත්මන්" ඇමතුමේ පිහිටීම ලබා දෙයි. දේශීය විචල්‍යයක් යොමු කිරීම සිදු කරනු ලබන්නේ මෙම ස්ථිතික දර්ශකයේ අගය සහ එම දේශීය විචල්‍යයේ ලිපිනය ලබා දීම සඳහා ඕෆ්සෙට් භාවිතා කිරීමෙනි. ස්ථිතික දර්ශකයේ පෙර අගය ද ඇමතුම් තොගයේ අඩංගු වේ. මෙහි'

RAM map:
0: pc
1: display
2: scratch0
3: fib
4: scratch1
5: scratch2
6: scratch3
7: call

fib map:
0: return
1: previous_call
2: cur
3: sum

සබ්ට්‍රවුටින් පිළිබඳ සිත්ගන්නා කරුණක් නම් ඒවා කිසිදු විශේෂිත අගයක් ලබා නොදීමයි. ඒ වෙනුවට, සබ්ට්‍රවුටින් සිදු කිරීමෙන් පසු සබ්ට්‍රවුටින්හි සියලුම දේශීය විචල්‍යයන් කියවිය හැකිය, එබැවින් සබ්ට්‍රවුටින් ඇමතුමකින් විවිධ දත්ත ලබා ගත හැකිය. මෙය සිදු කරනු ලබන්නේ සබ්ට්‍රවුටින් හි නිශ්චිත ඇමතුම සඳහා දර්ශකය ගබඩා කිරීමෙනි, එමඟින් (මෑතකදී ඉවත් කරන ලද) සිරස් රාමුව තුළ ඇති ඕනෑම දේශීය විචල්‍යයන් නැවත ලබා ගැනීමට භාවිතා කළ හැකිය.

උපසිරැසියක් ඇමතීමට විවිධ ක්‍රම තිබේ, සියල්ලම යතුරුපදය භාවිතා කරයි call:

call fib(10);   # subroutine is executed, no return vaue is stored

call pointer = fib(10);   # execute subroutine and return a pointer
display = pointer.sum;    # access a local variable and assign it to a global variable

call display = fib(10).sum;   # immediately store a return value

call display += fib(10).sum;   # other types of assignment operators can also be used with a return value

සබ්ට්‍රවුටින් ඇමතුමක් සඳහා තර්ක ලෙස ඕනෑම අගයන් ගණනක් ලබා දිය හැකිය. සපයා නොමැති ඕනෑම තර්කයක් එහි පෙරනිමි අගය සමඟ පුරවනු ලැබේ. සපයා නැති සහ පෙරනිමි අගයක් නොමැති තර්කයක් නිෂ්කාශනය නොකෙරේ (උපදෙස් / කාලය ඉතිරි කර ගැනීම සඳහා), එබැවින් සබ්ට්‍රවුටින් ආරම්භයේදී ඕනෑම අගයක් ලබා ගත හැකිය.

පොයින්ටර්ස් යනු සබ්ට්‍රවුටින්හි දේශීය විචල්‍යයන් කිහිපයකට ප්‍රවේශ වීමේ ක්‍රමයකි, නමුත් දර්ශකය තාවකාලික පමණක් බව සැලකිල්ලට ගැනීම වැදගත්ය: වෙනත් සබ්ට්‍රවුටින් ඇමතුමක් ලබා දුන් විට දර්ශකය පෙන්වා දෙන දත්ත විනාශ වේ.

නිදොස් කිරීමේ ලේබල

{...}කොගොල් වැඩසටහනක ඇති ඕනෑම කේත වාරණයකට පෙර බහු වචන විස්තර ලේබලයක් මඟින් කළ හැකිය. මෙම ලේබලය සම්පාදනය කරන ලද එකලස් කිරීමේ කේතයේ විවරණයක් ලෙස අමුණා ඇති අතර එය නිදොස් කිරීම සඳහා ඉතා ප්‍රයෝජනවත් විය හැකි බැවින් නිශ්චිත කේත කැබලි සොයා ගැනීම පහසු කරයි.

ශාඛා ප්‍රමාද තව් ප්‍රශස්තිකරණය

සම්පාදනය කරන ලද කේතයේ වේගය වැඩි දියුණු කිරීම සඳහා, කොගොල් සම්පාදකයා QFTASM කේතය හරහා අවසාන සමත් වීමක් ලෙස සැබවින්ම මූලික ප්‍රමාද ස්ලොට් ප්‍රශස්තිකරණය සිදු කරයි. හිස් ශාඛා ප්‍රමාදයක් සහිත ඕනෑම කොන්දේසි විරහිත පැනීමකට, පැනීමේ ගමනාන්තයේ පළමු උපදෙස් මගින් ප්‍රමාද ස්ලට් එක පිරවිය හැකි අතර, ඊළඟ උපදෙස් වෙත යොමු කිරීම සඳහා පැනීමේ ගමනාන්තය එක් අයෙකු විසින් වැඩි කරනු ලැබේ. කොන්දේසි විරහිතව පැනීම සිදු කරන සෑම අවස්ථාවකම මෙය සාමාන්‍යයෙන් එක් චක්‍රයක් ඉතිරි කරයි.

කොගොල්හි ටෙට්රිස් කේතය ලිවීම

අවසාන ටෙට්රිස් වැඩසටහන කොගොල් හි ලියා ඇති අතර ප්‍රභව කේතය මෙහි ඇත. සම්පාදනය කරන ලද QFTASM කේතය මෙහි ඇත. පහසුව සඳහා, මෙහි පර්මාලින්ක් ලබා දී ඇත: QFTASM හි ටෙට්රිස් . එකලස් කිරීමේ කේතය ගොල්ෆ් කිරීම ඉලක්කය වූ බැවින් (කොගොල් කේතය නොවේ), එහි ප්‍රති ant ලයක් ලෙස කොගෝල් කේතය අසීමිත ය. වැඩසටහනේ බොහෝ කොටස් සාමාන්‍යයෙන් ස්ථානගත වී ඇත්තේ සබ්ට්‍රවුටින්වල ය, නමුත් එම සබ්මැරීන ඇත්ත වශයෙන්ම කෙටි වන අතර කේතය අනුපිටපත් කිරීමෙන් උපදෙස් ඉතිරි කර ඇතcallප්‍රකාශ. අවසාන කේතයට ඇත්තේ ප්‍රධාන කේතයට අමතරව එක් සබ්මැරීනයක් පමණි. මීට අමතරව, බොහෝ අරා ඉවත් කර ප්‍රතිස්ථාපනය කරන ලද්දේ එක් එක් විචල්‍යයන්ට සමානව දිගු ලැයිස්තුවක් හෝ වැඩසටහනේ දෘඩ කේත අංක වලින් ය. අවසාන සම්පාදනය කරන ලද QFTASM කේතය උපදෙස් 300 ක් යටතේ ඇත, එය කොගෝල් ප්‍රභවයට වඩා මඳක් දිගු වුවද.


28
එකලස් කිරීමේ භාෂා උපදෙස් තෝරා ගැනීම ඔබේ උපස්ථර දෘඩාංග මගින් නිර්වචනය කිරීමට මම කැමතියි (MEZ නැත, මන්ද වැරදි දෙකකින් සත්‍යයක් එක්රැස් කිරීම දුෂ්කර ය). අපූරු කියවීම.
ඇලෙක්ස්

1
ඔබ කීවේ එය තමා =අසලම සිටිය හැකි බවයි, නමුත් අ !=.
ෆේබියන් රෝලිං

Ab ෆේබියන් සහ+=
ඔලිෆන්ට් - මොනිකා

L ඔලිෆාන්ට් ඔව් මගේ විස්තරය එතරම් නිවැරදි නැත, එය චරිත-පන්තියේ දෙයක් වන අතර, එහිදී එක්තරා අක්ෂර කාණ්ඩයක් එකිනෙකට යාබදව තිබිය හැකිය.
ෆිනොට්පී

652

5 වන කොටස: එකලස් කිරීම, පරිවර්තනය කිරීම සහ අනාගතය

සම්පාදකයා වෙතින් අපගේ එකලස් කිරීමේ වැඩසටහන සමඟ, Varlife පරිගණකය සඳහා ROM එකක් එක්රැස් කිරීමට කාලය එළඹ ඇති අතර සෑම දෙයක්ම විශාල GoL රටාවකට පරිවර්තනය කරයි!

එකලස් කිරීම

එකලස් කිරීමේ වැඩසටහන ROM එකකට එකලස් කිරීම සාම්ප්‍රදායික ක්‍රමලේඛනයේදී සිදු කරන ආකාරයටම සිදු වේ: සෑම උපදෙස්ම ද්විමය සමානව පරිවර්තනය කරනු ලැබේ, පසුව ඒවා විශාල ද්විමය බ්ලොබ් එකකට සංයුක්ත කර අප ක්‍රියාත්මක කළ හැකි යැයි කියනු ලැබේ. අපට නම් එකම වෙනස නම් ද්විමය බ්ලොබ් වර්ලයිෆ් පරිපථවලට පරිවර්තනය කර පරිගණකයට අනුයුක්ත කිරීමයි.

කේ ෂැං ලිවීය ගෝලි සඳහා පයිතන් පිටපතක් වන CreateROM.py . එය තරමක් සරල ය: එය ක්ලිප් පුවරුවෙන් එකලස් කිරීමේ වැඩසටහනක් ගෙන එය ද්විමය ලෙස එකලස් කර එම ද්විමය පරිපථයට පරිවර්තනය කරයි. පිටපත සමඟ ඇතුළත් කර ඇති සරල ප්‍රාථමික පරීක්ෂකයෙකු සමඟ උදාහරණයක් මෙන්න:

#0. MLZ -1 3 3;
#1. MLZ -1 7 6; preloadCallStack
#2. MLZ -1 2 1; beginDoWhile0_infinite_loop
#3. MLZ -1 1 4; beginDoWhile1_trials
#4. ADD A4 2 4;
#5. MLZ -1 A3 5; beginDoWhile2_repeated_subtraction
#6. SUB A5 A4 5;
#7. SUB 0 A5 2;
#8. MLZ A2 5 0;
#9. MLZ 0 0 0; endDoWhile2_repeated_subtraction
#10. MLZ A5 3 0;
#11. MNZ 0 0 0; endDoWhile1_trials
#12. SUB A4 A3 2;
#13. MNZ A2 15 0; beginIf3_prime_found
#14. MNZ 0 0 0;
#15. MLZ -1 A3 1; endIf3_prime_found
#16. ADD A3 2 3;
#17. MLZ -1 3 0;
#18. MLZ -1 1 4; endDoWhile0_infinite_loop

මෙය පහත සඳහන් ද්විමය නිෂ්පාදනය කරයි:

0000000000000001000000000000000000010011111111111111110001
0000000000000000000000000000000000110011111111111111110001
0000000000000000110000000000000000100100000000000000110010
0000000000000000010100000000000000110011111111111111110001
0000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000011110100000000000000100000
0000000000000000100100000000000000110100000000000001000011
0000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000110100000000000001010001
0000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000001010100000000000000100001
0000000000000000100100000000000001010000000000000000000011
0000000000000001010100000000000001000100000000000001010011
0000000000000001010100000000000000110011111111111111110001
0000000000000001000000000000000000100100000000000001000010
0000000000000001000000000000000000010011111111111111110001
0000000000000000010000000000000000100011111111111111110001
0000000000000001100000000000000001110011111111111111110001
0000000000000000110000000000000000110011111111111111110001

Varlife පරිපථ වලට පරිවර්තනය කළ විට, එය මේ ආකාරයෙන් පෙනේ:

ROM

වසා දැමීමේ ROM

ROM පසුව පරිගණකය සමඟ සම්බන්ධ වන අතර එය Varlife හි පූර්ණ ක්‍රියාකාරී වැඩසටහනක් සාදයි. නමුත් අපි තවම ඉවර නෑ ...

ගේම් ඔෆ් ලයිෆ් වෙත පරිවර්තනය

මේ මුළු කාලය තුළම, අපි ගේම් ඔෆ් ලයිෆ් හි පදනමට ඉහළින් විවිධාකාර වියුක්ත ස්ථර වල වැඩ කරමින් සිටිමු. නමුත් දැන්, වියුක්ත කිරීමේ තිරය පසුපසට ඇද අපගේ කාර්යයන් ගේම් ඔෆ් ලයිෆ් රටාවකට පරිවර්තනය කිරීමට කාලයයි. කලින් සඳහන් කළ පරිදි, අපි වර්ටයිෆ් සඳහා පදනම ලෙස OTCA මෙටාපික්සල් භාවිතා කරමු. ඉතින්, අවසාන පියවර වන්නේ වර්ලයිෆ් හි සෑම සෛලයක්ම ගේම් ඔෆ් ලයිෆ් හි මෙටපික්සෙල් බවට පරිවර්තනය කිරීමයි.

ගොලීට ස්ක්‍රිප්ට් එකක් ( metafier.py ) ඇති අතර එය OTCA මෙටාපික්සල් හරහා විවිධ රීසෙට් වල රටා ගේම් ඔෆ් ලයිෆ් රටා බවට පරිවර්තනය කළ හැකිය. අවාසනාවකට මෙන්, එය නිර්මාණය කර ඇත්තේ තනි ගෝලීය රීසෙට් එකක් සමඟ රටා පරිවර්තනය කිරීම සඳහා පමණි, එබැවින් එය වර්ලයිෆ් මත ක්‍රියා නොකරයි. මා විසින් නවීකරණය කරන ලද අනුවාදයක් ලියා එම ගැටළුව විසඳන අතර එමඟින් එක් එක් මෙටාපික්සල් සඳහා රීතිය වර්ලයිෆ් සඳහා සෛල අනුව සෛල පදනමක් මත ජනනය වේ.

ඉතින්, අපගේ පරිගණකයේ (ටෙට්රිස් ROM සමඟ) මායිම් පෙට්ටියක් 1,436 x 5,082 ඇත. එම කොටුවේ ඇති සෛල 7,297,752 න් 6,075,811 හිස් අවකාශයක් වන අතර සත්‍ය ජනගහනය 1,221,941 කි. එම සෑම සෛලයක්ම 2048x2048 මායිම් පෙට්ටියක් ඇති OTCA මෙටාපික්සෙල් බවට පරිවර්තනය කළ යුතු අතර ජනගහනය 64,691 (ON මෙටාපික්සෙල් සඳහා) හෝ 23,920 (OFF මෙටා පික්සෙල් සඳහා). ඒ කියන්නේ අවසාන නිෂ්පාදනයේ මායිම් පෙට්ටිය 2,940,928 x 10,407,936 (ඊට අමතරව මෙටපික්සල් වල මායිම් සඳහා දහස් ගණනක් අමතර), ජනගහනය 29,228,828,720 සහ 79,048,585,231 අතර වේ. සජීවී සෛලයකට බිට් 1 බැගින්, එය මුළු පරිගණකය සහ ROM නියෝජනය කිරීමට අවශ්‍ය GiB 27 ත් 74 ත් අතර වේ.

මම එම ගණනය කිරීම් මෙහි ඇතුළත් කළේ ස්ක්‍රිප්ට් ආරම්භ කිරීමට පෙර ඒවා ක්‍රියාත්මක කිරීමට මා නොසලකා හැර ඇති අතර ඉතා ඉක්මණින් මගේ පරිගණකයේ මතකය නැති වී ගිය බැවිනි. කලබල වූ killවිධානයකින් පසුව , මම මෙටාෆියර් ස්ක්‍රිප්ටයේ වෙනස් කිරීමක් කළෙමි. මෙටපික්සල් සෑම පේළි 10 කටම, රටාව තැටියට සුරකිනු ලැබේ (gzipped RLE ගොනුවක් ලෙස), සහ ජාලකය ගලා යයි. මෙය පරිවර්තනයට අමතර ධාවන කාලයක් එක් කරන අතර වැඩි තැටි ඉඩක් භාවිතා කරයි, නමුත් මතක භාවිතය පිළිගත හැකි සීමාවන් තුළ තබා ගනී. ගොලි විසින් රටාවේ පිහිටීම ඇතුළත් දීර් R RLE ආකෘතියක් භාවිතා කරන බැවින්, මෙය රටාව පැටවීමට තවත් සංකීර්ණතාවයක් එක් නොකරයි - රටා ගොනු සියල්ලම එකම ස්ථරයක විවෘත කරන්න.

කේ ෂැං මෙම කාර්යයෙන් ඉවත් වූ අතර විශාල රටා සඳහා RLE ට වඩා කාර්යක්ෂමව පටවන මැක්‍රොසෙල් ගොනු ආකෘතිය භාවිතා කරන වඩාත් කාර්යක්ෂම මෙටාෆයර් ස්ක්‍රිප්ටයක් නිර්මාණය කළේය . මෙම ස්ක්‍රිප්ට් එක සැලකිය යුතු වේගයකින් ධාවනය වේ (මුල් මෙටාෆියර් ස්ක්‍රිප්ට් සඳහා පැය කිහිපයක් හා සසඳන විට තත්පර කිහිපයක්), ඉතා කුඩා ප්‍රතිදානයක් (121 KB හා 1.7 GB ට සාපේක්ෂව) නිර්මාණය කරයි, එමෙන්ම විශාල පරිගණකයක් භාවිතා නොකර මුළු පරිගණකයම සහ ROM එක එකවරම වේගයෙන් වෙනස් කළ හැකිය. මතකයේ. මැක්‍රොසෙල් ලිපිගොනු රටා විස්තර කරන ගස් සංකේතවත් කිරීමෙන් එය ප්‍රයෝජන ගනී. අභිරුචි අච්චු ගොනුවක් භාවිතා කිරීමෙන්, මෙටාපික්සල් ගසට පෙර පටවා ඇති අතර අසල්වැසියන් හඳුනා ගැනීම සඳහා සමහර ගණනය කිරීම් හා වෙනස් කිරීම් වලින් පසුව, වර්ලයිෆ් රටාව සරලව එකතු කළ හැකිය.

සමස්ත පරිගණකයේ රටා ගොනුව සහ ගේම් ඔෆ් ලයිෆ් හි ROM මෙහි සොයාගත හැකිය .


ව්‍යාපෘතියේ අනාගතය

දැන් අපි ටෙට්රිස් සෑදුවා, අපි ඉවරයි නේද? කිට්ටු නෑ. අප වැඩ කරමින් සිටින මෙම ව්‍යාපෘතිය සඳහා අපට තවත් ඉලක්ක කිහිපයක් තිබේ:

  • muddyfish සහ Kritixi Lithos QFTASM සමඟ සම්පාදනය කරන ඉහළ මට්ටමේ භාෂාව පිළිබඳ අඛණ්ඩ වැඩ කටයුතු කරගෙන යයි.
  • එල්'එන්ඩියා ස්ටාර්මන් ඔන්ලයින් QFTASM පරිවර්තකය වෙත යාවත්කාලීන කිරීමට කටයුතු කරමින් සිටී.
  • ක්වාර්ටාටා ජීසීසී පසුබිමක වැඩ කරමින් සිටින අතර, එය සීසී සහ සී ++ කේත (සහ ෆෝට්රාන්, ඩී, හෝ පරමාර්ථ-සී වැනි වෙනත් භාෂාවන්) ජීසීසී හරහා QFTASM වෙත සම්පාදනය කිරීමට ඉඩ සලසයි. සම්මත පුස්තකාලයක් නොමැතිව වඩාත් හුරුපුරුදු භාෂාවකින් වඩාත් නවීන වැඩසටහන් නිර්මාණය කිරීමට මෙය ඉඩ දෙයි.
  • වැඩි ප්‍රගතියක් ලැබීමට පෙර අප විසින් ජයගත යුතු ලොකුම බාධාව නම් අපගේ මෙවලම් වලට ස්ථාන-ස්වාධීන කේත විමෝචනය කළ නොහැකි වීමයි (උදා: සාපේක්ෂ පැනීම්). PIC නොමැතිව, අපට කිසිදු සම්බන්ධතාවයක් කළ නොහැකි අතර, එබැවින් පවතින පුස්තකාල සමඟ සම්බන්ධ වීමට නොහැකි වීමෙන් ලැබෙන වාසි අපට මග හැරේ. PIC නිවැරදිව කිරීමට ක්‍රමයක් සෙවීමට අපි කටයුතු කරමින් සිටිමු.
  • QFT පරිගණකය සඳහා ලිවීමට අවශ්‍ය ඊළඟ වැඩසටහන ගැන අපි සාකච්ඡා කරමින් සිටිමු. මේ මොහොතේ, පොං ලස්සන ඉලක්කයක් සේ පෙනේ.

2
අනාගත උපවගන්තිය දෙස බැලීමේදී සාපේක්ෂ පැනීමක් පමණක් ADD PC offset PCනොවේද? මෙය වැරදියි නම් සමාවෙන්න, එකලස් කිරීමේ වැඩසටහන් කිසි විටෙකත් මගේ බලකොටුව නොවීය.
MBraedley

4
Im තිම්ම්ම් ඔව්, නමුත් ඉතා සෙමින්. (ඔබ ද හැෂ්ලයිෆ් භාවිතා කළ යුතුය).
ස්පැගටෝ

81
ඒ සඳහා ඔබ ලියන ඊළඟ වැඩසටහන කොන්වේ ගේම් ඔෆ් ලයිෆ් විය යුතුය.
ACK_stoverflow

13
@ACK_stoverflow එය යම් අවස්ථාවක දී සිදු කිරීමට නියමිතය.
මෙගෝ

16
එය ක්‍රියාත්මක වන වීඩියෝවක් ඔබ සතුව තිබේද?
PyRulez

630

6 වන කොටස: QFTASM වෙත නව සම්පාදකය

මූලික ටෙට්‍රිස් ක්‍රියාවට නැංවීම සඳහා කොගෝල් ප්‍රමාණවත් වුවද, එය පහසුවෙන් කියවිය හැකි මට්ටමකින් සාමාන්‍ය කාර්ය වැඩසටහන් සඳහා ඉතා සරල හා පහත් මට්ටමක පවතී. අපි 2016 සැප්තැම්බර් මාසයේදී නව භාෂාවක් සඳහා වැඩ ආරම්භ කළෙමු. දෝෂ මෙන්ම සැබෑ ජීවිතයද තේරුම් ගැනීමට අපහසු වීම නිසා භාෂාවේ ප්‍රගතිය මන්දගාමී විය.

සරල වර්ගයේ පද්ධතියක්, පුනරාවර්තනයට සහාය වන සබ්ට්‍රවුටින් සහ පේළිගත ක්‍රියාකරුවන් ඇතුළුව අපි පයිතන්ට සමාන සින්ටැක්ස් සහිත පහත් මට්ටමේ භාෂාවක් ගොඩනගා ගත්තෙමු. පෙළ සිට QFTASM දක්වා වූ සම්පාදකය පියවර 4 කින් නිර්මාණය කරන ලදි: ටෝකනයිසර්, ව්‍යාකරණ ගස, ඉහළ මට්ටමේ සම්පාදකය සහ පහත් මට්ටමේ සම්පාදකය.

ටෝකනයිසර්

බිල්ට් ඉන් ටෝකනයිසර් පුස්තකාලය භාවිතා කරමින් පයිතන් භාවිතයෙන් සංවර්ධනය ආරම්භ කරන ලදි, එයින් අදහස් වන්නේ මෙම පියවර ඉතා සරල බවය. අදහස් ඉවත් කිරීම ඇතුළුව පෙරනිමි ප්‍රතිදානයේ වෙනස්කම් කිහිපයක් පමණක් අවශ්‍ය විය (නමුත් ඒවා නොවේ #include).

ව්‍යාකරණ ගස

ව්‍යාකරණ ගස නිර්මාණය කරන ලද්දේ කිසිදු ප්‍රභව කේතයක් වෙනස් නොකර පහසුවෙන් විස්තාරණය කළ හැකි ආකාරයට ය.

ගස් ව්‍යුහය එක්ස්එම්එල් ගොනුවක ගබඩා කර ඇති අතර එමඟින් ගස සෑදිය හැකි නෝඩ් වල ව්‍යුහය සහ ඒවා වෙනත් නෝඩ් සහ ටෝකන සමඟ සෑදී ඇති ආකාරය ඇතුළත් වේ.

පුනරාවර්තන නෝඩ් මෙන්ම විකල්ප ඒවාට සහාය වීමට ව්‍යාකරණ අවශ්‍ය වේ. ටෝකන කියවිය යුතු ආකාරය විස්තර කිරීම සඳහා මෙටා ටැග් හඳුන්වා දීමෙන් මෙය සාක්ෂාත් කර ගන්නා ලදී.

එවිට ජනනය වන ටෝකන ව්‍යාකරණ රීති මගින් විග්‍රහ කරනු ලැබේ, එමඟින් ප්‍රතිදානය subs වැනි ව්‍යාකරණ මූලද්‍රව්‍ය ගසක් සාදයි generic_variables, අනෙක් ව්‍යාකරණ මූලද්‍රව්‍ය සහ ටෝකන අඩංගු වේ.

ඉහළ මට්ටමේ කේතයකට සම්පාදනය කිරීම

භාෂාවේ සෑම අංගයක්ම ඉහළ මට්ටමේ ඉදිකිරීම් වලට සම්පාදනය කිරීමට හැකි විය යුතුය. මේවාට assign(a, 12) සහ call_subroutine(is_prime, call_variable=12, return_variable=temp_var). මූලද්රව්යවල ආදාන වැනි අංග මෙම කොටසෙහි ක්රියාත්මක වේ. මේවා operators ලෙස අර්ථ දක්වා ඇති අතර ඒවා ක්‍රියාකරවන්නෙකු වැනි +හෝ %භාවිතා කරන සෑම අවස්ථාවකම ඒවා ආදාන වේ. මේ නිසා, ඒවා සාමාන්‍ය කේතයට වඩා සීමා කර ඇත - ඔවුන්ට තමන්ගේම ක්‍රියාකරු හෝ නිර්වචනය කර ඇති එක මත රඳා පවතින කිසිදු ක්‍රියාකරුවෙකු භාවිතා කළ නොහැක.

පේළිගත කිරීමේ ක්‍රියාවලියේදී අභ්‍යන්තර විචල්‍යයන් කැඳවනු ලැබේ. මෙය ඇත්ත වශයෙන්ම හැරේ

operator(int a + int b) -> int c
    return __ADD__(a, b)
int i = 3+3

වෙත

int i = __ADD__(3, 3)

ආදාන විචල්‍යය සහ ප්‍රතිදාන විචල්‍යයන් මතකයේ එකම ස්ථානයට යොමු වුවහොත් මෙම හැසිරීම අහිතකර හා දෝෂ සහිත විය හැකිය. 'ආරක්ෂිත' හැසිරීම භාවිතා කිරීම සඳහා, unsafeයතුරුපදය සම්පාදනය කිරීමේ ක්‍රියාවලිය සකස් කරයි, එමඟින් අතිරේක විචල්‍යයන් නිර්මාණය කර අවශ්‍ය පරිදි පේළියට හා ඉන් පිටතට පිටපත් කරනු ලැබේ.

සීරීම් විචල්යයන් සහ සංකීර්ණ මෙහෙයුම්

a += (b + c) * 4අතිරේක මතක සෛල භාවිතා නොකර ගණනය කළ නොහැකි ගණිතමය මෙහෙයුම් . මෙහෙයුම් විවිධ කොටස් වලට වෙන් කිරීමෙන් ඉහළ මට්ටමේ සම්පාදකයා මේ සමඟ කටයුතු කරයි:

scratch_1 = b + c
scratch_1 = scratch_1 * 4
a = a + scratch_1

ගණනය කිරීම්වල අතරමැදි තොරතුරු ගබඩා කිරීම සඳහා භාවිතා කරන සීරීම් විචල්‍යයන් පිළිබඳ සංකල්පය මෙය හඳුන්වා දෙයි. ඒවා අවශ්‍ය පරිදි වෙන් කර අවසන් වූ පසු සාමාන්‍ය සංචිතයට වෙන් කරනු ලැබේ. මෙය භාවිතයට අවශ්‍ය සීරීම් මතක ස්ථාන ගණන අඩු කරයි. සීරීම් විචල්‍යයන් ගෝලීය ලෙස සැලකේ.

සබ්ට්‍රවුටින් භාවිතා කරන සියලුම විචල්‍යයන් සහ ඒවායේ වර්ගය පිළිබඳව සඳහනක් තබා ගැනීම සඳහා සෑම සබ්මැරීනයකටම තමන්ගේම විචල්‍ය ගබඩාවක් ඇත. සම්පාදනය අවසානයේදී, ඒවා වෙළඳසැලේ ආරම්භයේ සිටම සාපේක්ෂ ඕෆ්සෙට් බවට පරිවර්තනය කර RAM හි සත්‍ය ලිපිනයන් ලබා දේ.

RAM ව්‍යුහය

Program counter
Subroutine locals
Operator locals (reused throughout)
Scratch variables
Result variable
Stack pointer
Stack
...

පහත් මට්ටමේ සම්පාදනය

පහළ මට්ටමේ සම්පාදක එකම දේ සමග ගනුදෙනු කිරීමට ඇත ඇත sub, call_sub, return, assign, ifහා while. මෙය වඩාත් පහසුවෙන් QFTASM උපදෙස් වලට පරිවර්තනය කළ හැකි කාර්යයන් ලැයිස්තුවකි.

sub

මෙය නම් කරන ලද සබ්මැරීනයක ආරම්භය හා අවසානය සොයා ගනී. පහත් මට්ටමේ සම්පාදකයා ලේබල් එකතු කරන අතර mainසබ්ට්‍රවුටින් සම්බන්ධයෙන් පිටවීමේ උපදෙස් එකතු කරයි (ROM අවසානය දක්වා පනින්න).

if හා while

යන දෙකම whileසහ ifඅඩු මට්ටමේ භාෂණ ලස්සන සරල: ඔවුන් මත පදනම්ව තම කොන්දේසි හා වෙත පනින්න සූචක ලබා ගන්න. whileලූප තරමක් වෙනස් වන අතර ඒවා සම්පාදනය කර ඇත

...
condition
jump to check
code
condition
if condtion: jump to code
...

call_sub හා return

බොහෝ ගෘහ නිර්මාණ මෙන් නොව, අප සම්පාදනය කරන පරිගණකයට තොගයක් තල්ලු කිරීම හා පිටවීම සඳහා දෘඩාංග සහාය නොමැත. මෙයින් අදහස් කරන්නේ තොගයෙන් තල්ලු කිරීම සහ පැනීම යන දෙකම උපදෙස් දෙකක් ගන්නා බවයි. පොපිං කිරීමේදී, අපි ස්ටක් පොයින්ටරය අඩු කර අගය ලිපිනයකට පිටපත් කරමු. තල්ලු කිරීමේ දී, අපි වර්තමාන තොග දර්ශකයේ ලිපිනයක සිට ලිපිනයට අගයක් පිටපත් කර වැඩි කරන්නෙමු.

සබ්ට්‍රවුටින් සඳහා වන සියලුම ප්‍රදේශවාසීන් සංයුක්ත වේලාවේදී තීරණය කරනු ලබන RAM හි ස්ථාවර ස්ථානයක ගබඩා කර ඇත. පුනරාවර්තන කටයුතු සිදු කිරීම සඳහා, ශ්‍රිතයක් සඳහා වන සියලුම ප්‍රදේශවාසීන් ඇමතුමක ආරම්භයේදීම තොගයට දමනු ලැබේ. එවිට සබ්ට්‍රවුටින් සඳහා වන තර්ක දේශීය ගබඩාවේ ඒවායේ ස්ථානයට පිටපත් කරනු ලැබේ. ආපසු ලිපිනයේ වටිනාකම තොගයට දමා සබ්ට්‍රවුටින් ක්‍රියාත්මක වේ.

returnප්‍රකාශයක් හමු වූ විට, තොගයේ ඉහළ කොටස කැපී පෙනෙන අතර වැඩසටහන් කවුන්ටරය එම අගයට සකසා ඇත. ඇමතුම් සබ්ට්‍රවුටින්හි දේශීයයන් සඳහා වන අගයන් වන්නේ තොගයෙන් ඉවතට ගොස් ඒවායේ පෙර ස්ථානයට ය.

assign

විචල්ය පැවරුම් සම්පාදනය කිරීමට පහසුම දේ වේ: ඒවා විචල්යයක් සහ අගයක් ගෙන තනි පේළියට සම්පාදනය කරයි: MLZ -1 VALUE VARIABLE

පැනීමේ ඉලක්ක පැවරීම

අවසාන වශයෙන්, සම්පාදකයා උපදෙස් වලට අමුණා ඇති ලේබල සඳහා පැනීමේ ඉලක්ක සකස් කරයි. ලේබලවල නිරපේක්ෂ පිහිටීම තීරණය වන අතර පසුව එම ලේබල සඳහා යොමු කිරීම් එම අගයන් සමඟ ප්‍රතිස්ථාපනය වේ. ලේබලයන් කේතයෙන් ඉවත් කර අවසානයේ උපදෙස් අංක සම්පාදනය කරන ලද කේතයට එකතු කරනු ලැබේ.

පියවරෙන් පියවර සම්පාදනය

දැන් අපි සියලු අදියරයන් පසු කර ඇත්තෙමු, පියවරෙන් පියවර සත්‍ය වැඩසටහනක් සඳහා සත්‍ය සම්පාදන ක්‍රියාවලියක් හරහා යමු.

#include stdint

sub main
    int a = 8
    int b = 12
    int c = a * b

හරි, සරලයි. එය වැඩසටහන අවසානයේ, පැහැදිලි විය යුතු a = 8, b = 12, c = 96. පළමුව, පහත සඳහන් කරුණු ඇතුළත් කිරීමට ඉඩ දෙන්න stdint.txt:

operator (int a + int b) -> int
    return __ADD__(a, b)

operator (int a - int b) -> int
    return __SUB__(a, b)

operator (int a < int b) -> bool
    bool rtn = 0
    rtn = __MLZ__(a-b, 1)
    return rtn

unsafe operator (int a * int b) -> int
    int rtn = 0
    for (int i = 0; i < b; i+=1)
        rtn += a
    return rtn

sub main
    int a = 8
    int b = 12
    int c = a * b

හරි, තරමක් සංකීර්ණයි. අපි ටෝකනයිසර් වෙත ගොස් එළියට එන දේ බලමු. මෙම අවස්ථාවෙහිදී, අපට ඇත්තේ කිසිදු ආකාරයක ව්‍යුහයකින් තොරව ටෝකන රේඛීය ප්‍රවාහයක් පමණි

NAME NAME operator
LPAR OP (
NAME NAME int
NAME NAME a
PLUS OP +
NAME NAME int
NAME NAME b
RPAR OP )
OP OP ->
NAME NAME int
NEWLINE NEWLINE
INDENT INDENT     
NAME NAME return
NAME NAME __ADD__
LPAR OP (
NAME NAME a
COMMA OP ,
NAME NAME b
RPAR OP )
...

දැන් සියලුම ටෝකන ව්‍යාකරණ විග්‍රහකය හරහා දමා එක් එක් කොටසේ නම් සහිත ගසක් ප්‍රතිදානය කරයි. කේතය කියවන පරිදි ඉහළ මට්ටමේ ව්‍යුහය මෙයින් පෙන්නුම් කෙරේ.

GrammarTree file
 'stmts': [GrammarTree stmts_0
  '_block_name': 'inline'
  'inline': GrammarTree inline
   '_block_name': 'two_op'
   'type_var': GrammarTree type_var
    '_block_name': 'type'
    'type': 'int'
    'name': 'a'
    '_global': False

   'operator': GrammarTree operator
    '_block_name': '+'

   'type_var_2': GrammarTree type_var
    '_block_name': 'type'
    'type': 'int'
    'name': 'b'
    '_global': False
   'rtn_type': 'int'
   'stmts': GrammarTree stmts
    ...

මෙම ව්‍යාකරණ ගස ඉහළ මට්ටමේ සම්පාදකයා විසින් විග්‍රහ කළ යුතු තොරතුරු සකස් කරයි. ව්‍යුහ වර්ග සහ විචල්‍යයක ගුණාංග වැනි තොරතුරු එයට ඇතුළත් ය. ව්‍යාකරණ ගස පසුව මෙම තොරතුරු ගෙන සබ්මැරීන සඳහා අවශ්‍ය විචල්‍යයන් පවරයි. ගස සියළුම ආදාන ඇතුළත් කරයි.

('sub', 'start', 'main')
('assign', int main_a, 8)
('assign', int main_b, 12)
('assign', int op(*:rtn), 0)
('assign', int op(*:i), 0)
('assign', global bool scratch_2, 0)
('call_sub', '__SUB__', [int op(*:i), int main_b], global int scratch_3)
('call_sub', '__MLZ__', [global int scratch_3, 1], global bool scratch_2)
('while', 'start', 1, 'for')
('call_sub', '__ADD__', [int op(*:rtn), int main_a], int op(*:rtn))
('call_sub', '__ADD__', [int op(*:i), 1], int op(*:i))
('assign', global bool scratch_2, 0)
('call_sub', '__SUB__', [int op(*:i), int main_b], global int scratch_3)
('call_sub', '__MLZ__', [global int scratch_3, 1], global bool scratch_2)
('while', 'end', 1, global bool scratch_2)
('assign', int main_c, int op(*:rtn))
('sub', 'end', 'main')

ඊළඟට, පහත් මට්ටමේ සම්පාදකයාට මෙම ඉහළ මට්ටමේ නිරූපණය QFTASM කේතය බවට පරිවර්තනය කළ යුතුය. RAM හි විචල්‍යයන් ස්ථාන පවරා ඇත:

int program_counter
int op(*:i)
int main_a
int op(*:rtn)
int main_c
int main_b
global int scratch_1
global bool scratch_2
global int scratch_3
global int scratch_4
global int <result>
global int <stack>

සරල උපදෙස් පසුව සම්පාදනය කෙරේ. අවසාන වශයෙන්, උපදෙස් අංක එකතු කරනු ලැබේ, එහි ප්‍රති ing ලයක් ලෙස ක්‍රියාත්මක කළ හැකි QFTASM කේතය.

0. MLZ 0 0 0;
1. MLZ -1 12 11;
2. MLZ -1 8 2;
3. MLZ -1 12 5;
4. MLZ -1 0 3;
5. MLZ -1 0 1;
6. MLZ -1 0 7;
7. SUB A1 A5 8;
8. MLZ A8 1 7;
9. MLZ -1 15 0;
10. MLZ 0 0 0;
11. ADD A3 A2 3;
12. ADD A1 1 1;
13. MLZ -1 0 7;
14. SUB A1 A5 8;
15. MLZ A8 1 7;
16. MNZ A7 10 0;
17. MLZ 0 0 0;
18. MLZ -1 A3 4;
19. MLZ -1 -2 0;
20. MLZ 0 0 0;

සින්ටැක්ස්

දැන් අපට ඇත්තේ හිස් භාෂාවයි, ඇත්ත වශයෙන්ම අපට එහි කුඩා වැඩසටහනක් ලිවීමට සිදුවේ. අපි පයිතන් මෙන් ඉන්ඩෙන්ටේෂන් භාවිතා කරන්නෙමු, තාර්කික කොටස් බෙදීම සහ ප්‍රවාහය පාලනය කරන්න. මෙයින් අදහස් කරන්නේ අපගේ වැඩසටහන් සඳහා සුදු අවකාශය වැදගත් බවයි. සෑම සම්පූර්ණ වැඩසටහනකටම සී වැනි භාෂාවල ක්‍රියාකාරිත්වය mainමෙන් ක්‍රියා කරන සබ්ට්‍රවුටින් main()ඇත. වැඩසටහන ආරම්භයේදීම ක්‍රියාත්මක වේ.

විචල්යයන් සහ වර්ග

පළමු වරට විචල්යයන් නිර්වචනය කළ විට, ඒවාට සම්බන්ධ වර්ගයක් තිබිය යුතුය. දැනට අර්ථ වර්ග intහා boolඅර්ථ පෙලගැස්මක් සඳහා කාරක රීති නමුත් සම්පාදක නොවේ සමග.

පුස්තකාල සහ ක්‍රියාකරුවන්

stdint.txtමූලික ක්‍රියාකරුවන් අර්ථ දක්වන පුස්තකාලයක් ඇත. මෙය ඇතුළත් කර නොමැති නම්, සරල ක්‍රියාකරුවන් පවා අර්ථ දැක්විය නොහැක. අපට මෙම පුස්තකාලය භාවිතා කළ හැකිය #include stdint. stdintනිර්වචනය කරන ක්රියාකරුවන් වැනි +, >>සහ පවා *හා %සෘජු QFTASM opcodes වේ වත් වන.

QFTASM ඔප් කේත සෘජුවම කැඳවීමට භාෂාව ඉඩ දෙයි __OPCODENAME__.

එකතු කිරීම stdintලෙස අර්ථ දක්වා ඇත

operator (int a + int b) -> int
    return __ADD__(a, b)

S +දෙකක් ලබා දුන් විට ක්‍රියාකරු කරන්නේ කුමක්ද යන්න නිර්වචනය කරයි int.


3
හැකි මම වඩා ඉල්ලා, ඇයි එය ජීවිතයේ කොන්වෝයි ගේ ක්රීඩාවෙහි wireworld වැනි CA නිර්මාණය කිරීමට තීරණය කරන ලදී මේ පරිපථ භාවිතා නව ප්රොසෙසරයක් නිර්මාණය නැවත භාවිතය / දැනට පවතින cgol විශ්ව පරිගණකය retrofit මේ එක ?
eaglgenes101

6
ag eaglgenes101 ආරම්භකයින් සඳහා, භාවිතා කළ හැකි වෙනත් විශ්වීය පරිගණකවල පැවැත්ම පිළිබඳව අපගෙන් බොහෝ දෙනෙක් දැන සිටි බව මම නොසිතමි. බහු මිශ්‍ර නීති සහිත වයර් වර්ල්ඩ් වැනි සීඒ සඳහා අදහස පැමිණියේ මෙටසෙල් සමඟ සෙල්ලම් කිරීමේ ප්‍රති result ලයක් වශයෙනි (මම විශ්වාස කරමි - මෙම අදහස ඉදිරිපත් කළේ ෆියි). එතැන් සිට එය අප විසින් නිර්මාණය කරන ලද දේට තාර්කික ප්‍රගතියක් විය.
මෙගෝ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.