Тұрақты (компьютерлік бағдарламалау) - Constant (computer programming) - Wikipedia

Жылы компьютерлік бағдарламалау, а тұрақты Бұл мәні оны өзгерту мүмкін емес бағдарлама қалыпты орындау кезінде, яғни мәні болып табылады тұрақты.[a] Идентификатормен байланыстырғанда тұрақты «аталды» деп аталады, дегенмен «тұрақты» және «атаулы констант» ұғымдары жиі ауыспалы мағынада қолданылады. Бұл а айнымалы, бұл қалыпты орындалу кезінде өзгертілуі мүмкін мәні бар идентификатор, яғни мән айнымалы. Тұрақтылар бағдарламашылар үшін де, құрастырушылар үшін де пайдалы: бағдарламашылар үшін олар өзін-өзі құжаттау код және ой жүгіртуге мүмкіндік береді дұрыстық, ал компиляторлар үшін олар мүмкіндік береді құрастыру уақыты жәнежұмыс уақыты тұрақтылық болжамдарының бұзылмағандығын тексеретін және кейбіреулеріне мүмкіндік беретін немесе жеңілдететін тексерулер компиляторды оңтайландыру.

Тұрақты деген жалпы ұғымды әр түрлі нақты іске асырулар бар, олардың көбіне назардан тыс қалады. Ең маңыздылары: компиляция уақыты (статикалық мәні бар) тұрақтылары, жұмыс уақыты (динамикалық мәні бар) тұрақтылары, өзгермейтін нысандар, және тұрақты түрлері (const ).

Компиляция уақытының тұрақты мысалдарына математикалық тұрақтылар, стандарттардан алынған мәндер жатады (мұнда максималды беріліс блогы ) немесе ішкі конфигурация мәндері (мұнда бір жолға таңба ), мысалы, C мысалдары:

const жүзу PI = 3.1415927;  // максималды бір өзгермелі дәлдікconst қол қойылмаған int МТУ = 1500;  // Ethernet v2, RFC 894const қол қойылмаған int БАҒАНДАР = 80;

Жұмыс уақытының тұрақтыларының типтік мысалдары - бұл функцияға кірістер негізінде есептелген мәндер, мысалы C ++ мысалы:

жарамсыз f(std::жіп с) {  const өлшем_т л = с.ұзындығы();  // ...}

Пайдаланыңыз

Кейбіреулер бағдарламалау тілдері мысалы, тұрақты және айнымалы символдар арасындағы айқын синтаксистік айырмашылықты жасаңыз тапсырма тұрақтыға синтаксистік қате болу керек, ал басқа тілдерде олар синтаксистік жағынан бірдей болып саналады (екеуі де қарапайым), ал емдеудегі айырмашылық семантикалық болып табылады (идентификаторға тағайындау синтаксистік тұрғыдан жарамды, ал егер идентификатор тұрақты болса мағыналық жағынан жарамсыз).

Тұрақтының мәні бір рет анықталады және оған бағдарлама бойынша бірнеше рет сілтеме жасауға болады. Бір мәнді бірнеше рет көрсетудің орнына тұрақты мәнді қолдану кодты техникалық қызмет көрсетуді жеңілдетуі мүмкін өзіңізді қайталамаңыз ) мәнге мағыналы атау беру арқылы дербес құжатталуы мүмкін, мысалы, PI 3.1415926 орнына.

Литералдармен және макростармен салыстыру

Бағдарламаны орындау кезінде өзгермейтін мәліметтер мәнін білдірудің бірнеше негізгі тәсілдері бар, олар әр түрлі программалау тілдеріне сәйкес келеді. Бір қарапайым тәсілі - жай жазу сөзбе-сөз бағдарлама кодына нөмір, таңба немесе жол, ол тікелей C, C ++ және ұқсас тілдерде.

