ماري هي لغة برمجة تم تصميمها وتنفيذها عن طريق المنظمة البحثية [RUNIT] في تروندهايم، النرويج في السبعينات. وقد اخذت العديد من ملامح [اللغة الخوارزمية ALGOL 68]، لكنها قد تم تصميمها لبرمجة موجهة للآلات.
وكان في قواعدها اللغوية خاصية غير عادية وهي أن التعبيرات كانت مبنية من خلال استخدام معاملات وسيطة، لكنها جميعا كان لها نفس الأولوية وذهب التقييم من اليسار الي اليمين إلا إذا كانت توجد أقواس. وكان للتعيين تخصيص على اليمين واعتُبر التعيين مجرد معاملا أخر.
ومثل لغة سي، يبدو أن العديد من ميزات اللغة قد وُجدت للسماح للمبرمجين بإنتاج كود محسن بشكل معقول، على الرغم من أن مولد الكود بدائي جدا في المحول البرمجي. وقد شملت هذه الميزات معاملات تشبه += غير ما هو وارد في سي (لغة برمجة) وإعلانات واضحة للسجلات بالنسبة للمتغيرات.
الميزات الملحوظة هي
- "قواعد لغوية لتدفق البيانات"- تتدفق القيم من اليسار الي اليمين، بما في ذلك التعيين.
- يمكن استخدام معظم التركيبات في التعبيرات (الكتل البرمجية، IF، CASE، الخ).
- وحدات ماكرو متكررة قائمة على النص.
- معاملات مثقلة يحددها المستخدم، ليست مقيدة بالمعرفات المحددة مسبقا كما في سي++ (لغة برمجة)
- البناء الاتوماتيكي والوصول الي محتويات المؤشرات من سياق الكتابة.
- أنواع نطاقات رقمية.
- تعداد مجموعة ومصفوفة في المكررات التكرار الحلقي.
- أدوات وصف المصفوفة الديناميكية (ROW).
وقد طُبع كتاب يصف لغة ماري عام 1974(الطبعة الرابعة والأخيرة عام 1979): Mary Textbook بقلم Reidar Conradi & Per Holager.
وقد أعدت المحولات البرمجية من أجل SM-4 لشركة [Kongsberg Våpenfabrikk] والحواسب المصغرة Nord-10/ND-100 لشركة [Norsk Data]. وكان المحول البرمجي الأصلي للغة ماري قد تمت كتابته بلغة نيوي [ALGOL] ، وتم تشغيله على فئات Univac-1100 واستخدامه لتنفيذ محول برمجي أصلي لنظام التشغيل [ND-100/SINTRAN-III]. وقد طبقت منظمة [RUNIT] المحول البرمجي [CHILL] المكتوب بلغة ماري والذي تم تشغيله على حاسب ND-100 وأهداف إنتل 8086 و[80286]. وعندما تم إعداد منفذ لهذا المحول البرمجي إلي منصة [VAX]، تم تنفيذ نهاية خلفية مشتركة للغة ماري و[CHILL]. ولاحقا، توافرت نهايات خلفية للمعالج الدقيق [i386] و[SPARC]. ومنذ أن تم تطبيق المحول البرمجي للغة ماري في لغة ماري، كان من الممكن تشغيل المحول البرمجي على كل هذه المنصات.
ولم تعد لغة ماري محتفظة بمكانتها.
مثال
BEGIN INT i := 10; %% Variable with initial value. REF INT ri := i; %% Pointer initialized to point to i. INT j := 11; j :- REF INT =: ri; %% Type conversion and assignment %% ri now points to j. i =: (ri :- VAL REF INT); %% Assignment and type conversion %% ri points to j so j is changed. IF j > 10 %% Conditional statement with result THEN %% used inside an arithmetic expression. 1 ELSE 2 FI + j =: j; END