Маштабуецца моў праграмавання кампутара
Там заўсёды будзе тое, што мы хочам сказаць, у нашых праграмах, што ва ўсіх вядомых мовах можна толькі сказаць, дрэнна.
- Алан Перлис
УВАГА
Калі вы збіраецеся адправіць мне камэнтары з нагоды гэтага артыкула, калі ласка, майце некалькі рэчаў на ўвазе:
Я напісаў гэты артыкул даўно (у 2001 годзе, калі не змяняе памяць), і, шчыра кажучы я не тое, што зацікаўлены ў абмеркаванні яго больш. У гэтыя дні я аддаю перавагу пісаць праграмы і вучыць мовы праграмавання, чым напісаць думкі.
Артыкул сапраўды адлюстроўвае маё меркаванне, як пра час, калі я пісаў яе, але не можа дакладна адлюстроўвае маё бягучае меркаванне.
Я не адпраўляў гэтую артыкул reddit.com або на любы іншы сайт. У мяне няма цікавасьці ў барабанах да трафік на гэтай старонцы.
Я атрымаў некалькі дзіўна варожых лістоў ад людзей, якія не згодныя са мной. Для гэтых людзей: калі ласка, зразумейце, што гэта гучныя словы, частка думкі. Калі вы не згодны са мной, не саромейцеся напісаць уласны кавалак меркаванне. Але лаянку і тролінг толькі прымушае вас выглядаць дрэнна і падрывае ўласныя аргументы. Я не буду адказваць на троляў, нават калі ў іх ёсць некалькі добрых кропак зрабіць. Калі вы не можаце казаць ветліва, казаць каму-небудзь яшчэ. Я ўвесь час здзіўлены тым, як злосны параўнальнага абмеркавання моў праграмавання можа атрымаць. Не мы ўсе разам? Ёсць больш важныя рэчы, каб атрымаць розуму, як рак, голаду ў свеце, распаўсюджванне ядзернай зброі, і г.д.
Тым не менш, я вітаю канструктыўныя заўвагі. На самай справе, я атрымаў шэраг праніклівыя каментары, і я дадаў некаторыя заўвагі ў канцы коратка некаторыя з зваротнай сувязі я атрымаў, а таксама некаторыя спосабы мае погляды перайшлі, так як я першапачаткова напісаў.
Увядзенне
Праграмісты часта выкарыстоўваюць словы, каб апісаць
маштабуюцца пажадана асаблівасць праграмы або алгарытму. Ідэя ў тым, што тое, што з'яўляецца маштабуецца не працуе толькі для вельмі маленькіх працоўных месцаў маштабу, але гэтак жа эфектыўна (або амаль так жа эфектыўна), калі праца ў пытанні значна больш (або, часцей, калі праца расце ад малая, каб быць вялікім ). Трывіяльны прыклад дрэнны маштабаванасці можа быць неэфектыўным алгарытм, які выкарыстоўваецца ў прататыпе рэалізацыі праграмы. Ён выдатна працуе, пакуль толькі вельмі невялікія наборы дадзеных выкарыстоўваюцца, але яна выходзіць са строю пры вялікіх набораў дадзеных выкарыстоўваюцца таму, што вылічэнне займае так шмат часу, што праграма эфектыўна пацерпіць правал. Гэты выгляд маштабаванасць добра разумеюць любы прыстойны праграміст. Розныя віды маштабаванасць прадстаўлена архітэктура камп'ютэрнай праграмы. Праграмы, якія не могуць быць лёгка пашырана, каб справіцца з новымі патрабаваннямі называецца
далікатным, які з'яўляецца супрацьлегласцю маштабаванасць. Так як эфектыўна ўсе праграмы, якія паспяхова растуць новыя часткі, nonscalable праграмы звычайна патрабуюць цалкам перапісаны пры змене патрабаванняў, якія вельмі марнатраўна. Звычайнай прычынай для такога роду не-дрэнны маштабаванасці абстракцыі дызайн, занадта шмат прынцыповых праектных рашэнняў былі правадных ў код ў вельмі многіх месцах, што цяжка мяняць іх усё, не уводзячы шмат памылак. Шмат, шмат кніг было напісана пра добры дызайн праграмы; класіка Абельсон і Суссман
Структура і інтэрпрэтацыя кампутарных праграм, якая ахоплівае гэта і многае іншае цікавы матэрыял, а таксама і вельмі рэкамендуецца. Але гэта не тое, што я хачу пагаварыць тут. Тое, што я хачу гаварыць пра тое, што робіць
мовы праграмавання кампутара маштабуюцца ці не. Я хачу паказаць, што паняцце маштабаванасць гэтак жа справядліва, калі прымяняюцца да моў праграмавання, як гэта калі прымяняецца да праграм або алгарытмаў. Я таксама абмеркаваць шэраг вядомых і не вельмі вядомых моў праграмавання З гэтага пункту гледжання і даць канкрэтныя рэкамендацыі, а таксама абмеркаваць некаторыя сацыяльныя фактары, якія перашкаджаюць прагрэсу ў гэтай галіне.
Што з'яўляецца маштабуюцца мова кампутара?
Прасцей кажучы, маштабуюцца кампутарны мова з'яўляецца мовай, які можна запісаць вельмі вялікіх праграм у (і пашырыць вельмі вялікіх праграм, якія ўжо былі напісаныя), не адчуваючы неапраўданай колькасць болю. У маштабуюцца мова праграмавання, цяжкасці кіравання складанасць праграмы расце прыкладна лінейна з памерам праграмы. І наадварот, nonscalable мова кампутар, у якім павелічэнне памераў і маштабаў праблемы прыводзіць да таго, праграмы значна складаней у кіраванні
(г.зн. складанасць праграмы расце значна больш, чым лінейна з яго памер).
Аспекты мова праграмавання, які ўплывае на маштабаванасць
Вываз смецця: вельмі, вельмі добра
Вываз смецця (GC) азначае, што кампутарны мова (у літаральным сэнсе, якая выконвае сістэмы кампутара мовы) аўтаматычна кіруе ўтылізацыі ("Вызваленне") памяці, якія больш не выкарыстоўваюцца. Гэта
велізарная перамога для праграміста, і можа значна павысіць маштабаванасць мове. Прычына гэтага простая. Гэта, як правіла, відавочна, дзе трэба вылучыць памяць. Гэта можа быць вельмі цяжка дакладна ведаць, калі гэта бяспечна для яго вызвалення. Гэта асабліва дакладна, калі спасылкі на выдзеленай памяці перадаюцца па ўсім, вярнуўся з функцый, якія захоўваюцца ў некалькіх структур дадзеных, якія затым выдаліць (або няма), і г.д. і да т.п. Наступствы гэтага вельмі падступныя. Мовы без GC няяўна перашкаджаць праграміста ад выкарыстання ўсіх, акрамя найпростых структур дадзеных, так як часцей за ўсё, праблемы кіравання памяццю хутка становіцца невырашальнай пры выкарыстанні больш складаных структур дадзеных. Што звычайна адбываецца на практыцы ў тым, што праграміст рулонах яго / яе уласны (дрэнна) зборшчык смецця (магчыма, лічыльнік спасылак), з прадукцыйнасцю, што, як правіла, горш, чым тое, што вы атрымаеце, калі вы выкарыстоўвалі мову з GC ўбудаванымі
Я бачыў дастаткова яркі прыклад гэтага нядаўна. Адна з рэчаў, я прафесійна вучыць мову праграмавання З у Каліфарнійскім тэхналагічным інстытуце студэнтаў. Я падкрэсліў, наколькі важна, каб заўсёды вольнай памяці, якія былі вылучаныя. Аднак, многія з маіх студэнтаў проста праігнараваў мяне, і іх код быў завалены уцечак памяці. Я так стаміўся ад запісу "гэты код мае уцечкі памяці тут" на іх заданні, якія я напісаў вельмі просты праверкі уцечкі памяці. Яны зараз павінны пісаць код, які праходзіць праз уцечку памяці праверкі без якіх-небудзь уцечак паведаміў, перш чым яны прадставяць свае заданні. Тым не менш, я быў некалькі расчараваны тым, што мае ўласныя адказы на заданні было некалькі тонкіх уцечкі памяці, як добра! Паколькі ў мяне ёсць больш за дзесяць гадоў вопыту праграмавання C, і працаваў на некалькіх вельмі буйных праектаў, гэта кажа мне, што ручное кіраванне памяццю значна цяжэй, чым я раней меркавалася яго бачыць.
Існуе кошт GC, як у часе і прасторы эфектыўнасці. Добра прадуманая зборшчыкі смецця (асабліва пакаленняў ГК) можа быць надзвычай эфектыўным (больш эфектыўным, напрыклад, чым наіўна падыходы, такія як падлік спасылак). Аднак, для таго каб зрабіць гэта яны, як правіла, значна больш прасторы звычаі, чым праграмы без GC (я чуў ацэнак парадку 50% больш агульнай плошчы выкарыстоўваецца). З іншага боку, праграма, уцечкі памяці мае найбольшую выкарыстанне прасторы ўсіх. Я выдаткаваў занадта шмат у маім жыцці паляванне уцечкі памяці ў вялікіх праграмах C, і ў мяне няма цікавасці працягваць рабіць гэта.
У заключэнне, я хацеў бы сказаць, што з усіх пунктаў я абмяркоўваю тут, GC з'яўляецца найбольш важным для забеспячэння таго, каб мова праграмавання з'яўляецца маштабаванасць. Менавіта таму праграмісты, якія пераязджаюць з мовы без GC (напрыклад C + +) да аднаго з прыкладна адпавядае абстрактнае улады, але з GC (напрыклад Java) нязменна сказаць, наколькі шчаслівымі яны цяпер, што яны не павінны турбавацца аб кіраванні памяццю і можа засяродзіцца на алгарытмы яны спрабуюць напісаць. Асабіста я ўпадабаў бы цягнуць мае ўласныя зубы, чым напісаць вялікі праект у мове без GC.
Прамы доступ да памяці і арыфметыку паказальнікаў: вельмі дрэнна
Некаторыя мовы праграмавання, у прыватнасці З і З + +, дазваляе праграмісту непасрэдна ўзаемадзейнічаюць з адрасамі памяці праз паказальнікі, а таксама дазваляе арыфметычныя аперацыі над паказальнікамі (павялічваюцца і декремента паказальніка зменных). Гэты выгляд праграмавання на ўзроўні нізкіх часам неабходна
(напрыклад, пры напісанні драйвераў прыладаў), а часам і проста карыснай
(напрыклад, пры мікра-аптымізацыі кода, які павінен працаваць як мага хутчэй). Аднак, мой (недасканалыя) разуменне гэтага пытання з'яўляецца тое, што праграмаванне з паказальнікамі робіць дакладны збор смецця немагчыма, або амаль так. Існуе выгляд GC называлі "кансерватарам" зборкі смецця (
тут гэта свабодная рэалізацыя Бэм-Демерс кансерватыўнай ГК), якія могуць працаваць з мовамі, як C і C + +. Гэта, вядома, лепш, чым нічога, але Ёсць ніякіх гарантый, што ўся памяць будзе ажыццяўляцца правільна
(гэта значыць уцечкі памяці, малаверагодна, але магчыма). На практыцы гэта нібыта не праблема, але я з некаторым цікавасцю, што вельмі мала C / C + + кода, які я бачыў на самой справе выкарыстоўвае кансерватыўны GC, а тыя, якія, як правіла, у кодзе, які рэалізуецца на мове, які ўключае ў сябе GC.
Маштабаванасць кошт паказальнікі выходзіць далёка за рамкі проста зрабіць GC цяжэй. Паказальнікі (і, асабліва, арыфметычныя аперацыі над паказальнікамі) імкнуцца знішчыць любыя гарантыі бяспекі вы можаце быць у стане зрабіць аб праграме. Гэта не цяжка зразумець, чаму. Калі ў вас ёсць паказальнік на (скажам) цэлы лік, і вы можаце дадаць 1 млн, каб гэты паказальнік і разнаймення некаторыя выпадковыя вобласці памяці, якая можа ці не можа быць часткай падчас выканання выява вашай праграмы, увесь пекла можа ўпасці. Калі вам павязе, вы абавязкова атрымаеце дамп памяці і ваша праграма будзе завершана. Калі вы не так пашанцавала, частка памяці праграм будуць пашкоджаныя, што прывяло да таямнічай памылак, якія з'яўляюцца надзвычай цяжка адсачыць, так як яны выяўляюцца далёка ад месца, дзе зыходная задача была. Гэта прыводзіць да вялізнага павелічэння адладкі разы, што рэзка балюча прадукцыйнасць працы праграміста. Як праграма становіцца больш, магчымасці для такога роду праблемы павелічэння, якое ўяўляе сабой значнае перашкода для маштабаванасці.
Звычайны аргумент на карысць прамых маніпуляцый паказальнікам з'яўляецца тое, што яны дазваляюць пісаць код хутчэй. Гэта часта справядліва, я бачыў выпадкі, калі з дапамогай паказальніка арыфметычных разумна павялічыць хуткасць праграмы па пяць разоў. Аднак, адваротнае таксама часта справядліва, шматлікія праграмы аптымізацыі (звычайна выконваецца аўтаматычна кампілятарам) аказваюцца значна больш цяжкім або немагчымым ў кодзе, які выкарыстоўвае паказальнікі. Іншымі словамі, мовы, якія дазваляюць мікра-аптымізацыі, часта робяць макра-аптымізацыі немагчыма.
Аўтар Эйфелевай мовы, Бертран Меер, сказаў, што (я Перафразую) "Вы можаце мець арыфметыку паказальнікаў, або вы можаце мець правільныя праграмы, але вы не можаце мець абодва". Я згодны з ім. Я думаю, што прамы доступ да памяці з дапамогай паказальнікаў з'яўляецца самым вялікім перашкодай для праграмавання маштабаванасць мове.
Усё гэта не азначае, разумее, што паказальнікі і арыфметычныя аперацыі над паказальнікамі не маюць права на існаванне, яны маюць вырашальнае значэнне для нізкага ўзроўню, блізкага да праграмна-метал. Аднак, вялікія праграмы, напісаныя на нізкім узроўні проста не маштабуюцца. Правільна выкарыстоўваць іншыя мовы, як C з'яўляецца рэалізацыя мала, засяроджаныя нізкаўзроўневых кампанентаў прыкладанняў, напісаных у асноўным у моў высокага ўзроўню. На самай справе, гэта таксама правільна выкарыстоўваць C + +, вы напісаць некаторыя нізкаўзроўневыя класы, выкарыстоўваць паказальнікі ў некаторых з сваіх метадаў і інкапсуляцыі гэтых метадаў, каб вы ніколі не павінны падвяргаць паказальнік маніпуляцыі карыстальнікам класа. Гэта было б амаль ідэальна, акрамя таго, што кампілятар не мае магчымасці для забеспячэння гэтага, вы заўсёды можаце выкарыстоўваць паказальнікі, калі вы хочаце.
Дарэчы, ёсць цікавы мова называецца Цыклон які па сутнасці з'яўляецца "бяспечны" варыянт C. Яна складаецца з трох розных тыпаў паказальнікаў, некаторыя з якіх дазваляюць паказальнікам арыфметычныя і некаторыя з іх гэтага не робяць. Арыфметычныя аперацыі з паказальнікамі ў цыклон заўсёды правяраюцца на бяспеку. Гэтая мова, такім чынам, нашмат бяспечней, чым З, падчас кошт вар'іруецца ад нязначнай да істотным. Тым не менш, цыклон не выпраўляе іншыя праблемы з C (гл. ніжэй), таму я б не стаў апісваць яе як асабліва маштабаванасць.
Статычная праверка тыпаў: у асноўным вельмі добра
Статычна типизированный мова з'яўляецца адным дзе кожны элемент дадзеных мае пэўны тып, які не можа быць зменены на працягу ўсяго тэрміну праграмы. Акрамя таго, зменныя пэўных тыпаў, і вы не можаце прысвоіць значэнне іншага тыпу гэтай зменнай. Ёсць шэраг пытанняў, звязаных з статычнай тыпізацыі, і ёсць шмат блытаніны па гэтых пытаннях, таму я паспрабую абагульніць асноўныя моманты тут.
Перавагі статычнай праверкі тыпаў
Асноўная перавага маштабаванасць статычны кантроль з'яўляецца тое, што вялікая колькасць памылак, якія злавілі падчас кампіляцыі, а не падчас выканання. Такім чынам, у статычна типизированный мову з добра прадуманай сістэмай тыпаў, большасць з трывіяльных памылак будзе злоўлены кампілятар, які пакідае праграмісту засяродзіцца на больш цікавых частак праграмы. Гэта павышае прадукцыйнасць, а таксама праграміст шчасце ;-) Акрамя таго, калі тып сістэмы распаўсюджваецца на модуль сістэмы (гл. ніжэй), то любое прымяненне Імпартаваны модуль будзе тып-праверылі, як добра. Гэта выключае вялікія класы памылак у выкарыстанні знешніх модуляў, напісаных іншымі так жа, як гэта адбываецца ў код пішуць для сябе. Гэта, у сваю чаргу, спрашчае паўторнае выкарыстанне чужога кода з упэўненасцю, што робіць мова значна больш маштабуецца.
Акрамя таго, статычная праверка тыпаў прыводзіць да значна больш хуткі код, чым дынамічныя (часу выканання) праверкі тыпаў. Калі кампілятар ведае, што "а" і "B" і ўяўляюць сабой невялікія цэлыя лікі, і ён павінен вылічыць '+ B', то ён можа ўставіць код для таго малога ліку прама ў праграме. Калі адзінае, што вядома пра "а" і "B" з'яўляецца тое, што яны ўяўляюць сабой аб'екты, якія могуць быць цэлыя лікі, або плавае, ці радкоў, то рашэнне аб тым, што рабіць павінна быць адкладзенае да часу выканання. Праверка тыпаў падчас выканання гэта дорага. Такім чынам, у дадатак да іншых перавагі статычнай тыпізацыі, вы таксама атрымліваеце больш хуткі код.
Тып заявы супраць вываду тыпу
Звычайнай прычынай, чаму многія праграмісты не любяць статычны кантроль з'яўляецца тое, што тып заявы шматслоўным і адцягваць ад чысціні алгарытму. Гэта, безумоўна, мае месца ў большасці статычна типизированных мовах, асабліва абуральны прыклад Java, дзе вы можаце мець заявы накшталт гэтага:
Foo foo = new Foo(); // Declare a new object of type Foo.
Вы павінны выкарыстоўваць слова "Фу" тры разы, каб атрымаць паведамленне праз! Тое, што большасць праграмістаў не разумеюць, што ёсць альтэрнатыва. Мовы з
высновай тыпу магу зразумець, тыпу амаль усе зменныя з кантэксту, гэта азначае, што праграмісту не трэба ўводзіць у дэкларацыях. Добрым прыкладам гэтага з'яўляецца
мэтай CAML (OCaml) мова праграмавання. Гэта прыводзіць да коду, які гэтак жа кароткі, як код, напісаны ў дынамічна типизированных моў, такіх як схемы або Python, але з усімі перавагамі статычнай тыпізацыі.
Прывядзенне тыпаў
На жаль, для маштабаванасці, у некаторых мовах (у прыватнасці З і З + +, зноў жа) маюць механізмаў для
прывядзення тыпаў, якія ў асноўным аварыйны люк, што дазваляе казаць кампілятар "Я ведаю, што я сказаў, што гэта значэнне тыпу X, але цяпер Вы можаце рабіць выгляд, што гэта на самой справе тыпу Y, і я бяру на сябе адказнасць ". Гэтая функцыя неабходная ў С, так як сістэма тыпу вельмі слабая (гэта не так неабходна ў C + + і, як правіла, лічыцца дрэнным стылем праграмавання). Таксама магчыма (і часта неабходна) для прывядзення паміж тыпамі ў Java (амаль заўсёды ад суперкласса ў падклас), але калі прывядзенне не працуе, то выключэнне, тады як у С, літой ніколі не выходзіць з ладу (і ўсё, што можа адбыцца, калі вы прыводзіце аб'ект няправільнага тыпу). У заключэнне, зняты ліцця тыпу дрэнна, і моў, якія патрабуюць шмат яго меней маштабуюцца, чым тыя, якія гэтага не робяць. Звярніце ўвагу, што большасць тыпаў ў Java (які правяраецца) проста абыйсці адсутнасць параметризованных тыпаў, так што нават праверыў прывядзення тыпаў можа сведчыць аб слабасці мовы.
Статычныя супраць дынамічнага праверкі тыпу
Адносных вартасцяў Параўнанне статычнай і дынамічнай праверкі тыпаў з'яўляюцца адным з вялікіх святых войнаў сярод кампутарны мову даследчыкаў і карыстальнікаў. У адрозненне ад статычнай праверкі тыпаў (апісана вышэй), у дынамічных сістэмах тыпу аб'ектаў, а не зменных, маюць тыпы. Зменных у гэтых сістэма проста прывязку да аб'екта, і ён можа быць звязаны з (напрыклад) цэлае адзін момант, радкі іншы момант, а таксама пералік іншы момант часу. Гэта азначае, што аперацыі, якія патрабуюць асаблівага тыпу для сваіх аргументаў
(напрыклад, складанне) павінны праверыць гэтыя тыпы падчас выканання, а не падчас кампіляцыі. Гэта прыводзіць да значнага пакарання прадукцыйнасці, а таксама страты бяспекі; памылка тыпу звычайна не злавілі, падчас выканання. З іншага боку, дынамічная тыпізацыя неверагодна выразныя, значна больш, чым любая статычная сістэма тыпаў. Гэта вялікая тэма, што я не мае намер вывучыць тут (гэта будзе эсэ сам па сабе). Дастаткова сказаць, што шмат гнуткасць дынамічных тыпаў могуць быць адноўлены ў статычна типизированный мову, калі тып сістэмы з'яўляецца дастаткова магутным. Добрым прыкладам статычна типизированный мову з вельмі магутны тып сістэмы, яшчэ раз,
OCaml (думайце, што мне падабаецца гэтая мова яшчэ? ;-)).
Іншы (слабая) аргументам на карысць дынамічнай праверкі з'яўляецца тое, што дынамічна типизированных мовах, як правіла, значна менш шматслоўным, чым статычна типизированных тыя, што азначае, што алгарытм можа часта быць выяўлена больш выразна і лаканічна. Аднак, статычна типизированных мовах з высновай тыпу, як (гм) OCaml абыйсці гэтую праблему, як згадвалася вышэй.
Калі статычная праверка тыпаў занадта абмежавальнымі для вашых густаў, то дынамічна типизированных моў, такіх як Lisp, Scheme, Python, Ruby або Smalltalk вельмі прыемна праграмы, хоць я лічу, што адсутнасць статычнай праверкі тыпаў балюча маштабаванасць гэтых моў істотна. Што звычайна адбываецца ў вялікіх праектах, напісаных на гэтых мовах выклікае тое, што модульныя тэсты пішуцца злавіць тыпу памылак, а таксама лагічныя памылкі (Smalltalk супольнасці была асабліва агрэсіўнай аб прасоўванні гэтага падыходу, гл Kent Beck's экстрэмальнага праграмавання сайта для значна больш падрабязна аб гэтым, якая не абмяжоўваецца Smalltalk або дынамічна типизированных мовах).
Іншы цікавы падыход "мяккі ўвод", што гэта нешта сярэдняе паміж статычнай праверкі тыпаў і дынамічнай праверкі тыпаў. Груба кажучы, гэта дазваляе выразнасці жа як дынамічная тыпізацыя, але статычна праверыць тыпу ўсё, што ён можа, а калі ён не можа вырашыць, ці будзе нейкая праграма элемент правільна набраны падчас кампіляцыі яна будзе правяраць яго на час выканання. Гэты падыход выкарыстоўваецца ў Дылан мове (а таксама ў Common Lisp, у большай ці меншай ступені ў залежнасці ад кампілятара) і актыўна развіваецца як з тэарэтычнай і практычнай пунктаў гледжання па PLT Scheme каманды мовы даследчыкі кампутар / распрацоўнікам. Я з нецярпеннем чакаем, што яны прыдумалі.
Апрацоўка выключэнняў: добрае
Апрацоўка выключэнняў з'яўляецца карыснай функцыяй для прыняцця код больш устойлівым, а таксама чысцей. Асноўная ідэя ў тым, што некаторыя аперацыі могуць не па розных прычынах, што робіць немагчымым вяртаньне патрэбнае значэнне. Напрыклад, чытаючы радкі з тэкставага файла немагчыма, калі паказальнік файла ўжо ў канцы файла. У прымітыўных моў, як C, адзіным рашэннем з'яўляецца вяртанне кода памылкі і карпатліва тэст для яго кожны раз, калі выклікаецца функцыя. Аднак, паколькі функцыя C можа вяртаць толькі адно значэнне, рэальны кошт вяртання функцыя павінна быць kludged як для запісу параметраў функцыі, што вельмі брудны і памылка схільных (так як яна патрабуе, каб карыстальнік маніпуляваць паказальнікамі). З апрацоўкі выключэнняў, калі выключным стане адбываецца выключэнне, і яна раскручваецца стэк выклікаў, пакуль не дасягне падыходнага апрацоўшчыка выключэнняў. Гэтая функцыя настолькі карысным, што амаль усе новыя мовы ўключыць яго. Цікава, што выключэння таксама працаваць значна лепш у прысутнасці смецця; пазбегнуць уцечкі памяці ў мове З + +, які апрацоўкі выключэнняў, але не мае GC даволі складана (гл. Майер кнігі Скотта
Effective C + + і
больш эфектыўнай C + + для падрабязнае апісанне гэты пытанне). Гэта яшчэ адзін аргумент для збору смецця (як калі б нам трэба адзін).
Памылка пры выкананні праверкі: добра
Дынамічна типизированных мовах ўсе памылкі іх праверкі падчас выканання. Большая частка гэтых памылак заключаецца ў забеспячэнні аперацыі называюцца з правільна типизированных аргументаў. Гэта дарагі і некалькі памылак у параўнанні з мовамі, якія могуць рабіць усё, тыпу іх праверкі падчас кампіляцыі. Аднак, нават у статычна типизированных мовах, узнікаюць сітуацыі, якія не могуць быць урэгуляваны шляхам тыпу сістэмы ў адзіночку. Дакладней, узнікаюць сітуацыі, калі любы разумны (адрозная, эфектыўны) тыпу сістэма не можа ведаць, падчас кампіляцыі, што памылкі не адбудзецца. Для таго, каб справіцца з гэтым неабходна памылка падчас выканання праверкі. Вось некалькі тыповых прыкладаў.
Межы масіва парушэнняў
Калі спроба доступу масіва за межамі яго межаў
(напрыклад, спрабуе атрымаць доступ да 100-й элемент-элемент масіву 10), то межы масіва парушэнне. Маштабуецца моў заўсёды зразумееш, што гэта памылка і, як правіла, кідаюць выключэнне так, што альбо праграмы можа мець справу з ім ці твар працуе праграма ведае, што нешта дрэннае здарылася (у ідэале трасіроўкі стэка будзе надрукавана ў апошнім выпадку). Праверка межаў масіва парушэнняў мае значныя затраты, таму ідэальна кампілятар будзе варыянт, які дазваляе карыстальніку адключыць гэтую праверку, калі хуткасць больш важная, чым бяспеку. Звярніце ўвагу, што межы масіва парушэнняў так і не знаходзяць у праграмах C, замест гэтага яны выклікаюць такія праблемы, як весела асноўных звалак і пашкоджанне памяці.
Арыфметычныя памылкі
Іншы клас памылак, якія звычайна могуць быць злоўлены эфектыўна падчас выканання, арыфметычныя памылкі. Класічным прыкладам гэтага з'яўляецца цэлалікавай дзяленне на нуль. Зноў жа, маштабуюцца мовах будзе кідаць выключэнне ў дадзеным выпадку. Іншыя цэлымі арыфметычныя памылкі, такія як перапаўненне таксама звычайна выклікаць выключэння на многіх мовах. У супрацьлегласць гэтаму, з якая плавае кропкай памылкі, такія як 1,0 / 0,0 (= бясконцасць), -1.0 / 0.0 (=- бясконцасць) і 0,0 / 0,0 (= не-нумар або NaN) звычайна не выклікаць выключэння, нават у адваротным выпадку вельмі бяспечна мовах (такіх як Java або OCaml). Прычынай гэтага з'яўляецца не зразумела для мяне (мабыць, гэта напісана ў IEEE з якая плавае кропкай стандартаў арыфметычных і ніхто не хоча аспрэчыць яго), і, шчыра кажучы, я думаю, што гэта памылка. Як масіў праверкі межаў, гэта добра мець кампілятар магчымасць адключэння праверкі на памылкі арыфметычнай, калі хуткасць больш важная, чым бяспеку для дадзенага дадатку. Гэта ўвогуле карысна прынцып: зрабіць мову бяспечнай па змаўчанні, і даць праграмісту магчымасць гандлёвай бяспекі для хуткасці, у ідэале, не патрабуючы яго / яе перапісаць любы код.
Сцвярджэнні і кантракты: вельмі добрае
Большасць моў (нават з) забяспечвае "сцвярджаць" функцыя, якая дазваляе праграмісту канстатаваць, што на дадзены момант праграма прыватнасці адносіны павінны быць праўдзівымі. Напрыклад, у праграме C Вы маглі б сказаць:
assert(i == 100);
што азначае "у дадзены момант праграмы," я "павінна мець значэнне 100, а калі гэта не нешта няправільна." Гэта свайго роду убудаваных у санітарныя праверкі, для вашай праграмы. Можна адключыць праверку зацвярджэнне падчас кампіляцыі, а таксама. Як правіла, сцвярджае, уключаны пры распрацоўцы праграмы і адключаецца пасля завяршэння праграмы ў мэтах паскарэння праграмы. У некаторых мовах (у прыватнасці, Эйфелева) маюць значна больш складанае зацвярджэнне сістэмы, вядомай як "Дызайн Кантракт", які ўключае ў сябе асобныя віды зацвярджэнне правярае перадумовы функцый, постусловия функцый, інварыянт класа, завесы інварыянт і варыянты, і многае іншае, усё ўключана ў аб'ект сістэмы мовы. Пры правільным выкарыстанні, гэта велізарная перамога. Памылкі будуць, як правіла, з'яўляюцца значна бліжэй да якой яны мелі месца, што робіць адладку значна лягчэй. Гэта, у сваю чаргу, робіць мова значна больш маштабуецца.
Падтрымка абстракцый
Увогуле, больш падтрымкі моў прадугледжвае распрацоўку абстракцыі, тым лепш. Добрыя магчымасці абстракцыя азначае, што вы можаце сказаць больш з меншай колькасцю кода, і менш кода, тым менш памылак і больш кароткія тэрміны распрацоўкі, што прыводзіць да лепшага маштабаванасці. Ёсць шмат каштуе асаблівасцяў мовы я не буду абмяркоўваць тут, замест гэтага, я буду адным з тых, якія маюць найбольшы ўплыў на мову маштабаванасці.
Модуль сістэмы: вельмі добрае
Шчыра кажучы, мова без добры модуль сістэмы бескарысна для распрацоўкі вялікіх праграм. Модульная сістэма дазваляе праграмісту для распрацоўкі і тэставанні частцы праграмы ў ізаляцыі, а затым аб'яднаць гэтыя часткі на больш позні час. Модулі, як правіла, выкарыстоўваюцца для рэалізацыі шматкроць выкарыстоўваюцца бібліятэк кода, які змяшчае дадзеныя структуры і функцыі, якія прадстаўляюць некаторыя цікавыя аспекты прадметнай вобласці (напрыклад, аперацыі на звязаных спісаў). Як толькі модуль напісаны і адладжаны, любую іншую праграму можна імпартаваць і выкарыстаць код у гэтым модулі. Гэта велізарная перамога, так як фундаментальныя структуры дадзеных і аперацыі не павінны быць перапісаны для кожнай праграмы (якая называецца "вынаходзіць кола" ў жаргоне праграмістаў). Гэта дазваляе праграмісту пісаць код значна хутчэй і з значна большай упэўненасцю ў поспеху, і, такім чынам, жыццёва важным кампанентам маштабуюцца кампутарных моў.
Аб'ектна-арыентаванае праграмаванне: добрае
Аб'ектна-арыентаванае праграмаванне (ААП) часта ўяўляюць як лекі ад усіх праблем праграмавання. Гэта не так. Аднак, некаторыя віды прыкладанняў мець вялікую карысць з аб'ектна-арыентаванай парадыгмы. Асноўная ідэя ў тым, што ААП праграмы разбіваецца на "аб'екты", якія "метады". Метады функцый, якія маюць доступ да унутраным станам аб'екта. Толькі метады адпаведны аб'ект можа атрымаць доступ, што ўнутраны стан, таму, калі змены стану ў нечаканым чынам, адным з метадаў павінны быць адказныя за гэта. Гэта называецца "ўтойванне звестак" або "абалонка". Акрамя таго, у ООП, можна ствараць новыя класы аб'ектаў па спадчыне; гэта азначае, што новы клас аб'екта версію старога класа аб'екта, але з некаторымі новымі метадамі і / ці новых дадзеных. І нарэшце, самае галоўнае, які выклікае аб'екта метадамі "паліморфных"; У асноўным гэта азначае, што адпаведны метад для работы на аб'екце выбіраецца падчас выканання, а не падчас кампіляцыі. Некаторыя віды задач праграмавання (такіх, як мадэляванне) добра падыходзяць для парадыгмы О.О., а іншыя задачы (напрыклад, кампілятары) не трэба OO. Увогуле, гэта добра, калі мова падтрымлівае О.О., але я аддаю перавагу моў, якія не прымусіць вас выкарыстоўваць оо для ўсіх праграм. Часта сцвярджаецца, што праграмы, напісаныя ў стылі О. лягчэй для пашырэння і змены, чым не-OO праграм. Я думаю, што гэта перабольшанне. Калі ў вас ёсць да падклас класа кожны раз, калі вы хочаце дадаць новы метад, ваша праграма пачне выглядаць вельмі заблытанае вельмі хутка. Тым не менш, А. з'яўляецца карысным метадам абстракцыі мець у сваім распараджэнні.
Функцыянальнае праграмаванне: добрае
"Двайны" да парадыгме ООП, калі хочаце, гэта функцыянальнае праграмаванне (FP) парадыгмы. Замест таго, каб раскладаць праграмы ў групу аб'ектаў, функцыянальных праграм раскласці праграму ў групу функцый. Як О.О., функцыянальнае праграмаванне патрабуе мову, які падтрымлівае некаторыя функцыі мовы. Асноўнай асаблівасцю з'яўляецца тое, што ў функцыянальным мове, функцыі "першага класа", што азначае, што яны могуць разглядацца як дадзеныя (гэта
значыць яны могуць быць перададзены ў якасці аргументаў функцыі, вярнуўся з функцыі, і / або створаныя на купляць ўнутры функцыі). Іншы найважнейшай асаблівасцю з'яўляецца здольнасць вызначаць рэкурсіўныя функцыі эфектыўна (тэхнічна, там павінен быць хваставой рэкурсіі аптымізацыі). Аказваецца, што калі ў вас ёсць гэтыя магчымасці, то можна абыйсціся і без завесы заявы
(напрыклад, і
ў той час як завесы ў C), замест гэтага выкарыстоўваючы рэкурсіі для ажыццяўлення цыкла. Акрамя таго, функцыянал праграмы, як правіла пазбягаць выкарыстання змяняных дадзеных (аператары прысвойвання) як мага больш. Яны таксама маюць тэндэнцыю выкарыстоўваць шмат вельмі дробных функцыі замест некалькіх вялікіх функцый. Перавагі FP ўключаюць у сябе:
- Многія алгарытмы могуць быць выяўленыя значна больш коратка і элегантна.
- Не выкарыстоўваць змяняныя дадзеныя выдаляе шырокі клас патэнцыйных памылак.
- Функцыянальныя праграмы значна лягчэй праверыць на карэктнасць, чым нефункциональные іх.
- Функцыі вышэйшага парадку (функцый, якія прымаюць функцыі ў якасці ўваходных дадзеных і / ці вяртання функцыі, як выснова) можа быць выкарыстаны для выключэння агульных ідыёмы праграмавання. Гэта дазваляе лёгка змяніць адзін від праграмы для гэтага звязаных з імі задач.
У мяне няма амаль дастаткова месца тут, каб перайсці ў гэтым падрабязна. Калі вам цікава, вы павінны прачытаць Абельсон і Суссман
Структура і інтэрпрэтацыя кампутарных праграм, які ідзе ў падрабязнасці па гэтым пытанні. Дастаткова сказаць, што наяўнасць падтрымкі функцыянальнага стылю могуць зрабіць кампутарны мова значна больш маштабуецца. На жаль, вельмі нешматлікія мовы падтрымліваюць гэты стыль (прыклады ўключаюць Lisp, Scheme, OCaml, Standard ML і Haskell), па-відаць, таму сярэднім праграмісты знайсці функцыянальны стыль "цяжка зразумець", і таму FP мае (у асноўным, але не зусім незаслужаная) рэпутацыю за неэфектыўнасці (на самай справе, эфектыўнасць FP залежыць надзвычай аб дэталях рэалізацыі мовы).
Макрасы: у асноўным добрае
Па "макрасаў" Я маю на ўвазе структурныя макрасы, як у Lisp, а не тэкставых макрасаў падстаноўкі, як у С. Структурныя макрасы могуць быць вельмі карысныя абстракцыі прылады, яны дазваляюць праграмісту для інкапсуляцыі праграмавання ідыёмы, якія часта паўтараюцца і якія не могуць быць выяўленыя ў якасці вышэйшай парадку функцый. Добрым прыкладам гэтага можа быць макрасы для ажыццяўлення кантролю канструкцый. У большасці моў, вы затрымаліся ў кіраўнікі канструкцыі
(калі,, у той
час), якія прадастаўляюцца на мове, але ў Lisp вы можаце вызначыць свой ??уласны, выкарыстоўваючы макрасы. Макрасы вельмі цікава (гл. кнігу Грэма Пола
на Lisp для значна больш на іх). У іх ёсць некаторыя праблемы, а таксама:
- Яны могуць зрабіць адладку істотна складаней.
- Яны могуць у некаторых выпадках зрабіць код складаней для разумення, таму што макрасы (па крайняй меры ў Lisp) выглядаюць як функцыі, але паводзяць сябе зусім інакш.
- Даць эфектыўныя макрасы нетрывіяльна.
Тым не менш, пры правільным выкарыстанні макрасаў можа павысіць ўзровень абстракцыі праграмы рэзка, што добра для маштабаванасці.
Кампаненты
"Кампаненты" з'яўляецца расплывістым словам у кантэксце кампутарных мовах, але тут я выкарыстоўваю яго, каб прадстаўляць адзіны блок функцыянальных магчымасцяў, якія могуць быць складзеныя з іншымі часткамі праграмы. Гэта накшталт як бібліятэка, але больш самадастатковым. Ёсць цэлы шэраг кампанентаў архітэктуры вакол (Java Beans, CORBA, Microsoft COM), а некаторыя, як бабы Java, падтрымлівае толькі адну мову, у той час як іншыя падтрымліваюць цэлы шэраг моў. Адзін вялікі прыцягнення кампанентаў з'яўляецца тое, што яны могуць быць незалежны ад мовы і нават месца не залежыць. Аднак, калі мова спецыяльна падтрымлівае адзін (ці некалькі) кампанент архітэктуры гэта вялікая перамога для маштабаванасці, таму што тады вы можаце паўторна выкарыстоўваць кампаненты, напісаныя на іншага распрацоўніка (і, магчыма, на іншай мове). Звычайна гэта проста бібліятэка пытанне, але некаторыя мовы (C # быўшы яркім прыкладам) распрацаваны спецыяльна, каб зрабіць кампанент развіцця лягчэй. Гэта добрая рэч, але ў мяне няма прасторы, каб увайсці ў яго тут.
Сінтаксіс і чытальнасць
Сінтаксіс не самы цікавы аспект мовы праграмавання, на самай справе, гэта, верагодна, найменш цікавы аспект, які дзіўна, улічваючы, што гэта, здаецца, адзіны аспект, што большасць праграмістаў ніколі не даведаецца ;-) сінтаксісу робіць розніцы маштабаванасці, аднак. На мой погляд, гэта не так важна, што сінтаксіс быць "знаёмыя" (што на практыцы азначае "падобны сінтаксіс C"), а, хутчэй, важным пытаннем з'яўляецца наколькі паслядоўныя гэта. Вельмі ў стылі барока і непаслядоўна сінтаксісу з дзесяткамі дзіўных выключэння з агульных правілаў (C + + і (асабліва) Perl з'яўляюцца самымі злоснымі парушальнікамі тут) робяць праграму вельмі цяжка зразумець і падтрымаць, проста таму, што ніхто не памятае усе прыватныя выпадкі. З іншага боку, вельмі мінімалістычны і просты сінтаксіс як сінтаксіс Lisp цяжка для многіх людзей, каб прывыкнуць да (хоць асабіста я цалкам падобны сінтаксіс Ліспе). Python з'яўляецца добрым прыкладам таго мовы, які мае вельмі дружалюбны сінтаксіс як для пачаткоўцаў праграмістаў і экспертаў.
Маштабаванасць розных моў праграмавання
У гэтым раздзеле я буду рабіць больш канкрэтныя заўвагі аб тым, як некаторыя мовы праграмавання складаецца з пункту гледжання іх маштабаванасць. Я не ў стане пакрыць кожны мова праграмавання, але я пастараюся, каб пакрыць рэпрэзентатыўнай выбарцы.
C
З спалучае ў сабе ўсе сілы на асэмблеры з усімі прастату выкарыстання асэмблеры. - Невядома Я проста хацеў, каб прыняць гэты момант, каб адзначыць, што C мае ўсе выразная сіла двух Дикси кубкі і радкі. - Джэймі Завінскі, у зыходны код для xkeycaps Існуе кропка ў вашым жыцці, калі вы ўсвядоміце, што вы напісалі досыць деструкторы, і правёў дастаткова часу адсочвання уцечак памяці, і вы павінны выдаткаваць дастаткова часу адсочвання пашкоджанне памяці, і вы патрацілі дастаткова часу, выкарыстоўваючы нізкаўзроўневыя небяспечна функцый, і вы рэалізавалі занадта шмат звязаных спісаў. - Мігель дэ Икаса Дзесятае Правіла Гринспан аб Праграмаванне: "Любая досыць складаная C ці Fortran праграма змяшчае спецыяльныя, неафіцыйна-названага памылка ахопленым павольнага ажыццяўлення паловы Common Lisp." - Піліп Гринспан Ваш начальнік інтэлекту не падыходзяць для нашага кволы зброі. - Невядома, праз Аарон Стэрн |
Я буду тупым: З жудасным мовай для распрацоўкі буйных праектаў цалі C змяшчае амаль усе дрэнныя асаблівасці мовы, апісанага вышэй, і амаль ніхто з добрых. Акрамя таго, некаторыя добрыя характарыстыкі ў яго ёсць (як статычнай праверкі тыпаў), настолькі пашкоджаная прывядзення тыпаў, што яны значна менш карысныя, чым яны маглі б быць. C таксама прапануе магчымасці практычна не абстракцыя бы то ні было, за выключэннем масіваў (якія сапраўды толькі паказальнікі ў маскіроўку) і структуры (гэтак жа).
Ці азначае гэта, што З з'яўляецца бескарысным мову? Зусім няма. Ён мае сваё месца, і яго месца мае жыццёва важнае значэнне. З выдатным мовай для напісання кода, які павінен напрамую ўзаемадзейнічаць з машынай ("голае жалеза" праграмаванне). Гэта таксама добры мова для ажыццяўлення лепш ;-) моў у рухавік OCaml выканання, напрыклад, напісаны на З (з некаторай дапамогай мовы асэмблера). З вельмі зручна для стварэння 1% ад вашага прыкладання, абсалютна станоўча, павінен працаваць як мага хутчэй. Аднак, калі вы спрабуеце пісаць вялікія дадатку цалкам на C вы на бездапаможнае час. Замест гэтага, вам лепш выбар добры мову, які мае інтэрфейс C замежных функцыі (FFI), так што вы можаце "падзенне ўніз" ў З, калі вам сапраўды трэба (які, спадзяюся, не будзе, што часта).
Некаторыя людзі (асабліва пачаткоўцаў праграмістаў, якія не ведаюць, што яны кажуць) знаходзяцца ў ілюзіі, што, паколькі C прапануе такі прамой кантроль над машынай, гэта толькі "рэальны" мова праграмавання для "сапраўдных хакераў". Калі б гэта было праўдай, усе "праўдзівыя хакеры" (што б гэта сродкаў) будзе пісаць код на асэмблеры, якая значна бліжэй да машыны, чым С. Я спадзяюся, што некаторыя з цытат вышэй, некаторыя з якіх сусветна вядомыя з адкрытым зыходным кодам хакераў, дапаможа развеяць гэты міф. Калі няма, то я рэкамендую вам паспрабаваць напісаць сапраўды вялікую праграму (> 100.000 радкоў кода) у С, і скажыце, што вы думаеце, у канцы гэтага вопыту. Я думаю, вы знойдзеце мае аргументы больш пераканаўчыя.
C + +
C + +: васьміног зроблены цвікі дадатковых ногі на сабаку. - Ад smalltalk.org Падумайце аб C + + як аб'ектна-арыентаваная мова асэмблера. - Ад рассылкі зламыснасьці Схема C дазваляе лёгка стрэліць сабе ў нагу. C + + робіць гэта складаней, але калі вы гэта зробіце, удар ўсю нагу. - Бьерн Строўструп Праграмавання на З + + з'яўляецца заўчаснай аптымізацыі. - Ад comp.lang.python |
C + + дадае аб'ектна-арыентаванага і агульныя асаблівасці праграмавання на C, а таксама мноства іншых функцый. Гэта можа значна павысіць ўзровень абстракцыі ў C + + праграм па параўнанні з С-праграм, і гэта павінна зрабіць мову больш маштабуецца. На жаль, наяўнасць паказальнікаў і адсутнасць GC, на мой погляд, адмяняе ўсе перавагі карысных функцый і робіць C + + немасштабируемые (напрыклад, ні адзін з стандартнай бібліятэкі шаблонаў (STL) кантэйнер класы выкарыстоўваюць ГК). Акрамя таго, C + +, так розум-bogglingly комплекс, з такой колькасцю няцотных функцый, якія ўзаемадзейнічаюць у своеасаблівыя спосабы, што гэта амаль немагчыма асвоіць. Я ахвотна прызнаю, што я ўпадабаў бы напісаць вялікае прыкладанне ў C + +, чым ў C, але гэта, як кажуць, што я лепш з'есці гнілой мяса, чым праглынуць сернай кіслаты ;-)
Каб быць справядлівым, я павінен адзначыць, што ёсць некаторыя сапраўды неабходны матэрыял можна ў C + + з выкарыстаннем шаблонаў (як правіла, засяроджаных пад назвай "шаблонаў метапрограммирования"; кніга сучаснага C + + Дызайн Андрэй Александреску для атрымання дадатковай інфармацыі. Глядзіце). Гэта вельмі праграмавання майстар-узроўні (што цалкам), але на мой погляд, гэта нават не наблізіліся да кампенсуючы адсутнасць GC. Што б зрабіць C + + больш маштабуецца мова (), уключаючы зборшчык смецця ў якасці часткі стандартнай бібліятэкі, і (б) з нейкім чынам абмежаваць выкарыстанне паказальнікаў на асобных модуляў, якія неабходна навядзіце курсор доступу (напрыклад, вельмі нізкім узроўні структуры дадзеных). Я не вельмі аптымістычна, што гэта ніколі не здарыцца, але я спадзяюся, што ён робіць.
Java і C #
Java і C # больш апошнія моў, якія дасталі ўрокі з памылак мінулага. Яны абодва маюць GC, і няма паказальнікаў, і яны абодва падтрымка аб'ектна-арыентаванага праграмавання. Гэта робіць праграмаванне на гэтых мовах параўнальна бязбольна, і яны добра маштабуецца. І таксама ёсць цікавыя механізмы для дасягнення незалежнасці ад платформы (што выходзіць за рамкі гэтага абмеркавання). C # з'яўляецца часткай NET Framework, які (тэарэтычна) дазваляе значную колькасць сярод мове ўзаемадзеяння;. Гэта на мой погляд, вялікая перамога, але і выходзіць за рамкі гэтага абмеркавання. Абодва мовы маюць тэндэнцыю быць вельмі падрабязна, якая адштурхоўвае многіх людзей (уключаючы мяне), але гэта не такая вялікая праблема. C # таксама змяшчае цікавы механізм для выкарыстання небяспечнага кода
(г.зн. кода, які выкарыстоўвае паказальнікі і не выкарыстоўвае GC), але, інкапсуляваць ў модулі спецыяльна адзначаныя "небяспечных" (ідэя запазычаная з Modula-3 мовы, які цяпер, на жаль, але ўсё неіснуючай ). Калі вы адчуваеце, што не можа жыць без здольнасці да праграме з паказальнікамі, але вы не маеце патрэбу ў іх большую частку вашага кода, гэта правільны шлях.
Узровень абстракцыі, як C # і Java пасрэдны; (!), Гэта нашмат лепш, чым З, некалькі слабей, чым З + +, і не так добра, як мовы, якія падтрымліваюць як аб'ектна-арыентаванага і функцыянальнага праграмавання (такіх, як Lisp і OCaml). Таму, я лічу, праграмавання на гэтых мовах, даволі сумна і стомна. Многія з маштабаванасці на гэтых мовах не з'яўляюцца, строга кажучы, частка моў на ўсіх, але і навакольнага асяроддзя (S), пабудаваны вакол мовах. Напрыклад, падтрымку кампанентаў, кіраванне версіямі, упакоўкі і дакументацыі пакаленне ўсе асаблівасці асяроддзя. Я спадзяюся, мы хутка пачынаем бачыць такога роду мета-функцыі лепш, чым мовах Java або C #.
Эйфелева
Эйфелева з'яўляецца вельмі чыста распрацаваныя аб'ектна-арыентаваны мова, які быў спецыяльна распрацаваны, каб быць маштабуецца. Ён мае шэраг цікавых асаблівасцяў, у тым ліку:
- Існуе вельмі моцная assertional сістэмы рэалізацыі "дызайн па кантракце" (гл. вышэй), якія цалкам уключаныя ў аб'ектна-арыентаванага праграмавання, так што падкласы не можа парушыць зацвярджэння свайго суперкласса (хоць Існуюць тэарэтычныя аргументы аб тым, гэта было зроблена права спосаб).
- Множнае спадкаваньне ажыццяўляецца ў тым, што я лічу, вельмі просты і эфектыўны спосаб, любыя канфлікты імёнаў павінны быць вырашаны шляхам перайменавання атрыманых у спадчыну класаў.
- Успадкоўванне можна кіраваць на тонкай дэталізацыі, чым прыватныя / ахоўных / Сувязі з грамадскасцю мадыфікатары бачылі ў C + +, Java і C #.
Ёсць шмат іншых асаблівасцяў, а таксама. пісьменнік Eiffel Бертран Меер, напісаў некалькі кніг аб мове і ідэй, яна, з якіх найбольш поўным з'яўляецца
аб'ектна-арыентаванага праграмнага забеспячэння будаўніцтва.
Эйфелева мае некалькі недахопаў. Сінтаксіс вельмі падрабязна (Ёсць нешта накшталт 70 ключавых слоў), а таксама зусім незнаёмых. Тэорыя, якая ляжыць правілы Эйфелевай некаторыя моўныя асаблівасці, што мы маем права чакаць, як і некалькі кропак выхаду з пятлі. Многія знаёмыя рысы знаходзяцца ў зусім незнаёмай форме. Заняткі толькі модуль адзінак, што я думаю, што парушае паняцце класа (і, што прыводзіць да празмернага выкарыстанні множнага спадчыну ў сітуацыях, у якіх ён на самай справе не трэба). Гэтыя недахопы не шоў-коркі, аднак.
Што яшчэ больш важна, функцыянальнае праграмаванне не падтрымліваецца (хоць апошні раз я праверыў нешта аналагічнае паказальнікаў на функцыі было ў працэсе дададзены ў Эйфелевай, я не ўпэўнены, што цяперашняя сітуацыя). Акрамя таго, тып сістэмы мае некалькі адтулін у ім, якія патрабуюць спасылку-часовай аналіз, каб пераканацца, што праграма правільна ўвялі. Гэта праблема, калі вы хочаце стварыць дынамічна падключаюцца бібліятэкі (хоць я прызнаю, што я не ведаю ўсе дэталі).
У заключэнне, я хацеў бы сказаць, што Эйфелева цалкам маштабуецца мова, вядома, больш, чым З + +, Java або C #. Я асабіста лічу адсутнасць падтрымкі функцыянальнага праграмавання даволі душна, але я хацеў бы праграму ў Эйфелевай чым у Java, C + +, C # або ў любы дзень.
Python і Smalltalk
Я сваливание ў адну кучу Python і Smalltalk, два зусім розных мовах, таму што яны як дынамічна типизированных моў, якія падтрымліваюць аб'ектна-арыентаванага праграмавання. Адно з адрозненняў з'яўляецца тое, што гэта магчыма, каб праграма не ў OO чынам у Python, у той час як Smalltalk нічога, акрамя аб'ектаў, усе шляхі ўніз. З маштабаванасць пункту гледжання, абодва мовы з'яўляюцца бяспечнымі, выдатна падыходзіць для прататыпаў, і наогул прыемна працаваць цалі З іншага боку, адсутнасць статычнай праверкі тыпаў балюча іх маштабаванасць (не кажучы ўжо пра іх эфектыўнасці), і, каб кампенсаваць гэта самы сур'ёзны Python і Smalltalk праграмісты трацяць шмат часу на напісанне тэстаў (што з'яўляецца добрай ідэяй, але тэстаў можа быць значна менш у статычна типизированных мовах, так як вы атрымліваеце бяспеку тыпу бясплатна). У мяне значна больш вопыту, чым з Python з Smalltalk, і я магу сказаць адназначна, што гэта вялікі мова для напісання невялікіх праграм, але, калі зыходны код праграмы больш, чым аб тысяч радкоў я пачынаю жадаючых я тыпу праверкі.
Perl
Python: выкананы псевдокод. Perl: выкананы шуму лініі.
-- off comp.lang.python
|
Я не прыхільнік Perl. У прынцыпе, я думаю, што Perl проста Python з неверагодна заблытаным сінтаксісам і некаторымі дадатковымі функцыямі, што ніхто сапраўды мае патрэбу. Perl неверагодна немасштабируемые, смею вас, каб паспрабаваць зразумець любы Perl праграмы больш чым сто радкоў або каля таго. Няспраўнасць не толькі сінтаксіс, семантыку мовы поўныя маленькіх дзівацтваў
(напрыклад, перагрузкі на вяртаецца тып функцыі), і, шчыра кажучы, я рэкамендую вам проста застацца ў баку ад Perl. Можа быць, Perl 6 не будзе гэтак хваравітым, але тады, можа быць, гэта не будзе. Я праверу яшчэ раз, калі Perl 6 на самай справе адбываецца.
У дужках, адзін крута, што выйшаў (на самай справе, гэта значыць у працэсе выхаду) з Perl 6 намаганні дзіўна халаднавата праект пад назвай Parrot, якая ўяўляе сабой віртуальную машыну, накіраваных на дынамічных мовах. Мэта складаецца ў тым, каб мець агульную віртуальную машыну для запуску Perl, Python, Ruby, схемы і т. п. Мне падабаецца гэты праект вельмі шмат, таму, калі ласка, праверыць яго.
Common Lisp і схемы
Большасць людзей проста страшэнна тупы, каб усвядоміць, як вялікі Лісп. - Ад Slashdot [Lisp] з'яўляецца адзіным мовай, кампутарам, што прыгожа. - Ніл Стывенсан Дарога ў тысячу міль пачынаецца з адкрывае дужкі. - Райнер Joswig Будзе пісаць код, які піша код, які піша код для вытворчасці прадуктаў харчавання. - Марцін Роджерс Тыя, хто не разумее, шепелявя асуджаныя на паўторнае яе рэалізацыі. - Растлумачыць Эрык Naggum, ад comp.lang.lisp |
Lisp з'яўляецца, папросту кажучы, бліскучы мова кампутара. Ёсць дзве формы Lisp, якія яшчэ жывыя сёння (тры, калі лічыць Dylan, але я распавяду, што ніжэй): Common Lisp і Scheme. Іх адрозненні ў асноўным мае значэння для абмеркавання тут, таму я аднаразовай іх разам для большай часткі.
Вось некаторыя з цікавых асаблівасцяў Ліспе.
- Ён мае неверагодна просты і адназначны сінтаксіс (што праўда трохі своеасаблівы, калі вы ўпершыню сутыкаецеся з ім).
- Ён цалкам падтрымлівае функцыянальнага праграмавання (і быў першым мовай, зрабіць гэта).
- Гэта збор смецця (і быў першым мовай, каб ён).
- Ёсць няма паказальнікаў ў код Lisp.
- Ёсць няма аб'яваў тыпу.
- Структурныя макрасы асноўнай часткай мовы, і з-за просты сінтаксіс лягчэй пісаць, чым на любым іншым мове.
Адным з наступстваў ўсіх гэтых асаблівасцяў з'яўляецца тое, што ён надзвычай просты ў рэалізацыі новай парадыгмы праграмавання ў мове Lisp. Напрыклад, можна рэалізаваць поўны аб'ектна-арыентаванай сістэмы (або некалькіх розных несумяшчальных сістэм ГА) у мове Lisp сябе. Па гэтай прычыне, Lisp часам называюць "моўны лабараторыі". З-за гэтага, Lisp праграмісты часта пішуць свае праграмы знізу уверх шляхам эфектыўнага Даць новую праграму-арыентаваны мова для прыкладання, а затым пісьмова прыкладанняў на гэтай мове. Грэм кніга Пола
па Lisp абмяркоўвае гэты падыход у драбнюткіх падрабязнасцях. Lisp таксама неверагодна дынамічны і гнуткі мову, код можа быць складзены на лета і модулі могуць быць паўторна загружаны па меры неабходнасці. Нягледзячы на ??гэта, існуюць кампілятары Lisp, якія вельмі эфектыўныя і могуць рэгулярна ствараць код, які толькі (скажам) 1,5 разы павольней, чым аптымізаваны C код.
Адзіным сур'ёзным недахопам, што Lisp мае тое, што ён абапіраецца ў асноўным на дынамічная тыпізацыя. Гэта выдатная магчымасць для інтэрактыўнага даследаванні, але становіцца перашкодай, як памер праграмы становіцца больш. Common Lisp па крайняй меры дазваляе аб'яў тыпу, якія кампілятар бясплатна для праверкі ўзгодненасці (або ігнараваць). Аднак, гэта не так проста атрымаць від абсалютнай бяспекі тыпу ў праграме Lisp, што вы атрымаеце ў (напрыклад) праграмы OCaml. Тым не менш, мне вельмі падабаецца Lisp, і я думаю, што кожны сур'ёзны праграміст павінен вывучыць яго. Акрамя таго, па крайняй меры адна рэалізацыя схемы ( PLT Scheme рэалізацыі) абяцае забяспечыць выкарыстоўваць праверку тыпу ў найбліжэйшай будучыні, што я з нецярпеннем чакаю.
Дылан
Дылан дыялект Lisp, што выкарыстоўвае больш традыцыйныя инфиксной сінтаксісу і, што мае шэраг асаблівасцяў, якія павышаюць маштабаванасць мовы па адносінах да Lisp. У прыватнасці, гэта дазваляе (і заклікае) выкарыстанне аб'яў тыпу ў кодзе. Калі гэтыя заявы тыпу могуць быць правераны падчас кампіляцыі, яны, у адваротным выпадку яны правераны падчас выканання. Гэта сапраўдная перамога для праграміста. На жаль, Дылан яшчэ не злавілі, але ёсць каманда хакераў адкрытых крыніц у
Гвидион Дылан, якія цяжка на працы спрабуе прынесці Дылан таму з небыцця. Я спадзяюся, ім гэта ўдасца, таму што Дылан мае патэнцыял, каб быць вельмі маштабуюцца мову, і, мабыць, адзіны мову, які спалучае ў сабе лепшыя рысы моў сцэнарыяў і маштабуюцца мовах.
Мэта CAML (OCaml) і Standard ML
Існуе анекдот пра амерыканскіх інжынераў і французскіх інжынераў. Амерыканская каманда прыносіць прататыпа для французскай каманды. Французская каманда ў адказ гэта: "Ну, яна выдатна працуе на практыцы, але як ён будзе трымаць у тэорыі?" - Невядома Perl, C, Fortran, Pascal і AWK чыста працэдурныя (нават не ГА) моў. Функцыянальныя мовы для вялікіх люстраных тэлескопаў, што гэтыя мовы ў бінокль. - Ад Slashdot Самыя лепшыя і самыя яркія ў мовах праграмавання полі працуюць на функцыянальных мовах праграмавання. - Бьерн Строўструп (перафразаваць з інтэрв'ю) |
Я захаваў лепшыя за апошнія ;-) Як вы, верагодна, сабраў з маіх каментарыяў вышэй, я
вялікі прыхільнік
Мэта CAML мова (як правіла, называюць OCaml). OCaml распрацоўваецца групай даследчыкаў у INRIA, Навукова-даследчы вылічальны навуковы інстытут ў Францыі. Цікава акронім CAML выступае за "катэгарычны Анатацыя машынны мова" і ў асноўным гістарычны артэфакт, я не буду абмяркоўваць яго далей. OCaml цесна звязана з іншым мовай называецца
Standard ML. Аднак, паколькі OCaml дае амаль усе асаблівасці Standard ML і многія іншыя, я не буду абмяркоўваць Standard ML далейшага небудзь.
Што OCaml прадугледзець, што робіць яго гэтак вялікая, і, у прыватнасці, робіць яго такім маштабуюцца мову?
- Вываз смецця.
- Няма паказальнікаў.
- Вельмі хуткая кампіляцыя ў байт-код.
- Кампіляцыя ў надзвычай эфектыўны машынны код (часта хутчэй, чым З + +, часта супастаўная з C хуткасці).
- Статычны тып праверкі з высновай тыпу (адзін з некалькіх моў, што мае гэта, вы не можаце сабе ўявіць, як крута гэта, пакуль вы яго выкарыстоўваеце).
- Поўная падтрымка функцыянальнага праграмавання.
- Поўная падтрымка для імператыўныя і аб'ектна-арыентаванага праграмавання.
- Вялікі модуль сістэмы.
- Паліморфным-типизированные функцыі (функцыі, якія з'яўляюцца агульнымі па ўсёй класаў тыпу).
- Алгебраічных тыпы дадзеных, якія робяць стварэнне складаных структур дадзеных неверагодна лёгка.
- Функторы (функцыі, якія ствараць уласныя тыпы дадзеных, параметризованные на ўвод тыпу або набор тыпаў).
- Праграмуемы препроцессора (camlp4), якія могуць быць выкарыстаны для змены сінтаксісу мовы (!).
Я не чакаю, каб вы зразумелі, усе гэтыя функцыі, але я таксама не маюць цярпення, каб растлумачыць іх усё тут, перайдзіце на вэб-сайт для атрымання дадатковай інфармацыі. Справа ў тым, што OCaml амаль усе характэрныя рысы, якія я вызначыла як прадастаўленне камп'ютэрнага мовы больш маштабаванасць і шэраг іншых асаблівасцяў, якія сустракаюцца амаль нідзе, што таксама павысіць маштабаванасць. Гэта таксама вельмі эфектыўны для такога складанага мовы, шмат кода OCaml цалкам канкурэнтаздольны з C код, які робіць тую ж задачу (часам OCaml код яшчэ хутчэй). Па гэтай прычыне, OCaml, безумоўна, мой любімы мова кампутара і адзін я лічу, у першую чаргу пры сузіраючы Даць новую праграму.
Сказаўшы гэта, я павінен дадаць, што OCaml з'яўляецца далёка ад дасканаласці. Сінтаксіс трохі дзіўна ў многіх месцах. Мова мае даволі доўгі крывой навучання. Існуе не хапае добрай дакументацыі і занадта мала кніг. Стандартная бібліятэка значна менш, што вы знойдзеце ў (напрыклад) Java. З іншага боку, ні адна з гэтых праблем шоу-коркі, і я прадказваю, што OCaml стане асноўнай рухаючай сілай у свеце моў праграмавання ў бліжэйшыя дзесяць гадоў, асабліва сярод вельмі высокага ўзроўню хакераў.
Сацыяльныя меркаванні
Улічваючы ўсе заўвагі, якія я зрабіў вышэй, відавочны пытанне: чаму людзі працягваюць выкарыстоўваць паршывы немасштабируемые моў праграмавання, калі Ёсць добрыя альтэрнатывы, якія зробяць іх жыццё нашмат прасцей? У гэтым раздзеле я хацеў бы паглядзець на фактары, якія перашкаджаюць праграмісты з вывучэння і выкарыстання маштабуецца моў праграмавання.
Невуцтва
Большасць праграмістаў, нават прафесійныя праграмісты, амаль нічога не ведаем аб мовах праграмавання. Большасць праграмістаў, напэўна, ніколі нават не чулі пра іншых мовах, акрамя C, C + +, Java, C #, Visual Basic, Fortran, і (магчыма) Perl. Гэта вельмі дрэнна, таму што не вялікі мову ў тым, што ўвесь спіс. Што гэта сведчыць аб тым, што людзі, якія распрацоўваюць і выкарыстоўваюць добрыя мовы трапілі лепш на атрыманне слова. Са свайго боку, я рэкамендаваў бы, што любы, чытаючы гэта пайсці і даведацца OCaml (особенно!), Lisp і / або Scheme, Python, Smalltalk, Eiffel і, асабліва, калі яны думаюць, што "ўсе мовы ж".
Навучанне
Як хто-небудзь, хто любіць вывучаць новыя мовы праграмавання і парадыгмы, я ненавіджу ў гэтым прызнацца, але адна з галоўных прычын дрэнны мовах захаваецца ў тым, што большасць людзей
ненавідзяць вывучэння новых моў праграмавання. Яны аддалі б прытрымлівацца дерьмовой мове, які яны больш або менш зразумець, чым узяць адзін месяц ці каля таго, каб азнаёміцца ??з новым мовай. Гэта прыклад вельмі, вельмі агульнае з'ява як у вылічальных і іншых краінах, што ў тым, што ніхто не хоча даведацца што-небудзь новае. Я думаю, гэта таму, што навучанне з'яўляецца вельмі хваравітым для большасці людзей (я кажу, я так
думаю, таму што я заўсёды вельмі спадабалася навучанне і таму я не магу ставіцца да гэтага на ўсіх). Гэта мела б сэнс, калі ў вывучэнні новага мовы не варта (паглядзім праўдзе ў вочы, гэта шмат працы), але, як я спрабаваў паказаць вышэй, Ёсць велізарныя адрозненні паміж дабром моў і дрэнных, і калі толькі мову вы ведаеце, з'яўляецца дрэнным, то навучанне добрым з'яўляецца найбольш вызначана варта.
Акрамя таго, задачы навучання становіцца нашмат, нашмат горш, калі новы мова ўвасабляе ў сабе розныя парадыгмы праграмавання (напрыклад, функцыянальнае праграмаванне), нават калі мова таксама падтрымлівае больш знаёмыя парадыгмаў. Я бачу гэта нават у старшакурснікі Каліфарнійскага тэхналагічнага інстытута, які, як мяркуецца, маюць высокі сярэдні сб ацэнкі якой-небудзь групе студэнтаў у свеце. Большасць з іх ужо ведаюць, як праграмаваць на C, калі яны тут, і мы вучым іх схема ў асноўным-функцыянальным стылі, што зусім незнаёмыя ім. Гэта дзіўна, як шмат цяжкасцяў яны з гэтым, вялікая сб ацэнкі нягледзячы на ??гэта.
Нарэшце, гэта праўда (але цалкам дзіўнае для мяне), што невялікія адрозненні ў сінтаксісе моў паміж кампутарам можа зрабіць гэта неверагодна цяжка для тых, хто асвоіў адзін мову, каб даведацца іншую. Менавіта таму Java і C # (правільна), прынятай C-падобны сінтаксіс, гэта не тое, што гэта лепш, гэта проста больш знаёмым і, такім чынам, менш верагодна, будзе адхілена. Праграмісты няцотных шмат, яны часта адпрэчваюць мова, заснаваны на самых трывіяльных крытэраў (напрыклад, ці з'яўляецца мова выкарыстоўвае кропку з коскай для асобных выступленняў).
Памылкі
Ёсць шмат дурных памылак аб мовах праграмавання, якія робяць людзі не хочуць, каб даведацца новыя. Найбольш распаўсюджанымі з іх з'яўляюцца:
- Усе мовы праграмавання, у асноўным такія ж.
- Код, напісаны ў чым-небудзь, але C будзе неверагодна павольна.
- Код, напісаны на любой мове са зборкай смецця будзе неверагодна павольна.
- "Сапраўдныя праграмісты" толькі напісаць код на мове C.
Я таксама чуў, некаторыя сапраўды неверагодныя зумеры людзі, якія павінны ведаць лепш, такіх, як "у Lisp, спісы толькі тып даных" (гэта было напісана ў кнізе,
якая спараджае праграмаванне, якое было апублікавана ў 2000 годзе, і цалкам, зусім ілжывыя).
Спадзяюся, я дапамог развеяць некаторыя з гэтых памылак у матэрыяле я напісаў вышэй.
Прынясенне ў ахвяру усё для хуткасці
Сур'ёзным перашкодай для прыняцця добрых моў праграмавання з'яўляецца паняцце, што ўсё павінна быць прынесена ў ахвяру хуткасці. У кампутарных мовах, як у жыцці, хуткасць забівае. Гэта не тое, што я, як павольна праграмы, але пра тое, што хуткасць толькі важным атрыбутам праграмы (у адрозненне ад правільнасці, ремонтопригодность, пашыральнасць, чытальнасць і г.д.) проста так. На самай справе, большасць праграм толькі невялікае ядро ??(магчыма, 20%), што абсалютна неабходна хутка асяроддзі значна больш інфраструктуры код, які не трэба запускаць ўсё, што хутка. Калі вы збіраецеся напісаць усё прыкладанне ў немасштабируемые мову, як C, так як толькі 20% праграмы патрабуе гэтага, то гэта сапраўдны ганьба. Гэта асабліва іранічна, таму што большасць добрых моў замежных інтэрфейс функцыі (ФФИ) у С, які дазваляе пісаць, што 20% у C і выкарыстоўваць лепш мова для астатняга кода. Аднак, большасць праграмістаў не могуць быць занепакоеныя навучання FFI больш, чым яны могуць быць занепакоеныя, вывучэнне новай мовы кампутара. Акрамя таго, большасць праграмістаў, якія апантаныя з хуткасцю нават не папрацавалі профілю іх код, каб знайсці, дзе вузкія месцы, відаць, таму што яны не могуць быць занепакоеныя, каб даведацца, як выкарыстоўваць Profiler небудзь. Вы выявіць карціну тут?
На шчасце, рост Java і моў сцэнарыяў, і поспех праектаў, якія выкарыстоўвалі гэтыя мовы, зрабілі хуткасць апантанасць значна менш каэфіцыент, чым раней.
Прынясенне ў ахвяру усё для біта кіравання на ўзроўні
Іншым фактарам, якія перашкаджаюць прыняцця маштабуюцца моў праграмавання з'яўляецца ідэя, што мова праграмавання
павінен даць вам інтымную, трохі ўзроўню кантролю над кожнай структуры дадзеных, або гэта не на карысць. Калі вы лічыце, што, думаю, зваротна на ўсе праграмы, якія вы калі-небудзь пісалі. Колькі з іх сапраўды меў патрэбу ў гэтым родзе біта кіравання ўзроўню? У маім выпадку, адказ роўны нулю, і калі вы праводзіце шмат часу на напісанне драйвераў прыладаў, ваш адказ, верагодна, даволі нізка таксама. Тым не менш, біт-кантроль ўзроўню з'яўляецца карысным уласцівасцю, і гэта менавіта тое, што C з'яўляецца добра. Вось чаму любы добры мову варта яе солі C FFI.
Прынясенне ў ахвяру усё для найменшага агульнага назоўніка
Іншым важным фактарам, якія перашкаджаюць прыняццю новых кампутарных моў з'яўляецца найменшым агульным назоўнікам. Праграмісты пераважнай большасці аддаюць перавагу вывучаць мову, які ўсё яшчэ ведае. Ёсць некалькі добрых прычын для гэтага:
- Гэта робіць яго значна лягчэй знайсці працу.
- Папулярны мову як правіла, мае значна больш даступных бібліятэк.
- Гэта значна лягчэй знайсці новых праграмістаў для працы над праектам, калі ён напісаны на мове, які многія ведаюць.
Аднак, гэта курыца і яйкі сітуацыі. Калі ніхто ніколі не даведаецца, новы мову, то ніякага прагрэсу будзе зроблена ў гэтай галіне. На самай справе, Ёсць толькі два паспяховых мадэляў мовы прыняцця, што я ведаю:
- Мова масава спрыяла кампаніі шмат грошай (напрыклад, Java і Sun, C # і Microsoft).
- Мова распаўсюджваецца ў "нізавых" моды (C, C + +, Perl, Python).
Так як я наўрад ці варта чакаць вялікіх карпарацый, каб падтрымліваць сапраўды добрая тэхналогія, я думаю, што адзіны спосаб для маштабуюцца моў праграмавання, каб заваяваць папулярнасць праз нізавыя метад. Я лічу, што OCaml пачынае атрымаць долю на рынку такім чынам. І, па праўдзе кажучы, Java і C # не
так ужо дрэнна, нават калі яны з'яўляюцца карпаратыўнымі спонсарамі. Яны разумна маштабуюцца мовах з пасрэдным магчымасці абстракцыі. Але мы можам зрабіць значна лепш.
Высновы і рэкамендацыі
Я спрабаваў паказаць, што Ёсць шмат аспектаў камп'ютэрных моў, якія могуць мець вялікі ўплыў на іх маштабаванасць, і я абмяркоўвалі, як розныя мовы параўнаць ў гэтым стаўленні. Нагадаем, маштабуюцца мовы, у ідэале, мець:
- збор смецця
- няма паказальнікаў або арыфметычныя аперацыі над паказальнікамі
- Інтэрфейс знешніх функцый на мове C
- статычная праверка тыпаў з высновай тыпу
- падтрымку для апрацоўкі выключэнняў
- памылка падчас выканання праверкі на наяўнасць памылак, якія не могуць быць захопленыя падчас кампіляцыі, як межы масіва парушэнняў і дзяленне на нуль
- падтрымкі для зацвярджэння і дызайн па кантракце
- магутны, статычна правераны модуль сістэмы
- падтрымка аб'ектна-арыентаванага праграмавання
- падтрымка функцыянальнага праграмавання
- структурных макрасы
- падтрымка для кампанентаў
- простым, паслядоўным і чытаны сінтаксіс
Калі вы дачыталі да гэтага месца і згодны з многімі з маіх назіранняў, то мае рэкамендацыі вам простая: даведацца некаторыя новыя мовы. У прыватнасці, вывучаць ўсе мовы, якія я абмяркоўваў вышэй, нават тыя, якія я паклаў. Стварыць значныя праграмы ва ўсіх гэтых мовах. Гэта будзе не толькі весела, але ён будзе вучыць больш аб тым, што робіць кампутарны мова маштабуецца, чым вы ніколі не даведаецеся, прачытаўшы. І калі вы толькі хочаце даведацца адзін мова праграмавання з усіх, якія я згадваў, калі ласка, рабіць сабе карысць і вучыцца OCaml. Гэта не ідэальна, але гэта лепшы мову, які я калі-небудзь выкарыстоўвалі. Калі ў вас ёсць час, каб вывучыць дзве мовы, іншы мова павінна быць агульным Lisp ці Scheme.
Удачы!
З моманту стварэння арыгінальную версію гэтага артыкула, у мяне было некалькі досведаў, якія былі зменены некаторыя з маіх поглядаў. Самае галоўнае, я не так высока на OCaml, як я быў тады. Хоць я ўсё яшчэ думаю, OCaml з'яўляецца выдатным мовы ў многіх адносінах, Ёсць значныя рэчы, якія я не люблю пра гэта. Я хацеў выкарыстаць OCaml, як мова для вялікага праекту, я хацеў працаваць, але знайшоў вельмі хутка, што я не мог выкарыстоўваць яго так, як я хацеў. Аб'ект сістэма не падтрымлівае Мультиметоды (што не дзіўна, вельмі мала мовах), і існуюць пэўныя асаблівасці, якія я хацеў, што завецца для Мультиметоды. У C + + або Java, вы можаце падробленыя Мультиметоды таму што ў вас ёсць час выканання тып ідэнтыфікацыі (RTTI). Але OCaml распрацоўшчыкі адмаўляюцца дадаць гэтую функцыю для OCaml на квазі-рэлігійнай глебе; ідэя мець праграмы, якія не могуць быць даказаны, каб быць типизированным падчас кампіляцыі ідзе супраць усяго, яны вераць ўнутры Незалежна ад таго, калі тып парушэнні прыводзяць да бяспечных выключэннем, як дзяленне на нуль робіць, яны не будуць чуць пра гэта. Так што я не выкарыстоўваю OCaml для гэтага праекта.
Я таксама меў больш вопыту як Java і C + + з пісьмовага першай версіі гэтага артыкула. Я не змяніў маё меркаванне аб Java шмат, лепш за ўсё пра яго, што ён прыходзіць з вялізным разнастайнасцю карысных бібліятэк. Маючыя адбыцца "Тыгр" выпуск Java будзе дадаць некалькі новых функцый мовы, якія робяць праграмаванне ў Java значна менш балюча (у прыватнасці, абагульнення і автобоксинг), што я вітаю. Я думаю, што Java з'яўляецца выдатным мовай для многіх тыпаў прыкладанняў, але яно не мае якасці прахалоды, якія робяць мяне закахацца ў мову, і ўзровень абстракцыі яшчэ менш, чым многія іншыя мовы, у тым ліку C + +. Гаворачы аб З + +, цяпер я разумею лепш, чаму З + + як яна ёсць. Хоць З + + з'яўляецца жахліва складаныя, уменне пісаць код, які плаўна перамяшчаецца ад трохі ўзроўню абстракцыі дастаткова высокі ўзровень абстракцыі, з'яўляюцца надзвычай каштоўнымі для многіх праектаў, асабліва тыя, дзе эфектыўнасць мае першараднае значэнне. Я маю намер зрабіць больш праграмавання З + +, а таксама выкарыстоўваць Бэм-Демерс кансерватыўнай GC, каб убачыць, наколькі эфектыўна гэта ў спалучэнні з C + + з іншымі функцыямі.
Марцін Роджерс (аўтар аднаго з цытаты вышэй) даслаў мне электроннай пошты, дзе ён кажа, што яго галоўным крытэрыем для забеспячэння маштабаванасці з'яўляецца тое, што мова не паклаў шкляны столь на абстракцыі. Гэта пункт гледжання класічнага праграміста Lisp, і я вельмі спагадліва да яго. Адна з вялікіх праблем у праграмаванні канструкцыя мовы, каб атрымаць мовах з гнуткасць Lisp, але з больш статычнымі гарантый. Сямейства МС мовы кампраміс паміж статычнай бяспекі тыпу і Lisp-як гнуткасць. Я з нецярпеннем чакаю далейшага развіцця ў гэтай галіне.
У гэтым артыкуле ёсць, размешчаныя ў reddit.com і, магчыма, некаторых іншых месцах, таму я атрымліваў шмат заўваг па ім. Вось мой адказ на некаторыя з тых, апынуліся для мяне найбольш цікавым.
Джуліян Морысан паслаў мне гэта ліст:
Там вельмі важная рыса вы прапусцілі, і гэта рэальнае тлумачэнне поспеху Java: сепарабельно, атамных, папярэдне упакаваных, версій функцыянальнасць. Jarballs. Тыя, больш за ўсё на свеце, зрабіць паўторнае выкарыстанне рэальным. Java праграмаванне аб падключэнні разам гатовыя убудаваныя часткі. Нішто іншае не блізка.
Я павінен пагадзіцца з ім па гэтым пытанні, і гэта недагляд асноўныя з сказанага вышэй (кампанент матэрыял з'яўляецца свайго роду, звязаныя з гэтым). Я не знаходжу Java быць вельмі натхняльная мову, але мне падабаецца інфраструктуры Java шмат (тое ж заўвага адносіцца да C #). З Java, вы можаце спампаваць пакеты і даволі добра упэўненасць, што ўсё будзе працаваць як трэба (з некаторымі агаворкамі, што я згадаю ніжэй). Ёсць куча асаблівасцяў інфраструктуры Java, якія робяць гэта магчымым: байт-код, з адной віртуальнай платформы на кожным рэальная платформа, кіраванне версіямі, метададзеныя і г.д., але ўсе яны ў выніку кавалак кода, які (у ідэале) "проста працуе". На самай справе, гэта не заўсёды "проста працаваць", але гэта "проста працуе" часцей, чым у большасці іншых моў я выкарыстаў. Да прыкладу, я паспрабаваў ўсталяваць падкастынг праграма, якая была напісана на Python, але выкарыстоўваць Python інтэрфейсы да ліку бібліятэк, напісаных на C або C + +. Я не мог прымусіць яго працаваць (і я рабіў гэта на працягу доўгага часу) з-за ўсіх касых праблемы версіі. Гэта была не віна Python як мова, ён быў тым, што Python пакеты не трэк C / C + + версіі, якія былі выкарыстаныя дастаткова добра. Гэта значна менш, верагодна, адбудзецца ў Java, па прычынах, названым вышэй, а таксама таму што выкарыстанне кода, напісанага на C / C + + у рамках праграмы Java (г.зн. праз JNI) менш неабходнага (вось дзе JIT-кампіляцыю акупляецца вялікае час).
З іншага боку, мой калега Доні Пинкстон, хто забыўся больш пра Java, чым я ніколі не даведаецца, адзначыў, што гэта вельмі лёгка патрапіць у пекла загрузчык класаў для праектаў, якія вызначаюць свае ўласныя загрузнікаў класаў (якія па-відаць, часта бывае неабходна), так што гэта не ўсё ложа з руж. Але я думаю, што ёсць кропкі, каб зрабіць што Java атрымлівае некаторыя з буйнамаштабных пытанняў менш няправільна, чым большасць моў. Гэтыя пытанні, як правіла, сумна не-сэксуальныя рэчы, якія не ўзбуджаюць мой кампутар пачуцці мовы, але яны зусім неабходныя на практыцы. Калі ніхто не можа ўсталяваць праграму, ніхто не можа яго выкарыстаць. І так, я думаю, што я патраціў столькі часу, набраўшы " configure;make;make install ", як ніхто, і я не думаю, што гэта дастаткова добра. Матэрыял для іншага дэкламацыя.
Адзін чалавек адзначыў, што Common Lisp мае Мультиметоды, што мае месца (гэта частка Клос, Common Lisp Object System). Мультиметоды вельмі халаднавата (у некаторых мовах, як Goo, будаваць іх з самага пачатку), у мяне склалася ўражанне, хоць, з'яўляецца тое, што яны цяжка эфектыўна рэалізаваць. Адзін дзень я буду будаваць мову з Мультиметоды, каб даведацца для сябе.
Хтосьці сцвярджаў, што я быў занадта жорсткім на OCaml для сцвярджаючы, што гэта не ў стане падробленыя Мультиметоды. Усё, што я магу сказаць: паспрабуйце, і пераканайцеся, як лёгка вы думаеце, гэта так. Я ўсё яшчэ думаю OCaml гэта вялікі мову, дарэчы.
Адзін чалавек сцвярджаў, маштабаванасці Lisp на колькасць узроўняў, якія па сутнасці зводзіцца да аргументу Пол Грэм аб тым, што ў Lisp, вы разьзяўляеце мову да праблемы замест кадавання праблемы аж да мовы (які я згадаў вышэй). Дзве ключавыя асаблівасці, якія дазваляюць гэтага з'яўляюцца раўнамернае сінтаксіс і сінтаксічныя макрасы. Я дакладна прыхільнік раўнамернай сінтаксісу (з аднаго боку, гэта памяншае канцэптуальную нагрузку навучання мове) і сінтаксічныя макрасы. Аднак, макрасы ёсць цікавыя і складаныя ўзаемадзеяння з модулем сістэмы, і многія людзі адчуваюць, што Common Lisp не атрымаць гэта права. Мэцью Флэтт у паперы кампілюецца і састаўнога Макрасы пераходзіць у PLT Scheme макра / модульная сістэма, якая цікавы новы падыход да гэтай праблеме, што стараецца быць лепшым з абодвух сьветаў. Акрамя таго, там было шмат у апошні час працы на "шматступеннага праграмавання", якая абагульняе паняцце вылічэнняў падчас кампіляцыі з адвольным колькасцю каскадаў (падчас кампіляцыі, падчас выканання, час кампаноўкі, навошта-то), а таксама можа ўключаць статычную праверку тыпаў. Гэта ўяўляецца вельмі перспектыўным для мяне. Цім Ширд мае шэраг прац па гэтых і сумежных дысцыплінах, а таксама спасылкі на іншыя працы.
Джуліян ноблы (экс-Caltecher!) Спытаў мяне аб-чацвёртае, мова, што ён добра знаёмы з (ён напісаў кнігу пад назвай Навукова Форт на (як вы ўжо здагадаліся) навуковых вылічэнняў у д.). Форт быў маёй першай любоўю сярод моў праграмавання (я чытаў Лео Бродзі Пачынаючы Форт даўно), і я меў выгляд адносіны любові / нянавісці з ім да гэтага часу. Вы можаце зрабіць цікавыя рэчы ў форт, што практычна немагчыма зрабіць на іншых мовах (напрыклад, змяненне лексічнага сінтаксісу), але ён заўсёды мне здаецца, што рэчы, якія даволі лёгка зрабіць на іншых мовах складана зрабіць у Форт. Я мог бы напісаць вельмі вялікі артыкул тлумачачы гэта ў дэталях, і я, верагодна, у адзін цудоўны дзень. Акрамя таго, Форт мае "толькі для запісу" якасці, якія я не люблю аб Perl, толькі яшчэ больш (хоць і некалькі змякчэлыя па вельмі раўнамернае сінтаксічныя і семантычныя мадэлі). Я напісаў два эксперыментальных моў, каб паспрабаваць атрымаць у сутнасць таго, што мне падабаецца ў Форт без рэчаў, якія я не люблю, я не атрымаў яшчэ няма. (Дарэчы, ліст Форт-падобных моў, здаецца, абрад пасвячэння для вундэркіндаў кампутар мове.) Я згодны з Джуліян што Форт з'яўляецца вельмі лёгкім мовай для адладкі, а таксама, што гэта мова, што кожны чалавек з сур'ёзнай зацікаўленасці ў мовы праграмавання варта вывучыць.
Я даволі шмат стаяць мае заявы на З + +, што я выказаў ў першым эпілогу. З + + жудасна магутны мову, але гэта надзвычай складаны і Ёсць так шмат спосабаў, каб стрэліць сабе ў нагу, што гэта цяжка выкарыстаць. Я пачаў думаць пра C + +, як гіганцкая сістэма макрасаў вакол C, што робіць шмат праектных рашэнняў лягчэй для разумення. Липпман кніга Стэна Inside C + + Object Model неабходна прачытаць, калі вы хочаце зразумець, C + + лепш, хоць кніга некалькі састарэла.
З моманту стварэння апошняй эпілог, я атрымаў вельмі закаханага ў Haskell, які я быў ??зацікаўлены ў працягу працяглага часу. Гэта было на самай справе некалькі маіх студэнтаў (Брэндон Мур і Аарон Платтнер), які ператварыў мяне (ззаду) на Haskell. Haskell прайшоў доўгі шлях за апошнія некалькі гадоў, і ў цяперашні час пачынаюць выкарыстоўвацца для сур'ёзных прыкладанняў. Я думаю, Haskell мае патэнцыял стаць самай маштабуецца мову калі-небудзь, але крывая навучання жахліва. Самае выдатнае ў Haskell з'яўляецца тое, што яго чыста функцыянальны характар ??дазваляе аб'яднаць кампаненты адвольна, і яны заўсёды працуюць так, як вы чакаеце! Аль-Барра неяк назваў гэта для мяне, як "абсталяванне разам" якасць мовы, і Haskell код здымкі разам вельмі прыгожа. Аднак, ёсць вартасць; справу з I / O і змянянае стан патрабуе больш працы, чым у большасці моў (хоць тып сістэмы дае вам добры гарантый, аб якіх функцыі могуць рабіць I / O або дзяржаўныя маніпуляцыі, а якія не могуць). Яшчэ адна цікавая рэч: "кропка-свабодны" стыль праграмавання на Haskell нагадвае мне шмат наперад! У Форт стварэння новых функцый шляхам аб'яднання старых функцый, у Haskell вы зрабіць тое ж самае, але з аператарам кампазіцыі функцый паміж функцыі (вядома, гэта не _quite_ так проста, але гэта блізка). Так, можа быць, я прайшоў поўны круг: Haskell з'яўляецца форт, лямбда-вылічэння SKI камбінатара, і мне трэба мае лекі ;-)
Спіс літаратуры
- Структура і інтэрпрэтацыя кампутарных праграм, Хэл Абельсон, Джэры Суссман і Джулі Суссман (поўны тэкст на сайце, але вы сапраўды павінны купіць копію ;-)).
- Бэм-Демерс кансерватыўны зборшчык смецця (боем старонак Ганс).
- Эйфелева мовы праграмавання.
- Цыклон мовы праграмавання.
- Мэта CAML (OCaml) мова праграмавання.
- Экстрэмальнае праграмаваньне хатняй старонкі.
- Гвидион Дылан галоўную старонку. Б-г з адкрытым зыходным кодам рэалізацыя мовы Дылан.
- PLT Scheme галоўную старонку. PLT Scheme з'яўляецца выдатным рэалізацыі Схемы мова праграмавання, са шматлікімі інавацыйнымі функцыямі.
- Скот Мейерс, Effective C + +, 2-е выд. І больш эфектыўнай C + +. Addison-Wesley, 1997 і 1995 (адпаведна).
- Андрэй Александреску, сучасны C + + Дызайн. Addison-Wesley, 2001.
- Пол Грэм, на Lisp.
- Бертран Меер, аб'ектна-арыентаванага праграмнага забеспячэння будаўніцтва. Prentice-Hall, 2000.
- Гвидион Дылан рэалізацыя мовы Дылан.
- Standard ML Нью-Джэрсі (SML / NJ) ажыццяўленне ML стандарт мовы.
- Haskell хатняй старонцы.
Вярнуцца назад да маёй хатняй старонцы. | Апошняе абнаўленне 28 студзеня 2009 |
Mike Vanier (mvanier@cs.caltech.edu)
Popular Linksabout ssl certificates , css tutorials, introduction to idl, windows faq, html tables recommendations , best web hosting, use jython, mapreduce faq, numerical methods about, scrabble practical guide, ultimate usability testing tool, cornell composting faq, best vps hosting, fast c compiler, wordpress website hosting