Ассемблер тілінде әріптік сандар мен таңбалар микропроцессорлардың көпшілігінде қол жетімді «жедел режим» нұсқаулығының көмегімен жасалады. «Тез» атауы -дан бірден қол жетімді болатын мәндерден туындайды нұсқаулық ағыны, оларды жад мекен-жайын іздеу арқылы жанама жүктеуге қарағанда.[1] Екінші жағынан, жолдар мен массивтер сияқты микропроцессордың сөз ұзындығынан ұзын мәндер жанама түрде өңделеді және ассемблерлер әдетте осындай мәліметтер кестелерін бағдарламаға енгізу үшін «деректер» жалған-опын ұсынады.

Тағы бір тәсілі - символикалық белгіні анықтау макро. Көптеген жоғары деңгейлі бағдарламалау тілдері және көптеген ассемблерлер бағдарламалаушы негізінен бастапқы файлдың басында немесе жеке анықтамалық файлда әртүрлі мәндердің аттарын анықтай алатын макро құралды ұсынады. Содан кейін препроцессор осы атауларды компиляциядан бұрын тиісті мәндермен ауыстырады, нәтижесінде жедел режимнің жылдамдық артықшылықтарымен әріптік белгілерді қолдануға функционалды ұқсас нәрсе шығады. Барлық мәндер сөзбе-сөз жазылған кодты жүргізу қиынға соғуы мүмкін, егер мән кез-келген қайталанатын немесе айқын емес түрде қолданылса, ол көбінесе макро ретінде орындалады.

Үшінші әдіс - айнымалыны «тұрақты» деп жариялау және анықтау. A ғаламдық немесе статикалық айнымалы сияқты квалификациялық кілт сөзімен жариялауға болады (немесе жинақта анықталған символ) const, тұрақты, немесе ақтық, оның мәні компиляция кезінде орнатылатындығын және жұмыс уақытында өзгермеуі керек екенін білдіреді. Компиляторлар инсталляцияланбаған деректер сақталатын мәліметтер бөліміне қарағанда, статикалық тұрақтыларды, әдетте, кодтың өзімен бірге объектілік файлдың мәтіндік бөліміне қояды. Кейбір компиляторлар тұрақтыға арналған бөлімді шығара алады. Мұндай тұрақтылардың қате көрсеткіштермен қайта жазылуын болдырмау үшін бұл аймаққа жадты қорғауды қолдануға болады.

Бұл тұрақтылар литералдардан бірнеше жағынан ерекшеленеді. Компиляторлар макростағы сияқты орындалатын файлға жайылудың орнына тұрақты белгіні жадының бір орнына орналастырады. Бұл жедел режимнің жылдамдық артықшылықтарын болдырмаса да, жад тиімділігінде артықшылықтар бар, және отладчиктер жұмыс кезінде осы тұрақтылармен жұмыс істей алады. Сондай-ақ, макростар кездейсоқ түрде C және C ++ тілдеріндегі қайшылықты тақырыптар файлдарымен қайта анықталуы мүмкін, компиляция кезінде қайшылықты тұрақтылар анықталады.

Тілге байланысты тұрақтылар типтелмеген немесе типтелген болуы мүмкін. C және C ++ тілдерінде макростар біріншісін ұсынады, ал const соңғысын ұсынады:

# PI 3.1415926535 анықтауconst жүзу pi2 = 3.1415926535;

Ада қаласаңыз, қолдануға болатын әмбебап сандық типтер бар:

pi : тұрақты := 3.1415926535;pi2 : тұрақты жүзу := 3.1415926535;

типтелмеген нұсқасы әр қолданған кезде тиісті түрге жасырын түрлендіріле отырып.[2]

Динамикалық бағаланатын тұрақтылар

Сонымен қатар статикалық тұрақтылар Жоғарыда сипатталған көптеген процедуралық тілдер, мысалы Ada және C ++ инициализациялау кезінде жасалатын глобальды айнымалыларға, стек немесе регистрлерде жұмыс кезінде автоматты түрде жасалатын жергілікті айнымалыларға деген тұрақтылық тұжырымдамасын кеңейтеді. , және функциялардың тақырыптарындағы параметрлер тізіміне.

