Интернет-археология: «99 бутылок» на языке Cmm

Язык «Cmm» был разработан в 1992 году компанией «Nombas». Основной идеей языка было упрощение языка «Си», отсюда и название — C minus minus. Официальное руководство говорит, что это «Си, минус объявление типов, минус указатели». Позже язык был переименован в ScriptEase, так как упоминание «Си» отпугивало людей. Язык существовал для ДОСа, Виндоуз, ОС/2 и операционной системы компании «Новелл».

В конце 1995 года компания создала версию скриптового языка для веб-страниц, внедрённую в браузер Нетскейп. Таким образом «Си-минус-минус» был одним из первых языков фронтенда!

Язык действительно простой — типы выводятся из использования, массивы без указания размера, нет явного выделения и освобождения памяти, указателей не видно.

Массивы и строки, хоть и являются указателями (есть даже арифметика с ними), но этого не замечаешь — выглядят, как обычные переменные. Все lvalue передаются по указателю, для передачи по значению есть специальный синтаксис. Забавно, кстати, что точка с запятой не обязательна, прямо как в ДжаваСкрипте.

Остальные отличия от «Си» не столь заметны. Языки почти что близнецы, есть даже ограниченный предпроцессор, да и встроенные функции, в основном, сишные. Язык, видимо, претендовал сразу на несколько ниш, на нишу коммандных оболочек в том числе — в составе предпроцессора есть команда, позволяющая импортировать куски программ, указывая с какой по какую строку производить импорт. Насколько я смог заметить, это широко используется, чтобы внедрять «СиЭмЭм» внутрь шелл-скриптов различных ОС.
// Written by Evgeny Stepanischev, 2017

BottlesPlural(Beer)
{
	switch ( Beer )
	{
		case 0:
			return `no bottles`
		case 1:
			return `1 bottle`
		default:
			sprintf(Bottles, `%d bottles`, Beer)
			return Bottles
	}
}

i = 99
Bottles = BottlesPlural(i)

while ( i > 0 ) {
	printf("%s of beer on the wall, %s of beer.\n", Bottles, Bottles)
	Bottles = BottlesPlural(--i)
	printf("Take one down and pass it around, %s of beer on the wall.\n\n", Bottles)
}

printf("No more bottles of beer on the wall, no more bottles of beer.\n")
printf("Go to the store and buy some more, 99 bottles of beer on the wall.\n")
Если кому-то интересно, в интернете легко гуглятся интерпретаторы языка с описанием. Я брал 32-битный интерпретатор версии 2.11 под Виндоуз. Кстати, под ОС/2 находится и более ранняя — 1.008, выпущенная в 1993 году.
18 ноября 2017 22:29

Никита (инкогнито)
1 декабря 2017, 05:20

Интересно, что название С-- потом повторно использовали - в 1997 небезызвестный Саймон Пейтон-Джонс создал язык с таким же названием :)
https://en.wikipedia.org/wiki/C--

bolknote.ru (bolknote.ru)
1 декабря 2017, 15:04, ответ предназначен Никите

Я уже писал, кстати, «песню» на Си--: http://bolknote.ru/99.html (№12). Но это получается уже третий Си-- :)

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)