Динамикалық бағаланатын тұрақтылар айнымалыны жадының белгілі бір аймағында орналасқан деп белгілемейді және компиляция кезінде орнатылған мәндер де жоқ. Сияқты C ++ кодында

жүзу функциясы(const жүзу БАРЛЫҒЫ) {    const жүзу XYZ = someGlobalVariable*someOtherFunction(БАРЛЫҒЫ);    ...}

тұрақты инициализацияланған өрнек өздері тұрақты емес. Бағдарламаның заңдылығы немесе мағыналық дәлдігі үшін тұрақтылықты қолдану қажет емес, бірақ оның үш артықшылығы бар:

  1. Орнатылғаннан кейін нысан әрі қарай өзгертілмейтіні оқырманға түсінікті
  2. Нысанның мәнін өзгерту әрекетін (бағдарлама логикасын толық түсінбейтін кейінгі бағдарламашылар жасайды) компилятор қабылдамайды
  3. Құрастырушы объектінің мәні құрылғаннан кейін өзгермейтінін біле отырып, кодты оңтайландыруды орындай алады.[3]

Динамикалық бағаланған тұрақтылар тілдік ерекшелік ретінде пайда болды ALGOL 68.[3] Ada және C ++ кодтарын зерттеу көрсеткендей, динамикалық мәндегі тұрақтылар сирек қолданылады, әдетте объектілердің 1% -ы немесе одан азы, егер оларды әлдеқайда көп қолдануға болатын болса, өйткені 40-50% жергілікті, сыныптық емес объектілер іс жүзінде өзгермейтін болып табылады. бір рет жасалған.[3][4] Екінші жағынан, мұндай «өзгермейтін айнымалылар» әдепкі болып табылады функционалды тілдер өйткені олар жанама әсері жоқ бағдарламалау стильдерін қолдайды (мысалы, рекурсия) немесе жасамайды көптеген декларациялар өзгермейді әдепкі бойынша. Кейбір тілдер деп аталады таза функционалды тіпті жанама әсерлерге толық тыйым салыңыз.

Тұрақтылық функцияны жариялауда жиі қолданылады, өйткені объект сілтеме арқылы өткен кезде шақырылған функция оны өзгертпейді деген уәде ретінде. Синтаксиске байланысты көрсеткіш немесе көрсетілген нысан тұрақты болуы мүмкін, бірақ әдетте соңғысы қажет. Әсіресе C ++ және C тілдерінде бағдарлама бойында сәйкес мәліметтер құрылымдарының тұрақты болуын қамтамасыз ету пәні деп аталады тұрақтылық.

Тұрақты функция параметрлері

C / C ++ тілінде функцияның немесе әдістің параметрін тұрақты деп жариялауға болады. Бұл бірінші тағайындаудан кейін бұл параметрді өзгерту мүмкін еместігінің кепілі (абайсызда). Егер параметр алдын-ала анықталған (ендірілген) тип болса, онда ол мәні бойынша шақырылады және өзгерту мүмкін емес. Егер бұл пайдаланушы анықтаған тип болса, айнымалы көрсеткіштің адресі болып табылады, оны өзгерту мүмкін емес. Алайда объектінің мазмұнын шектеусіз өзгертуге болады. Параметрлерді тұрақты деп жариялау осы мәнге сигнал беру тәсілі болуы мүмкін керек өзгертілмейді, бірақ бағдарламашы объектіні модификациялауды компилятор жасай алмайтынын есте ұстауы керек.

Бұл функциядан басқа C / C ++ тілінде функцияны немесе әдісті келесідей жариялауға болады const. Бұл функциялардың немесе әдістердің жергілікті айнымалылардан басқа ешнәрсені өзгертуіне жол бермейді.

C # -де кілт сөз const бар, бірақ функция параметрлері үшін бірдей әсер етпейді, өйткені бұл C / C ++ тіліндегі жағдай. Алайда, компиляторды тексеру үшін «араластырудың» тәсілі бар, бірақ ол аздап болса да қиынға соғады.[5]

Дәл осындай эффект алу үшін алдымен екі интерфейс анықталады

қоғамдық интерфейс Оқуға болады{    IValueInterface мән { алу; }}қоғамдық интерфейс IWritable : Оқуға болады{    IValueInterface мән { орнатылды; }}қоғамдық сынып AnObject : IWritable{    жеке Бетон мәні _aValue;    қоғамдық IValueInterface мән    {        алу { қайту _aValue; }        орнатылды { _aValue = мәні сияқты Бетон мәні; }    }}

Содан кейін анықталған әдістер тек оқуға немесе оқуға / жазуға мүмкіндік беретін дұрыс интерфейсті таңдайды:

қоғамдық жарамсыз бірдеңе(Оқуға болады өзгермелі){    // a айнымалысын өзгерту мүмкін емес!}қоғамдық жарамсыз doSomethingElse(IWritable өзгермелі){    // Айнымалыны өзгерте алады, сондықтан абай болыңыз!}

Нысанға бағытталған тұрақтылар

Деректердің тұрақты құрылымы немесе объектісі «деп аталадыөзгермейтін «объектіге бағытталған тілде. Өзгермейтін объект бағдарламаны жобалауда кейбір артықшылықтар береді. Мысалы, оны тек көшіргішті немесе сілтемені көшіріп, уақытты қажет ететін көшіру операциясынан аулақ болу және жадыны сақтау арқылы» көшіруге ”болады.

C ++ сияқты объектіге бағытталған тілдер тұрақтылықты одан әрі кеңейтеді. Құрылымның немесе сыныптың жеке мүшелері, егер сынып болмаса да, const бола алады. Керісінше, өзгеретін кілт сөзі, егер нысан инстанцияланған болса да, сынып мүшесін өзгертуге мүмкіндік береді const.

Тіпті функциялар C ++ тілінде const болуы мүмкін. Мұндағы мағына мынада: const ретінде құрылған объект үшін тек const функциясы шақырылуы мүмкін; const функциясы өзгермейтін деректерді өзгертпейді.

C # -де екеуі де бар const және а тек оқыңыз біліктілік; оның const тек компиляция уақытының тұрақтыларына арналған, ал оқылымды тек конструкторларда және басқа жұмыс уақытының қосымшаларында қолдануға болады.

Java

Java-да іріктеу бар ақтық бұл сілтемені өзгертуге жол бермейді және оның ешқашан басқа нысанды көрсетпейтіндігіне көз жеткізеді. Бұл сілтеме жасалған объектінің өзін өзгертуге жол бермейді. Java's ақтық негізінен а-ға тең const көрсеткіш C ++ тілінде. Ол басқа ерекшеліктерін қамтамасыз етпейді const.

Жылы Java, іріктеу ақтық зардап шеккен деректер мүшесі немесе айнымалы төмендегідей тағайындалмайтынын айтады:

ақтық int мен = 3;мен = 4; // Қате! «Соңғы» нысанды өзгерту мүмкін емес

Оны компиляторлар шешуі керек, мұндағы айнымалы ақтық маркер инициализацияланған, оны тек бір рет орындау керек, әйтпесе класс құрастырмайды. Java's ақтық және C ++ const қарабайыр айнымалылармен қолданған кезде кілт сөздердің мағынасы бірдей.

const int мен = 3; // C ++ декларациясымен = 4; // Қате!

Көрсеткіштерді ескере отырып, а ақтық Java-да сілтеме ұқсас нәрсені білдіреді const C ++ тіліндегі көрсеткіш. C ++ тілінде «» деп жариялауға боладыconst көрсеткіш түрі ».

Фу *const бар = mem_location; // const көрсеткішінің типі

Мұнда, бар декларация кезінде инициализациялануы керек және оны өзгерту мүмкін емес, бірақ ол нені білдіреді болып табылады өзгертілетін. Яғни * бар = мәні жарамды. Бұл жай ғана басқа орынды көрсете алмайды. Java-дағы соңғы сілтемелер бірдей жұмыс істейді, тек оларды инициализацияланбаған деп жариялауға болады.

ақтық Фу мен; // Java декларациясы

Ескерту: Java сілтемелерді қолдамайды.[6]Себебі көрсеткіштер (шектеулермен) - бұл Java-дағы объектілерге қол жеткізудің әдепкі тәсілі, ал Java оларды көрсету үшін жұлдыздарды қолданбайды. Мысалға, мен соңғы мысалда нұсқаушы бар және данамен қатынасу үшін оны пайдалануға болады.

Сондай-ақ, C ++ тіліндегі «тек оқуға арналған» мәліметтерге нұсқау жариялауға болады.

const Фу *бар;

Мұнда бар кез келген уақытта, кез-келген нәрсені көрсету үшін өзгертілуі мүмкін; тек көрсетілген мәнді өзгерту мүмкін емес арқылы бар Java-да баламалы механизм жоқ. Сонымен, жоқ const әдістер. Интерактивті интерфейстерді қолдану және классқа тек оқуға болатын интерфейсті анықтау және оны айналдыру арқылы жүйенің айналасында объектілерді өзгертуге болмайтындай етіп қамтамасыз етуге болады. Java коллекцияларының негіздері а-ның өзгертілмейтін орамасын жасау тәсілін ұсынады Жинақ арқылы Collections.unmodifiableCollection () және ұқсас әдістер.

Java-дегі әдістерді жариялауға болады «ақтық«, бірақ бұл мүлдем байланысты емес мағынаны білдіреді - бұл подкласстарда әдісті жоққа шығаруға болмайтынын білдіреді.

C #

Жылы C #, іріктеу тек оқыңыз деректер мүшелеріне бірдей әсер етеді ақтық Java және const C ++ тілінде жасайды; The const модификатор C # әсеріне ұқсас әсер етеді (әлі типтелген және ауқымды) # анықтау C ++ тілінде. (Java-ның басқа, мұраны тежейтін әсері ақтық әдістерге және сыныптарға қолданған кезде үшінші кілт сөзінің көмегімен C # индукцияланған, мөрмен бекітілген.)

C ++ тілінен айырмашылығы, C # әдістері мен параметрлерін белгілеуге жол бермейді const. Сонымен қатар, тек оқуға арналған ішкі сыныптарды айналып өтуге болады .NET Framework өзгермелі коллекцияларды өзгермейтін жинақтарға түрлендіруге қолдау көрсетеді, олар тек оқуға арналған орам ретінде берілуі мүмкін.

Парадигма бойынша

Тұрақтыларды емдеу айтарлықтай өзгереді бағдарламалау парадигмасы. Тұрақтылық - бұл C ++ сияқты императивті тілдерде мәселе, себебі әдепкі бойынша атауларды байланыстыру әдетте жасайды айнымалылар, бұл әр түрлі болуы мүмкін, аты айтып тұрғандай, және осылайша біреу міндеттемені тұрақты етіп белгілегісі келсе, оған қосымша нұсқау қажет.[b] Бағдарламалау тіліндегі басқа парадигмаларға қатысты мәселелер туындайды, олардың кейбір конст-дәлдігінің аналогтары табылған.

Жылы функционалды бағдарламалау, деректер әдепкі бойынша айнымалы емес, әдетте тұрақты болады. Айнымалыға мән берудің орнына (аты және ықтимал өзгермелі мәні бар сақтау орны), атаудың мәнге байланысын жасайды, мысалы рұқсат етіңіз диалектілерінде құрастыру Лисп. Кейбір функционалды тілдерде, әсіресе мультипарадигма сияқты Жалпы Лисп, деректерді өзгерту әдеттегі жағдай, ал басқаларында олар болдырмайды немесе ерекше болып саналады; бұл жағдай Схема (басқа Лисп диалектісі) орнатылды! деректерін өзгерту үшін салу ! леп белгісі осыған назар аударады. Мұндай тілдер тұрақтылыққа емес, модификацияға назар аудара отырып, конст-дәлдік мақсаттарына қол жеткізеді.

Бірқатар объектіге бағытталған тілдер (OOL) an ұғымы бар өзгермейтін нысан, әсіресе жолдар сияқты негізгі типтер үшін қолданылады; маңызды мысалдарға Java, JavaScript, Python және C # кіреді. Бұл тілдер пайдаланушы анықтаған типтерді өзгермейтін ретінде белгілеуге болатындығына байланысты өзгереді және объектінің немесе түрдің белгілі бір өрістерін (атрибуттарын) өзгермейтін ретінде белгілеуге мүмкіндік беруі мүмкін.

Нысанға бағытталған және функционалды стильдерге мүмкіндік беретін кейбір мульпарадигма тілдерінде бұл екі ерекшелік те біріктірілуі мүмкін. Мысалы, in OCaml нысан өрістері әдепкі бойынша өзгермейтін болып табылады және олармен нақты белгіленуі керек өзгеретін кілт сөзі өзгермелі болуы керек, ал Scala-да байланыстыру анық өзгермейді, анықталады вал «мән» үшін немесе анық өзгеретін, анықталған var «айнымалы» үшін.

Конвенцияларға атау беру

Конвенцияларға атау беру өйткені тұрақтылар әр түрлі болады. Кейбіреулер оларды кез-келген басқа айнымалы сияқты жай атайды. Басқалары бас әріптер мен астыңғы сызықтарды тұрақтылар үшін символдық макростар үшін дәстүрлі қолданысына ұқсас етіп пайдаланады, мысалы. SOME_CONSTANT.[7] Жылы Мажар жазбасы, «k» префикс тұрақтыларды да білдіреді макростар және санамаланған түрлері.

Бір күшейтілген конвенция - бұл Рубин, бас әріптен басталатын кез-келген айнымалы тұрақты деп есептеледі, соның ішінде сынып атаулары.

Сондай-ақ қараңыз

Ескертулер

  1. ^ Кейбір жағдайларда тұрақтылықты күтуді болдырмауға болады, мысалы. қолдану өзін-өзі өзгертетін код немесе қайта жазу арқылы жад орны мән сақталатын жерде.
  2. ^ Бұл әмбебап емес: Ada-да кіріс параметрлері және цикл параметрлері, мысалы, тұрақты емес.

Әдебиеттер тізімі

  1. ^ Мыс. IBM жүйелері туралы ақпарат. Нұсқаулық жинағы - PowerPC үшін ассемблер тіліне сілтеме.
  2. ^ Бук, Греди (1983). Ada-мен бірге бағдарламалық жасақтама. Бенджамин Каммингс. бет.116–117. ISBN  0-8053-0600-5.
  3. ^ а б c Шиллинг, Джонатан Л. (сәуір 1995). «Динамикалық бағаланған тұрақтылар: қолданылмаған тіл ерекшелігі». SIGPLAN ескертулері. 30 (4): 13–20. дои:10.1145/202176.202177.
  4. ^ Перкинс, Дж. А. Бағдарламалау практикасы: Әскери-әуе күштері, армия және теңіз флотына арналған Ада көзін талдау. TRI-Ada '89 жинағы. 342–354 бет. дои:10.1145/74261.74287.
  5. ^ Тимви (2010-09-09). «C # функциясының оқу параметрлері (» const «тәрізді)». https://stackoverflow.com/: Stack overflow. Алынған 2012-05-06. [...] Сонда сіз параметр түрі «айтатын» әдістерді жариялай аласыз, ол айнымалыны өзгертуді жоспарлап жатыр ма, жоқ па :. [...] Бұл C ++ тіліндегі тұрақтылыққа ұқсас компиляция уақытын тексеруді имитациялайды. Эрик Липперт дұрыс атап көрсеткендей, бұл өзгермейтіндікпен бірдей емес. Бірақ C ++ бағдарламашы ретінде сіз мұны білесіз деп ойлаймын.
  6. ^ «Java әзірлеушілеріне арналған Oracle Technology Network | Oracle Technology Network | Oracle». Java.sun.com. 2013-08-14. Алынған 2013-08-18.
  7. ^ Microsoft Office XP Developer: тұрақты аттар